# План переноса существующих сервисов в Docker

Документ описывает безопасный поэтапный перенос сервисов, которые сейчас работают на TurnKey LAMP напрямую. Цель — не нарушить работу двух организаций, существующих доменов, Apache, Certbot и внешних API.

## 1. Инвентаризация

- Составить список сайтов, API, фоновых процессов, cron-задач и systemd-сервисов.
- Для каждого сервиса зафиксировать домены, внешние порты, внутренние порты, каталог проекта и владельца процесса.
- Собрать текущую конфигурацию Apache: `apachectl -S`, включённые модули и vhost-файлы.
- Зафиксировать NAT-правила MikroTik и не менять их без отдельного плана.
- Определить базы данных, версии СУБД, объём данных, пользователей и расписание резервного копирования.
- Найти все секреты, сертификаты, ключи API и файлы окружения; исключить их из Git.

## 2. Резервное копирование и наблюдаемость

- Настроить ежедневные дампы баз данных с хранением нескольких последних копий.
- Сделать архивы текущих конфигураций Apache, systemd, cron и каталогов проектов.
- Проверить восстановление хотя бы одной тестовой копии.
- Добавить проверку доступности сайтов и API после каждого этапа миграции.
- Описать процедуру отката: остановить контейнер, вернуть старый vhost и запустить исходный systemd-сервис.

## 3. Единая Docker-инфраструктура

- Установить Docker Engine и Compose Plugin.
- Создать отдельные Compose-проекты, сети и volumes для организаций или сервисов.
- Не публиковать базы данных и внутренние API наружу без необходимости.
- Использовать фиксированные образы и отдельные `.env`-файлы с правами `600`.
- Настроить лимиты ресурсов, `restart: unless-stopped`, healthcheck и ротацию логов.

## 4. Сетевой слой и Apache

- Оставить Apache единой внешней точкой входа для доменов, которые уже обслуживаются через него.
- Для каждого домена использовать отдельный vhost и отдельный upstream-порт контейнера.
- Не занимать порты, используемые NAT и действующими API.
- Проверять конфигурацию командой `apachectl configtest` перед каждым reload.
- Применять `systemctl reload apache2`, а не restart, если нет необходимости полностью перезапускать Apache.
- Для новых HTTPS-доменов использовать Certbot с отдельным сертификатом или SAN-набором после проверки всех DNS-записей.

## 5. Миграция одного сервиса

1. Выбрать сервис с минимальным риском.
2. Зафиксировать его текущие порты, процессы, зависимости и контрольные URL.
3. Подготовить Dockerfile, Compose-файл, healthcheck и отдельный volume.
4. Запустить контейнер на временном localhost-порту.
5. Проверить API, фоновые задачи, доступ к базе и исходящие интеграции.
6. Подготовить Apache vhost с временным тестовым доменом или локальным Host-заголовком.
7. Переключить трафик после проверки.
8. Наблюдать сервис и логи минимум один рабочий цикл.
9. Только после подтверждения удалить или отключить старый systemd/cron-процесс.

## 6. Очерёдность

- Сначала stateless-сайты и простые API.
- Затем сервисы с отдельными базами после проверки восстановления.
- В последнюю очередь платёжные, доставочные, Telegram/SMS-интеграции и сервисы с жёсткими требованиями к исходящему IP.
- Переносить не более одного критичного сервиса за раз.

## 7. Финальная уборка

- Проверить, что старые процессы не слушают перенесённые порты.
- Удалить неиспользуемые vhost’ы только после подтверждённого периода стабильной работы.
- Обновить документацию доменов, портов, volumes, секретов, резервных копий и процедуры отката.
- Настроить регулярное обновление образов и контролируемое обновление Docker/ОС.
