fix(docker): simplify deployment with nginx fixes and alternative compose config
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
- Update nginx/default.conf with complete configuration including events section - Add docker-compose-simple.yml for simplified deployment without nginx - Update docker-compose.yml to properly mount nginx configuration - Revise DOCKER_FIX.md with clearer instructions and recommended solutions - Provide three deployment variants: with nginx, without nginx (recommended), and quick fix - Include data folder structure and environment setup documentation This change addresses nginx configuration errors and FileNotFoundError by providing both a corrected nginx setup and a simplified alternative deployment method without nginx for faster troubleshooting and deployment.
This commit is contained in:
249
DOCKER_FIX.md
249
DOCKER_FIX.md
@@ -5,137 +5,29 @@
|
|||||||
1. **Nginx**: `no "events" section in configuration`
|
1. **Nginx**: `no "events" section in configuration`
|
||||||
2. **Backend**: `FileNotFoundError: [Errno 2] No such file or directory: 'backend/data'`
|
2. **Backend**: `FileNotFoundError: [Errno 2] No such file or directory: 'backend/data'`
|
||||||
|
|
||||||
## Исправления
|
## ✅ Исправления сделаны
|
||||||
|
|
||||||
### 1. ✅ Исправлена nginx конфигурация
|
### 1. Исправлена nginx конфигурация
|
||||||
- Создан файл `nginx/default.conf` с упрощенной конфигурацией
|
- Обновлен файл `nginx/default.conf` с полной конфигурацией включая секцию `events`
|
||||||
- Обновлен `docker-compose.yml` для использования правильного пути
|
- Обновлен `docker-compose.yml` для монтирования как основной конфигурации nginx
|
||||||
|
|
||||||
### 2. ✅ Исправлен путь к папке данных
|
### 2. Исправлен путь к папке данных
|
||||||
- В `backend/daemons.py` изменен путь с `backend/data/daemons.json` на `data/daemons.json`
|
- В `backend/daemons.py` изменен путь с `backend/data/daemons.json` на `data/daemons.json`
|
||||||
- Добавлена проверка существования файла пользователей
|
- Добавлена проверка существования файла пользователей
|
||||||
|
|
||||||
## Что нужно сделать
|
### 3. Создан упрощенный docker-compose
|
||||||
|
- Файл `docker-compose-simple.yml` без nginx для быстрого запуска
|
||||||
|
|
||||||
### Вариант 1: Обновить файлы и перезапустить
|
## Решения
|
||||||
|
|
||||||
|
### Вариант 1: С исправленным nginx
|
||||||
|
|
||||||
1. **Скопируйте обновленные файлы**:
|
1. **Скопируйте обновленные файлы**:
|
||||||
- `backend/daemons.py`
|
- `backend/daemons.py`
|
||||||
- `nginx/default.conf` (новый файл)
|
- `nginx/default.conf`
|
||||||
- `docker-compose.yml`
|
- `docker-compose.yml`
|
||||||
|
|
||||||
2. **Остановите контейнеры**:
|
2. **Создайте папку data**:
|
||||||
```bash
|
|
||||||
docker-compose down
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Пересоберите и запустите**:
|
|
||||||
```bash
|
|
||||||
docker-compose up --build -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Вариант 2: Быстрое исправление (без пересборки)
|
|
||||||
|
|
||||||
1. **Остановите только nginx**:
|
|
||||||
```bash
|
|
||||||
docker-compose stop nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Создайте папку data в контейнере mc-panel**:
|
|
||||||
```bash
|
|
||||||
docker exec mc-panel mkdir -p /app/data
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Запустите nginx с новой конфигурацией**:
|
|
||||||
```bash
|
|
||||||
docker-compose up nginx -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## Проверка
|
|
||||||
|
|
||||||
После исправления:
|
|
||||||
|
|
||||||
1. **Проверьте статус контейнеров**:
|
|
||||||
```bash
|
|
||||||
docker-compose ps
|
|
||||||
```
|
|
||||||
|
|
||||||
Должно быть:
|
|
||||||
```
|
|
||||||
NAME STATE
|
|
||||||
mc-panel Up
|
|
||||||
mc-panel-nginx Up
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Проверьте логи**:
|
|
||||||
```bash
|
|
||||||
docker-compose logs mc-panel
|
|
||||||
docker-compose logs nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Откройте панель**:
|
|
||||||
- Перейдите на IP сервера (порт 80)
|
|
||||||
- Должна открыться панель управления
|
|
||||||
|
|
||||||
## Структура файлов после исправления
|
|
||||||
|
|
||||||
```
|
|
||||||
📁 Проект
|
|
||||||
├── 📁 nginx/
|
|
||||||
│ ├── default.conf # ✅ Новая упрощенная конфигурация
|
|
||||||
│ └── nginx.conf # Старая (не используется)
|
|
||||||
│
|
|
||||||
├── 📁 backend/
|
|
||||||
│ └── daemons.py # ✅ Исправлен путь к data/
|
|
||||||
│
|
|
||||||
├── docker-compose.yml # ✅ Обновлен для nginx/default.conf
|
|
||||||
└── 📁 data/ # Создается автоматически
|
|
||||||
├── daemons.json
|
|
||||||
├── users.json
|
|
||||||
└── tickets.json
|
|
||||||
```
|
|
||||||
|
|
||||||
## Переменные окружения
|
|
||||||
|
|
||||||
Убедитесь, что в `.env` файле заданы:
|
|
||||||
|
|
||||||
```env
|
|
||||||
# ZITADEL SSO
|
|
||||||
ZITADEL_ISSUER=https://sso.nevetime.ru
|
|
||||||
ZITADEL_CLIENT_ID=your_client_id
|
|
||||||
ZITADEL_CLIENT_SECRET=your_client_secret
|
|
||||||
|
|
||||||
# URLs
|
|
||||||
BASE_URL=https://your-domain.com
|
|
||||||
FRONTEND_URL=https://your-domain.com
|
|
||||||
|
|
||||||
# Security
|
|
||||||
SECRET_KEY=your-secret-key-here
|
|
||||||
```
|
|
||||||
|
|
||||||
## Если проблемы остались
|
|
||||||
|
|
||||||
### Nginx всё еще не запускается
|
|
||||||
|
|
||||||
1. **Проверьте монтирование**:
|
|
||||||
```bash
|
|
||||||
docker exec mc-panel-nginx ls -la /etc/nginx/conf.d/
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Проверьте синтаксис**:
|
|
||||||
```bash
|
|
||||||
docker exec mc-panel-nginx nginx -t
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Используйте стандартную конфигурацию**:
|
|
||||||
```bash
|
|
||||||
# Удалите volume с nginx конфигурацией из docker-compose.yml
|
|
||||||
# Nginx будет использовать стандартную конфигурацию
|
|
||||||
```
|
|
||||||
|
|
||||||
### Backend всё еще падает
|
|
||||||
|
|
||||||
1. **Создайте папки вручную**:
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p data
|
mkdir -p data
|
||||||
touch data/users.json
|
touch data/users.json
|
||||||
@@ -143,32 +35,103 @@ SECRET_KEY=your-secret-key-here
|
|||||||
touch data/daemons.json
|
touch data/daemons.json
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Проверьте права доступа**:
|
|
||||||
```bash
|
|
||||||
chmod 755 data
|
|
||||||
chmod 644 data/*.json
|
|
||||||
```
|
|
||||||
|
|
||||||
## Альтернативное решение
|
|
||||||
|
|
||||||
Если проблемы продолжаются, можно запустить без nginx:
|
|
||||||
|
|
||||||
1. **Отключите nginx в docker-compose.yml**:
|
|
||||||
```yaml
|
|
||||||
# Закомментируйте секцию nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Измените порты mc-panel**:
|
|
||||||
```yaml
|
|
||||||
ports:
|
|
||||||
- "80:8000" # Прямой доступ к панели
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Перезапустите**:
|
3. **Перезапустите**:
|
||||||
```bash
|
```bash
|
||||||
docker-compose up -d mc-panel
|
docker-compose down
|
||||||
|
docker-compose up --build -d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Вариант 2: Без nginx (РЕКОМЕНДУЕТСЯ)
|
||||||
|
|
||||||
|
1. **Используйте упрощенный docker-compose**:
|
||||||
|
```bash
|
||||||
|
# Остановите текущие контейнеры
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# Создайте папку data
|
||||||
|
mkdir -p data
|
||||||
|
touch data/users.json
|
||||||
|
touch data/tickets.json
|
||||||
|
touch data/daemons.json
|
||||||
|
|
||||||
|
# Запустите с упрощенной конфигурацией
|
||||||
|
docker-compose -f docker-compose-simple.yml up --build -d
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Панель будет доступна напрямую на порту 80**
|
||||||
|
|
||||||
|
### Вариант 3: Быстрое исправление текущей проблемы
|
||||||
|
|
||||||
|
Если не хотите менять файлы:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Остановите nginx
|
||||||
|
docker-compose stop nginx
|
||||||
|
|
||||||
|
# 2. Создайте папку data
|
||||||
|
mkdir -p data
|
||||||
|
echo '{"admin":{"username":"admin","password":"$2b$12$PAaomoUWn3Ip5ov.S/uYPeTIRiDMq7DbA57ahyYQnw3QHT2zuYMlG","role":"owner","servers":[],"permissions":{"manage_users":true,"manage_roles":true,"manage_servers":true,"manage_tickets":true,"manage_files":true,"delete_users":true,"view_all_resources":true},"resource_access":{"servers":[],"tickets":[],"files":[]}}}' > data/users.json
|
||||||
|
echo '{}' > data/tickets.json
|
||||||
|
echo '{}' > data/daemons.json
|
||||||
|
|
||||||
|
# 3. Измените порты mc-panel в docker-compose.yml
|
||||||
|
# Замените "8000:8000" на "80:8000"
|
||||||
|
|
||||||
|
# 4. Перезапустите только mc-panel
|
||||||
|
docker-compose up -d mc-panel
|
||||||
|
```
|
||||||
|
|
||||||
|
## Проверка
|
||||||
|
|
||||||
|
После любого из вариантов:
|
||||||
|
|
||||||
|
1. **Проверьте статус**:
|
||||||
|
```bash
|
||||||
|
docker-compose ps
|
||||||
|
# или для упрощенной версии:
|
||||||
|
docker-compose -f docker-compose-simple.yml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проверьте логи**:
|
||||||
|
```bash
|
||||||
|
docker-compose logs mc-panel
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Откройте панель**:
|
||||||
|
- Перейдите на IP сервера
|
||||||
|
- Должна открыться панель управления
|
||||||
|
- Логин: `admin`, пароль: `Admin`
|
||||||
|
|
||||||
|
## Структура файлов
|
||||||
|
|
||||||
|
```
|
||||||
|
📁 Проект
|
||||||
|
├── 📁 nginx/
|
||||||
|
│ └── default.conf # ✅ Полная nginx конфигурация
|
||||||
|
│
|
||||||
|
├── 📁 backend/
|
||||||
|
│ └── daemons.py # ✅ Исправлен путь к data/
|
||||||
|
│
|
||||||
|
├── docker-compose.yml # ✅ С nginx
|
||||||
|
├── docker-compose-simple.yml # ✅ Без nginx (рекомендуется)
|
||||||
|
│
|
||||||
|
└── 📁 data/ # Создать вручную
|
||||||
|
├── users.json
|
||||||
|
├── tickets.json
|
||||||
|
└── daemons.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## Рекомендация
|
||||||
|
|
||||||
|
**Используйте Вариант 2 (docker-compose-simple.yml)** - это самое простое и надежное решение:
|
||||||
|
|
||||||
|
1. Нет проблем с nginx
|
||||||
|
2. Прямой доступ к панели
|
||||||
|
3. Меньше компонентов = меньше проблем
|
||||||
|
4. Панель доступна на порту 80
|
||||||
|
|
||||||
|
Если нужен nginx (для SSL, доменов и т.д.), используйте Вариант 1 с исправленной конфигурацией.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**После исправления панель должна работать на IP сервера через порт 80!**
|
**Backend уже работает! Проблема только в nginx. Используйте упрощенную версию без nginx для быстрого запуска.**
|
||||||
51
docker-compose-simple.yml
Normal file
51
docker-compose-simple.yml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# MC Panel приложение
|
||||||
|
mc-panel:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
container_name: mc-panel
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "80:8000" # Прямой доступ через порт 80
|
||||||
|
environment:
|
||||||
|
# ZITADEL OpenID Connect
|
||||||
|
- ZITADEL_ISSUER=${ZITADEL_ISSUER}
|
||||||
|
- ZITADEL_CLIENT_ID=${ZITADEL_CLIENT_ID}
|
||||||
|
- ZITADEL_CLIENT_SECRET=${ZITADEL_CLIENT_SECRET}
|
||||||
|
|
||||||
|
# URLs
|
||||||
|
- BASE_URL=${BASE_URL:-http://localhost}
|
||||||
|
- FRONTEND_URL=${FRONTEND_URL:-http://localhost}
|
||||||
|
|
||||||
|
# Security
|
||||||
|
- SECRET_KEY=${SECRET_KEY:-change-this-in-production}
|
||||||
|
|
||||||
|
# Python
|
||||||
|
- PYTHONUNBUFFERED=1
|
||||||
|
volumes:
|
||||||
|
# Персистентное хранилище для серверов
|
||||||
|
- ./data/servers:/app/backend/servers
|
||||||
|
# Персистентное хранилище для пользователей и тикетов
|
||||||
|
- ./data/users.json:/app/backend/users.json
|
||||||
|
- ./data/tickets.json:/app/backend/tickets.json
|
||||||
|
# Папка для данных демонов
|
||||||
|
- ./data:/app/data
|
||||||
|
networks:
|
||||||
|
- mc-panel-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8000/api/auth/oidc/providers"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
|
|
||||||
|
networks:
|
||||||
|
mc-panel-network:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
servers-data:
|
||||||
|
users-data:
|
||||||
@@ -49,7 +49,7 @@ services:
|
|||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "443:443"
|
||||||
volumes:
|
volumes:
|
||||||
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
|
- ./nginx/default.conf:/etc/nginx/nginx.conf:ro
|
||||||
- ./nginx/ssl:/etc/nginx/ssl:ro
|
- ./nginx/ssl:/etc/nginx/ssl:ro
|
||||||
depends_on:
|
depends_on:
|
||||||
- mc-panel
|
- mc-panel
|
||||||
|
|||||||
@@ -1,62 +1,78 @@
|
|||||||
upstream mc_panel {
|
events {
|
||||||
server mc-panel:8000;
|
worker_connections 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
http {
|
||||||
listen 80;
|
include /etc/nginx/mime.types;
|
||||||
server_name _;
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
access_log /var/log/nginx/access.log main;
|
||||||
|
sendfile on;
|
||||||
|
keepalive_timeout 65;
|
||||||
client_max_body_size 100M;
|
client_max_body_size 100M;
|
||||||
|
|
||||||
# API endpoints
|
upstream mc_panel {
|
||||||
location /api/ {
|
server mc-panel:8000;
|
||||||
proxy_pass http://mc_panel;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection 'upgrade';
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_cache_bypass $http_upgrade;
|
|
||||||
|
|
||||||
# Таймауты
|
|
||||||
proxy_connect_timeout 60s;
|
|
||||||
proxy_send_timeout 60s;
|
|
||||||
proxy_read_timeout 60s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# WebSocket для консоли
|
server {
|
||||||
location /ws/ {
|
listen 80;
|
||||||
proxy_pass http://mc_panel;
|
server_name _;
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
|
|
||||||
# WebSocket таймауты
|
|
||||||
proxy_connect_timeout 7d;
|
|
||||||
proxy_send_timeout 7d;
|
|
||||||
proxy_read_timeout 7d;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Статические файлы фронтенда
|
# API endpoints
|
||||||
location / {
|
location /api/ {
|
||||||
proxy_pass http://mc_panel;
|
proxy_pass http://mc_panel;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header Connection 'upgrade';
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header Host $host;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
}
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
|
||||||
|
# Таймауты
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
}
|
||||||
|
|
||||||
# Health check
|
# WebSocket для консоли
|
||||||
location /health {
|
location /ws/ {
|
||||||
access_log off;
|
proxy_pass http://mc_panel;
|
||||||
return 200 "healthy\n";
|
proxy_http_version 1.1;
|
||||||
add_header Content-Type text/plain;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# WebSocket таймауты
|
||||||
|
proxy_connect_timeout 7d;
|
||||||
|
proxy_send_timeout 7d;
|
||||||
|
proxy_read_timeout 7d;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Статические файлы фронтенда
|
||||||
|
location / {
|
||||||
|
proxy_pass http://mc_panel;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
location /health {
|
||||||
|
access_log off;
|
||||||
|
return 200 "healthy\n";
|
||||||
|
add_header Content-Type text/plain;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user