Текущие проблемы 1. Деплой в 5 шагов: локальный код → push → SSH → pull → make (ручной, медленный) 2. Добавление нового сайта требует правки 7+ файлов: .env, docker-compose.yml, nginx-http.conf, nginx-ssl.conf, switch-config.sh, init-certbot.sh, checkRenewCerts.sh, Makefile — легко забыть что-то 3. HTTPS all-or-nothing: если у одного домена нет сертификата — все сайты падают на HTTP 4. Certbot: дублирование кода на каждый домен в init-certbot.sh, checkRenewCerts.sh и 5 отдельных renew-скриптов 5. Makefile растёт — на каждый сервис 4-5 целей Предложение Фаза 1: CI/CD через GitHub Actions Создать .github/workflows/deploy.yml: name: Deploy on: push: branches: [main] paths: - 'main_dc/**'Текущие проблемы 1. Деплой в 5 шагов: локальный код → push → SSH → pull → make (ручной, медленный) 2. Добавление нового сайта требует правки 7+ файлов: .env, docker-compose.yml, nginx-http.conf, nginx-ssl.conf, switch-config.sh, init-certbot.sh, checkRenewCerts.sh, Makefile — легко забыть что-то 3. HTTPS all-or-nothing: если у одного домена нет сертификата — все сайты падают на HTTP 4. Certbot: дублирование кода на каждый домен в init-certbot.sh, checkRenewCerts.sh и 5 отдельных renew-скриптов 5. Makefile растёт — на каждый сервис 4-5 целей Предложение Фаза 1: CI/CD через GitHub Actions Создать .github/workflows/deploy.yml: name: Deploy on: push: branches: [main] paths: - 'main_dc/**' jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy via SSH uses: appleboy/ssh-action@v1 with: host: ${{ secrets.HOST }} username: ${{ secrets.USER }} key: ${{ secrets.SSH_KEY }} script: | cd /home/valitovgaziz/tp git pull origin main # Определить какие сервисы изменились и пересобрать только их # Или просто: make all Преимущества: push → авто-деплой за ~1 мин, без SSH вручную. Фаза 2: Единый источник истины — sites.yml Ввести файл main_dc/sites.yml со списком всех сайтов: sites: yalarba: domain: yalarba.ru aliases: [www.yalarba.ru] type: spa root: /usr/share/nginx/yalarba/html api: http://api_tp/ api_yal: http://api_yal/ valitovgaziz: domain: valitovgaziz.ru aliases: [www.valitovgaziz.ru] type: container upstream: http://valitovgaziz/ api: http://analytics:3000/ easysite102: domain: easysite102.ru aliases: [www.easysite102.ru] type: container upstream: http://easysite:3000 api: http://api_yal:8787/ begushiybashkir: domain: begushiybashkir.ru aliases: [www.begushiybashkir.ru] type: spa root: /usr/share/nginx/begushiybashkir/html api: http://api_bb:8080/ Скрипт-генератор (generate-configs.sh) на основе sites.yml создаёт: - nginx-http.conf — HTTP-блоки - nginx-ssl.conf — HTTPS-блоки для каждого домена, каждый независимо проверяет свой сертификат - nginx-partial-ssl.conf — комбинированный: HTTPS где есть серт, HTTP где нет - certbot-domains.txt — список доменов для certbot - .env — переменные окружения Добавление нового сайта: 1 правка в sites.yml → ./generate-configs.sh → git commit. Фаза 3: Умный nginx — per-domain HTTPS Убрать all-or-nothing switch-config.sh. Вместо этого nginx грузит все конфиги через include: /etc/nginx/conf.d/ ├── 00-http-default.conf # HTTP на 80 ├── 10-yalarba-ssl.conf # HTTPS, если есть серт ├── 20-valitovgaziz-ssl.conf # HTTPS, если есть серт ├── 30-easysite102-ssl.conf # HTTPS, если есть серт └── common/ # Общие настройки Каждый файл SSL генерируется с if-проверкой наличия сертификата: server { listen 443 ssl; server_name valitovgaziz.ru www.valitovgaziz.ru; ssl_certificate /etc/letsencrypt/live/valitovgaziz.ru/fullchain.pem; ... } А HTTP-сервер делает return 301 https://$host$request_uri только для тех доменов, у кого есть сертификат. Остальные работают по HTTP. Фаза 4: Certbot — один скрипт для всех Вместо 5 renew-скриптов: # /opt/renew-all.sh — единый скрипт certbot renew --webroot -w /var/www/certbot Certbot сам знает все домены, для которых получал сертификаты. --webroot с одним -w работает для всех. Убрать: - renewBegushiyBAshkirLatin.sh, renewBegushiyBashkir.sh, renewEasysite102.sh, renewValitovGazizCert.sh, renewYalarbaCert.sh - Заменить checkRenewCerts.sh на вызов certbot renew Фаза 5: Makefile — авто-детект изменений Оставить базовые цели, но добавить: deploy: git @echo "Detecting changes..." @git diff --name-only HEAD~1 HEAD | grep -o 'main_dc/[^/]*/' | sort -u | while read dir; do \ service=$$(basename $$dir); \ if grep -q "^ $$service:" docker-compose.yml; then \ make stop_$$service build_$$service start_$$service; \ fi \ done Или ещё проще: GitHub Actions сам определяет какие сервисы изменились и запускает только их make цели. Дорожная карта Шаг Что делаем Эффект 1 sites.yml + generate-configs.sh Добавление сайта = 1 файл 2 Переход на per-domain HTTPS в nginx Один сайт без серта не ломает другие 3 Упрощение certbot: единый certbot renew Удалить 5 скриптов 4 GitHub Actions deploy workflow push → авто-деплой 5 Makefile: deploy с авто-детектом Быстрый частичный деплой jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy via SSH uses: appleboy/ssh-action@v1 with: host: ${{ secrets.HOST }} username: ${{ secrets.USER }} key: ${{ secrets.SSH_KEY }} script: | cd /home/valitovgaziz/tp git pull origin main # Определить какие сервисы изменились и пересобрать только их # Или просто: make all Преимущества: push → авто-деплой за ~1 мин, без SSH вручную. Фаза 2: Единый источник истины — sites.yml Ввести файл main_dc/sites.yml со списком всех сайтов: sites: yalarba: domain: yalarba.ru aliases: [www.yalarba.ru] type: spa root: /usr/share/nginx/yalarba/html api: http://api_tp/ api_yal: http://api_yal/ valitovgaziz: domain: valitovgaziz.ru aliases: [www.valitovgaziz.ru] type: container upstream: http://valitovgaziz/ api: http://analytics:3000/ easysite102: domain: easysite102.ru aliases: [www.easysite102.ru] type: container upstream: http://easysite:3000 api: http://api_yal:8787/ begushiybashkir: domain: begushiybashkir.ru aliases: [www.begushiybashkir.ru] type: spa root: /usr/share/nginx/begushiybashkir/html api: http://api_bb:8080/ Скрипт-генератор (generate-configs.sh) на основе sites.yml создаёт: - nginx-http.conf — HTTP-блоки - nginx-ssl.conf — HTTPS-блоки для каждого домена, каждый независимо проверяет свой сертификат - nginx-partial-ssl.conf — комбинированный: HTTPS где есть серт, HTTP где нет - certbot-domains.txt — список доменов для certbot - .env — переменные окружения Добавление нового сайта: 1 правка в sites.yml → ./generate-configs.sh → git commit. Фаза 3: Умный nginx — per-domain HTTPS Убрать all-or-nothing switch-config.sh. Вместо этого nginx грузит все конфиги через include: /etc/nginx/conf.d/ ├── 00-http-default.conf # HTTP на 80 ├── 10-yalarba-ssl.conf # HTTPS, если есть серт ├── 20-valitovgaziz-ssl.conf # HTTPS, если есть серт ├── 30-easysite102-ssl.conf # HTTPS, если есть серт └── common/ # Общие настройки Каждый файл SSL генерируется с if-проверкой наличия сертификата: server { listen 443 ssl; server_name valitovgaziz.ru www.valitovgaziz.ru; ssl_certificate /etc/letsencrypt/live/valitovgaziz.ru/fullchain.pem; ... } А HTTP-сервер делает return 301 https://$host$request_uri только для тех доменов, у кого есть сертификат. Остальные работают по HTTP. Фаза 4: Certbot — один скрипт для всех Вместо 5 renew-скриптов: # /opt/renew-all.sh — единый скрипт certbot renew --webroot -w /var/www/certbot Certbot сам знает все домены, для которых получал сертификаты. --webroot с одним -w работает для всех. Убрать: - renewBegushiyBAshkirLatin.sh, renewBegushiyBashkir.sh, renewEasysite102.sh, renewValitovGazizCert.sh, renewYalarbaCert.sh - Заменить checkRenewCerts.sh на вызов certbot renew Фаза 5: Makefile — авто-детект изменений Оставить базовые цели, но добавить: deploy: git @echo "Detecting changes..." @git diff --name-only HEAD~1 HEAD | grep -o 'main_dc/[^/]*/' | sort -u | while read dir; do \ service=$$(basename $$dir); \ if grep -q "^ $$service:" docker-compose.yml; then \ make stop_$$service build_$$service start_$$service; \ fi \ done Или ещё проще: GitHub Actions сам определяет какие сервисы изменились и запускает только их make цели. Дорожная карта Шаг Что делаем Эффект 1 sites.yml + generate-configs.sh Добавление сайта = 1 файл 2 Переход на per-domain HTTPS в nginx Один сайт без серта не ломает другие 3 Упрощение certbot: единый certbot renew Удалить 5 скриптов 4 GitHub Actions deploy workflow push → авто-деплой 5 Makefile: deploy с авто-детектом Быстрый частичный деплой