Конфигурация для внешнего 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)
|
||||
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 окружения
|
||||
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 или новее)
|
||||
2. Docker и Docker Compose установлены
|
||||
3. Traefik настроен как reverse proxy
|
||||
4. Домен направлен на ваш сервер
|
||||
3. Traefik уже настроен на хосте 192.168.50.59
|
||||
4. Домен video.mscsrv.ru направлен на 192.168.50.59
|
||||
5. Сетевая связность между хостами (порт 3000 доступен из 192.168.50.59)
|
||||
|
||||
## Шаг 1: Настройка Traefik
|
||||
## Шаг 1: Подготовка сервера приложения
|
||||
|
||||
Если Traefik еще не настроен, создайте базовую конфигурацию:
|
||||
### 1.1 Установка Docker (если не установлен)
|
||||
|
||||
```bash
|
||||
# Создайте сеть для Traefik
|
||||
docker network create traefik-public
|
||||
# Обновление системы
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# Создайте директорию для Traefik
|
||||
mkdir -p ~/traefik
|
||||
cd ~/traefik
|
||||
# Установка зависимостей
|
||||
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
|
||||
|
||||
# Добавление репозитория 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:
|
||||
|
||||
```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 сертификатов:
|
||||
### 1.2 Подготовка проекта
|
||||
|
||||
```bash
|
||||
touch acme.json
|
||||
chmod 600 acme.json
|
||||
```
|
||||
# Перейдите в директорию проекта
|
||||
cd /path/to/global_it24_landing
|
||||
|
||||
Запустите Traefik:
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## Шаг 2: Развертывание Global-IT24
|
||||
|
||||
1. **Клонируйте или скопируйте проект на сервер:**
|
||||
|
||||
```bash
|
||||
cd /home/your-user
|
||||
# Скопируйте папку global_it24_landing на сервер
|
||||
```
|
||||
|
||||
2. **Создайте .env файл:**
|
||||
|
||||
```bash
|
||||
cd global_it24_landing
|
||||
# Создайте .env файл
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
@@ -124,66 +57,373 @@ nano .env
|
||||
Отредактируйте `.env`:
|
||||
|
||||
```env
|
||||
DOMAIN=ваш-домен.ru
|
||||
NEXT_PUBLIC_SITE_URL=https://ваш-домен.ru
|
||||
DOMAIN=video.mscsrv.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
|
||||
```
|
||||
|
||||
3. **Соберите и запустите контейнер:**
|
||||
### 1.3 Проверка сетевой доступности
|
||||
|
||||
```bash
|
||||
# Сборка образа
|
||||
docker-compose build
|
||||
# Узнайте IP текущего хоста
|
||||
hostname -I
|
||||
|
||||
# Запуск контейнера
|
||||
docker-compose up -d
|
||||
|
||||
# Проверка логов
|
||||
docker-compose logs -f
|
||||
# С хоста Traefik (192.168.50.59) должен быть доступ к этому IP:3000
|
||||
# Проверьте после запуска контейнера
|
||||
```
|
||||
|
||||
## Шаг 3: Проверка работы
|
||||
## Шаг 2: Запуск приложения
|
||||
|
||||
1. Откройте браузер и перейдите на ваш домен
|
||||
2. Проверьте, что HTTPS работает корректно
|
||||
3. Проверьте мобильную версию сайта
|
||||
### 2.1 Сборка и запуск контейнера
|
||||
|
||||
```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
|
||||
# На сервере приложения:
|
||||
|
||||
# Перезапуск контейнера
|
||||
docker-compose restart
|
||||
./update.sh
|
||||
# или
|
||||
docker compose restart
|
||||
|
||||
# Остановка контейнера
|
||||
docker-compose down
|
||||
./stop.sh
|
||||
# или
|
||||
docker compose down
|
||||
|
||||
# Просмотр логов
|
||||
docker-compose logs -f
|
||||
|
||||
# Обновление после изменений
|
||||
docker-compose down
|
||||
docker-compose build
|
||||
docker-compose up -d
|
||||
./logs.sh
|
||||
# или
|
||||
docker compose logs -f
|
||||
|
||||
# Проверка статуса
|
||||
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"
|
||||
- "traefik.http.routers.global-it24-secure.middlewares=compress@docker"
|
||||
### Мониторинг
|
||||
|
||||
```bash
|
||||
# Использование ресурсов
|
||||
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:
|
||||
resources:
|
||||
limits:
|
||||
@@ -194,72 +434,58 @@ deploy:
|
||||
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
|
||||
```
|
||||
|
||||
## Мониторинг
|
||||
|
||||
```bash
|
||||
# Проверка использования ресурсов
|
||||
docker stats global-it24-landing
|
||||
|
||||
# Проверка здоровья контейнера
|
||||
docker inspect --format='{{.State.Health.Status}}' 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'
|
||||
Internet
|
||||
↓
|
||||
[DNS: video.mscsrv.ru] → 192.168.50.59
|
||||
↓
|
||||
[Traefik: 192.168.50.59]
|
||||
↓ (проксирует на)
|
||||
[App Server: 192.168.50.X:3000]
|
||||
↓
|
||||
[Docker Container: global-it24-landing]
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
1. Регулярно обновляйте Docker образы
|
||||
2. Используйте файрвол (ufw):
|
||||
### Рекомендации:
|
||||
|
||||
1. **Ограничьте доступ к порту 3000** только с хоста Traefik
|
||||
2. **Регулярно обновляйте** Docker образы и систему
|
||||
3. **Используйте сильные пароли** для SSH
|
||||
4. **Настройте fail2ban** для защиты от брутфорса
|
||||
5. **Мониторинг логов** на подозрительную активность
|
||||
|
||||
### Fail2ban (опционально)
|
||||
|
||||
```bash
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw enable
|
||||
sudo apt install fail2ban
|
||||
sudo systemctl enable fail2ban
|
||||
sudo systemctl start fail2ban
|
||||
```
|
||||
|
||||
3. Настройте автоматические обновления безопасности:
|
||||
## Производительность
|
||||
|
||||
### Рекомендации:
|
||||
|
||||
1. Используйте SSD диски
|
||||
2. Минимум 2GB RAM для сервера
|
||||
3. Настройте swap если RAM < 4GB
|
||||
4. Регулярно очищайте неиспользуемые Docker образы:
|
||||
```bash
|
||||
sudo apt install unattended-upgrades
|
||||
sudo dpkg-reconfigure --priority=low unattended-upgrades
|
||||
docker system prune -a
|
||||
```
|
||||
|
||||
## Контакты для поддержки
|
||||
|
||||
При возникновении проблем проверьте логи и документацию 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
|
||||
|
||||
# Скрипт для быстрого развертывания Global-IT24 на Ubuntu с Traefik
|
||||
# Скрипт для быстрого развертывания Global-IT24 на Ubuntu с внешним Traefik
|
||||
|
||||
set -e
|
||||
|
||||
@@ -11,47 +11,56 @@ echo "🚀 Развертывание Global-IT24..."
|
||||
if [ ! -f .env ]; then
|
||||
echo "⚠️ Файл .env не найден. Создаю из .env.example..."
|
||||
cp .env.example .env
|
||||
echo "📝 Отредактируйте файл .env и запустите скрипт снова."
|
||||
echo "📝 Отредактируйте файл .env (укажите APP_HOST_IP) и запустите скрипт снова."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Загрузка переменных окружения
|
||||
source .env
|
||||
|
||||
# Проверка наличия сети traefik-public
|
||||
if ! docker network inspect traefik-public >/dev/null 2>&1; then
|
||||
echo "📡 Создаю сеть traefik-public..."
|
||||
docker network create traefik-public
|
||||
# Проверка APP_HOST_IP
|
||||
if [ -z "$APP_HOST_IP" ] || [ "$APP_HOST_IP" = "192.168.50.X" ]; then
|
||||
echo "⚠️ Пожалуйста, укажите APP_HOST_IP в файле .env"
|
||||
echo "📝 Текущий IP адрес сервера:"
|
||||
hostname -I
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Остановка предыдущей версии
|
||||
echo "🛑 Остановка предыдущей версии..."
|
||||
docker-compose down 2>/dev/null || true
|
||||
docker compose down 2>/dev/null || true
|
||||
|
||||
# Сборка нового образа
|
||||
echo "🔨 Сборка Docker образа..."
|
||||
docker-compose build --no-cache
|
||||
docker compose build --no-cache
|
||||
|
||||
# Запуск контейнера
|
||||
echo "▶️ Запуск контейнера..."
|
||||
docker-compose up -d
|
||||
docker compose up -d
|
||||
|
||||
# Ожидание готовности
|
||||
echo "⏳ Ожидание готовности сервиса..."
|
||||
sleep 10
|
||||
|
||||
# Проверка статуса
|
||||
if docker-compose ps | grep -q "Up"; then
|
||||
if docker compose ps | grep -q "Up"; then
|
||||
echo "✅ Развертывание успешно завершено!"
|
||||
echo "🌐 Сайт доступен по адресу: ${NEXT_PUBLIC_SITE_URL}"
|
||||
echo ""
|
||||
echo "📊 Статус контейнера:"
|
||||
docker-compose ps
|
||||
docker compose ps
|
||||
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
|
||||
echo "❌ Ошибка при запуске контейнера!"
|
||||
echo "📝 Логи:"
|
||||
docker-compose logs
|
||||
docker compose logs
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -7,41 +7,16 @@ services:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
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
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://global-it24.local}
|
||||
networks:
|
||||
- traefik-public
|
||||
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"
|
||||
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://video.mscsrv.ru}
|
||||
- PORT=3000
|
||||
- HOSTNAME=0.0.0.0
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/"]
|
||||
interval: 30s
|
||||
@@ -49,6 +24,5 @@ services:
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
networks:
|
||||
traefik-public:
|
||||
external: true
|
||||
# Для работы с внешним Traefik не требуется сеть
|
||||
# Traefik будет обращаться к контейнеру по IP хоста на порту 3000
|
||||
|
||||
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