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)?