.gitignore was ignoring these files, causing them to be missing on fresh checkout (e.g. after git pull on server), which broke the Docker build. Removed the ignore entries so the files are tracked by git.
Текущие проблемы
- Деплой в 5 шагов: локальный код → push → SSH → pull → make (ручной, медленный)
- Добавление нового сайта требует правки 7+ файлов: .env, docker-compose.yml, nginx-http.conf, nginx-ssl.conf, switch-config.sh, init-certbot.sh, checkRenewCerts.sh, Makefile — легко забыть что-то
- HTTPS all-or-nothing: если у одного домена нет сертификата — все сайты падают на HTTP
- Certbot: дублирование кода на каждый домен в init-certbot.sh, checkRenewCerts.sh и 5 отдельных renew-скриптов
- Makefile растёт — на каждый сервис 4-5 целей
Предложение
Фаза 1: CI/CD через GitHub Actions
Создать .github/workflows/deploy.yml:
name: Deploy
on:
push:
branches: [main]
paths:
- 'main_dc/**'Текущие проблемы
- Деплой в 5 шагов: локальный код → push → SSH → pull → make (ручной, медленный)
- Добавление нового сайта требует правки 7+ файлов: .env, docker-compose.yml, nginx-http.conf, nginx-ssl.conf, switch-config.sh, init-certbot.sh, checkRenewCerts.sh, Makefile — легко забыть что-то
- HTTPS all-or-nothing: если у одного домена нет сертификата — все сайты падают на HTTP
- Certbot: дублирование кода на каждый домен в init-certbot.sh, checkRenewCerts.sh и 5 отдельных renew-скриптов
- 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 с авто-детектом Быстрый частичный деплой