Nextcloud и Django (статический) сайт в стороне за nginx-прокси [закрыто]

Прежде всего, я новичок в работе с сетями и с веб-сервисами в целом.

Контекст : У меня есть доменное имя : mydomain.com и VPS сервер (с Ubuntu) с фиксированным IPV4 адресом : MYIPADRESS. В панели управления провайдера VPS, я привязал mydomain.com к MYIPADRESS с записью A. Только один домен привязан к MYIPADRESS.

Задача : Я хочу разместить два веб-сервиса на моем VPS: экземпляр nextcloud и мой блог, который является статическим сайтом Django, все настроено на HTTPS. Я хочу, чтобы мой экземпляр nextcloud указывал на cloud.mydomain.com, а мой экземпляр Django блога на blog.mydomain.com.

Для этого я использую docker. В основном, я использую сервер nginx-proxy + его компаньон letsencrypt. После этого я запускаю контейнер docker для моего django блога с переменными env согласно документации по nginx-proxy и помещаю контейнер блога в ту же сеть, что и сети nginx-proxy и его компаньона letsencrypt.

Каждый раз, не отсоединяя изображения, в логах не появляется никаких предупреждений/"exited with 1"/red-written rows stuffs, будь то контейнер блога или контейнер nginx-proxy/letsencrypt companion. Я пока не пробовал ставить свой экземпляр nextcloud, так как просто настройка контейнера блога не работает.

Мой первый docker-compose.yml для nginx-proxy и связанных с ним :

version: '3'
services:
  nginx:
    image: nginx
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    container_name: nginx
    restart: unless-stopped
    logging:
      options:
        max-size: "10m"
        max-file: "3"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /home/ubuntu/nginx_setup/conf.d:/etc/nginx/conf.d
      - /home/ubuntu/nginx_setup/vhost.d:/etc/nginx/vhost.d
      - /home/ubuntu/nginx_setup/html:/usr/share/nginx/html
      - /home/ubuntu/nginx_setup/certs:/etc/nginx/certs:ro
    environment:
      DEFAULT_HOST: "mydomain.com"
  nginx-gen:
    image: jwilder/docker-gen
    container_name: nginx-gen
    restart: unless-stopped
    volumes:
      - /home/ubuntu/nginx_setup/conf.d:/etc/nginx/conf.d
      - /home/ubuntu/nginx_setup/vhost.d:/etc/nginx/vhost.d
      - /home/ubuntu/nginx_setup/html:/usr/share/nginx/html
      - /home/ubuntu/nginx_setup/certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:rw
      - /home/ubuntu/nginx_setup/templates/:/etc/docker-gen/templates:ro
    command: -notify-sighup nginx -watch -only-exposed /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf

  nginx-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-letsencrypt
    restart: unless-stopped
    volumes:
      - /home/ubuntu/nginx_setup/conf.d:/etc/nginx/conf.d
      - /home/ubuntu/nginx_setup/vhost.d:/etc/nginx/vhost.d
      - /home/ubuntu/nginx_setup/html:/usr/share/nginx/html
      - /home/ubuntu/nginx_setup/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:rw
    environment:
      NGINX_DOCKER_GEN_CONTAINER: "nginx-gen"
      NGINX_PROXY_CONTAINER: "nginx"

networks:
  default:
    external:
      name: nginx-proxy

Вышеупомянутый файл docker-compose.yml находится в каталоге со следующей структурой (этот каталог расположен в /home/ubuntu/) :


.
├── certs
│   ├── mydomain.com
│   ├── blog.mydomain.com
│   ├── default.crt
│   ├── default.key
│   └── dhparam.pem
├── conf.d
│   └── default.conf
├── docker-compose.yml
├── html
├── nginx.tmpl
├── templates
│   └── nginx.tmpl
└── vhost.d
    └── default

nginx.tmpl выглядит следующим образом :

server {
    listen 80 default_server;
    server_name _; # This is just an invalid value which will never trigger on a real hostname.
    error_log /proc/self/fd/2;
    access_log /proc/self/fd/1;
    return 503;
}

{{ range $host, $containers := groupByMulti $ "Env.VIRTUAL_HOST" "," }}
upstream {{ $host }} {

{{ range $index, $value := $containers }}

    {{ $addrLen := len $value.Addresses }}
    {{ $network := index $value.Networks 0 }}

    {{/* If only 1 port exposed, use that */}}
    {{ if eq $addrLen 1 }}
        {{ with $address := index $value.Addresses 0 }}
            # {{$value.Name}}
            server {{ $network.IP }}:{{ $address.Port }};
        {{ end }}

    {{/* If more than one port exposed, use the one matching VIRTUAL_PORT env var */}}
    {{ else if $value.Env.VIRTUAL_PORT }}
        {{ range $i, $address := $value.Addresses }}
            {{ if eq $address.Port $value.Env.VIRTUAL_PORT }}
            # {{$value.Name}}
            server {{ $network.IP }}:{{ $address.Port }};
            {{ end }}
        {{ end }}

    {{/* Else default to standard web port 80 */}}
    {{ else }}
        {{ range $i, $address := $value.Addresses }}
            {{ if eq $address.Port "80" }}
            # {{$value.Name}}
            server {{ $network.IP }}:{{ $address.Port }};
            {{ end }}
        {{ end }}
    {{ end }}
{{ end }}
}

server {
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    server_name {{ $host }};
    proxy_buffering off;
    error_log /proc/self/fd/2;
    access_log /proc/self/fd/1;

    location / {
        proxy_pass http://{{ trim $host }};
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # HTTP 1.1 support
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
{{ end }}

Отсюда я запускаю sudo docker-compose up -d из /home/ubuntu/nginx_setup/, чтобы включить nginx-proxy и связанные с ним контейнеры.

Затем я запускаю sudo docker-compose up -d из /home/ubuntu/mysite/myblog (где находится файл docker-compose.yml для моего django блога).

Файл docker-compose моего сайта django описан ниже :

version: '3'

services:
  gunicorn:
    container_name: myblog
    build: .
    command: sh -c "python manage.py makemigrations &&
                     python manage.py migrate &&
                     python manage.py collectstatic --noinput &&
                     gunicorn --bind 0.0.0.0:8000 --workers 2 mywebsite.wsgi:application"
    volumes:
      - ./staticfiles:/static
    environment:
      VIRTUAL_HOST: blog.mydomain.com
      VIRTUAL_PORT: 8000
      LETSENCRYPT_HOST: blog.mydomain.com
      LETSENCRYPT_EMAIL: myemailadress@forletsencrypt.com
    ports:
      - "8000:8000"


networks:
  default:
    external:
      name: nginx-proxy

Я думаю, что я следую процессу: контейнеры под одной сетью docker (я создал ее с помощью запуска sudo docker network create nginx-proxy) + настройка переменных ENV + мой контейнер django запускается только после запуска моего nginx и связанного с ним контейнера

Результат : С настоящим контейнером nginx (из nginx:latest) и просто созданным вручную nginx.conf, который затем устанавливается в контейнер nginx, мой сайт django прекрасно работает с HTTPS. При использовании temaplating подхода (т.е. nginx-proxy и связанного с ним), я получаю 503 HTTP ошибку от blog.mydomain.com.

Что здесь не так?

Кроме того, как мне указать nginx-proxy, откуда брать папку staticfile при такой настройке шаблонов (я смог это сделать с помощью записи location (и псевдонима) в созданном вручную файле nginx.conf)?

Вернуться на верх