Конфигурация для внешнего Traefik
This commit is contained in:
File diff suppressed because one or more lines are too long
12
.env.example
12
.env.example
@@ -1,9 +1,17 @@
|
|||||||
|
|
||||||
# Домен вашего сайта
|
# Домен вашего сайта
|
||||||
DOMAIN=global-it24.example.com
|
DOMAIN=video.mscsrv.ru
|
||||||
|
|
||||||
# URL сайта (используется для метатегов и canonical URL)
|
# URL сайта (используется для метатегов и canonical URL)
|
||||||
NEXT_PUBLIC_SITE_URL=https://global-it24.example.com
|
NEXT_PUBLIC_SITE_URL=https://video.mscsrv.ru
|
||||||
|
|
||||||
|
# IP адреса
|
||||||
|
# Traefik хост
|
||||||
|
TRAEFIK_HOST=192.168.50.59
|
||||||
|
|
||||||
|
# IP этого сервера (где запущен контейнер)
|
||||||
|
# Укажите IP текущего хоста в локальной сети
|
||||||
|
APP_HOST_IP=192.168.50.X
|
||||||
|
|
||||||
# Для production окружения
|
# Для production окружения
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
|
|||||||
@@ -1,122 +1,55 @@
|
|||||||
|
|
||||||
# Инструкция по развертыванию Global-IT24 на Ubuntu с Traefik
|
# Инструкция по развертыванию Global-IT24 на Ubuntu с внешним Traefik
|
||||||
|
|
||||||
|
## Архитектура
|
||||||
|
|
||||||
|
- **Traefik:** 192.168.50.59 (внешний хост)
|
||||||
|
- **Приложение:** Ваш сервер (докер контейнер на порту 3000)
|
||||||
|
- **Домен:** video.mscsrv.ru
|
||||||
|
|
||||||
## Предварительные требования
|
## Предварительные требования
|
||||||
|
|
||||||
1. Ubuntu Server (20.04 или новее)
|
1. Ubuntu Server (20.04 или новее)
|
||||||
2. Docker и Docker Compose установлены
|
2. Docker и Docker Compose установлены
|
||||||
3. Traefik настроен как reverse proxy
|
3. Traefik уже настроен на хосте 192.168.50.59
|
||||||
4. Домен направлен на ваш сервер
|
4. Домен video.mscsrv.ru направлен на 192.168.50.59
|
||||||
|
5. Сетевая связность между хостами (порт 3000 доступен из 192.168.50.59)
|
||||||
|
|
||||||
## Шаг 1: Настройка Traefik
|
## Шаг 1: Подготовка сервера приложения
|
||||||
|
|
||||||
Если Traefik еще не настроен, создайте базовую конфигурацию:
|
### 1.1 Установка Docker (если не установлен)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Создайте сеть для Traefik
|
# Обновление системы
|
||||||
docker network create traefik-public
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
# Создайте директорию для Traefik
|
# Установка зависимостей
|
||||||
mkdir -p ~/traefik
|
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
|
||||||
cd ~/traefik
|
|
||||||
|
# Добавление репозитория Docker
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
|
|
||||||
|
# Установка Docker
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||||||
|
|
||||||
|
# Добавление пользователя в группу docker
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
newgrp docker
|
||||||
|
|
||||||
|
# Проверка установки
|
||||||
|
docker --version
|
||||||
|
docker compose version
|
||||||
```
|
```
|
||||||
|
|
||||||
Создайте `docker-compose.yml` для Traefik:
|
### 1.2 Подготовка проекта
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
|
||||||
traefik:
|
|
||||||
image: traefik:v2.10
|
|
||||||
container_name: traefik
|
|
||||||
restart: unless-stopped
|
|
||||||
security_opt:
|
|
||||||
- no-new-privileges:true
|
|
||||||
networks:
|
|
||||||
- traefik-public
|
|
||||||
ports:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
volumes:
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
||||||
- ./traefik.yml:/traefik.yml:ro
|
|
||||||
- ./acme.json:/acme.json
|
|
||||||
- ./config.yml:/config.yml:ro
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.http.routers.traefik.entrypoints=web"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
traefik-public:
|
|
||||||
external: true
|
|
||||||
```
|
|
||||||
|
|
||||||
Создайте `traefik.yml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
api:
|
|
||||||
dashboard: true
|
|
||||||
insecure: false
|
|
||||||
|
|
||||||
entryPoints:
|
|
||||||
web:
|
|
||||||
address: ":80"
|
|
||||||
http:
|
|
||||||
redirections:
|
|
||||||
entryPoint:
|
|
||||||
to: websecure
|
|
||||||
scheme: https
|
|
||||||
websecure:
|
|
||||||
address: ":443"
|
|
||||||
http:
|
|
||||||
tls:
|
|
||||||
certResolver: letsencrypt
|
|
||||||
|
|
||||||
providers:
|
|
||||||
docker:
|
|
||||||
endpoint: "unix:///var/run/docker.sock"
|
|
||||||
exposedByDefault: false
|
|
||||||
network: traefik-public
|
|
||||||
file:
|
|
||||||
filename: /config.yml
|
|
||||||
|
|
||||||
certificatesResolvers:
|
|
||||||
letsencrypt:
|
|
||||||
acme:
|
|
||||||
email: your-email@example.com
|
|
||||||
storage: acme.json
|
|
||||||
httpChallenge:
|
|
||||||
entryPoint: web
|
|
||||||
```
|
|
||||||
|
|
||||||
Создайте файл для SSL сертификатов:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
touch acme.json
|
# Перейдите в директорию проекта
|
||||||
chmod 600 acme.json
|
cd /path/to/global_it24_landing
|
||||||
```
|
|
||||||
|
|
||||||
Запустите Traefik:
|
# Создайте .env файл
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## Шаг 2: Развертывание Global-IT24
|
|
||||||
|
|
||||||
1. **Клонируйте или скопируйте проект на сервер:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /home/your-user
|
|
||||||
# Скопируйте папку global_it24_landing на сервер
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Создайте .env файл:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd global_it24_landing
|
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
nano .env
|
nano .env
|
||||||
```
|
```
|
||||||
@@ -124,66 +57,373 @@ nano .env
|
|||||||
Отредактируйте `.env`:
|
Отредактируйте `.env`:
|
||||||
|
|
||||||
```env
|
```env
|
||||||
DOMAIN=ваш-домен.ru
|
DOMAIN=video.mscsrv.ru
|
||||||
NEXT_PUBLIC_SITE_URL=https://ваш-домен.ru
|
NEXT_PUBLIC_SITE_URL=https://video.mscsrv.ru
|
||||||
|
TRAEFIK_HOST=192.168.50.59
|
||||||
|
APP_HOST_IP=192.168.50.X # Замените на IP текущего сервера
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Соберите и запустите контейнер:**
|
### 1.3 Проверка сетевой доступности
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Сборка образа
|
# Узнайте IP текущего хоста
|
||||||
docker-compose build
|
hostname -I
|
||||||
|
|
||||||
# Запуск контейнера
|
# С хоста Traefik (192.168.50.59) должен быть доступ к этому IP:3000
|
||||||
docker-compose up -d
|
# Проверьте после запуска контейнера
|
||||||
|
|
||||||
# Проверка логов
|
|
||||||
docker-compose logs -f
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Шаг 3: Проверка работы
|
## Шаг 2: Запуск приложения
|
||||||
|
|
||||||
1. Откройте браузер и перейдите на ваш домен
|
### 2.1 Сборка и запуск контейнера
|
||||||
2. Проверьте, что HTTPS работает корректно
|
|
||||||
3. Проверьте мобильную версию сайта
|
```bash
|
||||||
|
# Автоматическое развертывание
|
||||||
|
./deploy.sh
|
||||||
|
|
||||||
|
# Или вручную:
|
||||||
|
docker compose build --no-cache
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 Проверка работы контейнера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка статуса
|
||||||
|
./status.sh
|
||||||
|
# или
|
||||||
|
docker compose ps
|
||||||
|
|
||||||
|
# Просмотр логов
|
||||||
|
./logs.sh
|
||||||
|
# или
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
# Проверка доступности локально
|
||||||
|
curl http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 Проверка доступности из сети
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# С хоста Traefik (192.168.50.59) выполните:
|
||||||
|
curl http://192.168.50.X:3000
|
||||||
|
|
||||||
|
# Замените 192.168.50.X на IP вашего сервера
|
||||||
|
```
|
||||||
|
|
||||||
|
## Шаг 3: Настройка Traefik (на хосте 192.168.50.59)
|
||||||
|
|
||||||
|
### 3.1 Создание конфигурации
|
||||||
|
|
||||||
|
На хосте Traefik создайте файл конфигурации для file provider:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Перейдите в директорию конфигурации Traefik
|
||||||
|
cd /path/to/traefik/config
|
||||||
|
|
||||||
|
# Создайте файл конфигурации
|
||||||
|
nano global-it24.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
Скопируйте содержимое из `traefik-config-example.yml`, заменив:
|
||||||
|
- `192.168.50.X` на реальный IP сервера с приложением
|
||||||
|
|
||||||
|
### 3.2 Пример конфигурации
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
http:
|
||||||
|
routers:
|
||||||
|
global-it24:
|
||||||
|
rule: "Host(`video.mscsrv.ru`)"
|
||||||
|
entryPoints:
|
||||||
|
- web
|
||||||
|
middlewares:
|
||||||
|
- redirect-to-https
|
||||||
|
service: global-it24-service
|
||||||
|
|
||||||
|
global-it24-secure:
|
||||||
|
rule: "Host(`video.mscsrv.ru`)"
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
middlewares:
|
||||||
|
- security-headers
|
||||||
|
- compress
|
||||||
|
service: global-it24-service
|
||||||
|
tls:
|
||||||
|
certResolver: letsencrypt
|
||||||
|
|
||||||
|
services:
|
||||||
|
global-it24-service:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://192.168.50.X:3000" # IP сервера приложения
|
||||||
|
healthCheck:
|
||||||
|
path: /
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
|
||||||
|
middlewares:
|
||||||
|
redirect-to-https:
|
||||||
|
redirectScheme:
|
||||||
|
scheme: https
|
||||||
|
permanent: true
|
||||||
|
|
||||||
|
security-headers:
|
||||||
|
headers:
|
||||||
|
customResponseHeaders:
|
||||||
|
X-Frame-Options: "SAMEORIGIN"
|
||||||
|
X-Content-Type-Options: "nosniff"
|
||||||
|
X-XSS-Protection: "1; mode=block"
|
||||||
|
sslRedirect: true
|
||||||
|
stsSeconds: 31536000
|
||||||
|
|
||||||
|
compress:
|
||||||
|
compress: {}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 Перезагрузка Traefik
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# На хосте Traefik
|
||||||
|
docker restart traefik
|
||||||
|
# или
|
||||||
|
docker compose restart traefik
|
||||||
|
|
||||||
|
# Проверка логов Traefik
|
||||||
|
docker logs traefik -f
|
||||||
|
```
|
||||||
|
|
||||||
|
## Шаг 4: Проверка работы
|
||||||
|
|
||||||
|
1. **Локальная проверка:**
|
||||||
|
```bash
|
||||||
|
curl -v http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проверка через Traefik:**
|
||||||
|
```bash
|
||||||
|
curl -v http://video.mscsrv.ru
|
||||||
|
curl -v https://video.mscsrv.ru
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Проверка в браузере:**
|
||||||
|
- Откройте https://video.mscsrv.ru
|
||||||
|
- Проверьте мобильную версию
|
||||||
|
- Проверьте SSL сертификат
|
||||||
|
|
||||||
## Команды для управления
|
## Команды для управления
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# На сервере приложения:
|
||||||
|
|
||||||
# Перезапуск контейнера
|
# Перезапуск контейнера
|
||||||
docker-compose restart
|
./update.sh
|
||||||
|
# или
|
||||||
|
docker compose restart
|
||||||
|
|
||||||
# Остановка контейнера
|
# Остановка контейнера
|
||||||
docker-compose down
|
./stop.sh
|
||||||
|
# или
|
||||||
|
docker compose down
|
||||||
|
|
||||||
# Просмотр логов
|
# Просмотр логов
|
||||||
docker-compose logs -f
|
./logs.sh
|
||||||
|
# или
|
||||||
# Обновление после изменений
|
docker compose logs -f
|
||||||
docker-compose down
|
|
||||||
docker-compose build
|
|
||||||
docker-compose up -d
|
|
||||||
|
|
||||||
# Проверка статуса
|
# Проверка статуса
|
||||||
docker-compose ps
|
./status.sh
|
||||||
|
|
||||||
|
# Обновление после изменений
|
||||||
|
docker compose down
|
||||||
|
docker compose build --no-cache
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Резервное копирование
|
||||||
|
./backup.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Оптимизация производительности
|
## Оптимизация и безопасность
|
||||||
|
|
||||||
1. **Включите кэширование в Traefik** (добавьте в labels):
|
### Файрвол на сервере приложения
|
||||||
```yaml
|
|
||||||
- "traefik.http.middlewares.cache-control.headers.customResponseHeaders.Cache-Control=public, max-age=31536000"
|
```bash
|
||||||
|
# Установка UFW
|
||||||
|
sudo apt install ufw
|
||||||
|
|
||||||
|
# Разрешаем SSH
|
||||||
|
sudo ufw allow 22/tcp
|
||||||
|
|
||||||
|
# Разрешаем порт 3000 ТОЛЬКО с хоста Traefik
|
||||||
|
sudo ufw allow from 192.168.50.59 to any port 3000 proto tcp
|
||||||
|
|
||||||
|
# Включаем файрвол
|
||||||
|
sudo ufw enable
|
||||||
|
|
||||||
|
# Проверка правил
|
||||||
|
sudo ufw status verbose
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Настройте компрессию** (добавьте в labels):
|
### Мониторинг
|
||||||
```yaml
|
|
||||||
- "traefik.http.middlewares.compress.compress=true"
|
```bash
|
||||||
- "traefik.http.routers.global-it24-secure.middlewares=compress@docker"
|
# Использование ресурсов
|
||||||
|
docker stats global-it24-landing
|
||||||
|
|
||||||
|
# Проверка здоровья
|
||||||
|
docker inspect --format='{{.State.Health.Status}}' global-it24-landing
|
||||||
|
|
||||||
|
# Системные ресурсы
|
||||||
|
htop
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Ограничьте ресурсы контейнера** (добавьте в docker-compose.yml):
|
### Автоматический перезапуск при сбое
|
||||||
```yaml
|
|
||||||
|
Docker Compose уже настроен с `restart: unless-stopped`, контейнер будет автоматически перезапускаться.
|
||||||
|
|
||||||
|
### Логирование
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ротация логов Docker
|
||||||
|
sudo nano /etc/docker/daemon.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Добавьте:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"log-driver": "json-file",
|
||||||
|
"log-opts": {
|
||||||
|
"max-size": "10m",
|
||||||
|
"max-file": "3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Перезапустите Docker:
|
||||||
|
```bash
|
||||||
|
sudo systemctl restart docker
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Обновление приложения
|
||||||
|
|
||||||
|
### Быстрое обновление (без изменения кода)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./update.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Полное обновление (с пересборкой)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Остановка
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# Обновление кода (git pull или копирование файлов)
|
||||||
|
|
||||||
|
# Пересборка и запуск
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Резервное копирование
|
||||||
|
|
||||||
|
### Автоматическое резервное копирование
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание резервной копии
|
||||||
|
./backup.sh
|
||||||
|
|
||||||
|
# Настройка автоматического бэкапа (cron)
|
||||||
|
crontab -e
|
||||||
|
```
|
||||||
|
|
||||||
|
Добавьте:
|
||||||
|
```cron
|
||||||
|
# Резервное копирование каждый день в 3:00
|
||||||
|
0 3 * * * cd /path/to/global_it24_landing && ./backup.sh >> /var/log/backup-global-it24.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Восстановление из резервной копии
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Остановка текущего контейнера
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# Восстановление из архива
|
||||||
|
cd /path/to/restore
|
||||||
|
tar -xzf backup_YYYYMMDD_HHMMSS.tar.gz
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
cd global_it24_landing
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Устранение неполадок
|
||||||
|
|
||||||
|
### Контейнер не запускается
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр логов
|
||||||
|
docker compose logs global-it24-web
|
||||||
|
|
||||||
|
# Проверка конфигурации
|
||||||
|
docker compose config
|
||||||
|
|
||||||
|
# Пересборка с нуля
|
||||||
|
docker compose down
|
||||||
|
docker system prune -a
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Сайт недоступен через Traefik
|
||||||
|
|
||||||
|
1. **Проверка доступности приложения локально:**
|
||||||
|
```bash
|
||||||
|
curl http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проверка доступности из сети Traefik:**
|
||||||
|
```bash
|
||||||
|
# На хосте Traefik (192.168.50.59)
|
||||||
|
curl http://192.168.50.X:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Проверка логов Traefik:**
|
||||||
|
```bash
|
||||||
|
# На хосте Traefik
|
||||||
|
docker logs traefik -f
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Проверка файрвола:**
|
||||||
|
```bash
|
||||||
|
sudo ufw status
|
||||||
|
# Убедитесь, что порт 3000 открыт для 192.168.50.59
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Проверка конфигурации Traefik:**
|
||||||
|
```bash
|
||||||
|
# Проверьте файл global-it24.yml
|
||||||
|
# Убедитесь, что IP адрес правильный
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с SSL
|
||||||
|
|
||||||
|
Проверьте на хосте Traefik:
|
||||||
|
```bash
|
||||||
|
# Логи Traefik
|
||||||
|
docker logs traefik | grep -i error
|
||||||
|
|
||||||
|
# Проверка сертификатов
|
||||||
|
ls -la /path/to/acme.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Высокое использование ресурсов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ограничение ресурсов в docker-compose.yml
|
||||||
|
# Добавьте в сервис global-it24-web:
|
||||||
deploy:
|
deploy:
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
@@ -194,72 +434,58 @@ deploy:
|
|||||||
memory: 256M
|
memory: 256M
|
||||||
```
|
```
|
||||||
|
|
||||||
## Резервное копирование
|
## Сетевая диаграмма
|
||||||
|
|
||||||
```bash
|
|
||||||
# Создайте скрипт для бэкапа
|
|
||||||
cat > backup.sh << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
BACKUP_DIR="/backup/global-it24"
|
|
||||||
DATE=$(date +%Y%m%d_%H%M%S)
|
|
||||||
mkdir -p $BACKUP_DIR
|
|
||||||
docker-compose exec global-it24-web tar czf - /app > $BACKUP_DIR/backup_$DATE.tar.gz
|
|
||||||
EOF
|
|
||||||
|
|
||||||
chmod +x backup.sh
|
|
||||||
```
|
```
|
||||||
|
Internet
|
||||||
## Мониторинг
|
↓
|
||||||
|
[DNS: video.mscsrv.ru] → 192.168.50.59
|
||||||
```bash
|
↓
|
||||||
# Проверка использования ресурсов
|
[Traefik: 192.168.50.59]
|
||||||
docker stats global-it24-landing
|
↓ (проксирует на)
|
||||||
|
[App Server: 192.168.50.X:3000]
|
||||||
# Проверка здоровья контейнера
|
↓
|
||||||
docker inspect --format='{{.State.Health.Status}}' global-it24-landing
|
[Docker Container: global-it24-landing]
|
||||||
```
|
|
||||||
|
|
||||||
## Устранение неполадок
|
|
||||||
|
|
||||||
### Контейнер не запускается:
|
|
||||||
```bash
|
|
||||||
docker-compose logs global-it24-web
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проблемы с SSL:
|
|
||||||
```bash
|
|
||||||
docker logs traefik
|
|
||||||
# Проверьте acme.json
|
|
||||||
```
|
|
||||||
|
|
||||||
### Сайт недоступен:
|
|
||||||
```bash
|
|
||||||
# Проверьте, что контейнер работает
|
|
||||||
docker ps | grep global-it24
|
|
||||||
|
|
||||||
# Проверьте сеть
|
|
||||||
docker network inspect traefik-public
|
|
||||||
|
|
||||||
# Проверьте порты
|
|
||||||
netstat -tulpn | grep -E '80|443'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Безопасность
|
## Безопасность
|
||||||
|
|
||||||
1. Регулярно обновляйте Docker образы
|
### Рекомендации:
|
||||||
2. Используйте файрвол (ufw):
|
|
||||||
|
1. **Ограничьте доступ к порту 3000** только с хоста Traefik
|
||||||
|
2. **Регулярно обновляйте** Docker образы и систему
|
||||||
|
3. **Используйте сильные пароли** для SSH
|
||||||
|
4. **Настройте fail2ban** для защиты от брутфорса
|
||||||
|
5. **Мониторинг логов** на подозрительную активность
|
||||||
|
|
||||||
|
### Fail2ban (опционально)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ufw allow 80/tcp
|
sudo apt install fail2ban
|
||||||
sudo ufw allow 443/tcp
|
sudo systemctl enable fail2ban
|
||||||
sudo ufw enable
|
sudo systemctl start fail2ban
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Настройте автоматические обновления безопасности:
|
## Производительность
|
||||||
|
|
||||||
|
### Рекомендации:
|
||||||
|
|
||||||
|
1. Используйте SSD диски
|
||||||
|
2. Минимум 2GB RAM для сервера
|
||||||
|
3. Настройте swap если RAM < 4GB
|
||||||
|
4. Регулярно очищайте неиспользуемые Docker образы:
|
||||||
```bash
|
```bash
|
||||||
sudo apt install unattended-upgrades
|
docker system prune -a
|
||||||
sudo dpkg-reconfigure --priority=low unattended-upgrades
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Контакты для поддержки
|
## Контакты для поддержки
|
||||||
|
|
||||||
При возникновении проблем проверьте логи и документацию Traefik: https://doc.traefik.io/traefik/
|
При возникновении проблем:
|
||||||
|
1. Проверьте логи контейнера: `./logs.sh`
|
||||||
|
2. Проверьте статус: `./status.sh`
|
||||||
|
3. Проверьте доступность из сети
|
||||||
|
4. Проверьте конфигурацию Traefik
|
||||||
|
5. Проверьте файрвол и сетевую связность
|
||||||
|
|
||||||
|
Документация Traefik: https://doc.traefik.io/traefik/
|
||||||
|
Документация Docker: https://docs.docker.com/
|
||||||
|
|||||||
64
check-network.sh
Executable file
64
check-network.sh
Executable file
@@ -0,0 +1,64 @@
|
|||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Скрипт для проверки сетевой связности с Traefik
|
||||||
|
|
||||||
|
source .env 2>/dev/null || true
|
||||||
|
|
||||||
|
TRAEFIK_HOST=${TRAEFIK_HOST:-192.168.50.59}
|
||||||
|
APP_PORT=${APP_PORT:-3000}
|
||||||
|
|
||||||
|
echo "🔍 Проверка сетевой связности..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Получаем IP адреса текущего хоста
|
||||||
|
echo "📍 IP адреса текущего хоста:"
|
||||||
|
hostname -I
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Проверка доступности локально
|
||||||
|
echo "🏠 Проверка локального доступа (localhost:${APP_PORT})..."
|
||||||
|
if curl -s -o /dev/null -w "%{http_code}" http://localhost:${APP_PORT} | grep -q "200"; then
|
||||||
|
echo "✅ Приложение доступно локально"
|
||||||
|
else
|
||||||
|
echo "❌ Приложение НЕ доступно локально"
|
||||||
|
echo " Проверьте: docker compose ps"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Проверка доступности контейнера
|
||||||
|
echo "🐳 Статус контейнера:"
|
||||||
|
docker compose ps 2>/dev/null || echo "⚠️ Docker Compose не запущен"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Проверка порта
|
||||||
|
echo "🔌 Проверка открытых портов:"
|
||||||
|
if command -v netstat &> /dev/null; then
|
||||||
|
netstat -tulpn | grep ${APP_PORT} || echo "⚠️ Порт ${APP_PORT} не прослушивается"
|
||||||
|
elif command -v ss &> /dev/null; then
|
||||||
|
ss -tulpn | grep ${APP_PORT} || echo "⚠️ Порт ${APP_PORT} не прослушивается"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Инструкции для проверки с Traefik хоста
|
||||||
|
echo "📋 Для проверки доступности с хоста Traefik (${TRAEFIK_HOST}):"
|
||||||
|
echo ""
|
||||||
|
echo " Выполните на хосте ${TRAEFIK_HOST}:"
|
||||||
|
echo " curl http://\${APP_HOST_IP}:${APP_PORT}"
|
||||||
|
echo ""
|
||||||
|
echo " Где \${APP_HOST_IP} - один из IP адресов выше"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Проверка файрвола
|
||||||
|
echo "🔥 Проверка файрвола (UFW):"
|
||||||
|
if command -v ufw &> /dev/null; then
|
||||||
|
sudo ufw status 2>/dev/null || echo "⚠️ UFW не установлен или требует sudo"
|
||||||
|
else
|
||||||
|
echo "⚠️ UFW не установлен"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "💡 Рекомендации:"
|
||||||
|
echo " 1. Убедитесь, что порт ${APP_PORT} открыт для ${TRAEFIK_HOST}"
|
||||||
|
echo " 2. Проверьте файрвол: sudo ufw allow from ${TRAEFIK_HOST} to any port ${APP_PORT}"
|
||||||
|
echo " 3. Используйте один из IP адресов выше в конфигурации Traefik"
|
||||||
37
deploy.sh
37
deploy.sh
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Скрипт для быстрого развертывания Global-IT24 на Ubuntu с Traefik
|
# Скрипт для быстрого развертывания Global-IT24 на Ubuntu с внешним Traefik
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -11,47 +11,56 @@ echo "🚀 Развертывание Global-IT24..."
|
|||||||
if [ ! -f .env ]; then
|
if [ ! -f .env ]; then
|
||||||
echo "⚠️ Файл .env не найден. Создаю из .env.example..."
|
echo "⚠️ Файл .env не найден. Создаю из .env.example..."
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
echo "📝 Отредактируйте файл .env и запустите скрипт снова."
|
echo "📝 Отредактируйте файл .env (укажите APP_HOST_IP) и запустите скрипт снова."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Загрузка переменных окружения
|
# Загрузка переменных окружения
|
||||||
source .env
|
source .env
|
||||||
|
|
||||||
# Проверка наличия сети traefik-public
|
# Проверка APP_HOST_IP
|
||||||
if ! docker network inspect traefik-public >/dev/null 2>&1; then
|
if [ -z "$APP_HOST_IP" ] || [ "$APP_HOST_IP" = "192.168.50.X" ]; then
|
||||||
echo "📡 Создаю сеть traefik-public..."
|
echo "⚠️ Пожалуйста, укажите APP_HOST_IP в файле .env"
|
||||||
docker network create traefik-public
|
echo "📝 Текущий IP адрес сервера:"
|
||||||
|
hostname -I
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Остановка предыдущей версии
|
# Остановка предыдущей версии
|
||||||
echo "🛑 Остановка предыдущей версии..."
|
echo "🛑 Остановка предыдущей версии..."
|
||||||
docker-compose down 2>/dev/null || true
|
docker compose down 2>/dev/null || true
|
||||||
|
|
||||||
# Сборка нового образа
|
# Сборка нового образа
|
||||||
echo "🔨 Сборка Docker образа..."
|
echo "🔨 Сборка Docker образа..."
|
||||||
docker-compose build --no-cache
|
docker compose build --no-cache
|
||||||
|
|
||||||
# Запуск контейнера
|
# Запуск контейнера
|
||||||
echo "▶️ Запуск контейнера..."
|
echo "▶️ Запуск контейнера..."
|
||||||
docker-compose up -d
|
docker compose up -d
|
||||||
|
|
||||||
# Ожидание готовности
|
# Ожидание готовности
|
||||||
echo "⏳ Ожидание готовности сервиса..."
|
echo "⏳ Ожидание готовности сервиса..."
|
||||||
sleep 10
|
sleep 10
|
||||||
|
|
||||||
# Проверка статуса
|
# Проверка статуса
|
||||||
if docker-compose ps | grep -q "Up"; then
|
if docker compose ps | grep -q "Up"; then
|
||||||
echo "✅ Развертывание успешно завершено!"
|
echo "✅ Развертывание успешно завершено!"
|
||||||
echo "🌐 Сайт доступен по адресу: ${NEXT_PUBLIC_SITE_URL}"
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "📊 Статус контейнера:"
|
echo "📊 Статус контейнера:"
|
||||||
docker-compose ps
|
docker compose ps
|
||||||
echo ""
|
echo ""
|
||||||
echo "📝 Для просмотра логов используйте: docker-compose logs -f"
|
echo "🌐 Сайт будет доступен по адресу: ${NEXT_PUBLIC_SITE_URL}"
|
||||||
|
echo " после настройки Traefik на хосте ${TRAEFIK_HOST}"
|
||||||
|
echo ""
|
||||||
|
echo "🔧 Настройте Traefik (см. traefik-config-example.yml):"
|
||||||
|
echo " - IP приложения: ${APP_HOST_IP}:3000"
|
||||||
|
echo " - Домен: ${DOMAIN}"
|
||||||
|
echo ""
|
||||||
|
echo "📝 Для просмотра логов используйте: ./logs.sh"
|
||||||
|
echo "🧪 Локальная проверка: curl http://localhost:3000"
|
||||||
else
|
else
|
||||||
echo "❌ Ошибка при запуске контейнера!"
|
echo "❌ Ошибка при запуске контейнера!"
|
||||||
echo "📝 Логи:"
|
echo "📝 Логи:"
|
||||||
docker-compose logs
|
docker compose logs
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -7,41 +7,16 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
args:
|
args:
|
||||||
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-https://global-it24.local}
|
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-https://video.mscsrv.ru}
|
||||||
container_name: global-it24-landing
|
container_name: global-it24-landing
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
environment:
|
environment:
|
||||||
- NODE_ENV=production
|
- NODE_ENV=production
|
||||||
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://global-it24.local}
|
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://video.mscsrv.ru}
|
||||||
networks:
|
- PORT=3000
|
||||||
- traefik-public
|
- HOSTNAME=0.0.0.0
|
||||||
labels:
|
|
||||||
# Включаем Traefik для этого контейнера
|
|
||||||
- "traefik.enable=true"
|
|
||||||
|
|
||||||
# Настройка HTTP
|
|
||||||
- "traefik.http.routers.global-it24.rule=Host(`${DOMAIN:-global-it24.local}`)"
|
|
||||||
- "traefik.http.routers.global-it24.entrypoints=web"
|
|
||||||
- "traefik.http.routers.global-it24.middlewares=redirect-to-https@docker"
|
|
||||||
|
|
||||||
# Настройка HTTPS
|
|
||||||
- "traefik.http.routers.global-it24-secure.rule=Host(`${DOMAIN:-global-it24.local}`)"
|
|
||||||
- "traefik.http.routers.global-it24-secure.entrypoints=websecure"
|
|
||||||
- "traefik.http.routers.global-it24-secure.tls=true"
|
|
||||||
- "traefik.http.routers.global-it24-secure.tls.certresolver=letsencrypt"
|
|
||||||
|
|
||||||
# Middleware для редиректа HTTP -> HTTPS
|
|
||||||
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
|
|
||||||
- "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true"
|
|
||||||
|
|
||||||
# Указываем порт сервиса
|
|
||||||
- "traefik.http.services.global-it24.loadbalancer.server.port=3000"
|
|
||||||
|
|
||||||
# Middleware для заголовков безопасности
|
|
||||||
- "traefik.http.middlewares.security-headers.headers.customResponseHeaders.X-Frame-Options=SAMEORIGIN"
|
|
||||||
- "traefik.http.middlewares.security-headers.headers.customResponseHeaders.X-Content-Type-Options=nosniff"
|
|
||||||
- "traefik.http.middlewares.security-headers.headers.customResponseHeaders.X-XSS-Protection=1; mode=block"
|
|
||||||
- "traefik.http.routers.global-it24-secure.middlewares=security-headers@docker"
|
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/"]
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
@@ -49,6 +24,5 @@ services:
|
|||||||
retries: 3
|
retries: 3
|
||||||
start_period: 40s
|
start_period: 40s
|
||||||
|
|
||||||
networks:
|
# Для работы с внешним Traefik не требуется сеть
|
||||||
traefik-public:
|
# Traefik будет обращаться к контейнеру по IP хоста на порту 3000
|
||||||
external: true
|
|
||||||
|
|||||||
59
traefik-config-example.yml
Normal file
59
traefik-config-example.yml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
|
||||||
|
# Пример конфигурации для Traefik File Provider
|
||||||
|
# Этот файл нужно добавить в вашу конфигурацию Traefik на хосте 192.168.50.59
|
||||||
|
|
||||||
|
http:
|
||||||
|
routers:
|
||||||
|
global-it24:
|
||||||
|
rule: "Host(`video.mscsrv.ru`)"
|
||||||
|
entryPoints:
|
||||||
|
- web
|
||||||
|
middlewares:
|
||||||
|
- redirect-to-https
|
||||||
|
service: global-it24-service
|
||||||
|
|
||||||
|
global-it24-secure:
|
||||||
|
rule: "Host(`video.mscsrv.ru`)"
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
middlewares:
|
||||||
|
- security-headers
|
||||||
|
- compress
|
||||||
|
service: global-it24-service
|
||||||
|
tls:
|
||||||
|
certResolver: letsencrypt
|
||||||
|
# Или укажите путь к сертификатам:
|
||||||
|
# certFile: /path/to/cert.pem
|
||||||
|
# keyFile: /path/to/key.pem
|
||||||
|
|
||||||
|
services:
|
||||||
|
global-it24-service:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
# Замените 192.168.50.X на реальный IP хоста, где запущен контейнер
|
||||||
|
- url: "http://192.168.50.X:3000"
|
||||||
|
healthCheck:
|
||||||
|
path: /
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
|
||||||
|
middlewares:
|
||||||
|
redirect-to-https:
|
||||||
|
redirectScheme:
|
||||||
|
scheme: https
|
||||||
|
permanent: true
|
||||||
|
|
||||||
|
security-headers:
|
||||||
|
headers:
|
||||||
|
customResponseHeaders:
|
||||||
|
X-Frame-Options: "SAMEORIGIN"
|
||||||
|
X-Content-Type-Options: "nosniff"
|
||||||
|
X-XSS-Protection: "1; mode=block"
|
||||||
|
Referrer-Policy: "strict-origin-when-cross-origin"
|
||||||
|
sslRedirect: true
|
||||||
|
stsSeconds: 31536000
|
||||||
|
stsIncludeSubdomains: true
|
||||||
|
stsPreload: true
|
||||||
|
|
||||||
|
compress:
|
||||||
|
compress: {}
|
||||||
Reference in New Issue
Block a user