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
Сертификаты, выданные 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:
Создайте каталог для конфигурации Nginx, а затем сам файл конфигурации:
Скопируйте следующую конфигурацию 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;
}
}