План: сервер Tucktag на Oracle Cloud (OCI), CI/CD из GitHub, доступ из IntelliJ
План: сервер Tucktag на Oracle Cloud (OCI), CI/CD из GitHub, доступ из IntelliJ
Черновик для владельца (msg 2265, 2026-10-15). После одобрения он станет seed и пойдёт по конвейеру. Факты об OCI — из моих знаний на середину 2026 года. Пункты с «проверить» воркер сверит с документацией Oracle до начала работ.
Что у нас есть
- Сервер: Spring Boot, Java 25, PostgreSQL 18. Есть Dockerfile и compose.yaml для разработки.
- Настройки сервера — переменные окружения
TUCKTAG_*(база, ключи, Google, Telegram, Firebase). - Есть чек-лист запуска в прод: docs/ops/runbooks/RUNBOOK-05 (домен, TLS, секреты, Google, Telegram webhook, Firebase).
- В репозитории нет GitHub Actions.
Целевая схема
GitHub (push в main)
│ 1. тесты сервера (unit)
│ 2. сборка образа linux/arm64
│ 3. образ → GHCR (реестр GitHub)
│ 4. деплой: ждёт твоего «Approve» (environment production)
▼
OCI VM (Ampere A1, Ubuntu, Always Free)
├─ Caddy :443 → HTTPS (Let's Encrypt), домен
├─ tucktag-server :8080 (только внутри)
├─ PostgreSQL :5432 (только внутри)
└─ ночной pg_dump → OCI Object Storage
IntelliJ ── SSH-туннель ──► база, логи, отладка
Фаза 0. Решения (твои)
- Домен для сервера. Нужен для HTTPS и Google-входа.
- Как CI попадает на VM (см. Фаза 4): SSH из GitHub (рекомендую) или VM сама забирает образ.
- Что значит «подключаться из IntelliJ» (см. Фаза 5).
- Перевести аккаунт OCI на Pay-As-You-Go. Рекомендую: бесплатные лимиты остаются, Oracle не забирает «простаивающую» VM. Ставим бюджет-алерт на 1 $.
Фаза 1. Аккаунт и сеть OCI (делаешь ты в консоли, я даю шаги)
- Проверь домашний регион. Его нельзя сменить. Ampere A1 там бывает «Out of capacity» — тогда пробуем позже или другой домен доступности.
- Включи MFA на аккаунт.
- Создай compartment
tucktag. - Создай VCN мастером «VCN with Internet Connectivity».
- Security List: вход только 22 (SSH), 80 и 443. Порт 5432 и 8080 наружу НЕ открываем.
Фаза 2. VM (ты в консоли, дальше воркер по SSH — только с твоей командой)
- Instance: shape VM.Standard.A1.Flex, 4 OCPU, 24 GB RAM (весь бесплатный лимит — проверить), образ Ubuntu 24.04, диск 100–150 GB (лимит 200 GB на все диски).
- Добавь свой SSH-ключ. Вход по паролю выключен.
- Зарезервируй публичный IP (Reserved Public IP), направь на него DNS домена.
- На VM: Docker и compose, пользователь
deployбез sudo-пароля только для docker, fail2ban, автообновления безопасности. - Ловушка: образы Ubuntu в OCI закрывают порты в iptables на самой VM. Нужно открыть 80 и 443 и там, не только в Security List.
Фаза 3. Прод-конфиг в репозитории (воркер, отдельная ветка)
server/compose.prod.yaml: postgres, server (образ из GHCR по тегу), caddy. Лимиты памяти. Тома для базы, builds, holiday-media.server/Caddyfile: домен → server:8080, HTTPS автоматически.- Секреты: файл
.envтолько на VM (права 600). В git — только.env.example. Свежие прод-секреты по RUNBOOK-05 §2.3. - Новый runbook: RUNBOOK-07 «OCI»: создание VM, деплой, откат, восстановление базы.
Фаза 4. CI/CD в GitHub (воркер)
.github/workflows/server.yml:- на PR и push: unit-тесты сервера (
*UnitTests,*ModularityTests); - на push в main: сборка образа linux/arm64 → GHCR, тег = версия + коммит;
- job deploy: environment
productionс обязательным одобрением (ты нажимаешь «Approve»).
- на PR и push: unit-тесты сервера (
- Деплой (вариант А, рекомендую): SSH на VM под
deploy→docker compose pull && up -d→ проверка/actuator/health→ при провале откат на прошлый тег. Вариант Б: VM сама опрашивает GHCR. Нет входа SSH из GitHub, но нет и кнопки одобрения в GitHub. - Сборка arm64: раннер GitHub
ubuntu-24.04-arm(проверить: бесплатен ли он для приватного репозитория). Запасной путь — buildx с QEMU (медленно, ~3–5x). - Секреты GitHub: SSH-ключ деплоя, host. Прод-секреты сервера в GitHub не кладём.
- Ограничение: пуш workflow-файлов в GitHub — только по твоему слову, по нашим правилам пуша.
Фаза 5. IntelliJ (выбери, что нужно)
- База: Database tool window → PostgreSQL через SSH-туннель (порт 5432 наружу закрыт). Только чтение по умолчанию: отдельный пользователь БД с правами read-only.
- Логи и контейнеры: плагин Docker → подключение к Docker на VM по SSH.
- Отладка: Remote JVM Debug через SSH-туннель на порт 5005. JDWP включаем только на время отладки — это дыра, если оставить.
- Терминал и файлы: SSH-конфигурация в IntelliJ (терминал, SFTP).
- Remote Development (Gateway): IDE-бэкенд на VM. Не рекомендую на прод-VM: он ест 2–4 GB RAM рядом с сервером.
Фаза 6. Бэкапы и наблюдение
- Ночной
pg_dump→ OCI Object Storage (бесплатно 20 GB — проверить), хранение 14 дней. - Раз в месяц — проверка восстановления на копии.
- Бэкап загрузочного диска (бесплатно до 5 — проверить).
- Алерт: OCI Monitoring или внешний пинг
/actuator/health; сообщение в Telegram.
Риски
- Ampere A1 может не создаться из-за нехватки мощности в регионе.
- Always Free без Pay-As-You-Go: Oracle может забрать VM при низкой нагрузке 7 дней.
- База на той же VM: потеря VM = восстановление из бэкапа. Платная управляемая PostgreSQL в OCI не бесплатна.
- Образ должен быть arm64: проверить все зависимости (Temurin 25 — есть arm64).
Кто что делает
| Шаг | Кто |
|---|---|
| Консоль OCI, домен, DNS, MFA, PAYG | ты (я даю шаги) |
| compose.prod, Caddyfile, workflow, runbook | воркер (Codex), ревью независимым ревьюером (это деплой и секреты) |
| Настройка VM по SSH | воркер, только с твоей командой и твоим ключом доступа |
| Пуш в GitHub, первый деплой, «Approve» | только по твоему слову |