Найти в Дзене

Разворачиваем сервер с контейнеризацией для собственных нужд. Часть 8 - запускаем nginx и заворачиваем в него phpMyAdmin + pgAdmin

Теперь нам нужно подготовить прочную основу для дальнейшей раскатки всего и вся в контейнерах. В будущем нам понадобятся: В этой части развернём 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 В
Оглавление

Теперь нам нужно подготовить прочную основу для дальнейшей раскатки всего и вся в контейнерах. В будущем нам понадобятся:

  1. MySQL (развернули в ч. 5)
  2. PostgreSQL (развернули в ч. 6)
  3. PHPMyAdmin (развернули в ч. 7)
  4. PgAdmin (развернули в ч. 7)
  5. Nginx
  6. PHP-FPM

В этой части развернём Nginx и завернём в него phpMyAdmin + pgAdmin убрав проброс портов.

Напоминаю, что сервер развёрнут и работает в timeweb.cloud, но вы можете использовать любой другой VPS.

Забрать все файлы для загрузки можно отсюда:

Часть 8, Nginx

Наконец мы завершили все подготовительные работы и теперь будем разворачивать веб-сервер. Как наиболее удобный, хотя давно уже и не абсолютный лидер рынка, был выбран 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, он потребуется нам для получения сертификатов https
Установка certbot, он потребуется нам для получения сертификатов https

После создания директорий и установки 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

Мы почти готовы к запуску, но сначала наполним конфигурациями и настройками наш сервер. План такой:

  1. Выпускаем сертификат для учебного домена
  2. Заполняем директорию www файлами
  3. Закрываем порты у phpMyAdmin и pgAdmin
  4. Пишем простой конфиг для phpMyAdmin и pgAdmin и пробрасываем их через nginx
  5. Пробуем запуститься

Выпускаем сертификат

Для данного цикла статей я создал поддомен: 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/
Часть 8, Nginx

Файлы с яндекс.диск. Там лежат директория 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

Если всё прошло успешно, то мы увидим при проверке три страницы ответа:

https://teach.testarea.biz/
https://teach.testarea.biz/
https://teach.testarea.biz/pma/
https://teach.testarea.biz/pma/
https://teach.testarea.biz/pga/
https://teach.testarea.biz/pga/

На этом настройка nginx завершена. Остаётся настроить php-fpm и можем начинать плодить сайты.