# Настройка Traefik File Provider для Global-IT24

## 📋 Архитектура

```
[Сервер с Traefik]              [Сервер с приложением]
     Traefik                     docker-compose.yml
   (порт 80/443)  ──────────►    (порт 3000)
   + file provider                - postgres
   + SSL/TLS                      - nextjs-app
```

## 🔧 Настройка на сервере с Traefik

### 1. Структура файлов Traefik

Обычно на сервере с Traefik:
```
/etc/traefik/
├── traefik.yml         # Статическая конфигурация
└── dynamic/            # Динамическая конфигурация (file provider)
    └── global-it24.yml # ← Конфигурация для вашего приложения
```

### 2. Проверьте traefik.yml (статическая конфигурация)

Убедитесь, что включен file provider:

```yaml
# /etc/traefik/traefik.yml
providers:
  file:
    directory: /etc/traefik/dynamic
    watch: true  # Автоматическая перезагрузка при изменении файлов

certificatesResolvers:
  letsencrypt:
    acme:
      email: your-email@example.com
      storage: /etc/traefik/acme.json
      httpChallenge:
        entryPoint: web
```

### 3. Создайте файл для приложения

```bash
# На сервере с Traefik
sudo nano /etc/traefik/dynamic/global-it24.yml
```

Скопируйте содержимое файла `traefik-file-provider.yml` из репозитория.

**ВАЖНО:** Замените `IP_ХОСТА_С_ПРИЛОЖЕНИЕМ` на реальный IP:

```yaml
http:
  services:
    global-it24-service:
      loadBalancer:
        servers:
          - url: "http://192.168.1.100:3000"  # ← Ваш IP
```

### 4. Проверьте конфигурацию

```bash
# Проверка синтаксиса (если Traefik запущен локально)
traefik validate --configFile=/etc/traefik/traefik.yml

# Или просто проверьте логи после сохранения файла
docker logs traefik --tail 50 -f
```

Должно появиться сообщение:
```
Configuration loaded from file: /etc/traefik/dynamic/global-it24.yml
```

### 5. Проверка работы

```bash
# Проверка DNS
dig video.mscsrv.ru

# Проверка доступности приложения
curl -I http://IP_ХОСТА_С_ПРИЛОЖЕНИЕМ:3000

# Проверка через Traefik
curl -I https://video.mscsrv.ru
```

## 🔒 Firewall на сервере с приложением

Разрешите доступ к порту 3000 **только** с IP сервера Traefik:

```bash
# Узнайте IP сервера Traefik
# Например: 203.0.113.50

# Разрешите доступ только с IP Traefik
sudo ufw allow from 203.0.113.50 to any port 3000 proto tcp comment 'Traefik proxy'

# Или если используете firewalld
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" port protocol="tcp" port="3000" accept'
sudo firewall-cmd --reload
```

## 📝 Изменение домена

Если нужно изменить домен с `video.mscsrv.ru` на другой:

### На сервере с Traefik:

```bash
sudo nano /etc/traefik/dynamic/global-it24.yml
```

Измените:
```yaml
rule: "Host(`новый-домен.ru`)"
```

### На сервере с приложением:

1. Измените `.env`:
```bash
nano /home/ubuntu/global_it24_landing/.env
```

```env
NEXT_PUBLIC_SITE_URL=https://новый-домен.ru
```

2. Пересоберите приложение:
```bash
cd /home/ubuntu/global_it24_landing
./deploy-simple.sh
```

## 🔍 Отладка

### Проблема: 502 Bad Gateway

**Причины:**
1. Приложение не запущено
2. Неправильный IP в конфигурации
3. Firewall блокирует порт 3000
4. Приложение не отвечает на healthcheck

**Проверка:**

```bash
# На сервере с приложением
cd /home/ubuntu/global_it24_landing
./status.sh

# Должно показать:
# ✅ global-it24-landing Up (healthy)

# Проверка доступности с сервера Traefik
# (выполните на сервере с Traefik)
curl -I http://IP_ПРИЛОЖЕНИЯ:3000
```

### Проблема: 404 Not Found

**Причина:** Traefik не нашел роутер для домена

**Проверка:**

```bash
# На сервере с Traefik
cat /etc/traefik/dynamic/global-it24.yml | grep "Host("

# Должно показать:
# rule: "Host(`video.mscsrv.ru`)"

# Проверьте что домен резолвится на IP сервера Traefik
dig video.mscsrv.ru +short
```

### Проблема: SSL сертификат не выдается

**Причины:**
1. DNS не настроен
2. Порт 80 недоступен (нужен для ACME challenge)
3. Неверный email в конфигурации

**Проверка:**

```bash
# Проверьте логи Traefik
docker logs traefik | grep -i acme

# Проверьте доступность порта 80
curl -I http://video.mscsrv.ru/.well-known/acme-challenge/test
```

## 📊 Мониторинг

### На сервере с приложением:

```bash
# Логи приложения
cd /home/ubuntu/global_it24_landing
./logs.sh

# Статус контейнеров
./status.sh

# Использование ресурсов
docker stats global-it24-landing global-it24-postgres
```

### На сервере с Traefik:

```bash
# Логи Traefik
docker logs traefik --tail 100 -f

# Dashboard Traefik (если включен)
# https://traefik.mscsrv.ru/dashboard/
```

## 🔄 Обновление приложения

```bash
# На сервере с приложением
cd /home/ubuntu/global_it24_landing
git pull origin master
./deploy-simple.sh

# Traefik автоматически переключится на новую версию
# после прохождения healthcheck
```

## 🎯 Дополнительные настройки

### Rate Limiting (ограничение запросов)

Добавьте в `/etc/traefik/dynamic/global-it24.yml`:

```yaml
http:
  middlewares:
    global-it24-ratelimit:
      rateLimit:
        average: 100  # запросов в секунду
        burst: 200
        period: 1s

  routers:
    global-it24-router:
      middlewares:
        - global-it24-compress
        - global-it24-headers
        - global-it24-ratelimit  # ← Добавьте
```

### IP Whitelist (разрешить доступ только с определенных IP)

```yaml
http:
  middlewares:
    global-it24-ipwhitelist:
      ipWhiteList:
        sourceRange:
          - "203.0.113.0/24"
          - "198.51.100.50"

  routers:
    global-it24-router:
      middlewares:
        - global-it24-ipwhitelist  # ← Добавьте
```

### Редирект с www на без www

Раскомментируйте секцию в конце файла `traefik-file-provider.yml`:

```yaml
http:
  routers:
    global-it24-www-redirect:
      rule: "Host(`www.video.mscsrv.ru`)"
      service: noop@internal
      entryPoints:
        - websecure
      middlewares:
        - global-it24-www-to-non-www
      tls:
        certResolver: letsencrypt

  middlewares:
    global-it24-www-to-non-www:
      redirectRegex:
        regex: "^https://www\\.video\\.mscsrv\\.ru/(.*)"
        replacement: "https://video.mscsrv.ru/$${1}"
        permanent: true
```

## 📞 Контакты

**Репозиторий:** `git.mscsrv.ru/sa/global_it24_landing.git`

---

**Последнее обновление:** $(date +"%Y-%m-%d")
