docs: update README and docs with strict Quick Start (docker-compose-prod), fix WebSocket paths, enforce strict tone
This commit is contained in:
36
docs/api.md
36
docs/api.md
@@ -16,7 +16,7 @@
|
||||
|
||||
LogBoard+ предоставляет REST API и WebSocket API для работы с логами Docker контейнеров. API разработан для интеграции с системами мониторинга и автоматизации, а также для создания собственных клиентов.
|
||||
|
||||
### 🎯 **Применение API**
|
||||
### Применение API
|
||||
|
||||
- **Интеграция с CI/CD** - автоматический мониторинг логов в пайплайнах
|
||||
- **Собственные дашборды** - создание кастомных интерфейсов мониторинга
|
||||
@@ -108,7 +108,7 @@ Authorization: Bearer <token>
|
||||
|
||||
### Контейнеры и сервисы
|
||||
|
||||
#### GET /api/services
|
||||
#### GET /api/containers/services
|
||||
|
||||
Получение списка всех контейнеров.
|
||||
|
||||
@@ -122,7 +122,7 @@ Authorization: Bearer <token>
|
||||
**Пример запроса:**
|
||||
|
||||
```bash
|
||||
curl -X GET "http://localhost:9001/api/services?projects=myproject&include_stopped=true" \
|
||||
curl -X GET "http://localhost:9001/api/containers/services?projects=myproject&include_stopped=true" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN"
|
||||
```
|
||||
|
||||
@@ -157,7 +157,7 @@ curl -X GET "http://localhost:9001/api/services?projects=myproject&include_stopp
|
||||
]
|
||||
```
|
||||
|
||||
#### GET /api/projects
|
||||
#### GET /api/containers/projects
|
||||
|
||||
Получение списка всех проектов Docker Compose.
|
||||
|
||||
@@ -268,7 +268,7 @@ curl -X GET "http://localhost:9001/api/logs/abc123def456?tail=100&since=2024-01-
|
||||
}
|
||||
```
|
||||
|
||||
#### GET /api/excluded-containers
|
||||
#### GET /api/containers/excluded
|
||||
|
||||
Получение списка исключенных контейнеров.
|
||||
|
||||
@@ -283,7 +283,7 @@ curl -X GET "http://localhost:9001/api/logs/abc123def456?tail=100&since=2024-01-
|
||||
}
|
||||
```
|
||||
|
||||
#### POST /api/excluded-containers
|
||||
#### POST /api/containers/excluded
|
||||
|
||||
Обновление списка исключенных контейнеров.
|
||||
|
||||
@@ -306,7 +306,7 @@ curl -X GET "http://localhost:9001/api/logs/abc123def456?tail=100&since=2024-01-
|
||||
}
|
||||
```
|
||||
|
||||
#### POST /api/snapshot
|
||||
#### POST /api/logs/snapshot
|
||||
|
||||
Создание снимка логов.
|
||||
|
||||
@@ -374,7 +374,7 @@ ok
|
||||
|
||||
Все WebSocket endpoints требуют JWT токен в параметре `token`.
|
||||
|
||||
### ws://host:port/ws/logs/{container_id}
|
||||
### ws://host:port/api/websocket/logs/{container_id}
|
||||
|
||||
Получение логов отдельного контейнера.
|
||||
|
||||
@@ -390,7 +390,7 @@ ok
|
||||
```javascript
|
||||
const token = "your-jwt-token";
|
||||
const containerId = "abc123def456";
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/logs/${containerId}?token=${token}&tail=100`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/logs/${containerId}?token=${token}&tail=100`);
|
||||
|
||||
ws.onmessage = function(event) {
|
||||
console.log('Получены логи:', event.data);
|
||||
@@ -401,7 +401,7 @@ ws.onerror = function(error) {
|
||||
};
|
||||
```
|
||||
|
||||
### ws://host:port/ws/fan/{service_name}
|
||||
### ws://host:port/api/websocket/fan/{service_name}
|
||||
|
||||
Получение логов сервиса (все реплики).
|
||||
|
||||
@@ -416,14 +416,14 @@ ws.onerror = function(error) {
|
||||
```javascript
|
||||
const token = "your-jwt-token";
|
||||
const serviceName = "web";
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/fan/${serviceName}?token=${token}&tail=100`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/fan/${serviceName}?token=${token}&tail=100`);
|
||||
|
||||
ws.onmessage = function(event) {
|
||||
console.log('Логи сервиса:', event.data);
|
||||
};
|
||||
```
|
||||
|
||||
### ws://host:port/ws/fan_group
|
||||
### ws://host:port/api/websocket/fan_group
|
||||
|
||||
Получение логов группы сервисов.
|
||||
|
||||
@@ -438,7 +438,7 @@ ws.onmessage = function(event) {
|
||||
```javascript
|
||||
const token = "your-jwt-token";
|
||||
const services = "web,db,redis";
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/fan_group?services=${services}&token=${token}&tail=100`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/fan_group?services=${services}&token=${token}&tail=100`);
|
||||
|
||||
ws.onmessage = function(event) {
|
||||
console.log('Логи группы сервисов:', event.data);
|
||||
@@ -522,7 +522,7 @@ def login(username, password):
|
||||
# Получение списка контейнеров
|
||||
def get_containers(token):
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
response = requests.get(f"{BASE_URL}/api/services", headers=headers)
|
||||
response = requests.get(f"{BASE_URL}/api/containers/services", headers=headers)
|
||||
return response.json()
|
||||
|
||||
# Получение логов контейнера
|
||||
@@ -563,7 +563,7 @@ class LogBoardAPI {
|
||||
if (projects) params.append('projects', projects);
|
||||
if (includeStopped) params.append('include_stopped', 'true');
|
||||
|
||||
const response = await fetch(`${this.baseUrl}/api/services?${params}`, {
|
||||
const response = await fetch(`${this.baseUrl}/api/containers/services?${params}`, {
|
||||
headers: this.headers
|
||||
});
|
||||
return await response.json();
|
||||
@@ -592,7 +592,7 @@ class LogBoardAPI {
|
||||
// WebSocket для live-логов
|
||||
createLogsWebSocket(containerId, tail = 100) {
|
||||
const ws = new WebSocket(
|
||||
`ws://${this.baseUrl.replace('http://', '')}/ws/logs/${containerId}?token=${this.token}&tail=${tail}`
|
||||
`ws://${this.baseUrl.replace('http://', '')}/api/websocket/logs/${containerId}?token=${this.token}&tail=${tail}`
|
||||
);
|
||||
return ws;
|
||||
}
|
||||
@@ -654,12 +654,12 @@ echo "Токен получен: ${TOKEN:0:20}..."
|
||||
|
||||
# Получение списка контейнеров
|
||||
echo "Получение списка контейнеров..."
|
||||
curl -s -X GET "$BASE_URL/api/services" \
|
||||
curl -s -X GET "$BASE_URL/api/containers/services" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
| jq '.[] | {name: .name, status: .status, project: .project}'
|
||||
|
||||
# Получение логов первого контейнера
|
||||
CONTAINER_ID=$(curl -s -X GET "$BASE_URL/api/services" \
|
||||
CONTAINER_ID=$(curl -s -X GET "$BASE_URL/api/containers/services" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
| jq -r '.[0].id')
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ LogBoard+ использует переменные окружения для н
|
||||
- **ReDoc** - альтернативная документация по адресу `/redoc`
|
||||
- **Подробное логирование** - детальные логи для отладки
|
||||
|
||||
**⚠️ Важно:** В продакшене обязательно установите `DEBUG_MODE=false`!
|
||||
Важно: в продакшене обязательно установите `DEBUG_MODE=false`.
|
||||
|
||||
### Настройки уведомлений
|
||||
|
||||
@@ -311,11 +311,11 @@ volumes:
|
||||
|
||||
```bash
|
||||
# Получение списка исключенных контейнеров
|
||||
curl -X GET "http://localhost:9001/api/excluded-containers" \
|
||||
curl -X GET "http://localhost:9001/api/containers/excluded" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN"
|
||||
|
||||
# Обновление списка
|
||||
curl -X POST "http://localhost:9001/api/excluded-containers" \
|
||||
curl -X POST "http://localhost:9001/api/containers/excluded" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '["container1", "container2"]'
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
LogBoard+ - это современная веб-панель для мониторинга и просмотра логов Docker контейнеров в реальном времени. Приложение идеально подходит для локальной разработки, позволяя разработчикам всегда держать логи микросервисов перед глазами на втором мониторе.
|
||||
|
||||
### 🎯 **Идеально для локальной разработки**
|
||||
### Идеально для локальной разработки
|
||||
|
||||
LogBoard+ особенно полезен для разработчиков, работающих с микросервисной архитектурой:
|
||||
|
||||
@@ -16,7 +16,7 @@ LogBoard+ особенно полезен для разработчиков, р
|
||||
- **Мониторинг в реальном времени** - Видите проблемы сразу, как они возникают
|
||||
- **Централизованный просмотр** - Все логи в одном месте, а не в десятках терминалов
|
||||
|
||||
### 🐳 **Оптимизирован для Docker и Docker Compose**
|
||||
### Оптимизирован для Docker и Docker Compose
|
||||
|
||||
Если ваша инфраструктура основана на Docker и Docker Compose, LogBoard+ станет незаменимым инструментом:
|
||||
|
||||
@@ -26,13 +26,13 @@ LogBoard+ особенно полезен для разработчиков, р
|
||||
- **Multi-view режим** - одновременный просмотр логов нескольких контейнеров
|
||||
- **Интеграция с Docker API** - прямая работа с контейнерами
|
||||
|
||||
### 🚀 **Производительность и удобство**
|
||||
### Производительность и удобство
|
||||
|
||||
Приложение предоставляет удобный веб-интерфейс для работы с логами микросервисов, поддерживает множественные проекты Docker Compose и включает в себя функции безопасности.
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
### Установка
|
||||
### Вариант A: Разработка
|
||||
|
||||
```bash
|
||||
# Клонирование репозитория
|
||||
@@ -40,17 +40,50 @@ git clone <repository-url>
|
||||
cd logboard
|
||||
|
||||
# Настройка переменных окружения
|
||||
cp env.example .env
|
||||
make setup
|
||||
|
||||
# Запуск приложения
|
||||
docker compose up --build -d
|
||||
make up
|
||||
```
|
||||
|
||||
### Доступ
|
||||
### Вариант B: Продакшен (пример docker-compose-prod.yaml)
|
||||
|
||||
- **URL:** http://localhost:9001
|
||||
- **Пользователь:** `admin`
|
||||
- **Пароль:** `admin` (обязательно измените в продакшене!)
|
||||
```yaml
|
||||
services:
|
||||
logboard:
|
||||
image: docker.io/inecs/logboard:v1
|
||||
container_name: logboard
|
||||
environment:
|
||||
LOGBOARD_PORT: "9001"
|
||||
LOGBOARD_TAIL: "500"
|
||||
LOGBOARD_USER: "admin"
|
||||
LOGBOARD_PASS: "admin"
|
||||
LOGBOARD_SNAPSHOT_DIR: "/app/snapshots"
|
||||
LOGBOARD_STATIC_DIR: "/app/static"
|
||||
LOGBOARD_INDEX_HTML: "./app/templates/index.html"
|
||||
TZ_TS: "Europe/Moscow"
|
||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
||||
SECRET_KEY: "your-secret-key-here"
|
||||
ENCRYPTION_KEY: "your-encryption-key-here"
|
||||
LOG_LEVEL: "INFO"
|
||||
LOG_FORMAT: "json"
|
||||
DEBUG_MODE: "false"
|
||||
AUTH_ENABLED: "true"
|
||||
SESSION_TIMEOUT: "3600"
|
||||
ports:
|
||||
- "9001:9001"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- ./snapshots:/app/snapshots
|
||||
restart: unless-stopped
|
||||
user: 0:0
|
||||
```
|
||||
|
||||
После запуска интерфейс доступен по адресу: http://localhost:9001
|
||||
|
||||
Учетные данные по умолчанию:
|
||||
- Пользователь: `admin`
|
||||
- Пароль: `admin` (обязательно измените в продакшене)
|
||||
|
||||
## Документация
|
||||
|
||||
@@ -106,35 +139,35 @@ docker compose up --build -d
|
||||
|
||||
## Скриншоты
|
||||
|
||||
### 🔐 Страница входа
|
||||
### Страница входа
|
||||
| Светлая тема | Темная тема |
|
||||
|--------------|-------------|
|
||||
|  |  |
|
||||
|
||||
### 📊 Основной интерфейс
|
||||
### Основной интерфейс
|
||||
| Светлая тема | Темная тема |
|
||||
|--------------|-------------|
|
||||
|  |  |
|
||||
|
||||
### 🖥️ Multi-view режим
|
||||
### Multi-view режим
|
||||

|
||||
|
||||
### 📋 Карточки контейнеров
|
||||
### Карточки контейнеров
|
||||

|
||||
|
||||
### 📁 Проекты
|
||||
### Проекты
|
||||

|
||||
|
||||
### ⚙️ Настройки
|
||||
### Настройки
|
||||

|
||||
|
||||
### 🔧 Сворачиваемая боковая панель
|
||||
### Сворачиваемая боковая панель
|
||||

|
||||
|
||||
### ❓ Справка
|
||||
### Справка
|
||||

|
||||
|
||||
### 🚨 Страницы ошибок
|
||||
### Страницы ошибок
|
||||

|
||||
|
||||
## Архитектура
|
||||
@@ -169,22 +202,22 @@ docker compose up --build -d
|
||||
- `GET /api/auth/me` - Информация о текущем пользователе
|
||||
|
||||
#### Контейнеры и сервисы
|
||||
- `GET /api/services` - Список контейнеров
|
||||
- `GET /api/projects` - Список проектов Docker Compose
|
||||
- `GET /api/containers/services` - Список контейнеров
|
||||
- `GET /api/containers/projects` - Список проектов Docker Compose
|
||||
- `GET /api/logs/{container_id}` - Логи контейнера
|
||||
- `GET /api/logs/stats/{container_id}` - Статистика логов
|
||||
|
||||
#### Управление
|
||||
- `GET /api/settings` - Настройки приложения
|
||||
- `GET /api/excluded-containers` - Список исключенных контейнеров
|
||||
- `POST /api/excluded-containers` - Обновление исключенных контейнеров
|
||||
- `POST /api/snapshot` - Создание снимка логов
|
||||
- `GET /api/containers/excluded` - Список исключенных контейнеров
|
||||
- `POST /api/containers/excluded` - Обновление исключенных контейнеров
|
||||
- `POST /api/logs/snapshot` - Создание снимка логов
|
||||
|
||||
### WebSocket API
|
||||
|
||||
- `ws://host:port/ws/logs/{container_id}` - Логи отдельного контейнера
|
||||
- `ws://host:port/ws/fan/{service_name}` - Логи сервиса (все реплики)
|
||||
- `ws://host:port/ws/fan_group` - Логи группы сервисов
|
||||
- `ws://host:port/api/websocket/logs/{container_id}` - Логи отдельного контейнера
|
||||
- `ws://host:port/api/websocket/fan/{service_name}` - Логи сервиса (все реплики)
|
||||
- `ws://host:port/api/websocket/fan_group` - Логи группы сервисов
|
||||
|
||||
## Конфигурация
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
## Обзор и применение
|
||||
|
||||
### 🎯 **Идеально для локальной разработки**
|
||||
### Идеально для локальной разработки
|
||||
|
||||
LogBoard+ создан специально для разработчиков, работающих с микросервисной архитектурой. Если вы используете Docker и Docker Compose для локальной разработки, этот инструмент станет незаменимым помощником:
|
||||
|
||||
@@ -24,7 +24,7 @@ LogBoard+ создан специально для разработчиков,
|
||||
- **Мониторинг в реальном времени** - Видите проблемы сразу, как они возникают
|
||||
- **Централизованный просмотр** - Все логи в одном месте, а не в десятках терминалов
|
||||
|
||||
### 🐳 **Оптимизирован для Docker и Docker Compose**
|
||||
### Оптимизирован для Docker и Docker Compose
|
||||
|
||||
Если ваша инфраструктура основана на Docker и Docker Compose, LogBoard+ предоставляет:
|
||||
|
||||
@@ -34,7 +34,7 @@ LogBoard+ создан специально для разработчиков,
|
||||
- **Multi-view режим** - одновременный просмотр логов нескольких контейнеров
|
||||
- **Интеграция с Docker API** - прямая работа с контейнерами
|
||||
|
||||
### 💡 **Сценарии использования**
|
||||
### Сценарии использования
|
||||
|
||||
- **Локальная разработка** - мониторинг логов микросервисов на втором мониторе
|
||||
- **Отладка проблем** - быстрый поиск ошибок в логах
|
||||
@@ -212,11 +212,11 @@ curl -X POST "http://localhost:9001/api/auth/login" \
|
||||
|
||||
```bash
|
||||
# Проверка списка контейнеров
|
||||
curl -X GET "http://localhost:9001/api/services" \
|
||||
curl -X GET "http://localhost:9001/api/containers/services" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN_HERE"
|
||||
|
||||
# Проверка списка проектов
|
||||
curl -X GET "http://localhost:9001/api/projects" \
|
||||
curl -X GET "http://localhost:9001/api/containers/projects" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN_HERE"
|
||||
```
|
||||
|
||||
|
||||
@@ -129,39 +129,39 @@ echo ""
|
||||
|
||||
# Проверка наличия OpenSSL
|
||||
if ! command -v openssl &> /dev/null; then
|
||||
echo "❌ OpenSSL не найден. Установите OpenSSL для генерации ключей."
|
||||
echo "OpenSSL не найден. Установите OpenSSL для генерации ключей."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🔐 Генерация SECRET_KEY..."
|
||||
echo "Генерация SECRET_KEY..."
|
||||
SECRET_KEY=$(openssl rand -hex 32)
|
||||
echo "SECRET_KEY=$SECRET_KEY"
|
||||
echo ""
|
||||
|
||||
echo "🔐 Генерация ENCRYPTION_KEY..."
|
||||
echo "Генерация ENCRYPTION_KEY..."
|
||||
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||
echo "ENCRYPTION_KEY=$ENCRYPTION_KEY"
|
||||
echo ""
|
||||
|
||||
echo "🔐 Генерация пароля пользователя..."
|
||||
echo "Генерация пароля пользователя..."
|
||||
USER_PASSWORD=$(openssl rand -base64 16 | tr -d "=+/" | cut -c1-16)
|
||||
echo "LOGBOARD_PASS=$USER_PASSWORD"
|
||||
echo ""
|
||||
|
||||
echo "📝 Обновление .env файла..."
|
||||
echo "Обновление .env файла..."
|
||||
if [ -f .env ]; then
|
||||
# Создание резервной копии
|
||||
cp .env .env.backup.$(date +%Y%m%d_%H%M%S)
|
||||
echo "✅ Создана резервная копия .env"
|
||||
echo "Создана резервная копия .env"
|
||||
|
||||
# Обновление ключей
|
||||
sed -i "s/^SECRET_KEY=.*/SECRET_KEY=$SECRET_KEY/" .env
|
||||
sed -i "s/^ENCRYPTION_KEY=.*/ENCRYPTION_KEY=$ENCRYPTION_KEY/" .env
|
||||
sed -i "s/^LOGBOARD_PASS=.*/LOGBOARD_PASS=$USER_PASSWORD/" .env
|
||||
|
||||
echo "✅ Ключи обновлены в .env"
|
||||
echo "Ключи обновлены в .env"
|
||||
else
|
||||
echo "⚠️ Файл .env не найден. Создайте его из env.example"
|
||||
echo "Файл .env не найден. Создайте его из env.example"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
@@ -171,7 +171,7 @@ echo "2. Не передавайте ключи через незащищенн
|
||||
echo "3. Регулярно обновляйте ключи"
|
||||
echo "4. Используйте разные ключи для разных окружений"
|
||||
echo ""
|
||||
echo "✅ Генерация ключей завершена!"
|
||||
echo "Генерация ключей завершена!"
|
||||
```
|
||||
|
||||
```bash
|
||||
@@ -213,9 +213,9 @@ def check_entropy(key_hex):
|
||||
print(f'Энтропия: {entropy:.2%}')
|
||||
|
||||
if entropy > 0.8:
|
||||
print('✅ Ключ имеет хорошую энтропию')
|
||||
print('Ключ имеет хорошую энтропию')
|
||||
else:
|
||||
print('⚠️ Ключ может иметь низкую энтропию')
|
||||
print('Ключ может иметь низкую энтропию')
|
||||
|
||||
# Проверка вашего ключа
|
||||
key = '8a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6'
|
||||
@@ -660,43 +660,43 @@ echo ""
|
||||
|
||||
# Проверка паролей по умолчанию
|
||||
if grep -q "LOGBOARD_PASS=admin" .env; then
|
||||
echo "❌ Пароль по умолчанию не изменен!"
|
||||
echo "Пароль по умолчанию не изменен"
|
||||
else
|
||||
echo "✅ Пароль изменен"
|
||||
echo "Пароль изменен"
|
||||
fi
|
||||
|
||||
# Проверка секретных ключей
|
||||
if grep -q "SECRET_KEY=your-secret-key-here" .env; then
|
||||
echo "❌ SECRET_KEY не изменен!"
|
||||
echo "SECRET_KEY не изменен"
|
||||
else
|
||||
echo "✅ SECRET_KEY изменен"
|
||||
echo "SECRET_KEY изменен"
|
||||
fi
|
||||
|
||||
if grep -q "ENCRYPTION_KEY=your-encryption-key-here" .env; then
|
||||
echo "❌ ENCRYPTION_KEY не изменен!"
|
||||
echo "ENCRYPTION_KEY не изменен"
|
||||
else
|
||||
echo "✅ ENCRYPTION_KEY изменен"
|
||||
echo "ENCRYPTION_KEY изменен"
|
||||
fi
|
||||
|
||||
# Проверка HTTPS
|
||||
if curl -s -I https://localhost:9001 > /dev/null 2>&1; then
|
||||
echo "✅ HTTPS доступен"
|
||||
echo "HTTPS доступен"
|
||||
else
|
||||
echo "⚠️ HTTPS недоступен"
|
||||
echo "HTTPS недоступен"
|
||||
fi
|
||||
|
||||
# Проверка прав Docker
|
||||
if ls -la /var/run/docker.sock | grep -q "srw-rw-rw-"; then
|
||||
echo "✅ Docker socket доступен"
|
||||
echo "Docker socket доступен"
|
||||
else
|
||||
echo "❌ Проблемы с доступом к Docker socket"
|
||||
echo "Проблемы с доступом к Docker socket"
|
||||
fi
|
||||
|
||||
# Проверка файрвола
|
||||
if command -v ufw > /dev/null && sudo ufw status | grep -q "Status: active"; then
|
||||
echo "✅ Файрвол активен"
|
||||
echo "Файрвол активен"
|
||||
else
|
||||
echo "⚠️ Файрвол не настроен"
|
||||
echo "Файрвол не настроен"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
@@ -363,7 +363,7 @@ echo $SESSION_TIMEOUT
|
||||
|
||||
```bash
|
||||
# Проверка WebSocket endpoint
|
||||
curl -I "http://localhost:9001/ws/logs/test"
|
||||
curl -I "http://localhost:9001/api/websocket/logs/test"
|
||||
|
||||
# Проверка логов приложения
|
||||
make logs | grep -i websocket
|
||||
@@ -376,8 +376,8 @@ make logs | grep -i websocket
|
||||
|
||||
1. **Проблема с прокси**
|
||||
```nginx
|
||||
# Настройка Nginx для WebSocket
|
||||
location /ws/ {
|
||||
# Настройка Nginx для WebSocket с корректными путями API
|
||||
location /api/websocket/ {
|
||||
proxy_pass http://localhost:9001;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
@@ -390,7 +390,7 @@ make logs | grep -i websocket
|
||||
```javascript
|
||||
// Проверка токена в WebSocket URL
|
||||
const token = "your-valid-token";
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/logs/container-id?token=${token}`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/logs/container-id?token=${token}`);
|
||||
```
|
||||
|
||||
3. **Проблема с CORS**
|
||||
@@ -703,7 +703,7 @@ curl -X POST "http://localhost:9001/api/auth/login" \
|
||||
|
||||
# Проверка API с токеном
|
||||
TOKEN="your-token"
|
||||
curl -X GET "http://localhost:9001/api/services" \
|
||||
curl -X GET "http://localhost:9001/api/containers/services" \
|
||||
-H "Authorization: Bearer $TOKEN"
|
||||
```
|
||||
|
||||
@@ -762,6 +762,6 @@ curl -s -X POST "http://localhost:9001/api/auth/login" \
|
||||
TOKEN=$(curl -s -X POST "http://localhost:9001/api/auth/login" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"admin","password":"admin"}' | jq -r '.access_token')
|
||||
curl -s -X GET "http://localhost:9001/api/services" \
|
||||
curl -s -X GET "http://localhost:9001/api/containers/services" \
|
||||
-H "Authorization: Bearer $TOKEN" | jq 'length'
|
||||
```
|
||||
|
||||
@@ -45,12 +45,12 @@ curl -X POST "http://localhost:9001/api/auth/login" \
|
||||
|
||||
```javascript
|
||||
const token = "your-jwt-token";
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/logs/container-id?token=${token}`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/logs/container-id?token=${token}`);
|
||||
```
|
||||
|
||||
## Endpoints
|
||||
|
||||
### ws://host:port/ws/logs/{container_id}
|
||||
### ws://host:port/api/websocket/logs/{container_id}
|
||||
|
||||
Получение логов отдельного контейнера в реальном времени.
|
||||
|
||||
@@ -70,7 +70,7 @@ const ws = new WebSocket(`ws://localhost:9001/ws/logs/container-id?token=${token
|
||||
const containerId = "abc123def456";
|
||||
const token = "your-jwt-token";
|
||||
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/logs/${containerId}?token=${token}&tail=100`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/logs/${containerId}?token=${token}&tail=100`);
|
||||
|
||||
ws.onopen = function() {
|
||||
console.log('WebSocket соединение установлено');
|
||||
@@ -104,7 +104,7 @@ Connected to container: myproject_web_1
|
||||
2024-01-15T10:30:15.123456789Z 2024/01/15 10:30:15 [notice] 1#1: start worker process 1234
|
||||
```
|
||||
|
||||
### ws://host:port/ws/fan/{service_name}
|
||||
### ws://host:port/api/websocket/fan/{service_name}
|
||||
|
||||
Получение логов всех реплик сервиса Docker Compose (fan-in).
|
||||
|
||||
@@ -123,7 +123,7 @@ Connected to container: myproject_web_1
|
||||
const serviceName = "web";
|
||||
const token = "your-jwt-token";
|
||||
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/fan/${serviceName}?token=${token}&tail=100`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/fan/${serviceName}?token=${token}&tail=100`);
|
||||
|
||||
ws.onmessage = function(event) {
|
||||
// Логи приходят с префиксом ID контейнера
|
||||
@@ -140,7 +140,7 @@ ws.onmessage = function(event) {
|
||||
[def456gh] 2024-01-15T10:30:16.123456789Z 2024/01/15 10:30:16 [notice] 1#1: start worker processes
|
||||
```
|
||||
|
||||
### ws://host:port/ws/fan_group
|
||||
### ws://host:port/api/websocket/fan_group
|
||||
|
||||
Получение логов группы сервисов одновременно.
|
||||
|
||||
@@ -159,7 +159,7 @@ ws.onmessage = function(event) {
|
||||
const services = "web,db,redis";
|
||||
const token = "your-jwt-token";
|
||||
|
||||
const ws = new WebSocket(`ws://localhost:9001/ws/fan_group?services=${services}&token=${token}&tail=100`);
|
||||
const ws = new WebSocket(`ws://localhost:9001/api/websocket/fan_group?services=${services}&token=${token}&tail=100`);
|
||||
|
||||
ws.onmessage = function(event) {
|
||||
// Логи приходят с префиксом ID контейнера и имени сервиса
|
||||
@@ -193,7 +193,7 @@ class LogBoardWebSocket {
|
||||
connectToContainer(containerId, options = {}) {
|
||||
const { tail = 100, onMessage, onError, onClose } = options;
|
||||
|
||||
const url = `ws://${this.baseUrl.replace('http://', '')}/ws/logs/${containerId}?token=${this.token}&tail=${tail}`;
|
||||
const url = `ws://${this.baseUrl.replace('http://', '')}/api/websocket/logs/${containerId}?token=${this.token}&tail=${tail}`;
|
||||
const ws = new WebSocket(url);
|
||||
|
||||
ws.onopen = () => {
|
||||
@@ -222,7 +222,7 @@ class LogBoardWebSocket {
|
||||
connectToService(serviceName, options = {}) {
|
||||
const { tail = 100, project, onMessage, onError, onClose } = options;
|
||||
|
||||
let url = `ws://${this.baseUrl.replace('http://', '')}/ws/fan/${serviceName}?token=${this.token}&tail=${tail}`;
|
||||
let url = `ws://${this.baseUrl.replace('http://', '')}/api/websocket/fan/${serviceName}?token=${this.token}&tail=${tail}`;
|
||||
if (project) url += `&project=${project}`;
|
||||
|
||||
const ws = new WebSocket(url);
|
||||
@@ -253,7 +253,7 @@ class LogBoardWebSocket {
|
||||
connectToServiceGroup(services, options = {}) {
|
||||
const { tail = 100, project, onMessage, onError, onClose } = options;
|
||||
|
||||
let url = `ws://${this.baseUrl.replace('http://', '')}/ws/fan_group?services=${services}&token=${this.token}&tail=${tail}`;
|
||||
let url = `ws://${this.baseUrl.replace('http://', '')}/api/websocket/fan_group?services=${services}&token=${this.token}&tail=${tail}`;
|
||||
if (project) url += `&project=${project}`;
|
||||
|
||||
const ws = new WebSocket(url);
|
||||
@@ -393,7 +393,7 @@ class LogBoardWebSocket:
|
||||
|
||||
async def connect_to_container(self, container_id, tail=100, callback=None):
|
||||
"""Подключение к логам контейнера"""
|
||||
uri = f"{self.base_url}/ws/logs/{container_id}?token={self.token}&tail={tail}"
|
||||
uri = f"{self.base_url}/api/websocket/logs/{container_id}?token={self.token}&tail={tail}"
|
||||
|
||||
try:
|
||||
async with websockets.connect(uri) as websocket:
|
||||
@@ -412,7 +412,7 @@ class LogBoardWebSocket:
|
||||
|
||||
async def connect_to_service(self, service_name, tail=100, project=None, callback=None):
|
||||
"""Подключение к логам сервиса"""
|
||||
uri = f"{self.base_url}/ws/fan/{service_name}?token={self.token}&tail={tail}"
|
||||
uri = f"{self.base_url}/api/websocket/fan/{service_name}?token={self.token}&tail={tail}"
|
||||
if project:
|
||||
uri += f"&project={project}"
|
||||
|
||||
@@ -433,7 +433,7 @@ class LogBoardWebSocket:
|
||||
|
||||
async def connect_to_service_group(self, services, tail=100, project=None, callback=None):
|
||||
"""Подключение к логам группы сервисов"""
|
||||
uri = f"{self.base_url}/ws/fan_group?services={services}&token={self.token}&tail={tail}"
|
||||
uri = f"{self.base_url}/api/websocket/fan_group?services={services}&token={self.token}&tail={tail}"
|
||||
if project:
|
||||
uri += f"&project={project}"
|
||||
|
||||
@@ -507,7 +507,7 @@ class LogBoardWebSocket {
|
||||
connectToContainer(containerId, options = {}) {
|
||||
const { tail = 100, onMessage, onError, onClose } = options;
|
||||
|
||||
const url = `${this.baseUrl}/ws/logs/${containerId}?token=${this.token}&tail=${tail}`;
|
||||
const url = `${this.baseUrl}/api/websocket/logs/${containerId}?token=${this.token}&tail=${tail}`;
|
||||
const ws = new WebSocket(url);
|
||||
|
||||
ws.on('open', () => {
|
||||
@@ -538,7 +538,7 @@ class LogBoardWebSocket {
|
||||
connectToService(serviceName, options = {}) {
|
||||
const { tail = 100, project, onMessage, onError, onClose } = options;
|
||||
|
||||
let url = `${this.baseUrl}/ws/fan/${serviceName}?token=${this.token}&tail=${tail}`;
|
||||
let url = `${this.baseUrl}/api/websocket/fan/${serviceName}?token=${this.token}&tail=${tail}`;
|
||||
if (project) url += `&project=${project}`;
|
||||
|
||||
const ws = new WebSocket(url);
|
||||
|
||||
Reference in New Issue
Block a user