План миграции сайта на новую инфраструктуру и репозиторий
1. Текущее положение вещей (as-is)
Инфраструктура
-
2 ВМ с внешними адресами.
-
Nginx настроен на backend-сервере и является точкой входа для фронта и API:
- site.uz → frontend
- api.site.uz → backend
-
Frontend обращается к backend по внешнему домену (api.site.uz).
-
База MySQL находится на backend-сервере.
CI/CD
- GitLab CI/CD “полумёртвый”: фактически выполняет git pull, npm install, restart.
- Контейнеризация отсутствует в проде.
- Локально уже собраны Dockerfile и есть docker-compose (через костыли).
Проблемы
- Деплой не воспроизводим.
- Нет нормального разделения ролей (edge/app/db).
- Наблюдаемость слабая или отсутствует.
- Трудно безопасно масштабировать и сопровождать.
2. Переработка репозитория (to-be)
Цель
- Перейти на GitHub (организация).
- Сделать monorepo: backend + client в одном репозитории.
- Сохранить простоту, но обеспечить правильный фундамент.
Решение
- Laravel и Next в одном репозитории, но в отдельных папках.
- Перенести Next в подпапку frontend/.
- Добавить infra/ для docker-compose, nginx-конфигов, скриптов деплоя.
- Настроить GitHub Actions + GHCR.
Плюсы
- Единый источник правды: код + инфраструктура + документация.
- Воспроизводимые сборки (через контейнерные образы).
- Атомарные изменения API + UI.
- Готовность к будущему Kubernetes без необходимости переписывать приложение.
3. Структура monorepo (рекомендуемая)
Ключевой принцип: backend и client изолированы, инфраструктура рядом, но не смешана с кодом приложения.
repo/
backend/
app/
bootstrap/
config/
database/
public/
resources/
routes/
storage/
tests/
composer.json
artisan
Dockerfile
frontend/
src/
public/
package.json
next.config.*
tsconfig.json
Dockerfile
infra/
compose/
docker-compose.dev.yml
docker-compose.prod.yml
nginx/
edge/
site.conf
api.conf
app/
laravel.conf
scripts/
deploy_prod.sh
migrate_prod.sh
rollback_prod.sh
env/
backend.env.example
client.env.example
prod.env.example
.github/
workflows/
build_backend.yml
build_client.yml
deploy_prod.yml
docs/
architecture.md
runbook.md
deploy.md
README.md
Примечания
- В production-репозитории не хранить реальные .env.prod.
- Хранить только .env.example и шаблоны.
- Теги образов в registry должны быть по git sha.
4. Переработка инфраструктуры (to-be)
Цель
Сделать минимально правильную схему, не усложняя её HA, балансировщиками и Kubernetes.
Выбранная топология: вариант C (3 ВМ)
-
VM1: edge
- Nginx reverse proxy
- TLS termination
- Роутинг по доменам
- Кеширование и сжатие статики
-
VM2: app
- Docker Compose production
- Next.js runtime (SSR)
- Laravel (php-fpm)
- Worker (очереди)
- Scheduler
- Redis (опционально)
-
VM3: db
- MySQL нативно на хосте (не в Docker)
- Бэкапы на VM3 в отдельный каталог
- Offsite-перенос бэкапов через rsync pull на удалённые хосты
Сеть
- Приватная сеть выделенная под prod subnet.
- Снаружи доступна только VM1 (edge).
- VM2 и VM3 не имеют публичных сервисов.
5. CI/CD (минимально правильный)
GitHub Actions
- Сборка Docker-образов backend и client.
- Пуш в GHCR.
- Деплой на VM2 через pull образов + docker compose up -d.
- Миграции Laravel выполняются как отдельный шаг в деплое.
Особенность, важная для вашего режима (downtime ok)
- Деплой можно делать простым рестартом сервисов.
- Но миграции и рестарт worker лучше выполнять контролируемо и в фиксированном порядке.
6. Наблюдаемость
Минимальный набор, который окупается
- AppSignal для Laravel (APM, ошибки, метрики).
- AppSignal (или альтернативный error monitoring) для Next.
- Базовые метрики по хостам (CPU, RAM, disk, IO) для VM1/VM2/VM3.
7. Финальная схема инфраструктуры
План действий (high-level)
1. Репозиторий
- Создать GitHub org repo (monorepo).
- Перенести Laravel в backend/.
- Перенести Next в client/.
- Добавить infra/ (compose, nginx, scripts, env examples).
- Привести README + docs/ (architecture, deploy, runbook).
2. Контейнеризация
- Довести Dockerfile backend и client до production-готовности.
- Сделать docker-compose.prod.yml под VM2 (app) и docker-compose.dev.yml для локалки.
- Убедиться, что все сервисы пишут логи в stdout/stderr.
3. Nginx
- Подготовить edge-конфиги (VM1): site.uz и api.site.uz → прокси на VM2 по private IP.
- Подготовить app-конфиг (VM2) для Laravel (nginx → php-fpm).
- Добавить кеширование/заголовки для Next статики на edge.
4. База данных
- Развернуть MySQL нативно на VM3.
- Настроить создание пользователя, базы, доступ только из private сети.
- Перенести данные со старого MySQL (dump/restore).
5. Бэкапы
- На VM3 настроить backup job (mysqldump или xtrabackup) в отдельную директорию.
- Настроить rsync pull на удалённый хост (offsite).
6. GitHub Actions + registry
- Настроить GHCR.
- Добавить workflow сборки backend и client образов с тегом git sha.
- Добавить workflow деплоя на VM2: pull → compose up -d → migrate → restart worker.
7. Прод окружение
- Поднять VM1 (edge), VM2 (app), VM3 (db) в отдельной prod subnet.
- Закрыть публичные порты на VM2/VM3, наружу оставить только VM1.
8. Мониторинг
- Подключить AppSignal в Laravel.
- Подключить мониторинг ошибок/метрик для Next (AppSignal или альтернативу).
- Поставить простой агент метрик на VM1/VM2/VM3 + алерты по диску на VM3.
9. Переключение трафика
- Прогнать тестовый деплой.
- Переключить DNS на новый edge.
- Зафиксировать runbook “как деплоим / как откатываем / где бэкапы”.
10. После стабилизации
- Упростить/укрепить деплой (path-фильтры, кеши, smoke checks).
- Только если появится реальная потребность: думать про k8s, HA, балансировку.