# Автоматический деплой на LXC + Docker + Nginx Proxy Manager ## Схема работы ``` [Git Push] → [Gitea Actions] → [Build Images] → [Gitea Registry] ↓ [LXC Server] ← [Watchtower] ← [Poll every 60s] ↓ [Nginx Proxy Manager] → [HTTPS] → [frontend:80] ↓ /api/* → [backend:8080] (внутри сети) ``` ## Пошаговая настройка ### 1. Настройка Gitea В конфиге Gitea (`app.ini`) включи registry: ```ini [packages] ENABLED = true ``` Перезапусти Gitea. ### 2. Обнови workflow файл Открой `.gitea/workflows/deploy.yml` и замени: - `gitea.your-domain.com` → на твой домен Gitea - Убедись что путь `${{ gitea.repository_owner }}/delivery-tracker` корректен ### 3. Создай токен в Gitea - Gitea → Settings → Applications → Generate Token - Сохрани токен (понадобится для Watchtower) ### 4. Настройка LXC сервера (если еще не настроен Docker) ```bash curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER newgrp docker ``` ### 5. Клонируй репозиторий на сервер ```bash cd /opt sudo git clone https://gitea.your-domain.com/yourusername/delivery-tracker.git sudo chown -R $USER:$USER delivery-tracker ``` ### 6. Настрой переменные окружения ```bash cd delivery-tracker cp .env.production.example .env nano .env ``` Заполни: - Пароли для PostgreSQL - JWT секрет: `openssl rand -hex 32` - Gitea credentials для Watchtower - `GITEA_REGISTRY` — твой registry (например: `gitea.example.com/yourusername`) ### 7. Логин в Gitea Registry на сервере ```bash docker login gitea.your-domain.com # Введи username и токен/password ``` ### 8. Первый запуск ```bash docker-compose -f docker-compose.prod.yml pull docker-compose -f docker-compose.prod.yml up -d ``` ### 9. Настройка Nginx Proxy Manager Открой веб-интерфейс NPM (обычно `http://server-ip:81` или через твой домен). #### Добавь Proxy Host для приложения: - **Domain Names**: `delivery.yourdomain.com` (замени на свой поддомен) - **Scheme**: `http` - **Forward Hostname/IP**: `frontend` (имя сервиса в docker-compose) - **Forward Port**: `80` - **Cache Assets**: Включи - **Block Common Exploits**: Включи **SSL Tab:** - SSL Certificate: Request a new SSL Certificate - Force SSL: Включи - HTTP/2 Support: Включи **Как это работает:** - NPM проксирует все запросы на frontend контейнер - Frontend nginx сам проксирует `/api/*` запросы на backend через docker network - Backend вообще не доступен извне — только через frontend **Важно**: Контейнеры используют `expose` порты (не `ports`). NPM достучится до `frontend` через docker network если NPM в той же сети, или по IP сервера. #### Подключение NPM к сети контейнеров: Если NPM запущен в другом compose, подключи его к сети delivery-tracker: ```bash docker network connect delivery-tracker_delivery-network npm-app-1 ``` Или используй IP адрес сервера (`172.17.0.1` или `host.docker.internal`) в поле Forward Hostname. ### 10. Проверь автоматическое обновление Watchtower будет каждые 60 секунд проверять новые образы: ```bash docker-compose -f docker-compose.prod.yml logs -f watchtower ``` ## Как работает автодеплой 1. `git push` в main/master 2. Gitea Actions собирает образы → push в Registry 3. Watchtower (60s poll) → проверяет registry → pull новых образов → перезапускает контейнеры 4. NPM продолжает проксировать трафик на обновленные контейнеры ## Ручной деплой ```bash cd /opt/delivery-tracker docker-compose -f docker-compose.prod.yml pull docker-compose -f docker-compose.prod.yml up -d ``` ## Обновление SSL через NPM NPM автоматически обновляет SSL сертификаты Let's Encrypt. Ничего делать не нужно. ## Траблшутинг **Образы не обновляются:** ```bash docker-compose -f docker-compose.prod.yml logs watchtower docker login gitea.your-domain.com ``` **NPM не видит контейнеры:** - Проверь что NPM и delivery-tracker в одной docker-сети - Или используй IP сервера вместо имен сервисов - Проверь `docker network ls` и `docker network inspect delivery-tracker_delivery-network` **Контейнеры не запускаются:** ```bash docker-compose -f docker-compose.prod.yml logs backend docker-compose -f docker-compose.prod.yml logs frontend docker-compose -f docker-compose.prod.yml logs postgres ``` **Frontend не подключается к backend:** - Проверь что frontend nginx проксирует `/api/` на `backend:8080` - Проверь логи frontend: `docker-compose -f docker-compose.prod.yml logs frontend` - Убедись что backend работает: `docker-compose -f docker-compose.prod.yml logs backend`