Текущие проблемы
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_es:8088/

  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_es:8088/

  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 с авто-детектом	Быстрый частичный деплой