mnemo_cards/docs/coolify-migration.md
Dmitry a92cade04f
Some checks failed
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
Deploy Telegram Bot / Deploy Telegram Bot (push) Has been cancelled
Return debug info in API response for admin auth errors
This will show the exact reason for token verification failure
2025-12-12 01:05:05 +03:00

136 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Coolify: перенос сервисов (backend Docker, web статик, внешняя БД)
Цель: перенести существующие сервисы в Coolify (через Traefik/Lets Encrypt), сохранив БД на хосте. Ниже — пошаговая инструкция, Dockerfile-примеры, настройки Coolify и порядок переключения трафика.
## 1. Backend (Dart) в Docker
### Структура образа
- Base (builder): `dart:stable-sdk`
- Runtime: `debian:bookworm-slim` (или distroless)
- Порт: `8081`
- Health: `GET /health` (замените, если другой endpoint)
### Пример Dockerfile
```
# stage: build
FROM dart:stable-sdk AS builder
WORKDIR /app
COPY pubspec.* ./
RUN dart pub get
COPY . .
RUN dart compile exe lib/main.dart -o /app/server
# stage: runtime
FROM debian:bookworm-slim
WORKDIR /app
COPY --from=builder /app/server /app/server
EXPOSE 8081
CMD ["/app/server", "-a", "0.0.0.0", "-p", "8081"]
```
### Env для внешней БД (БД остаётся на хосте)
- `DB_HOST` — IP хоста (обычно `172.17.0.1` или реальный публичный/приватный IP)
- `DB_PORT` — порт вашей БД
- `DB_NAME`, `DB_USER`, `DB_PASSWORD`
- Если нужен TLS к БД: добавить флаги клиента/сертификаты
### Настройка сети/Traefik
- В сервисе (compose) добавить:
```
networks:
- coolify
extra_hosts:
- "host.docker.internal:host-gateway"
```
- Traefik (через Coolify UI → Domains):
- Domain: `api.mnemo-cards.online`
- EntryPoints: `websecure`
- Cert resolver: `le`
- HTTP→HTTPS редирект уже есть через middleware redirectscheme
### Шаги в Coolify (UI)
1. Project → Environment → New Service → Dockerfile.
2. Указать репозиторий/ветку и путь к Dockerfile.
3. Env: `DB_HOST`, `DB_PORT`, `DB_NAME`, `DB_USER`, `DB_PASSWORD` (+ ваши APP_*).
4. Network: подключить `coolify`.
5. Domains: `api.mnemo-cards.online`, entrypoint `websecure`, resolver `le`.
6. Healthcheck: HTTP 200 на `/health` (или ваш путь).
## 2. Web и Admin (Flutter Web) как статика в контейнере
### Сборка
```
flutter build web --release \
--dart-define=API_BASE_URL=https://api.mnemo-cards.online
```
Артефакт: `build/web/`.
### Пример Dockerfile (nginx)
```
FROM nginx:1.27-alpine
COPY build/web/ /usr/share/nginx/html/
RUN rm /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
```
`default.conf`:
```
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /assets/ {
try_files $uri =404;
add_header Cache-Control "public, max-age=31536000, immutable";
}
}
```
### Разделение сервисов
- Web: домен `mnemo-cards.online`
- Admin: домен `admin.mnemo-cards.online`
Рекомендуется два сервиса в Coolify (два образа или один образ + разные домены).
### Шаги в Coolify
1. New Service → Dockerfile/Image (web).
2. Network: `coolify`.
3. Domains:
- web: `mnemo-cards.online` → entrypoint `websecure`, resolver `le`.
- admin: `admin.mnemo-cards.online` (отдельный сервис либо второй домен).
4. Healthcheck: HEAD `/` (200/301/302).
## 3. Traefik/LE (уже поднят)
- Порты 80/443 заняты Traefik.
- Все сервисы должны быть в сети `coolify`.
- Для каждого домена в Coolify задать entrypoint `websecure` и resolver `le`; HTTP→HTTPS редирект активен.
## 4. Порядок миграции/катовера
1) Собрать и запушить образы:
- backend (Dart) → registry.
- web/admin статика → отдельные образы.
2) Создать сервисы в Coolify (backend, web, admin) c env и доменами.
3) Протестировать:
- Временно через hosts или временный домен (Coolify supports additional domain).
- Проверить доступ к БД из контейнера (psql/curl).
4) Подключить боевые домены:
- `api.mnemo-cards.online`, `mnemo-cards.online`, `admin.mnemo-cards.online`.
5) Переключить трафик:
- Остановить legacy systemd backend и nginx, когда новые сервисы отвечают.
6) Мониторинг/откат:
- При проблемах: стартануть старый systemd/nginx (бэкап конфигов: `/root/pre-coolify-backup-2025-12-07.tar.gz`).
## 5. Проверки после миграции
- HTTPS: `curl -I https://api.mnemo-cards.online`, `https://mnemo-cards.online`, `https://admin.mnemo-cards.online` → 200/301/302, валидный LE.
- Health: все сервисы green в Coolify; backend `/health` 200.
- БД: приложение читает/пишет (прогнать базовый сценарий).
- Логи: нет ошибок подключения к БД/Redis.
- Сеть: наружу открыты только 80/443 (Traefik); внутренние порты не публиковать.
## 6. Что остаётся на хосте
- База данных остаётся на сервере; контейнеры подключаются как к внешнему ресурсу (`DB_HOST` = IP хоста).
- Traefik/LE уже работают в Docker, используется resolver `le`.