Skip to content

Nginx, SSL сертификаты через certbot docker

Запустим gitlab в самом простом варианте

sudo docker pull gitlab/gitlab-ce:latest
sudo mkdir -p /srv/gitlab/config
sudo mkdir -p /srv/gitlab/logs
sudo mkdir -p /srv/gitlab/data
sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 4443:443 --publish 8080:80 --publish 2222:22 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

Запустим сertbot через docker

sudo docker pull certbot/certbot:latest
sudo docker run -it --rm \
  -p 80:80 \
  -v /srv/nginx/certificates:/etc/letsencrypt \
  -v /srv/nginx/certbot-logs:/var/log/letsencrypt \
  certbot/certbot:latest \
  certonly --standalone -d your-domain.com
Замените 'ваш-домен.com' на ваше доменное имя. Сертификаты будут сохранены в /srv/nginx/certificates. Во время процесса установки сертификата вам будет предложено указать ваш адрес электронной почты и согласиться с условиями использования.

Сертификаты, выданные Let's Encrypt, у CA для Certbot, имеют срок действия 90 дней, поэтому обычно проводится проверка на обновление как минимум ежемесячно или даже чаще. Вот как вы можете настроить задание cron для обновления сертификата crontab -e

Чтобы запустить задание cron раз в месяц в субботу ночью/воскресенье утром в 2:30, при этом остановив контейнер NGINX перед запуском команды обновления и запустив его снова после этого, добавьте следующую запись в cron в конец файла

  30 2 * * 6 sudo docker stop nginx-proxy && sudo docker run --rm -p 80:80 -v /srv/nginx/certificates:/etc/letsencrypt -v /srv/nginx/certbot-logs:/var/log/letsencrypt certbot/certbot:latest renew --quiet && sudo docker start nginx-proxy

Теперь давайте загрузим образ Nginx:

  sudo docker pull nginx:latest

Создайте каталог для конфигурации Nginx, а затем сам файл конфигурации:

  sudo mkdir -p /srv/nginx/conf.d
sudo nano /srv/nginx/conf.d/gitlab.conf

Скопируйте следующую конфигурацию Nginx в gitlab.conf и убедитесь, что заменили your-domain.com на ваш реальный домен:

# Redirect HTTP to HTTPS
server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}
# HTTPS server
server {
    listen 443 ssl;
    server_name your-domain.com;

    ssl_certificate /etc/nginx/certificates/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/certificates/live/your-domain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

sudo docker run --name nginx-proxy \
  --detach \
  --publish 80:80 \
  --publish 443:443 \
  --volume /srv/nginx/certificates:/etc/nginx/certificates \
  --volume /srv/nginx/conf.d:/etc/nginx/conf.d \
  --network host \
  --restart always \
  nginx:latest