Теперь нам нужно подготовить прочную основу для дальнейшей раскатки всего и вся в контейнерах. В будущем нам понадобятся:
MySQL (развернули в ч. 5)PostgreSQL (развернули в ч. 6)PHPMyAdmin (развернули в ч. 7)PgAdmin (развернули в ч. 7)- Nginx
- PHP-FPM
В этой части развернём Nginx и завернём в него phpMyAdmin + pgAdmin убрав проброс портов.
Напоминаю, что сервер развёрнут и работает в timeweb.cloud, но вы можете использовать любой другой VPS.
Забрать все файлы для загрузки можно отсюда:
Наконец мы завершили все подготовительные работы и теперь будем разворачивать веб-сервер. Как наиболее удобный, хотя давно уже и не абсолютный лидер рынка, был выбран nginx.
Первичная подготовка
Создаём его рабочие директории:
mkdir -p /home/docker-admin/infra/nginx/service_folders/
mkdir -p /home/docker-admin/infra/nginx/service_folders/logs
mkdir -p /home/docker-admin/infra/nginx/service_folders/nginx/conf
mkdir -p /home/docker-admin/infra/nginx/service_folders/www
Первая - общая директория, где будут лежать все вложенные и наш файл docker-compose.yml
Вторая - директория, которую примонтируем для сохранения логов
Третья - директория настроек nginx
В четвёртой разместим страницу-заглушку (default page)
Сначала, чтобы у нас создалась директория letsencrypt - поставим certbot:
sudo apt install certbot -y
После создания директорий и установки certbot - заведём файл docker-compose.yml:
version: '3.9'
services:
webserver:
image: nginx:1.25
deploy:
replicas: 1
resources:
limits:
cpus: "1"
memory: 1G
reservations:
memory: 256M
restart_policy:
condition: on-failure
ports:
- target: 80
published: 80
mode: host
- target: 443
published: 443
mode: host
tty: true
volumes:
- type: bind
source: ./service_folders/nginx/conf
target: /etc/nginx/conf.d
- type: bind
source: ./service_folders/www/html/0_default
target: /var/www/html/0_default
- type: bind
source: /etc/letsencrypt/
target: /etc/letsencrypt/
- type: bind
source: ./service_folders/logs
target: /var/log/www
environment:
- APP_NAME=webserver_sites
- TZ=Russia/Moscow
networks:
- portainer_composite_nw
networks:
portainer_composite_nw:
external: true
Мы почти готовы к запуску, но сначала наполним конфигурациями и настройками наш сервер. План такой:
- Выпускаем сертификат для учебного домена
- Заполняем директорию www файлами
- Закрываем порты у phpMyAdmin и pgAdmin
- Пишем простой конфиг для phpMyAdmin и pgAdmin и пробрасываем их через nginx
- Пробуем запуститься
Выпускаем сертификат
Для данного цикла статей я создал поддомен: teach.testarea.biz, выпустим к нему сертификаты:
sudo certbot certonly -d teach.testarea.biz -d www.teach.testarea.biz
Мы используем certonly, т.к. сами будем пробрасывать выпущенные сертификаты в контейнер и настраивать их.
Отвечайте на вопросы так, как указано на скриншоте (почту укажите свою):
Убеждаемся (вам нужно подставить свой домен):
sudo ls /etc/letsencrypt/live/teach.testarea.biz
Заполняем директорию www файлами (+грузим default.conf для nginx)
На данном шаге нужно загрузить по пути:
/home/docker-admin/infra/nginx/service_folders/
Файлы с яндекс.диск. Там лежат директория www с дефолтными страницам + nginx/conf с базовым конфигом.
Также нужно загрузить в директорию /etc/letsencrypt два файла из одноимённой директории по ссылке выше (делаем под root).
Закрываем порты у phpMyAdmin и pgAdmin
Здесь всё тоже просто. Идём в:
/home/docker-admin/infra/sqladmmin/docker-compose.yml
И удалям в файле записи конфига для pgAdmin:
ports:
- target: 80
published: 8102
mode: host
Для phpMyAdmin:
ports:
- target: 80
published: 8101
mode: host
Также сразу к phpmyadmin в секцию environment добавим:
PMA_ABSOLUTE_URI: https://teach.testarea.biz/pma
Вы должны указать тут свой домен.
После этого пересоздаём поды:
sudo docker stack rm sqladmin
sudo docker stack deploy -c /home/docker-admin/infra/sqladmmin/docker-compose.yml sqladmin
В portainer они должны быть уже без открытых портов.
Пишем простой конфиг для phpMyAdmin и pgAdmin и пробрасываем их через nginx
Нам осталось сконфигурировать виртуальные хосты для pgAdmin и phpMyAdmin после чего можем запускаться.
Создаём файл infr.conf по пути:
/home/docker-admin/infra/nginx/service_folders/nginx/conf/
В нём объявляем наш учебный домен и настраиваем все поддиректории:
server {
listen 80;
server_name teach.testarea.biz www.teach.testarea.biz;
return 301 https://teach.testarea.biz$request_uri;
}
# HTTPS www → HTTPS без www
server {
listen 443 ssl http2;
server_name www.teach.testarea.biz;
ssl_certificate /etc/letsencrypt/live/teach.testarea.biz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/teach.testarea.biz/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
return 301 https://teach.testarea.biz$request_uri;
}
# Основной HTTPS сервер
server {
listen 443 ssl http2;
server_name teach.testarea.biz;
ssl_certificate /etc/letsencrypt/live/teach.testarea.biz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/teach.testarea.biz/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www;
location / {
root /var/www/html/0_default/;
index index.html;
}
location /pma/ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://sqladmin_phpmyadmin:80/;
rewrite ^/pma(/.*)$ $1 break;
}
location /pga/ {
proxy_set_header X-Script-Name /pga;
proxy_set_header Host $host;
proxy_pass http://sqladmin_pgadmin:80/;
proxy_redirect off;
}
}
Настройка предельно простая - мы завернули весь трафки на https://teach.testarea.biz (все кто идут на http:// + www.teach будут переадресовываться туда), подключили сертификат и настроили прокси по путям:
/pma
/pga
Пробуем запуститься
Настала пора запускаться. Если мы всё сделали правильно - на выходе получим работающий веб-сервер по портам 80 и 443 через который проксируются portainer, phpmyadmin, pgadmin.
sudo docker stack deploy -c /home/docker-admin/infra/nginx/docker-compose.yml nginx
Если всё прошло успешно, то мы увидим при проверке три страницы ответа:
На этом настройка nginx завершена. Остаётся настроить php-fpm и можем начинать плодить сайты.