Publish Docker image / build-and-push (push) Successful in 1m19s
- диагностика: JSON на GET /api/evobgp и /evobgp - совместимость с nginx, срезающим префикс /api - DOCKER.md: пример location /api/ и типичная ошибка Made-with: Cursor
265 lines
8.7 KiB
Markdown
265 lines
8.7 KiB
Markdown
# Docker Images
|
||
|
||
Этот проект предоставляет Docker образы для RouterOS Manager с двумя различными версиями интерфейса.
|
||
|
||
## 🏷️ Доступные теги
|
||
|
||
### Основная версия (main branch)
|
||
- `git.shts.su/[repository]:latest` - Стабильная версия с базовым интерфейсом
|
||
- `git.shts.su/[repository]:[commit-sha]` - Версия с конкретным коммитом
|
||
|
||
### Tabler версия (tabler branch)
|
||
- `git.shts.su/[repository]:tabler` - Версия с современным Tabler UI
|
||
- `git.shts.su/[repository]:tabler-[commit-sha]` - Tabler версия с конкретным коммитом
|
||
|
||
## 🚀 Запуск
|
||
|
||
### Основная версия
|
||
```bash
|
||
docker run -d \
|
||
--name s3-lists-manager \
|
||
-p 3001:3001 \
|
||
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||
git.shts.su/[repository]:latest
|
||
```
|
||
|
||
### Tabler версия
|
||
```bash
|
||
docker run -d \
|
||
--name s3-lists-manager-tabler \
|
||
-p 3001:3001 \
|
||
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||
git.shts.su/[repository]:tabler
|
||
```
|
||
|
||
## 🔄 Обновление
|
||
|
||
### Основная версия
|
||
```bash
|
||
docker pull git.shts.su/[repository]:latest
|
||
docker stop s3-lists-manager
|
||
docker rm s3-lists-manager
|
||
docker run -d \
|
||
--name s3-lists-manager \
|
||
-p 3001:3001 \
|
||
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||
git.shts.su/[repository]:latest
|
||
```
|
||
|
||
### Tabler версия
|
||
```bash
|
||
docker pull git.shts.su/[repository]:tabler
|
||
docker stop s3-lists-manager-tabler
|
||
docker rm s3-lists-manager-tabler
|
||
docker run -d \
|
||
--name s3-lists-manager-tabler \
|
||
-p 3001:3001 \
|
||
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||
git.shts.su/[repository]:tabler
|
||
```
|
||
|
||
## 🐳 Docker Compose
|
||
|
||
Создайте файл `docker-compose.yml`:
|
||
|
||
```yaml
|
||
version: '3.8'
|
||
|
||
services:
|
||
s3-lists-manager:
|
||
image: git.shts.su/[repository]:latest
|
||
container_name: s3-lists-manager
|
||
ports:
|
||
- "3001:3001"
|
||
restart: unless-stopped
|
||
environment:
|
||
- NODE_ENV=production
|
||
- ENCRYPTION_KEY=${ENCRYPTION_KEY} # Обязательно! Используйте .env файл или secrets
|
||
# Прокси EvoBGP для UI (Communities / Domains / …) — без CORS в браузере:
|
||
# - EVOBGP_API_URL=http://evobgp:8080
|
||
# - EVOBGP_API_TOKEN=...
|
||
|
||
s3-lists-manager-tabler:
|
||
image: git.shts.su/[repository]:tabler
|
||
container_name: s3-lists-manager-tabler
|
||
ports:
|
||
- "3002:3001"
|
||
restart: unless-stopped
|
||
environment:
|
||
- NODE_ENV=production
|
||
- ENCRYPTION_KEY=${ENCRYPTION_KEY} # Обязательно! Используйте .env файл или secrets
|
||
```
|
||
|
||
**Создайте файл `.env` в той же директории:**
|
||
```bash
|
||
ENCRYPTION_KEY=your-64-hex-character-key-here
|
||
```
|
||
|
||
Запуск:
|
||
```bash
|
||
docker-compose up -d
|
||
```
|
||
|
||
## 🔧 Переменные окружения
|
||
|
||
| Переменная | Описание | По умолчанию | Обязательная |
|
||
|------------|----------|--------------|--------------|
|
||
| `NODE_ENV` | Окружение Node.js | `production` | Нет |
|
||
| `PORT` | Порт для запуска сервера | `3001` | Нет |
|
||
| `ENCRYPTION_KEY` | Ключ шифрования для IPSec паролей (64 hex символа) | - | **Да** |
|
||
| `EVOBGP_API_URL` | Базовый URL API EvoBGP для серверного прокси `/api/evobgp` (например `http://evobgp:8080` или `http://10.0.0.5:8080`; при необходимости к пути добавляется `/v1`) | - | Да, если используете интеграцию EvoBGP в UI |
|
||
| `EVOBGP_API_TOKEN` | Bearer-токен к API EvoBGP (только на сервере, не в браузере) | - | Да, если используете интеграцию EvoBGP в UI |
|
||
|
||
### EvoBGP и reverse proxy (nginx)
|
||
|
||
Запросы UI идут на тот же origin: `/api/evobgp/…` обрабатывает **Node** внутри образа. Если перед приложением стоит **nginx**, нужно проксировать префикс `/api` на Node **без потери** сегмента `/api` в URI (иначе в upstream попадёт не тот путь и будет 404).
|
||
|
||
**Рекомендуемый вариант** (путь `/api/…` сохраняется):
|
||
|
||
```nginx
|
||
location /api/ {
|
||
proxy_pass http://127.0.0.1:3001/api/;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
```
|
||
|
||
**Типичная ошибка**: внутри `location /api` указать `proxy_pass http://127.0.0.1:3001/;` — nginx **срезает** `/api`, в Node приходит `/evobgp/router-lists/catalog` вместо `/api/evobgp/router-lists/catalog`. В коде добавлен запасной маршрут на `/evobgp`, но лучше поправить nginx.
|
||
|
||
**Проверка**: `GET http://<хост>:<порт>/api/evobgp` (без хвоста) должен вернуть JSON вида `{"ok":true,"proxy":true,"evobgpConfigured":true}` — если вместо этого HTML «404» или страница SPA, запрос **не доходит** до Node (только статика, другой порт или неверный `proxy_pass`).
|
||
|
||
### ENCRYPTION_KEY
|
||
|
||
**Важно**: `ENCRYPTION_KEY` является обязательным параметром для работы с IPSec паролями. Этот ключ используется для шифрования/дешифрования паролей, хранящихся в S3.
|
||
|
||
**Генерация ключа:**
|
||
```bash
|
||
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
||
```
|
||
|
||
**Пример запуска с ENCRYPTION_KEY:**
|
||
```bash
|
||
docker run -d \
|
||
--name s3-lists-manager \
|
||
-p 3001:3001 \
|
||
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||
git.shts.su/[repository]:latest
|
||
```
|
||
|
||
**⚠️ Внимание**: Используйте один и тот же `ENCRYPTION_KEY` для всех запусков контейнера. При изменении ключа старые зашифрованные пароли не смогут быть расшифрованы.
|
||
|
||
## 📊 Мониторинг
|
||
|
||
### Просмотр логов
|
||
```bash
|
||
# Основная версия
|
||
docker logs s3-lists-manager
|
||
|
||
# Tabler версия
|
||
docker logs s3-lists-manager-tabler
|
||
```
|
||
|
||
### Статистика контейнеров
|
||
```bash
|
||
docker stats s3-lists-manager s3-lists-manager-tabler
|
||
```
|
||
|
||
## 🔍 Отладка
|
||
|
||
### Вход в контейнер
|
||
```bash
|
||
# Основная версия
|
||
docker exec -it s3-lists-manager /bin/bash
|
||
|
||
# Tabler версия
|
||
docker exec -it s3-lists-manager-tabler /bin/bash
|
||
```
|
||
|
||
### Проверка процессов
|
||
```bash
|
||
docker exec s3-lists-manager ps aux
|
||
```
|
||
|
||
## 🏗️ Сборка локально
|
||
|
||
### Основная версия
|
||
```bash
|
||
git checkout main
|
||
docker build -t s3-lists-manager:local .
|
||
```
|
||
|
||
### Tabler версия
|
||
```bash
|
||
git checkout tabler
|
||
docker build -t s3-lists-manager-tabler:local .
|
||
```
|
||
|
||
## 📝 CI/CD
|
||
|
||
### Автоматическая сборка
|
||
|
||
- **Ветка `main`**: Автоматически создает образ с тегом `latest`
|
||
- **Ветка `tabler`**: Автоматически создает образ с тегом `tabler`
|
||
|
||
### Workflow файлы
|
||
|
||
- `.gitea/workflows/docker-publish.yml` - Сборка основной версии
|
||
- `.gitea/workflows/docker-publish-tabler.yml` - Сборка Tabler версии
|
||
|
||
## 🔒 Безопасность
|
||
|
||
### Проверка образа
|
||
```bash
|
||
docker scan git.shts.su/[repository]:latest
|
||
docker scan git.shts.su/[repository]:tabler
|
||
```
|
||
|
||
### Запуск в изолированной сети
|
||
```bash
|
||
docker network create s3-lists-network
|
||
docker run -d \
|
||
--name s3-lists-manager \
|
||
--network s3-lists-network \
|
||
-p 3001:3001 \
|
||
git.shts.su/[repository]:latest
|
||
```
|
||
|
||
## 📈 Производительность
|
||
|
||
### Ограничение ресурсов
|
||
```bash
|
||
docker run -d \
|
||
--name s3-lists-manager \
|
||
--memory=512m \
|
||
--cpus=0.5 \
|
||
-p 3001:3001 \
|
||
git.shts.su/[repository]:latest
|
||
```
|
||
|
||
### Мониторинг ресурсов
|
||
```bash
|
||
docker stats --no-stream s3-lists-manager
|
||
```
|
||
|
||
## 🆘 Устранение неполадок
|
||
|
||
### Проверка статуса контейнера
|
||
```bash
|
||
docker ps -a | grep s3-lists-manager
|
||
```
|
||
|
||
### Перезапуск контейнера
|
||
```bash
|
||
docker restart s3-lists-manager
|
||
```
|
||
|
||
### Очистка неиспользуемых образов
|
||
```bash
|
||
docker image prune -f
|
||
```
|
||
|
||
---
|
||
|
||
**Примечание**: Замените `[repository]` на актуальное имя вашего репозитория в Gitea. |