Задать вопрос
@MrSlam
местами сисадмин

Как подружить nginx docker (vaultwarden) и certbot?

Здравствуйте.
Есть сервер c Ubuntu 20.04, на нем установлены пакеты nginx и certbot. Также на этом сервере запускается doker-контейнер vaultwarden.
Контейнер запускается с настройками:
sudo docker run -d --name vaultwarden -e  \ 
    DOMAIN=https://под.домен.ру -e SIGNUPS_ALLOWED=false \
    -v /vw-data/:/data \
    -e WEBSOCKET_ENABLED=true \
    -p 80:80 -p 3012:3012 --restart on-failure \
    vaultwarden/server:latest

В nginx конфиг прописан следующий:
server {
    server_name под.домен.ру; # managed by Certbot
  location / {
    proxy_pass http://под.домен.ру:80;
    proxy_set_header Host $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;
  }

  location /notifications/hub {
    proxy_pass http://под.домен.ру:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  location /notifications/hub/negotiate {
    proxy_pass http://под.домен.ру:80;
  }
  # Optionally add extra authentication besides the ADMIN_TOKEN
  # If you don't want this, leave this part out
  location /admin {
    # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
    auth_basic "Private";
    auth_basic_user_file /path/to/htpasswd_file;

    proxy_set_header Host $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;

    proxy_pass http://под.домен.ру:80;
  }

  location /.well-known/acme-challenge {
    root /var/www/letsencrypt;
  }
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/под.домен.ру/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/под.домен.ру/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
#    if ($host = под.домен.ру) {
#        return 301 https://$host$request_uri;
#    } # managed by Certbot

#       listen 80 ;
#       listen [::]:80 ;
#    server_name под.домен.ру;
#    return 404; # managed by Certbot
}

С таким великолепием Vaulwarden работает. Но не работает естественно, редирект с http на https (насколько мне хватает знаний, из-за закоменченного if ($host = под.домен.ру) { return 301 https://$host$request_uri; } . Если его раскомментить, то редиректа все-равно нет, но VW по http работает, а по https - нет.

Также при этом конфиге, если попробовать обновить сертификат (хотя бы в тестовом режиме) certbot renew --dry-run
То появляется ошибка верификации:

...
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: под.домен.ру
Type: unauthorized
Detail: Invalid response from
http://под.домен.ру/.well-known/acme-challenge/nLO...


Для того, чтобы оно не появлялось, я вкрячил в конфиг nginx
location /.well-known/acme-challenge {
    root /var/www/letsencrypt;
  }

И для certbot указал certbot -w /var/www/letsencrypt

Соответственно, если остановить контейнер, то certbot нормально отрабатывает. Поэтому и хотелось бы понять - где я ошибся в конфиге? И что нужно сделать для того, чтобы и certbot работал, и контейнер vaultwarden?

P.S. Я пробовал запускать контейнер с разными вариантами, например, указывая порт -p 8080:80, и правя конфиг nginx на http://под.домен.ру:8080, но при таком раскладе либо VW не работает, либо nginx не перезапускается.
  • Вопрос задан
  • 697 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
kotomyava
@kotomyava
Системный администратор
Редирект на стороне nginx не будет работать не из-за того, что закомментирован, а из-за того, что nginx тут вообще не слушает запросы на 80 порту, и ну никак не может сделать какой-то редирект. Отсюда же проблемы с certbot на http - запрос уходит напрямую в контейнер.

Лучше было бы поднять контейнер на 127.0.0.1:80 например. В nginx сделать две секции server:
одну для внешний_ip:80 - в ней только редирект
другую внешний_ip:443 - в ней то же, что сейчас примерно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
18 дек. 2024, в 12:39
1000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект