90a96b4125
- 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
223 lines
11 KiB
Markdown
223 lines
11 KiB
Markdown
Текущие проблемы
|
||
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 с авто-детектом Быстрый частичный деплой |