- Remove api_es service, Dockerfile, all Go source files - Remove api_es from docker-compose.yml, nginx-ssl.conf, .env, Makefile - Replace nginx /api/ proxy with /api/v1/ → api_yal:8787 - Add amenity/upload domains, AuthResponse, GET /auth/me, GET /objects/my to api_yal - Rewrite easysite frontend: types, composables, and all 5 pages to use api_yal DTOs - Wire nuxt.config public.apiBase, add useObjects CRUD composable - Update docs references from api_es to api_yal
11 KiB
Текущие проблемы
- Деплой в 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 с авто-детектом Быстрый частичный деплой