add: Nginx и Certboot в Docker (5)

This commit is contained in:
Sergei Erjemin 2025-02-14 10:24:57 +03:00
parent 9064bad6d1
commit 91fafb96cf

View File

@ -111,17 +111,17 @@ networks:
- `portainer` (у вас его может и не быть, или быть какой-то другой сервис, который вы будете производить): - `portainer` (у вас его может и не быть, или быть какой-то другой сервис, который вы будете производить):
- `image: portainer/portainer-ce:latest` — используем образ Portainer Community Edition; - `image: portainer/portainer-ce:latest` — используем образ Portainer Community Edition;
- `container_name: portainer` — имя контейнера `portainer`; - `container_name: portainer` — имя контейнера `portainer`;
- `volumes: ...` — монтируем файлы или тома изнутри контейнера Portainer на хост. В данном случае монтируем: сокет -- - `volumes: ...` — монтируем файлы или тома изнутри контейнера на хост. В данном случае маппим: сокет —
чтобы изнутри контейнера Portainer можно было через Docker API управлять Docker самого хоста (вот так хитро) и чтобы изнутри контейнера Portainer можно было через Docker API управлять Docker самого хоста (вот так хитро) и
каталог `/home/web/docker-data/portainer` — чтобы сохранять настройки и данные Portainer между перезапусками; каталог `/home/web/docker-data/portainer` — чтобы сохранять настройки и данные Portainer между перезапусками;
- `restart: always` — автоматически перезапускаем контейнер при его остановке; - `restart: always` — автоматически перезапускаем контейнер при его остановке или перезагрузке хоста;
- `networks: ...` — подключаем контейнер к пользовательской (внутри-контейнерной) сети `web`. - `networks: ...` — подключаем контейнер к пользовательской (внутри-контейнерной) сети `web`.
- `nginx`: - `nginx`:
- `image: nginx:latest` — используем образ Nginx; - `image: nginx:latest` — используем образ Nginx;
- `container_name: nginx` — имя контейнера `nginx`; - `container_name: nginx` — имя контейнера `nginx`;
- `ports: ...` — пробрасываем порты 80 и 443 на хост; - `ports: ...` — пробрасываем порты 80 и 443 из контейнера на хост;
- `volumes: ...` — монтируем каталог с конфигурационными файлами Nginx; - `volumes: ...` — монтируем каталог с конфигурационными файлами Nginx;
- `restart: always` — автоматически перезапускаем контейнер при его остановке; - `restart: always` — автоматически перезапускаем контейнер при его остановке или перезагрузке хоста;
- `networks: ...` — подключаем контейнер к пользовательской (внутри-контейнерной) сети `web`. - `networks: ...` — подключаем контейнер к пользовательской (внутри-контейнерной) сети `web`.
- `networks: ...`: - `networks: ...`:
- `web`: - `web`:
@ -211,7 +211,7 @@ mkdir -p /home/web/docker-data/letsencrypt/_ownership_check
``` ```
*Тут происходит очень похожий маппинг тома для сертификатов Let's Encrypt и временных файлов для проверки *Тут происходит очень похожий маппинг тома для сертификатов Let's Encrypt и временных файлов для проверки
владения, но теперь для контейнера nginx*: владения, но теперь в контейнер с nginx*:
- `volumes: ...`: - `volumes: ...`:
- `/home/web/docker-data/letsencrypt/_cert:/etc/letsencrypt` — маппинг тома для сертификатов Let's Encrypt, чтобы их - `/home/web/docker-data/letsencrypt/_cert:/etc/letsencrypt` — маппинг тома для сертификатов Let's Encrypt, чтобы их
@ -252,18 +252,21 @@ server {
включённом proxy_pass. включённом proxy_pass.
**Важно!** После того как сертификаты Let's Encrypt будут получены, не надо удалять этот `location ^~` из конфигурации! **Важно!** После того как сертификаты Let's Encrypt будут получены, не надо удалять этот `location ^~` из конфигурации!
Он нужен для автоматического обновления сертификатов. При обновлении сертификатов certbot будет снова создавать Он нужен для автоматического обновления сертификатов: certbot будет снова создавать временные файлы в каталоге
временные файлы в каталоге `/var/www/letsencrypt/` а Let's Encrypt проверять их доступность. Если nginx не сможет отдать `/var/www/letsencrypt/`, а сервера Let's Encrypt "дергать" их и тем самым проверять права владения. Если nginx
эти файлы, то обновление сертификатов не произойдет. не сможет отдать эти файлы, то и обновление сертификатов не произойдет.
Останавливаем docker-compose и запускаем только nginx из него: Останавливаем docker-compose и перезапускаем (сначала все контейнеры, чтобы инициализировать контейнер certbot, а затем
только nginx, чтобы он отдавать временные файлы для проверки владения доменом):
```bash ```bash
cd /home/web/docker-data cd /home/web/docker-data
docker-compose down docker-compose down
docker-compose up -d
docker-compose down
docker-compose up -d nginx docker-compose up -d nginx
``` ```
Теперь можно запустить certbot для получения сертификатов Let's Encrypt: Теперь нужно мз контейнера `certbot` инициализировать получение сертификатов Let's Encrypt:
```bash ```bash
docker run --rm --name letsencrypt-certbot \ docker run --rm --name letsencrypt-certbot \
-v /home/web/docker-data/letsencrypt/_ownership_check:/var/www/html \ -v /home/web/docker-data/letsencrypt/_ownership_check:/var/www/html \
@ -296,8 +299,8 @@ If you like Certbot, please consider supporting our work by:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
``` ```
Если у вас что-то пойдёт не так, то скорее всего что-то напутано в маппингах томов, или в конфигурации nginx. Вы можете Если у вас что-то пойдёт не так, то скорее всего напутано в маппингах томов или в конфигурации nginx. Вы можете
посмотреть логи certbot (возможно вам придется замаппить каталог логов из контейнера certbot на хост). посмотреть логи `certbot` (возможно вам придется замаппить каталог логов из контейнера certbot на хост).
Уже хочется проверить, что все работает? Рано! Нам нужно добавить в конфигурацию nginx SSL-сертификаты и настроить Уже хочется проверить, что все работает? Рано! Нам нужно добавить в конфигурацию nginx SSL-сертификаты и настроить
перенаправление с HTTP на HTTPS. Отредактируем конфиг nginx, теперь он будет выглядеть так: перенаправление с HTTP на HTTPS. Отредактируем конфиг nginx, теперь он будет выглядеть так: