169 lines
5.7 KiB
Markdown
169 lines
5.7 KiB
Markdown
# Автоматический деплой на 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`
|