docs: Полная переработка документации проекта
- Удалена старая документация с эмодзи - Создана новая техническая документация на русском языке - Добавлены подробные руководства: * README.md - обзор проекта * docs/installation.md - установка и настройка * docs/configuration.md - конфигурация * docs/api.md - API документация * docs/management.md - управление проектом * docs/security.md - безопасность * docs/troubleshooting.md - устранение неполадок - Обновлены конфигурационные файлы - Улучшена структура проекта Автор: Сергей Антропов Сайт: https://devops.org.ru
This commit is contained in:
@@ -1,217 +0,0 @@
|
||||
# Улучшения AJAX Auto-update
|
||||
|
||||
## Описание изменений
|
||||
|
||||
Реализованы значительные улучшения системы AJAX auto-update для LogBoard+.
|
||||
|
||||
## Основные изменения
|
||||
|
||||
### 1. AJAX autoupdate по умолчанию включен
|
||||
|
||||
**Изменение:** Значение `ajaxUpdateEnabled` изменено с `false` на `true`
|
||||
|
||||
**Файл:** `templates/index.html`
|
||||
```javascript
|
||||
// Было:
|
||||
let ajaxUpdateEnabled = false;
|
||||
|
||||
// Стало:
|
||||
let ajaxUpdateEnabled = true; // По умолчанию включен
|
||||
```
|
||||
|
||||
**Преимущества:**
|
||||
- Пользователи сразу получают автоматическое обновление логов
|
||||
- Не нужно вручную включать функцию при каждом запуске
|
||||
- Улучшенный пользовательский опыт
|
||||
|
||||
### 2. Добавлена кнопка Update
|
||||
|
||||
**Новая функциональность:** Кнопка update в header для управления AJAX autoupdate
|
||||
|
||||
**Расположение:** Справа от кнопки WebSocket состояния
|
||||
|
||||
**Визуальные состояния:**
|
||||
- **Зеленая** - AJAX autoupdate включен
|
||||
- **Красная** - AJAX autoupdate выключен
|
||||
|
||||
**Функциональность:**
|
||||
- Клик по кнопке переключает состояние AJAX autoupdate
|
||||
- Автоматическое обновление цвета при изменении состояния
|
||||
- Интуитивно понятное управление
|
||||
|
||||
### 3. Улучшенное управление кнопками
|
||||
|
||||
**Логика работы:**
|
||||
- **AJAX autoupdate включен** → Кнопка refresh скрыта, кнопка update зеленая
|
||||
- **AJAX autoupdate выключен** → Кнопка refresh показана, кнопка update красная
|
||||
|
||||
## Техническая реализация
|
||||
|
||||
### CSS стили
|
||||
|
||||
```css
|
||||
/* Кнопка состояния AJAX Update */
|
||||
.ajax-update-btn {
|
||||
background: var(--chip);
|
||||
color: var(--muted);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
padding: 6px 12px;
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
font-family: inherit;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.ajax-update-btn.ajax-on {
|
||||
background: #7ea855; /* Зеленый цвет */
|
||||
color: white;
|
||||
border-color: #7ea855;
|
||||
}
|
||||
|
||||
.ajax-update-btn.ajax-off {
|
||||
background: #f7768e; /* Красный цвет */
|
||||
color: white;
|
||||
border-color: #f7768e;
|
||||
}
|
||||
|
||||
.ajax-update-btn:hover {
|
||||
opacity: 0.8;
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
|
||||
}
|
||||
```
|
||||
|
||||
### HTML структура
|
||||
|
||||
```html
|
||||
<button id="wsstate" class="ws-status-btn">ws: off</button>
|
||||
<button id="ajaxUpdateBtn" class="ajax-update-btn" title="AJAX Auto-update">update</button>
|
||||
<button class="btn btn-small log-refresh-btn" title="Обновить логи и счетчики">
|
||||
<i class="fas fa-sync-alt"></i> Refresh
|
||||
</button>
|
||||
```
|
||||
|
||||
### JavaScript функции
|
||||
|
||||
#### setAjaxUpdateState(enabled)
|
||||
```javascript
|
||||
function setAjaxUpdateState(enabled) {
|
||||
if (els.ajaxUpdateBtn) {
|
||||
// Удаляем все классы состояний
|
||||
els.ajaxUpdateBtn.classList.remove('ajax-on', 'ajax-off');
|
||||
|
||||
// Добавляем соответствующий класс
|
||||
if (enabled) {
|
||||
els.ajaxUpdateBtn.classList.add('ajax-on');
|
||||
els.ajaxUpdateBtn.textContent = 'update';
|
||||
} else {
|
||||
els.ajaxUpdateBtn.classList.add('ajax-off');
|
||||
els.ajaxUpdateBtn.textContent = 'update';
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Обновленная updateRefreshButtonVisibility()
|
||||
```javascript
|
||||
function updateRefreshButtonVisibility() {
|
||||
const refreshButtons = document.querySelectorAll('.log-refresh-btn');
|
||||
refreshButtons.forEach(btn => {
|
||||
if (ajaxUpdateEnabled) {
|
||||
// Если ajax autoupdate включен, скрываем кнопку refresh
|
||||
btn.style.display = 'none';
|
||||
} else {
|
||||
// Если ajax autoupdate выключен, показываем кнопку refresh
|
||||
btn.style.display = 'inline-flex';
|
||||
}
|
||||
});
|
||||
|
||||
// Обновляем состояние кнопки update
|
||||
setAjaxUpdateState(ajaxUpdateEnabled);
|
||||
}
|
||||
```
|
||||
|
||||
#### Обработчик клика
|
||||
```javascript
|
||||
// Обработчик для кнопки update (AJAX autoupdate toggle)
|
||||
if (els.ajaxUpdateBtn) {
|
||||
els.ajaxUpdateBtn.addEventListener('click', () => {
|
||||
toggleAjaxLogUpdate();
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
## Интеграция с существующим кодом
|
||||
|
||||
### Обновленные функции
|
||||
1. **enableAjaxLogUpdate()** - обновляет состояние кнопки update
|
||||
2. **disableAjaxLogUpdate()** - обновляет состояние кнопки update
|
||||
3. **toggleAjaxLogUpdate()** - обновляет состояние кнопки update
|
||||
4. **initAjaxUpdateCheckbox()** - устанавливает правильное начальное состояние
|
||||
5. **initAjaxUpdate()** - инициализирует состояние кнопки update
|
||||
|
||||
### Автоматическое обновление состояния
|
||||
Состояние кнопки update автоматически обновляется в следующих случаях:
|
||||
- При инициализации AJAX update
|
||||
- При изменении состояния чекбокса "Auto-update logs"
|
||||
- При программном включении/выключении AJAX update
|
||||
- При переключении состояния через функцию toggleAjaxLogUpdate
|
||||
- При клике по кнопке update
|
||||
|
||||
## Преимущества реализации
|
||||
|
||||
### 1. Улучшенный UX
|
||||
- Интуитивно понятное управление AJAX autoupdate
|
||||
- Визуальная обратная связь о состоянии системы
|
||||
- Быстрый доступ к управлению через кнопку в header
|
||||
|
||||
### 2. Логическая связность
|
||||
- Кнопка refresh скрыта, когда она не нужна
|
||||
- Кнопка update показывает актуальное состояние
|
||||
- Единообразное поведение всех элементов управления
|
||||
|
||||
### 3. Автоматическое управление
|
||||
- Не требует ручного вмешательства пользователя
|
||||
- Состояние синхронизировано между всеми элементами
|
||||
- Корректная работа при всех сценариях использования
|
||||
|
||||
### 4. Совместимость
|
||||
- Работает с существующим кодом без нарушений
|
||||
- Поддерживает все режимы просмотра (single-view, multi-view)
|
||||
- Совместимо с фильтрацией и настройками уровней логирования
|
||||
|
||||
## Тестирование
|
||||
|
||||
### Сценарии тестирования
|
||||
|
||||
1. **Начальное состояние**
|
||||
- При загрузке страницы AJAX autoupdate должен быть включен
|
||||
- Кнопка update должна быть зеленой
|
||||
- Кнопка refresh должна быть скрыта
|
||||
|
||||
2. **Переключение через кнопку update**
|
||||
- Клик по кнопке update должен переключить состояние
|
||||
- Цвет кнопки должен измениться (зеленый ↔ красный)
|
||||
- Видимость кнопки refresh должна измениться
|
||||
|
||||
3. **Переключение через чекбокс**
|
||||
- Изменение состояния чекбокса "Auto-update logs" должно обновить кнопку update
|
||||
- Состояние должно синхронизироваться между всеми элементами
|
||||
|
||||
4. **Программное управление**
|
||||
- Вызов функций enable/disable должен обновить UI
|
||||
- Состояние должно корректно отображаться
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Дата реализации
|
||||
|
||||
2024 год
|
||||
@@ -1,84 +0,0 @@
|
||||
# Добавление Border и Box-shadow к кнопке Refresh
|
||||
|
||||
## Описание изменений
|
||||
|
||||
Добавлены border и box-shadow к кнопке refresh в header для полного соответствия стилям кнопки update.
|
||||
|
||||
## Изменения стилей
|
||||
|
||||
### До изменений:
|
||||
```css
|
||||
.log-refresh-btn {
|
||||
border: none; /* Без границы */
|
||||
/* нет box-shadow */
|
||||
}
|
||||
```
|
||||
|
||||
### После изменений:
|
||||
```css
|
||||
.log-refresh-btn {
|
||||
border: 1px solid var(--accent); /* Граница как у update */
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* Тень как у update */
|
||||
}
|
||||
```
|
||||
|
||||
## Сравнение кнопок
|
||||
|
||||
### Кнопка Update:
|
||||
```css
|
||||
.ajax-update-btn {
|
||||
border: 1px solid var(--border);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
```
|
||||
|
||||
### Кнопка Refresh (после изменений):
|
||||
```css
|
||||
.log-refresh-btn {
|
||||
border: 1px solid var(--accent); /* ✅ Совпадает по стилю */
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* ✅ Совпадает */
|
||||
}
|
||||
```
|
||||
|
||||
## Визуальные улучшения
|
||||
|
||||
### Полное единообразие:
|
||||
- **Одинаковая граница** - 1px solid для обеих кнопок
|
||||
- **Одинаковая тень** - box-shadow для обеих кнопок
|
||||
- **Одинаковая высота** - обе кнопки имеют одинаковую высоту
|
||||
- **Одинаковая ширина** - минимальная ширина 60px для обеих кнопок
|
||||
- **Одинаковый размер шрифта** - 11px для обеих кнопок
|
||||
- **Одинаковые отступы** - 6px 12px для обеих кнопок
|
||||
|
||||
### Преимущества:
|
||||
1. **Визуальная согласованность** - кнопки выглядят как единый набор элементов управления
|
||||
2. **Профессиональный вид** - границы и тени придают кнопкам более современный вид
|
||||
3. **Улучшенная читаемость** - тени помогают выделить кнопки на фоне
|
||||
|
||||
## Технические детали
|
||||
|
||||
### Добавленные CSS свойства:
|
||||
- `border: 1px solid var(--accent)` - граница в цвет акцента
|
||||
- `box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1)` - легкая тень
|
||||
|
||||
### Особенности реализации:
|
||||
- **Цвет границы** - используется `var(--accent)` вместо `var(--border)` для лучшего соответствия цвету кнопки
|
||||
- **Тень** - идентична тени кнопки update для полного соответствия
|
||||
- **Совместимость** - работает в обеих темах (светлая/темная)
|
||||
|
||||
## Совместимость
|
||||
|
||||
Изменения стилей не влияют на:
|
||||
- Функциональность кнопки
|
||||
- JavaScript обработчики
|
||||
- Логику показа/скрытия
|
||||
- Поведение в разных темах (светлая/темная)
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Дата реализации
|
||||
|
||||
2024 год
|
||||
@@ -1,96 +0,0 @@
|
||||
# Изменение порядка кнопок в Header
|
||||
|
||||
## Описание изменений
|
||||
|
||||
Изменен порядок кнопок в header для улучшения логической группировки элементов управления.
|
||||
|
||||
## Новый порядок кнопок
|
||||
|
||||
### До изменений:
|
||||
1. Счетчики логов (DEBUG, INFO, WARN, ERROR, OTHER)
|
||||
2. **Кнопка Refresh**
|
||||
3. Переключатель темы (Theme)
|
||||
4. Кнопка WebSocket состояния (ws: off)
|
||||
5. **Кнопка Update**
|
||||
|
||||
### После изменений:
|
||||
1. Счетчики логов (DEBUG, INFO, WARN, ERROR, OTHER)
|
||||
2. Переключатель темы (Theme)
|
||||
3. Кнопка WebSocket состояния (ws: off)
|
||||
4. **Кнопка Update**
|
||||
5. **Кнопка Refresh**
|
||||
|
||||
## Логика нового порядка
|
||||
|
||||
### Группировка по функциональности:
|
||||
1. **Счетчики логов** - отображение статистики
|
||||
2. **Настройки интерфейса** - переключатель темы
|
||||
3. **Состояние соединений** - WebSocket и AJAX update
|
||||
4. **Управление обновлением** - кнопки update и refresh
|
||||
|
||||
### Преимущества нового порядка:
|
||||
- **Логическая группировка** - связанные элементы находятся рядом
|
||||
- **Улучшенный UX** - пользователь интуитивно понимает назначение кнопок
|
||||
- **Последовательность действий** - сначала управление состоянием, потом ручное обновление
|
||||
|
||||
## HTML структура
|
||||
|
||||
```html
|
||||
<div class="header-controls">
|
||||
<div class="header-compact-controls">
|
||||
<!-- Счетчики логов -->
|
||||
<button class="counter-btn debug-btn" title="DEBUG">...</button>
|
||||
<button class="counter-btn info-btn" title="INFO">...</button>
|
||||
<button class="counter-btn warn-btn" title="WARN">...</button>
|
||||
<button class="counter-btn error-btn" title="ERROR">...</button>
|
||||
<button class="counter-btn other-btn" title="OTHER">...</button>
|
||||
</div>
|
||||
|
||||
<!-- Настройки интерфейса -->
|
||||
<div class="theme-toggle">
|
||||
<span>Theme</span>
|
||||
<input id="themeSwitch" type="checkbox" />
|
||||
</div>
|
||||
|
||||
<!-- Состояние соединений -->
|
||||
<button id="wsstate" class="ws-status-btn">ws: off</button>
|
||||
<button id="ajaxUpdateBtn" class="ajax-update-btn" title="AJAX Auto-update">update</button>
|
||||
|
||||
<!-- Управление обновлением -->
|
||||
<button class="btn btn-small log-refresh-btn" title="Обновить логи и счетчики">
|
||||
<i class="fas fa-sync-alt"></i> Refresh
|
||||
</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Визуальное представление
|
||||
|
||||
### Header layout:
|
||||
```
|
||||
[DEBUG: 0] [INFO: 0] [WARN: 0] [ERROR: 0] [OTHER: 0] | Theme [☐] | ws: off | update | Refresh
|
||||
```
|
||||
|
||||
### Логические группы:
|
||||
- **Счетчики**: `[DEBUG: 0] [INFO: 0] [WARN: 0] [ERROR: 0] [OTHER: 0]`
|
||||
- **Настройки**: `Theme [☐]`
|
||||
- **Состояние**: `ws: off | update`
|
||||
- **Управление**: `Refresh`
|
||||
|
||||
## Совместимость
|
||||
|
||||
Изменение порядка кнопок не влияет на:
|
||||
- Функциональность кнопок
|
||||
- JavaScript обработчики
|
||||
- CSS стили
|
||||
- Логику показа/скрытия кнопок
|
||||
|
||||
Все существующие функции продолжают работать без изменений.
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Дата реализации
|
||||
|
||||
2024 год
|
||||
42
Makefile
42
Makefile
@@ -2,7 +2,7 @@
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
.PHONY: help setup build up down restart logs clean status ps shell generate test-auth
|
||||
.PHONY: help setup build up down restart logs clean status ps shell
|
||||
|
||||
# Переменные
|
||||
COMPOSE_FILE = docker-compose.yml
|
||||
@@ -34,7 +34,10 @@ setup: ## Настроить переменные окружения (копир
|
||||
cp env.example .env; \
|
||||
echo "$(GREEN)Файл .env создан из env.example$(NC)"; \
|
||||
echo "$(YELLOW)Не забудьте отредактировать .env под свои нужды!$(NC)"; \
|
||||
echo "$(YELLOW)После редактирования .env запустите make generate для обновления docker-compose.yml$(NC)"; \
|
||||
echo "$(YELLOW)Особенно важны переменные безопасности:$(NC)"; \
|
||||
echo "$(YELLOW) - LOGBOARD_PASS$(NC)"; \
|
||||
echo "$(YELLOW) - SECRET_KEY$(NC)"; \
|
||||
echo "$(YELLOW) - ENCRYPTION_KEY$(NC)"; \
|
||||
else \
|
||||
echo "$(YELLOW)Файл .env уже существует.$(NC)"; \
|
||||
echo "$(YELLOW)Для пересоздания удалите .env и запустите make setup$(NC)"; \
|
||||
@@ -47,9 +50,15 @@ build: ## Собрать Docker образ
|
||||
|
||||
up: ## Запустить сервисы в фоновом режиме (с правами root)
|
||||
@echo "$(GREEN)Запуск сервисов с правами root...$(NC)"
|
||||
@mkdir -p snapshots
|
||||
docker compose -f $(COMPOSE_FILE) up -d
|
||||
@echo "$(GREEN)Сервисы запущены с правами root!$(NC)"
|
||||
@echo "$(YELLOW)Приложение доступно по адресу: http://localhost:9001$(NC)"
|
||||
@if [ -f .env ]; then \
|
||||
PORT=$$(grep "^LOGBOARD_PORT=" .env | cut -d'=' -f2 || echo "9001"); \
|
||||
echo "$(YELLOW)Приложение доступно по адресу: http://localhost:$$PORT$(NC)"; \
|
||||
else \
|
||||
echo "$(YELLOW)Приложение доступно по адресу: http://localhost:9001$(NC)"; \
|
||||
fi
|
||||
|
||||
down: ## Остановить и удалить сервисы (с правами root)
|
||||
@echo "$(YELLOW)Остановка сервисов с правами root...$(NC)"
|
||||
@@ -88,8 +97,33 @@ rebuild: ## Пересобрать и запустить сервисы
|
||||
@echo "$(YELLOW)Пересборка и запуск сервисов...$(NC)"
|
||||
docker compose -f $(COMPOSE_FILE) down
|
||||
docker compose -f $(COMPOSE_FILE) build --no-cache
|
||||
@mkdir -p snapshots
|
||||
docker compose -f $(COMPOSE_FILE) up -d
|
||||
@echo "$(GREEN)Сервисы пересобраны и запущены!$(NC)"
|
||||
@echo "$(YELLOW)Приложение доступно по адресу: http://localhost:9001$(NC)"
|
||||
@if [ -f .env ]; then \
|
||||
PORT=$$(grep "^LOGBOARD_PORT=" .env | cut -d'=' -f2 || echo "9001"); \
|
||||
echo "$(YELLOW)Приложение доступно по адресу: http://localhost:$$PORT$(NC)"; \
|
||||
else \
|
||||
echo "$(YELLOW)Приложение доступно по адресу: http://localhost:9001$(NC)"; \
|
||||
fi
|
||||
|
||||
config: ## Показать конфигурацию с подставленными переменными окружения
|
||||
@echo "$(GREEN)Конфигурация Docker Compose с переменными окружения:$(NC)"
|
||||
docker compose -f $(COMPOSE_FILE) config
|
||||
|
||||
validate: ## Проверить синтаксис docker-compose.yml
|
||||
@echo "$(GREEN)Проверка синтаксиса docker-compose.yml...$(NC)"
|
||||
docker compose -f $(COMPOSE_FILE) config --quiet
|
||||
@echo "$(GREEN)Синтаксис корректен!$(NC)"
|
||||
|
||||
env-check: ## Проверить переменные окружения
|
||||
@echo "$(GREEN)Проверка переменных окружения...$(NC)"
|
||||
@if [ -f .env ]; then \
|
||||
echo "$(GREEN)Файл .env найден$(NC)"; \
|
||||
echo "$(YELLOW)Основные переменные:$(NC)"; \
|
||||
grep -E "^(LOGBOARD_PORT|LOGBOARD_USER|LOGBOARD_PASS|SECRET_KEY|ENCRYPTION_KEY)=" .env || echo "$(RED)Переменные не найдены$(NC)"; \
|
||||
else \
|
||||
echo "$(RED)Файл .env не найден. Запустите make setup$(NC)"; \
|
||||
fi
|
||||
|
||||
|
||||
|
||||
459
README.md
459
README.md
@@ -1,459 +0,0 @@
|
||||
|
||||
# LogBoard+ - Веб-панель для просмотра логов микросервисов
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 1.0.0
|
||||
|
||||
## 📋 Описание
|
||||
|
||||
LogBoard+ - это современная веб-панель для просмотра логов Docker контейнеров в реальном времени. Приложение предоставляет удобный интерфейс для мониторинга логов микросервисов с поддержкой множественного просмотра, фильтрации, поиска и экспорта логов.
|
||||
|
||||
## ✨ Основные возможности
|
||||
|
||||
### 🔍 Просмотр логов
|
||||
- **Single View режим** - просмотр логов одного контейнера
|
||||
- **Multi View режим** - одновременный просмотр логов нескольких контейнеров
|
||||
- **Real-time обновление** через WebSocket соединения
|
||||
- **AJAX обновление** - периодическое получение новых логов без WebSocket
|
||||
- **Умное управление кнопками** - кнопка refresh скрывается при включенном AJAX autoupdate, кнопка update показывает состояние
|
||||
- **Автопрокрутка** логов
|
||||
- **Пауза/возобновление** потока логов
|
||||
|
||||
### 🎨 Интерфейс
|
||||
- **Современный адаптивный дизайн**
|
||||
- **Темная и светлая темы**
|
||||
- **Мобильная версия**
|
||||
- **Интуитивно понятная навигация**
|
||||
|
||||
### 🔧 Управление логами
|
||||
- **Фильтрация по уровням логирования** (DEBUG, INFO, WARN, ERROR, OTHER)
|
||||
- **Поиск по регулярным выражениям**
|
||||
- **Настройка количества строк** (Tail Lines)
|
||||
- **Перенос строк** (Word Wrap)
|
||||
- **Счетчики логов** по уровням
|
||||
|
||||
### 📊 Статистика и мониторинг
|
||||
- **Счетчики логов** в реальном времени
|
||||
- **Статистика по уровням логирования**
|
||||
- **Мониторинг состояния контейнеров**
|
||||
- **Health check статусы**
|
||||
|
||||
### 💾 Экспорт и сохранение
|
||||
- **Скачивание логов** в формате .log
|
||||
- **Отдельные файлы** для каждого контейнера в Multi View режиме
|
||||
- **Автоматическое именование файлов** с временными метками
|
||||
- **Сохранение снимков** логов
|
||||
|
||||
### 🔐 Безопасность
|
||||
- **JWT аутентификация**
|
||||
- **Настраиваемые пользователи**
|
||||
- **Защищенные API endpoints**
|
||||
- **Шифрование чувствительных данных**
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Предварительные требования
|
||||
- Docker и Docker Compose
|
||||
- Python 3.8+
|
||||
- Доступ к Docker socket
|
||||
|
||||
### Установка и запуск
|
||||
|
||||
1. **Клонирование репозитория**
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd logboard
|
||||
```
|
||||
|
||||
2. **Настройка переменных окружения**
|
||||
```bash
|
||||
make setup
|
||||
# Отредактируйте .env файл под свои нужды
|
||||
```
|
||||
|
||||
3. **Генерация docker-compose.yml**
|
||||
```bash
|
||||
make generate
|
||||
```
|
||||
|
||||
4. **Запуск приложения**
|
||||
```bash
|
||||
make up
|
||||
```
|
||||
|
||||
5. **Открытие в браузере**
|
||||
```
|
||||
http://localhost:9001
|
||||
```
|
||||
|
||||
### Команды управления
|
||||
|
||||
```bash
|
||||
make help # Показать справку по командам
|
||||
make setup # Настроить переменные окружения
|
||||
make generate # Сгенерировать docker-compose.yml
|
||||
make build # Собрать Docker образ
|
||||
make up # Запустить сервисы
|
||||
make down # Остановить сервисы
|
||||
make restart # Перезапустить сервисы
|
||||
make logs # Показать логи
|
||||
make status # Показать статус сервисов
|
||||
make shell # Подключиться к контейнеру
|
||||
make clean # Очистить проект
|
||||
```
|
||||
|
||||
## ⚙️ Конфигурация
|
||||
|
||||
### Основные настройки (.env)
|
||||
|
||||
```bash
|
||||
# Основные настройки приложения
|
||||
LOGBOARD_PORT=9001 # Порт приложения
|
||||
LOGBOARD_TAIL=500 # Количество строк логов по умолчанию
|
||||
LOGBOARD_USER=admin # Имя пользователя
|
||||
LOGBOARD_PASS=s3cret-change-me # Пароль
|
||||
|
||||
# Директория для снимков логов
|
||||
LOGBOARD_SNAPSHOT_DIR=/app/snapshots
|
||||
|
||||
# Фильтр по проекту Docker Compose
|
||||
COMPOSE_PROJECT_NAME=myproj
|
||||
|
||||
# Настройки множественных проектов
|
||||
LOGBOARD_PROJECTS=project1,project2,project3
|
||||
|
||||
# Настройки безопасности
|
||||
SECRET_KEY=your-secret-key-here
|
||||
ENCRYPTION_KEY=your-encryption-key-here
|
||||
|
||||
# Настройки производительности
|
||||
MAX_CONNECTIONS=100
|
||||
CONNECTION_TIMEOUT=30
|
||||
READ_TIMEOUT=60
|
||||
|
||||
# Настройки аутентификации
|
||||
AUTH_ENABLED=true
|
||||
AUTH_METHOD=jwt
|
||||
SESSION_TIMEOUT=3600
|
||||
```
|
||||
|
||||
### Docker сети
|
||||
|
||||
Приложение поддерживает подключение к внешним Docker сетям:
|
||||
|
||||
```yaml
|
||||
networks:
|
||||
- default: {}
|
||||
- iaas:
|
||||
external: true
|
||||
- infrastructure_iaas:
|
||||
external: true
|
||||
```
|
||||
|
||||
## 🔌 API Endpoints
|
||||
|
||||
### Аутентификация
|
||||
- `POST /api/auth/login` - Вход в систему
|
||||
- `POST /api/auth/logout` - Выход из системы
|
||||
- `GET /api/auth/me` - Информация о текущем пользователе
|
||||
|
||||
### Сервисы и контейнеры
|
||||
- `GET /api/services` - Список всех сервисов/контейнеров
|
||||
- `GET /api/projects` - Список проектов Docker Compose
|
||||
- `GET /api/logs/stats/{container_id}` - Статистика логов контейнера
|
||||
|
||||
### Управление исключениями
|
||||
- `GET /api/excluded-containers` - Список исключенных контейнеров
|
||||
- `POST /api/excluded-containers` - Добавить контейнер в исключения
|
||||
|
||||
### Снимки логов
|
||||
- `POST /api/snapshot` - Создать снимок логов
|
||||
|
||||
### WebSocket endpoints
|
||||
- `WS /ws/logs/{container_id}` - Поток логов контейнера
|
||||
- `WS /ws/fan/{service_name}` - Агрегированный поток логов сервиса
|
||||
- `WS /ws/fan_group` - Групповой поток логов
|
||||
|
||||
### Системные
|
||||
- `GET /healthz` - Проверка здоровья приложения
|
||||
- `GET /` - Главная страница
|
||||
- `GET /login` - Страница входа
|
||||
|
||||
## 🎯 Режимы просмотра
|
||||
|
||||
### Single View режим
|
||||
- Просмотр логов одного выбранного контейнера
|
||||
- Полноэкранный режим отображения
|
||||
- Детальная статистика по уровням логирования
|
||||
- Возможность паузы и возобновления потока
|
||||
|
||||
### Multi View режим
|
||||
- Одновременный просмотр логов нескольких контейнеров
|
||||
- Адаптивная сетка (1-4 колонки в зависимости от количества контейнеров)
|
||||
- Отдельные счетчики для каждого контейнера
|
||||
- Возможность скачивания отдельных файлов логов для каждого контейнера
|
||||
|
||||
## 🔍 Фильтрация и поиск
|
||||
|
||||
### Уровни логирования
|
||||
- **DEBUG** - Отладочная информация
|
||||
- **INFO** - Информационные сообщения
|
||||
- **WARN** - Предупреждения
|
||||
- **ERROR** - Ошибки
|
||||
- **OTHER** - Прочие сообщения
|
||||
|
||||
### Поиск
|
||||
- **Регулярные выражения** для поиска в логах
|
||||
- **Фильтрация в реальном времени**
|
||||
- **Подсветка найденных совпадений**
|
||||
|
||||
### Настройки отображения
|
||||
- **Tail Lines** - количество отображаемых строк
|
||||
- **Word Wrap** - перенос длинных строк
|
||||
- **Автопрокрутка** - автоматическая прокрутка к новым логам
|
||||
|
||||
## ⌨️ Горячие клавиши
|
||||
|
||||
### Навигация по контейнерам
|
||||
- **`[`** или **`Ctrl + ←`** - Переключение к предыдущему контейнеру
|
||||
- **`]`** или **`Ctrl + →`** - Переключение к следующему контейнеру
|
||||
|
||||
### Тема оформления
|
||||
- **`Ctrl + T`** - Переключение между темной и светлой темой
|
||||
|
||||
### Формы и ввод
|
||||
- **`Enter`** - В форме входа: отправка формы авторизации
|
||||
- **`Enter`** - В поле добавления исключений: добавление контейнера в исключения
|
||||
|
||||
### Условия работы горячих клавиш
|
||||
- Горячие клавиши работают только когда фокус не находится в полях ввода
|
||||
- Навигация по контейнерам работает только в Single View режиме
|
||||
- Переключение темы работает на всех страницах приложения
|
||||
|
||||
## 📱 Мобильная версия
|
||||
|
||||
Приложение полностью адаптивно и поддерживает:
|
||||
- **Адаптивный дизайн** для мобильных устройств
|
||||
- **Сенсорное управление**
|
||||
- **Оптимизированный интерфейс** для маленьких экранов
|
||||
- **Боковое меню** для мобильных устройств
|
||||
|
||||
## 🔧 Расширенные возможности
|
||||
|
||||
### Управление проектами
|
||||
- **Множественные проекты** Docker Compose
|
||||
- **Фильтрация по проектам**
|
||||
- **Переключение между проектами**
|
||||
|
||||
### Исключения контейнеров
|
||||
- **Добавление контейнеров в исключения**
|
||||
- **Постоянное хранение исключений**
|
||||
- **Управление через веб-интерфейс**
|
||||
|
||||
### Мониторинг состояния
|
||||
- **Health check статусы** контейнеров
|
||||
- **Фильтрация нездоровых контейнеров**
|
||||
- **Автоматическое обновление статусов**
|
||||
|
||||
### Производительность
|
||||
- **Ограничение количества соединений**
|
||||
- **Таймауты для операций**
|
||||
- **Оптимизированная обработка логов**
|
||||
- **Кэширование данных**
|
||||
|
||||
## 🛠️ Разработка
|
||||
|
||||
### Структура проекта
|
||||
```
|
||||
logboard/
|
||||
├── app.py # Основное приложение FastAPI
|
||||
├── docker-compose.yml # Конфигурация Docker Compose
|
||||
├── Dockerfile # Docker образ
|
||||
├── requirements.txt # Зависимости Python
|
||||
├── templates/ # HTML шаблоны
|
||||
│ ├── index.html # Главная страница
|
||||
│ ├── login.html # Страница входа
|
||||
│ └── error.html # Страницы ошибок
|
||||
├── scripts/ # Вспомогательные скрипты
|
||||
│ └── generate-compose.py
|
||||
├── snapshots/ # Директория для снимков логов
|
||||
├── Makefile # Команды управления
|
||||
├── env.example # Пример переменных окружения
|
||||
└── README.md # Документация
|
||||
```
|
||||
|
||||
### Технологии
|
||||
- **Backend**: FastAPI, Python 3.8+
|
||||
- **Frontend**: HTML5, CSS3, JavaScript (ES6+)
|
||||
- **WebSocket**: Асинхронные соединения для real-time логов
|
||||
- **Docker**: Интеграция с Docker API
|
||||
- **JWT**: Аутентификация и авторизация
|
||||
- **Docker Compose**: Управление контейнерами
|
||||
|
||||
### Разработка и отладка
|
||||
|
||||
```bash
|
||||
# Запуск в режиме разработки
|
||||
make dev
|
||||
|
||||
# Подключение к контейнеру
|
||||
make shell
|
||||
|
||||
# Просмотр логов
|
||||
make logs
|
||||
|
||||
# Пересборка
|
||||
make rebuild
|
||||
```
|
||||
|
||||
## 🔒 Безопасность
|
||||
|
||||
### Аутентификация
|
||||
- **JWT токены** для сессий
|
||||
- **Настраиваемые пользователи** через переменные окружения
|
||||
- **Автоматический выход** по истечении сессии
|
||||
- **Защищенные API endpoints**
|
||||
|
||||
### Шифрование
|
||||
- **Шифрование чувствительных данных** с помощью Fernet
|
||||
- **Безопасное хранение** токенов и паролей
|
||||
- **Защищенные переменные окружения**
|
||||
|
||||
### Сетевая безопасность
|
||||
- **HTTPS поддержка** (при настройке)
|
||||
- **Валидация входных данных**
|
||||
- **Защита от XSS и CSRF атак**
|
||||
|
||||
## 📊 Мониторинг и логирование
|
||||
|
||||
### Логирование приложения
|
||||
- **Настраиваемые уровни логирования** (DEBUG, INFO, WARN, ERROR)
|
||||
- **JSON формат** логов
|
||||
- **Структурированное логирование**
|
||||
|
||||
### Метрики
|
||||
- **Количество активных соединений**
|
||||
- **Статистика WebSocket соединений**
|
||||
- **Время отклика API**
|
||||
- **Использование ресурсов**
|
||||
|
||||
### Health checks
|
||||
- **Проверка состояния** приложения
|
||||
- **Мониторинг Docker соединения**
|
||||
- **Проверка доступности** зависимостей
|
||||
|
||||
## 🚀 Развертывание
|
||||
|
||||
### Продакшн настройки
|
||||
|
||||
1. **Настройка безопасности**
|
||||
```bash
|
||||
# Измените секретные ключи
|
||||
SECRET_KEY=your-production-secret-key
|
||||
ENCRYPTION_KEY=your-production-encryption-key
|
||||
|
||||
# Настройте пользователей
|
||||
LOGBOARD_USER=your-admin-user
|
||||
LOGBOARD_PASS=your-secure-password
|
||||
```
|
||||
|
||||
2. **Настройка сети**
|
||||
```bash
|
||||
# Настройте внешние сети
|
||||
DOCKER_NETWORKS=your-network1,your-network2
|
||||
```
|
||||
|
||||
3. **Настройка производительности**
|
||||
```bash
|
||||
# Увеличьте лимиты для продакшна
|
||||
MAX_CONNECTIONS=500
|
||||
CONNECTION_TIMEOUT=60
|
||||
READ_TIMEOUT=120
|
||||
```
|
||||
|
||||
### Docker Swarm
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
logboard:
|
||||
image: logboard:latest
|
||||
deploy:
|
||||
replicas: 2
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
reservations:
|
||||
memory: 256M
|
||||
networks:
|
||||
- logboard-network
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- logboard-snapshots:/app/snapshots
|
||||
```
|
||||
|
||||
### Kubernetes
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: logboard
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: logboard
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: logboard
|
||||
spec:
|
||||
containers:
|
||||
- name: logboard
|
||||
image: logboard:latest
|
||||
ports:
|
||||
- containerPort: 9001
|
||||
volumeMounts:
|
||||
- name: docker-sock
|
||||
mountPath: /var/run/docker.sock
|
||||
- name: snapshots
|
||||
mountPath: /app/snapshots
|
||||
volumes:
|
||||
- name: docker-sock
|
||||
hostPath:
|
||||
path: /var/run/docker.sock
|
||||
- name: snapshots
|
||||
persistentVolumeClaim:
|
||||
claimName: logboard-snapshots
|
||||
```
|
||||
|
||||
## 🤝 Поддержка и обратная связь
|
||||
|
||||
### Автор
|
||||
- **Сергей Антропов**
|
||||
- **Сайт**: https://devops.org.ru
|
||||
- **Email**: [contact@devops.org.ru]
|
||||
|
||||
### Сообщество
|
||||
- **Issues**: Сообщайте о багах и предлагайте улучшения
|
||||
- **Pull Requests**: Приветствуются вклады в развитие проекта
|
||||
- **Документация**: Помогите улучшить документацию
|
||||
|
||||
### Лицензия
|
||||
Проект распространяется под лицензией MIT.
|
||||
|
||||
## 📝 Changelog
|
||||
|
||||
### v1.0.0 (2024-12-17)
|
||||
- ✨ Первый релиз LogBoard+
|
||||
- 🔍 Поддержка Single View и Multi View режимов
|
||||
- 🔐 JWT аутентификация
|
||||
- 📱 Адаптивный дизайн
|
||||
- 🔧 Полная интеграция с Docker API
|
||||
- 📊 Статистика и мониторинг логов
|
||||
- 💾 Экспорт логов в файлы
|
||||
- 🎨 Темная и светлая темы
|
||||
|
||||
---
|
||||
|
||||
**LogBoard+** - современное решение для мониторинга логов микросервисов в Docker среде.
|
||||
@@ -1,105 +0,0 @@
|
||||
# Унификация стилей кнопки Refresh
|
||||
|
||||
## Описание изменений
|
||||
|
||||
Обновлены стили кнопки refresh в header для соответствия размерам и стилям кнопки update.
|
||||
|
||||
## Изменения стилей
|
||||
|
||||
### До изменений:
|
||||
```css
|
||||
.log-refresh-btn {
|
||||
padding: 6px 24px; /* Больше горизонтального отступа */
|
||||
height: fit-content; /* Автоматическая высота */
|
||||
border: none; /* Без границы */
|
||||
/* нет min-width */
|
||||
/* нет text-align */
|
||||
/* нет box-shadow */
|
||||
}
|
||||
```
|
||||
|
||||
### После изменений:
|
||||
```css
|
||||
.log-refresh-btn {
|
||||
padding: 6px 12px; /* Такой же отступ как у update */
|
||||
min-width: 60px; /* Минимальная ширина как у update */
|
||||
text-align: center; /* Выравнивание текста по центру */
|
||||
border: 1px solid var(--accent); /* Граница как у update */
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* Тень как у update */
|
||||
/* убрали height: fit-content */
|
||||
}
|
||||
```
|
||||
|
||||
## Сравнение кнопок
|
||||
|
||||
### Кнопка Update:
|
||||
```css
|
||||
.ajax-update-btn {
|
||||
padding: 6px 12px;
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
```
|
||||
|
||||
### Кнопка Refresh (после изменений):
|
||||
```css
|
||||
.log-refresh-btn {
|
||||
padding: 6px 12px; /* ✅ Совпадает */
|
||||
font-size: 11px; /* ✅ Совпадает */
|
||||
font-weight: 500; /* ✅ Совпадает */
|
||||
min-width: 60px; /* ✅ Совпадает */
|
||||
text-align: center; /* ✅ Совпадает */
|
||||
border: 1px solid var(--accent); /* ✅ Совпадает по стилю */
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* ✅ Совпадает */
|
||||
}
|
||||
```
|
||||
|
||||
## Визуальные улучшения
|
||||
|
||||
### Единообразие:
|
||||
- **Одинаковая высота** - обе кнопки теперь имеют одинаковую высоту
|
||||
- **Одинаковая ширина** - минимальная ширина 60px для обеих кнопок
|
||||
- **Одинаковый размер шрифта** - 11px для обеих кнопок
|
||||
- **Одинаковые отступы** - 6px 12px для обеих кнопок
|
||||
- **Одинаковая граница** - 1px solid для обеих кнопок
|
||||
- **Одинаковая тень** - box-shadow для обеих кнопок
|
||||
|
||||
### Преимущества:
|
||||
1. **Визуальная согласованность** - кнопки выглядят как единый набор элементов управления
|
||||
2. **Улучшенный UX** - пользователь видит логически связанные элементы одинакового размера
|
||||
3. **Профессиональный вид** - интерфейс выглядит более аккуратно и организованно
|
||||
|
||||
## Технические детали
|
||||
|
||||
### Измененные CSS свойства:
|
||||
- `padding: 6px 24px` → `padding: 6px 12px`
|
||||
- Добавлен `min-width: 60px`
|
||||
- Добавлен `text-align: center`
|
||||
- `border: none` → `border: 1px solid var(--accent)`
|
||||
- Добавлен `box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1)`
|
||||
- Убран `height: fit-content`
|
||||
|
||||
### Сохраненные свойства:
|
||||
- `font-size: 11px` - уже совпадал
|
||||
- `font-weight: 500` - уже совпадал
|
||||
- `border-radius: 6px` - уже совпадал
|
||||
- Hover эффекты - уже совпадали
|
||||
|
||||
## Совместимость
|
||||
|
||||
Изменения стилей не влияют на:
|
||||
- Функциональность кнопки
|
||||
- JavaScript обработчики
|
||||
- Логику показа/скрытия
|
||||
- Поведение в разных темах (светлая/темная)
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Дата реализации
|
||||
|
||||
2024 год
|
||||
@@ -1,196 +0,0 @@
|
||||
# Управление кнопками Refresh и Update
|
||||
|
||||
## Описание изменений
|
||||
|
||||
Реализована функциональность автоматического управления кнопками "Refresh" и "Update" в header в зависимости от состояния AJAX autoupdate.
|
||||
|
||||
### Основные изменения:
|
||||
1. **AJAX autoupdate по умолчанию включен** - изменено значение `ajaxUpdateEnabled` с `false` на `true`
|
||||
2. **Добавлена кнопка Update** - новая кнопка справа от кнопки WebSocket состояния
|
||||
3. **Улучшено управление кнопками** - кнопка refresh скрывается, кнопка update показывает состояние
|
||||
|
||||
## Логика работы
|
||||
|
||||
### Кнопка Refresh
|
||||
- **AJAX autoupdate включен** → Кнопка refresh **скрыта**
|
||||
- **AJAX autoupdate выключен** → Кнопка refresh **показана**
|
||||
|
||||
### Кнопка Update
|
||||
- **AJAX autoupdate включен** → Кнопка update **зеленая**
|
||||
- **AJAX autoupdate выключен** → Кнопка update **красная**
|
||||
- **Клик по кнопке** → Переключает состояние AJAX autoupdate
|
||||
|
||||
## Реализованные функции
|
||||
|
||||
### updateRefreshButtonVisibility()
|
||||
Основная функция для управления видимостью кнопки refresh и состоянием кнопки update:
|
||||
|
||||
```javascript
|
||||
function updateRefreshButtonVisibility() {
|
||||
const refreshButtons = document.querySelectorAll('.log-refresh-btn');
|
||||
refreshButtons.forEach(btn => {
|
||||
if (ajaxUpdateEnabled) {
|
||||
// Если ajax autoupdate включен, скрываем кнопку refresh
|
||||
btn.style.display = 'none';
|
||||
} else {
|
||||
// Если ajax autoupdate выключен, показываем кнопку refresh
|
||||
btn.style.display = 'inline-flex';
|
||||
}
|
||||
});
|
||||
|
||||
// Обновляем состояние кнопки update
|
||||
setAjaxUpdateState(ajaxUpdateEnabled);
|
||||
}
|
||||
```
|
||||
|
||||
### setAjaxUpdateState(enabled)
|
||||
Функция для управления визуальным состоянием кнопки update:
|
||||
|
||||
```javascript
|
||||
function setAjaxUpdateState(enabled) {
|
||||
if (els.ajaxUpdateBtn) {
|
||||
// Удаляем все классы состояний
|
||||
els.ajaxUpdateBtn.classList.remove('ajax-on', 'ajax-off');
|
||||
|
||||
// Добавляем соответствующий класс
|
||||
if (enabled) {
|
||||
els.ajaxUpdateBtn.classList.add('ajax-on');
|
||||
els.ajaxUpdateBtn.textContent = 'update';
|
||||
} else {
|
||||
els.ajaxUpdateBtn.classList.add('ajax-off');
|
||||
els.ajaxUpdateBtn.textContent = 'update';
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Интеграция с существующим кодом
|
||||
|
||||
Функция `updateRefreshButtonVisibility()` вызывается в следующих местах:
|
||||
|
||||
1. **updateAjaxUpdateCheckbox()** - при обновлении состояния чекбокса
|
||||
2. **enableAjaxLogUpdate()** - при включении AJAX обновления
|
||||
3. **disableAjaxLogUpdate()** - при выключении AJAX обновления
|
||||
4. **toggleAjaxLogUpdate()** - при переключении состояния
|
||||
5. **initAjaxUpdateCheckbox()** - при инициализации чекбокса
|
||||
6. **initAjaxUpdate()** - при инициализации AJAX update
|
||||
7. **Обработчик изменения чекбокса** - при изменении состояния пользователем
|
||||
|
||||
## CSS стили
|
||||
|
||||
### Кнопка Refresh
|
||||
Кнопка refresh использует класс `.log-refresh-btn` и стили:
|
||||
|
||||
```css
|
||||
.log-refresh-btn {
|
||||
background: var(--accent);
|
||||
color: white;
|
||||
border: 1px solid var(--accent);
|
||||
border-radius: 6px;
|
||||
transition: all 0.2s ease;
|
||||
padding: 6px 12px;
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
```
|
||||
|
||||
### Кнопка Update
|
||||
Кнопка update использует класс `.ajax-update-btn` и стили:
|
||||
|
||||
```css
|
||||
.ajax-update-btn {
|
||||
background: var(--chip);
|
||||
color: var(--muted);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
padding: 6px 12px;
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
font-family: inherit;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.ajax-update-btn.ajax-on {
|
||||
background: #7ea855; /* Зеленый цвет */
|
||||
color: white;
|
||||
border-color: #7ea855;
|
||||
}
|
||||
|
||||
.ajax-update-btn.ajax-off {
|
||||
background: #f7768e; /* Красный цвет */
|
||||
color: white;
|
||||
border-color: #f7768e;
|
||||
}
|
||||
|
||||
.ajax-update-btn:hover {
|
||||
opacity: 0.8;
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
|
||||
}
|
||||
```
|
||||
|
||||
## HTML структура
|
||||
|
||||
### Кнопка Refresh
|
||||
Кнопка refresh находится в header:
|
||||
|
||||
```html
|
||||
<button class="btn btn-small log-refresh-btn" title="Обновить логи и счетчики">
|
||||
<i class="fas fa-sync-alt"></i> Refresh
|
||||
</button>
|
||||
```
|
||||
|
||||
### Кнопка Update
|
||||
Кнопка update находится в header справа от кнопки WebSocket состояния:
|
||||
|
||||
```html
|
||||
<button id="wsstate" class="ws-status-btn">ws: off</button>
|
||||
<button id="ajaxUpdateBtn" class="ajax-update-btn" title="AJAX Auto-update">update</button>
|
||||
<button class="btn btn-small log-refresh-btn" title="Обновить логи и счетчики">
|
||||
<i class="fas fa-sync-alt"></i> Refresh
|
||||
</button>
|
||||
```
|
||||
|
||||
## Автоматическое обновление видимости
|
||||
|
||||
Видимость кнопки refresh автоматически обновляется в следующих случаях:
|
||||
|
||||
1. **При инициализации AJAX update** - устанавливается начальное состояние
|
||||
2. **При изменении состояния чекбокса "Auto-update logs"** - пользователь включает/выключает autoupdate
|
||||
3. **При программном включении/выключении AJAX update** - через функции enable/disable
|
||||
4. **При переключении состояния через функцию toggleAjaxLogUpdate** - программное переключение
|
||||
|
||||
## Преимущества реализации
|
||||
|
||||
1. **Улучшенный UX** - пользователь видит только актуальные элементы управления
|
||||
2. **Логическая связность** - кнопка refresh скрыта, когда она не нужна (при включенном autoupdate)
|
||||
3. **Автоматическое управление** - не требует ручного вмешательства пользователя
|
||||
4. **Совместимость** - работает с существующим кодом без нарушений
|
||||
|
||||
## Тестирование
|
||||
|
||||
Для тестирования функциональности:
|
||||
|
||||
1. Откройте приложение в браузере
|
||||
2. Проверьте, что при включенном чекбоксе "Auto-update logs" кнопка refresh скрыта
|
||||
3. Отключите чекбокс "Auto-update logs" - кнопка refresh должна появиться
|
||||
4. Включите чекбокс обратно - кнопка refresh должна скрыться
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Дата реализации
|
||||
|
||||
2024 год
|
||||
@@ -1,182 +0,0 @@
|
||||
# Исправление проблемы со скроллом в Multi View режиме
|
||||
|
||||
## Проблема
|
||||
В режиме Multi View со свернутым sidebar не работал скролл в логах контейнеров. Проблема была связана с неправильными CSS стилями, которые не учитывали правильную высоту и overflow для multi-view логов в свернутом состоянии sidebar.
|
||||
|
||||
## Причина
|
||||
Основные причины проблемы:
|
||||
|
||||
1. **Неправильная высота multi-view-log**: В свернутом состоянии sidebar элементы `.multi-view-log` получали неправильную высоту `calc(100vh - var(--header-height))` вместо `100%`
|
||||
2. **Отсутствие flex-свойств**: Элементы не имели правильных flex-свойств для корректного распределения пространства
|
||||
3. **Неправильный overflow**: Контейнеры `.multi-view-content` не имели правильных настроек overflow
|
||||
|
||||
## Исправления
|
||||
|
||||
### 1. CSS стили для свернутого sidebar
|
||||
|
||||
Добавлены дополнительные CSS правила для правильного отображения multi-view в свернутом состоянии:
|
||||
|
||||
```css
|
||||
/* Исправляем скролл для multi-view в свернутом состоянии */
|
||||
.sidebar.collapsed ~ .main-content .multi-view-content {
|
||||
height: calc(100vh - var(--header-height) - 60px) !important;
|
||||
overflow: hidden !important;
|
||||
display: flex !important;
|
||||
flex-direction: column !important;
|
||||
}
|
||||
|
||||
.sidebar.collapsed ~ .main-content .multi-view-log {
|
||||
height: 100% !important;
|
||||
overflow: auto !important;
|
||||
display: block !important;
|
||||
max-height: none !important;
|
||||
min-height: 200px !important;
|
||||
position: relative !important;
|
||||
flex: 1 !important;
|
||||
min-height: 0 !important;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Новая функция forceFixMultiViewStyles()
|
||||
|
||||
Добавлена новая функция для принудительного исправления стилей multi-view логов:
|
||||
|
||||
```javascript
|
||||
function forceFixMultiViewStyles() {
|
||||
const multiViewLogs = document.querySelectorAll('.multi-view-log');
|
||||
|
||||
multiViewLogs.forEach((log, index) => {
|
||||
// Принудительно устанавливаем все необходимые стили
|
||||
log.style.setProperty('height', '100%', 'important');
|
||||
log.style.setProperty('overflow', 'auto', 'important');
|
||||
log.style.setProperty('max-height', 'none', 'important');
|
||||
log.style.setProperty('display', 'block', 'important');
|
||||
log.style.setProperty('min-height', '200px', 'important');
|
||||
log.style.setProperty('position', 'relative', 'important');
|
||||
log.style.setProperty('flex', '1', 'important');
|
||||
log.style.setProperty('min-height', '0', 'important');
|
||||
|
||||
// Принудительно вызываем пересчет layout
|
||||
log.style.setProperty('transform', 'translateZ(0)', 'important');
|
||||
|
||||
// Дополнительно устанавливаем inline стили для максимальной надежности
|
||||
log.setAttribute('style', log.getAttribute('style') + '; height: 100% !important; overflow: auto !important; flex: 1 !important; min-height: 0 !important;');
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Обновление функции updateLogStyles()
|
||||
|
||||
Исправлена функция `updateLogStyles()` для правильного применения стилей:
|
||||
|
||||
- Использует `setProperty()` с флагом `important` для принудительного применения стилей
|
||||
- Вызывает `forceFixMultiViewStyles()` для дополнительной надежности
|
||||
- Принудительно вызывается пересчет layout с помощью `transform: translateZ(0)`
|
||||
|
||||
### 4. Улучшение функции toggleSidebar()
|
||||
|
||||
Добавлена дополнительная проверка для multi-view логов при переключении sidebar:
|
||||
|
||||
```javascript
|
||||
// Дополнительная проверка для multi-view логов
|
||||
if (state.multiViewMode) {
|
||||
console.log('Sidebar toggle: Force fixing multi-view styles');
|
||||
forceFixMultiViewStyles();
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Обновление функции setupMultiView()
|
||||
|
||||
Добавлена принудительная проверка стилей при создании multi-view:
|
||||
|
||||
```javascript
|
||||
// Принудительно обновляем стили логов для multi-view
|
||||
setTimeout(() => {
|
||||
updateLogStyles();
|
||||
|
||||
// Дополнительная проверка для multi-view логов
|
||||
console.log('setupMultiView: Force fixing multi-view styles');
|
||||
forceFixMultiViewStyles();
|
||||
}, 200);
|
||||
```
|
||||
|
||||
### 6. Инициализация при загрузке страницы
|
||||
|
||||
Добавлена дополнительная проверка при инициализации:
|
||||
|
||||
```javascript
|
||||
// Дополнительная проверка для multi-view логов при загрузке
|
||||
setTimeout(() => {
|
||||
if (state.multiViewMode) {
|
||||
console.log('Initialization: Force fixing multi-view styles');
|
||||
forceFixMultiViewStyles();
|
||||
}
|
||||
}, 1000);
|
||||
```
|
||||
|
||||
### 7. Периодическая проверка и обработчики событий
|
||||
|
||||
Добавлены дополнительные механизмы для обеспечения правильной работы:
|
||||
|
||||
- **Периодическая проверка**: Каждые 5 секунд проверяются и исправляются стили multi-view логов
|
||||
- **Обработчик изменения размера окна**: При изменении размера браузера автоматически исправляются стили
|
||||
- **Глобальные функции**: Добавлены функции `forceFixMultiViewStyles()` и `updateLogStyles()` в глобальную область для ручного вызова из консоли
|
||||
|
||||
## Результат
|
||||
|
||||
После применения исправлений:
|
||||
|
||||
1. ✅ Скролл работает корректно в Multi View режиме со свернутым sidebar
|
||||
2. ✅ Логи контейнеров отображаются в правильной высоте
|
||||
3. ✅ Переключение sidebar не нарушает функциональность скролла
|
||||
4. ✅ Автопрокрутка работает корректно
|
||||
5. ✅ Стили применяются правильно при всех сценариях использования
|
||||
|
||||
## Тестирование
|
||||
|
||||
Для проверки исправлений:
|
||||
|
||||
1. Включите Multi View режим (выберите несколько контейнеров)
|
||||
2. Сверните sidebar (Ctrl+B или кнопка)
|
||||
3. Убедитесь, что скролл работает в каждом контейнере
|
||||
4. Проверьте автопрокрутку при поступлении новых логов
|
||||
5. Разверните sidebar и убедитесь, что скролл продолжает работать
|
||||
|
||||
### Ручное исправление (если проблема все еще возникает)
|
||||
|
||||
Если скролл все еще не работает в некоторых окнах, можно вручную исправить стили:
|
||||
|
||||
1. Откройте консоль браузера (F12)
|
||||
2. Выполните команду: `forceFixMultiViewStyles()`
|
||||
3. Или выполните команду: `updateLogStyles()`
|
||||
4. Для всех контейнеров: `fixAllContainers()`
|
||||
5. Для обратной совместимости: `fixProblematicContainers()` (перенаправляет на `fixAllContainers()`)
|
||||
|
||||
Эти функции принудительно исправят стили всех multi-view логов на странице.
|
||||
|
||||
### Универсальное исправление для всех контейнеров
|
||||
|
||||
Вместо специальной обработки только для проблемных контейнеров, теперь применяется универсальное решение:
|
||||
|
||||
- **Универсальные CSS правила** для всех multi-view логов (с более специфичными селекторами)
|
||||
- **Единообразное исправление стилей** для всех контейнеров
|
||||
- **Проверка родительских элементов** для всех контейнеров
|
||||
- **Автоматическое исправление** в периодических проверках и при изменении размера окна
|
||||
- **Защита от влияния на другие элементы** - все селекторы теперь специфичны для `.multi-view-content .multi-view-log`
|
||||
|
||||
### Исправление проблемы с wrap text
|
||||
|
||||
Проблема с wrap text была решена путем:
|
||||
|
||||
- **Более специфичных селекторов** - изменил `.log` на `.main-content .log` в функции `applyWrapSettings()`
|
||||
- **Добавления вызовов `applyWrapSettings()`** в ключевых местах:
|
||||
- После обновления логов (`refreshLogsAndCounters()`)
|
||||
- После исправления стилей (`forceFixMultiViewStyles()`)
|
||||
- После исправления всех контейнеров (`fixAllContainers()`)
|
||||
- После переключения контейнеров (`switchToSingle()`)
|
||||
- После открытия мульти-контейнеров (`openMulti()`)
|
||||
- **Сохранения существующих вызовов** в `setupMultiView()` и других местах
|
||||
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
5
app.py
5
app.py
@@ -882,10 +882,11 @@ def api_services(
|
||||
project_list = None
|
||||
if projects:
|
||||
project_list = [p.strip() for p in projects.split(",") if p.strip()]
|
||||
elif DEFAULT_PROJECTS:
|
||||
elif DEFAULT_PROJECTS and DEFAULT_PROJECTS.strip():
|
||||
project_list = [p.strip() for p in DEFAULT_PROJECTS.split(",") if p.strip()]
|
||||
elif DEFAULT_PROJECT:
|
||||
elif DEFAULT_PROJECT and DEFAULT_PROJECT.strip():
|
||||
project_list = [DEFAULT_PROJECT]
|
||||
# Если ни одна переменная не указана или пустая, показываем все контейнеры (project_list остается None)
|
||||
|
||||
return JSONResponse(
|
||||
content=list_containers(projects=project_list, include_stopped=include_stopped),
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
# Документация LogBoard+
|
||||
|
||||
## Обзор
|
||||
|
||||
LogBoard+ - это веб-приложение для мониторинга логов Docker контейнеров в реальном времени с поддержкой Single View и Multi View режимов.
|
||||
|
||||
## Основные функции
|
||||
|
||||
### Просмотр логов
|
||||
- **Single View**: просмотр логов одного контейнера
|
||||
- **Multi View**: одновременный просмотр логов нескольких контейнеров
|
||||
- Фильтрация по уровням логирования (DEBUG, INFO, WARN, ERROR)
|
||||
- Поиск по регулярным выражениям
|
||||
- Автопрокрутка и перенос строк
|
||||
|
||||
### Горячие клавиши
|
||||
- `Ctrl+R` / `Ctrl+K` - обновление логов
|
||||
- `[` `]` - навигация между контейнерами
|
||||
- `Ctrl+B` - сворачивание/разворачивание панели
|
||||
|
||||
### Управление интерфейсом
|
||||
- Сворачивание sidebar для экономии места
|
||||
- Переключение тем (светлая/темная)
|
||||
- Настройка количества отображаемых строк
|
||||
- Экспорт логов в файл
|
||||
|
||||
## Документация
|
||||
|
||||
- [Горячие клавиши](hotkeys.md) - подробное описание всех горячих клавиш
|
||||
- [Новые функции интерфейса](features.md) - описание сворачивания панелей и других функций
|
||||
- [API документация](../api/README.md) - описание API endpoints
|
||||
- [Разработка](../dev/README.md) - руководство для разработчиков
|
||||
|
||||
## Технологии
|
||||
|
||||
- **Backend**: Python, FastAPI, WebSocket
|
||||
- **Frontend**: HTML5, CSS3, JavaScript (Vanilla)
|
||||
- **База данных**: PostgreSQL с asyncpg
|
||||
- **Контейнеризация**: Docker, Docker Compose
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов - https://devops.org.ru
|
||||
|
||||
## Лицензия
|
||||
|
||||
MIT License
|
||||
@@ -1,172 +0,0 @@
|
||||
# AJAX Auto-update для LogBoard+
|
||||
|
||||
## Описание
|
||||
|
||||
AJAX Auto-update - это система автоматического обновления логов через AJAX запросы, которая позволяет получать новые логи без перезагрузки страницы.
|
||||
|
||||
## Основные возможности
|
||||
|
||||
- **Автоматическое обновление**: Логи обновляются с заданным интервалом
|
||||
- **Умное управление кнопкой Refresh**: Кнопка refresh автоматически скрывается при включенном AJAX autoupdate и показывается при выключенном
|
||||
- **Поддержка Multi-view**: Работает как в single-view, так и в multi-view режимах
|
||||
- **Настраиваемый интервал**: Интервал обновления настраивается через API
|
||||
- **Эффективное обновление**: Обновляются только новые логи с момента последнего запроса
|
||||
|
||||
## Управление кнопками
|
||||
|
||||
### Кнопка Refresh
|
||||
|
||||
Кнопка refresh в header автоматически управляется в зависимости от состояния AJAX autoupdate:
|
||||
|
||||
- **AJAX autoupdate включен** → Кнопка refresh **скрыта**
|
||||
- **AJAX autoupdate выключен** → Кнопка refresh **показана**
|
||||
|
||||
### Кнопка Update
|
||||
|
||||
Кнопка update в header показывает состояние AJAX autoupdate и позволяет переключать его:
|
||||
|
||||
- **AJAX autoupdate включен** → Кнопка update **зеленая**
|
||||
- **AJAX autoupdate выключен** → Кнопка update **красная**
|
||||
- **Клик по кнопке** → Переключает состояние AJAX autoupdate
|
||||
|
||||
### Функции управления
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* Обновить видимость кнопки refresh в header
|
||||
*/
|
||||
function updateRefreshButtonVisibility() {
|
||||
const refreshButtons = document.querySelectorAll('.log-refresh-btn');
|
||||
refreshButtons.forEach(btn => {
|
||||
if (ajaxUpdateEnabled) {
|
||||
// Если ajax autoupdate включен, скрываем кнопку refresh
|
||||
btn.style.display = 'none';
|
||||
} else {
|
||||
// Если ajax autoupdate выключен, показываем кнопку refresh
|
||||
btn.style.display = 'inline-flex';
|
||||
}
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### Автоматическое обновление видимости
|
||||
|
||||
Видимость кнопки refresh автоматически обновляется в следующих случаях:
|
||||
|
||||
1. **При инициализации AJAX update**
|
||||
2. **При изменении состояния чекбокса "Auto-update logs"**
|
||||
3. **При программном включении/выключении AJAX update**
|
||||
4. **При переключении состояния через функцию toggleAjaxLogUpdate**
|
||||
|
||||
## Настройки
|
||||
|
||||
### Интервал обновления
|
||||
|
||||
Интервал обновления настраивается через API endpoint `/api/settings`:
|
||||
|
||||
```json
|
||||
{
|
||||
"ajax_update_interval": 2000
|
||||
}
|
||||
```
|
||||
|
||||
По умолчанию используется интервал 2000ms (2 секунды).
|
||||
|
||||
### Чекбокс управления
|
||||
|
||||
В sidebar есть чекбокс "Auto-update logs", который позволяет пользователю:
|
||||
|
||||
- Включить автоматическое обновление
|
||||
- Выключить автоматическое обновление
|
||||
- Автоматически управляет видимостью кнопки refresh
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### Получение настроек
|
||||
|
||||
```
|
||||
GET /api/settings
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
Ответ:
|
||||
```json
|
||||
{
|
||||
"ajax_update_interval": 2000
|
||||
}
|
||||
```
|
||||
|
||||
### Получение логов с поддержкой AJAX
|
||||
|
||||
```
|
||||
GET /api/logs/{container_id}?tail={lines}&since={timestamp}
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
Параметры:
|
||||
- `tail`: количество строк для получения (или "all")
|
||||
- `since`: временная метка последнего обновления (опционально)
|
||||
|
||||
## Переменные состояния
|
||||
|
||||
```javascript
|
||||
let ajaxUpdateEnabled = true; // Состояние AJAX обновления (по умолчанию включен)
|
||||
let ajaxUpdateIntervalMs = 2000; // Интервал обновления в миллисекундах
|
||||
let ajaxUpdateInterval = null; // ID интервала
|
||||
const containerStates = new Map(); // Состояние контейнеров для отслеживания обновлений
|
||||
```
|
||||
|
||||
## Функции управления
|
||||
|
||||
### enableAjaxLogUpdate(intervalMs)
|
||||
Включает AJAX обновление логов с заданным интервалом.
|
||||
|
||||
### disableAjaxLogUpdate()
|
||||
Отключает AJAX обновление логов.
|
||||
|
||||
### toggleAjaxLogUpdate()
|
||||
Переключает состояние AJAX обновления.
|
||||
|
||||
### performAjaxLogUpdate()
|
||||
Выполняет одно обновление логов через AJAX.
|
||||
|
||||
### updateContainerLogs(containerId, tailLines, token)
|
||||
Обновляет логи для конкретного контейнера.
|
||||
|
||||
### updateRefreshButtonVisibility()
|
||||
Обновляет видимость кнопки refresh и состояние кнопки update в зависимости от состояния AJAX autoupdate.
|
||||
|
||||
### setAjaxUpdateState(enabled)
|
||||
Обновляет визуальное состояние кнопки update (зеленая/красная) в зависимости от состояния AJAX autoupdate.
|
||||
|
||||
## Интеграция с существующим кодом
|
||||
|
||||
AJAX update интегрируется с существующими функциями:
|
||||
|
||||
- **switchToSingle**: Останавливает AJAX обновление при смене контейнера
|
||||
- **switchToMultiView**: Останавливает AJAX обновление при переключении в multi-view
|
||||
- **refreshLogsAndCounters**: Ручное обновление логов (кнопка refresh)
|
||||
|
||||
## Логирование
|
||||
|
||||
Все операции AJAX update логируются в консоль браузера:
|
||||
|
||||
```javascript
|
||||
console.log('AJAX обновление логов включено с интервалом 2000ms');
|
||||
console.log('AJAX обновление логов отключено');
|
||||
console.log('AJAX Update: Обновляем 2 контейнеров: ["container1", "container2"]');
|
||||
```
|
||||
|
||||
## Обработка ошибок
|
||||
|
||||
При ошибках AJAX запросов:
|
||||
|
||||
- Обновление не останавливается автоматически
|
||||
- Ошибки логируются в консоль
|
||||
- Пользователь может вручную отключить обновление через чекбокс
|
||||
|
||||
## Совместимость
|
||||
|
||||
- Работает с существующими WebSocket соединениями
|
||||
- Поддерживает все режимы просмотра (single-view, multi-view)
|
||||
- Совместимо с фильтрацией и настройками уровней логирования
|
||||
@@ -1,77 +0,0 @@
|
||||
# Новые функции интерфейса LogBoard+
|
||||
|
||||
## Сворачивание панелей
|
||||
|
||||
### Sidebar (боковая панель)
|
||||
- **Кнопка сворачивания**: <i class="fas fa-chevron-left"></i> на границе sidebar и основного контента
|
||||
- **Горячая клавиша**: `Ctrl+B` / `Ctrl+И`
|
||||
- **Свернутое состояние**: ширина 60px
|
||||
- **Логотип**: показывает <i class="fas fa-terminal"></i> в свернутом состоянии
|
||||
- **Кнопка помощи**: <i class="fas fa-question-circle"></i> между options и logout
|
||||
|
||||
## Управление
|
||||
|
||||
### Кнопка сворачивания
|
||||
- **Кнопка на границе**: сворачивает боковую панель
|
||||
- **Расположение**: посередине экрана по высоте на границе sidebar и основного контента
|
||||
- **Состояние сохраняется** в localStorage
|
||||
|
||||
### Горячая клавиша
|
||||
- **Ctrl+B** / **Ctrl+И**: сворачивает/разворачивает sidebar и header
|
||||
- Удобно для быстрого освобождения места на экране
|
||||
|
||||
### Header (заголовок)
|
||||
- **Сворачивается вместе с sidebar**
|
||||
- **В свернутом состоянии**: тонкая полоска 40px высотой
|
||||
- **Содержит**: фильтр логов, кнопки уровней логирования, кнопку обновления
|
||||
- **Стили**: кнопки выглядят точно так же, как в развернутом состоянии
|
||||
- **log-header**: полностью скрывается в свернутом режиме
|
||||
- **log-content**: минимальный padding 2px в свернутом состоянии
|
||||
- **multi-view-panel**: показывает название контейнера в Single View режиме
|
||||
|
||||
## Визуальные элементы
|
||||
|
||||
### Логотип в свернутом sidebar
|
||||
```
|
||||
<i class="fas fa-terminal"></i>
|
||||
```
|
||||
- Отображается только когда sidebar свернут
|
||||
- Расположен в самом верху sidebar
|
||||
- Стилизован в цвете акцента
|
||||
- Занимает минимальное место
|
||||
|
||||
### Модальное окно с горячими клавишами
|
||||
- **Открытие**: кнопка <i class="fas fa-question-circle"></i> в свернутом sidebar
|
||||
- **Закрытие**: кнопка X, клик вне окна, или повторный клик на кнопку помощи
|
||||
- **Содержит**: полный список всех горячих клавиш с описанием
|
||||
- **Анимация**: плавное появление и исчезновение
|
||||
|
||||
### Анимации
|
||||
- Плавные переходы при сворачивании/разворачивании
|
||||
- Длительность анимации: 0.3 секунды
|
||||
- CSS transitions для всех элементов
|
||||
- Кнопка сворачивания остается на месте при наведении
|
||||
|
||||
## Сохранение настроек
|
||||
|
||||
### localStorage ключи
|
||||
- `lb_sidebar_collapsed` - состояние sidebar
|
||||
- `lb_hotkeys_shown` - показ уведомления о горячих клавишах
|
||||
|
||||
### Восстановление состояния
|
||||
- При перезапуске приложения состояния восстанавливаются
|
||||
- Кнопки показывают правильные иконки
|
||||
- Tooltip обновляется в соответствии с состоянием
|
||||
|
||||
## Примеры использования
|
||||
|
||||
### Освобождение места
|
||||
1. Нажать `Ctrl+B` или кнопку sidebar - сворачивается панель
|
||||
2. Получаем больше места для просмотра логов
|
||||
|
||||
### Быстрое переключение
|
||||
1. Использовать `Ctrl+B` для быстрого переключения
|
||||
2. Использовать кнопку на границе для точного управления
|
||||
|
||||
## Автор
|
||||
Сергей Антропов - https://devops.org.ru
|
||||
@@ -1,66 +0,0 @@
|
||||
# Горячие клавиши LogBoard+
|
||||
|
||||
## Обновление логов
|
||||
|
||||
### Ctrl+R
|
||||
Обновляет логи в текущем режиме просмотра:
|
||||
- **Single View**: переподключается к WebSocket и получает свежие логи
|
||||
- **Multi View**: переподключается ко всем выбранным контейнерам
|
||||
|
||||
### Ctrl+K
|
||||
Альтернативная комбинация для обновления логов (аналогично Ctrl+R)
|
||||
|
||||
## Навигация
|
||||
|
||||
### [ (квадратная скобка)
|
||||
Переход к предыдущему контейнеру в списке
|
||||
|
||||
### ] (квадратная скобка)
|
||||
Переход к следующему контейнеру в списке
|
||||
|
||||
### Ctrl+← (стрелка влево)
|
||||
Альтернативная комбинация для перехода к предыдущему контейнеру
|
||||
|
||||
### Ctrl+→ (стрелка вправо)
|
||||
Альтернативная комбинация для перехода к следующему контейнеру
|
||||
|
||||
## Управление интерфейсом
|
||||
|
||||
### Ctrl+B
|
||||
Сворачивание/разворачивание sidebar панели:
|
||||
- Сворачивает sidebar до минимальной ширины (60px)
|
||||
- Скрывает все элементы управления и список контейнеров
|
||||
- Показывает логотип LogBoard+ в свернутом sidebar
|
||||
- Состояние сохраняется в localStorage
|
||||
|
||||
### Кнопка сворачивания
|
||||
- **Кнопка на границе** (<i class="fas fa-chevron-left"></i>) - сворачивание sidebar
|
||||
- Расположена посередине экрана по высоте на границе sidebar и основного контента
|
||||
- Состояние сохраняется в localStorage
|
||||
|
||||
## Особенности
|
||||
|
||||
### Проверка фокуса
|
||||
Горячие клавиши не работают, когда фокус находится в полях ввода:
|
||||
- Поле фильтра логов
|
||||
- Поле добавления исключенных контейнеров
|
||||
- Любые другие input/textarea элементы
|
||||
|
||||
### Визуальные подсказки
|
||||
- Иконка клавиатуры в заголовке с подсказкой о горячих клавишах
|
||||
- Уведомление о горячих клавишах при первом запуске
|
||||
- Tooltip на кнопке сворачивания sidebar
|
||||
|
||||
### Сохранение настроек
|
||||
- Состояние sidebar (свернут/развернут) сохраняется в localStorage
|
||||
- При следующем запуске приложения состояние восстанавливается
|
||||
|
||||
## Примеры использования
|
||||
|
||||
1. **Быстрое обновление логов**: `Ctrl+R` для получения свежих данных
|
||||
2. **Навигация по контейнерам**: `[` `]` для переключения между сервисами
|
||||
3. **Освобождение места на экране**: `Ctrl+B` для сворачивания панели
|
||||
4. **Работа в Multi View**: `Ctrl+R` обновляет все выбранные контейнеры одновременно
|
||||
|
||||
## Автор
|
||||
Сергей Антропов - https://devops.org.ru
|
||||
@@ -3,57 +3,79 @@ services:
|
||||
build: .
|
||||
container_name: logboard
|
||||
environment:
|
||||
LOGBOARD_PORT: '9001'
|
||||
LOGBOARD_TAIL: '500'
|
||||
LOGBOARD_USER: admin
|
||||
LOGBOARD_PASS: admin
|
||||
COMPOSE_PROJECT_NAME: ''
|
||||
LOGBOARD_SNAPSHOT_DIR: /app/snapshots
|
||||
LOGBOARD_INDEX_HTML: ./templates/index.html
|
||||
TZ_TS: Europe/Moscow
|
||||
SECRET_KEY: your-secret-key-here
|
||||
ENCRYPTION_KEY: your-encryption-key-here
|
||||
LOG_LEVEL: INFO
|
||||
LOG_FORMAT: json
|
||||
WEB_TITLE: LogBoard+
|
||||
WEB_DESCRIPTION: Веб-панель для просмотра логов микросервисов
|
||||
WEB_VERSION: 1.0.0
|
||||
MAX_CONNECTIONS: '100'
|
||||
CONNECTION_TIMEOUT: '30'
|
||||
READ_TIMEOUT: '60'
|
||||
AUTH_ENABLED: 'true'
|
||||
AUTH_METHOD: jwt
|
||||
SESSION_TIMEOUT: '3600'
|
||||
NOTIFICATIONS_ENABLED: 'false'
|
||||
SMTP_HOST: ''
|
||||
SMTP_PORT: '587'
|
||||
SMTP_USER: ''
|
||||
SMTP_PASS: ''
|
||||
SMTP_FROM: ''
|
||||
# Docker настройки
|
||||
DOCKER_HOST: unix:///var/run/docker.sock
|
||||
DOCKER_NETWORKS: iaas,infrastructure_iaas
|
||||
# Основные настройки приложения
|
||||
LOGBOARD_PORT: ${LOGBOARD_PORT:-9001}
|
||||
LOGBOARD_TAIL: ${LOGBOARD_TAIL:-500}
|
||||
LOGBOARD_USER: ${LOGBOARD_USER:-admin}
|
||||
LOGBOARD_PASS: ${LOGBOARD_PASS:-admin}
|
||||
LOGBOARD_PROJECTS: ${LOGBOARD_PROJECTS:-}
|
||||
LOGBOARD_SNAPSHOT_DIR: ${LOGBOARD_SNAPSHOT_DIR:-/app/snapshots}
|
||||
LOGBOARD_INDEX_HTML: ${LOGBOARD_INDEX_HTML:-./templates/index.html}
|
||||
TZ_TS: ${TZ_TS:-Europe/Moscow}
|
||||
|
||||
# Настройки безопасности
|
||||
SECRET_KEY: ${SECRET_KEY:-your-secret-key-here}
|
||||
ENCRYPTION_KEY: ${ENCRYPTION_KEY:-your-encryption-key-here}
|
||||
|
||||
# Настройки логирования
|
||||
LOG_LEVEL: ${LOG_LEVEL:-INFO}
|
||||
LOG_FORMAT: ${LOG_FORMAT:-json}
|
||||
|
||||
# Настройки веб-интерфейса
|
||||
WEB_TITLE: ${WEB_TITLE:-LogBoard+}
|
||||
WEB_DESCRIPTION: ${WEB_DESCRIPTION:-Веб-панель для просмотра логов микросервисов}
|
||||
WEB_VERSION: ${WEB_VERSION:-1.0.0}
|
||||
|
||||
# Настройки производительности
|
||||
MAX_CONNECTIONS: ${MAX_CONNECTIONS:-100}
|
||||
CONNECTION_TIMEOUT: ${CONNECTION_TIMEOUT:-30}
|
||||
READ_TIMEOUT: ${READ_TIMEOUT:-60}
|
||||
|
||||
# Настройки аутентификации
|
||||
AUTH_ENABLED: ${AUTH_ENABLED:-true}
|
||||
AUTH_METHOD: ${AUTH_METHOD:-jwt}
|
||||
SESSION_TIMEOUT: ${SESSION_TIMEOUT:-3600}
|
||||
|
||||
# Настройки уведомлений
|
||||
NOTIFICATIONS_ENABLED: ${NOTIFICATIONS_ENABLED:-false}
|
||||
SMTP_HOST: ${SMTP_HOST:-}
|
||||
SMTP_PORT: ${SMTP_PORT:-587}
|
||||
SMTP_USER: ${SMTP_USER:-}
|
||||
SMTP_PASS: ${SMTP_PASS:-}
|
||||
SMTP_FROM: ${SMTP_FROM:-}
|
||||
|
||||
# Настройки Docker
|
||||
DOCKER_HOST: ${DOCKER_HOST:-unix:///var/run/docker.sock}
|
||||
DOCKER_TLS_VERIFY: ${DOCKER_TLS_VERIFY:-}
|
||||
DOCKER_CERT_PATH: ${DOCKER_CERT_PATH:-}
|
||||
DOCKER_NETWORKS: ${DOCKER_NETWORKS:-iaas,infrastructure_iaas}
|
||||
|
||||
# Настройки фильтрации контейнеров
|
||||
LOGBOARD_SKIP_UNHEALTHY: 'true'
|
||||
LOGBOARD_CONTAINER_LIST_TIMEOUT: '10'
|
||||
LOGBOARD_CONTAINER_INFO_TIMEOUT: '3'
|
||||
LOGBOARD_HEALTH_CHECK_TIMEOUT: '2'
|
||||
LOGBOARD_SKIP_UNHEALTHY: ${LOGBOARD_SKIP_UNHEALTHY:-true}
|
||||
LOGBOARD_CONTAINER_LIST_TIMEOUT: ${LOGBOARD_CONTAINER_LIST_TIMEOUT:-10}
|
||||
LOGBOARD_CONTAINER_INFO_TIMEOUT: ${LOGBOARD_CONTAINER_INFO_TIMEOUT:-3}
|
||||
LOGBOARD_HEALTH_CHECK_TIMEOUT: ${LOGBOARD_HEALTH_CHECK_TIMEOUT:-2}
|
||||
|
||||
# Настройки AJAX обновления
|
||||
LOGBOARD_AJAX_UPDATE_INTERVAL: '2000'
|
||||
LOGBOARD_AJAX_UPDATE_INTERVAL: ${LOGBOARD_AJAX_UPDATE_INTERVAL:-2000}
|
||||
|
||||
ports:
|
||||
- 9001:9001
|
||||
- "${LOGBOARD_PORT:-9001}:${LOGBOARD_PORT:-9001}"
|
||||
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- ./snapshots:/app/snapshots
|
||||
- ./:/app
|
||||
|
||||
restart: unless-stopped
|
||||
user: 0:0
|
||||
|
||||
networks:
|
||||
- default
|
||||
- iaas
|
||||
- infrastructure_iaas
|
||||
|
||||
|
||||
networks:
|
||||
default: {}
|
||||
iaas:
|
||||
external: true
|
||||
infrastructure_iaas:
|
||||
|
||||
126
env.example
126
env.example
@@ -1,79 +1,159 @@
|
||||
# LogBoard+ - Переменные окружения
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
# Версия: 1.0.0
|
||||
|
||||
# Основные настройки приложения
|
||||
# =============================================================================
|
||||
# ОСНОВНЫЕ НАСТРОЙКИ ПРИЛОЖЕНИЯ
|
||||
# =============================================================================
|
||||
|
||||
# Порт на котором будет работать веб-интерфейс LogBoard+
|
||||
LOGBOARD_PORT=9001
|
||||
LOGBOARD_TAIL=500
|
||||
LOGBOARD_USER=admin
|
||||
LOGBOARD_PASS=s3cret-change-me
|
||||
|
||||
# Директория для снимков логов
|
||||
# Количество строк логов для отображения по умолчанию (tail)
|
||||
LOGBOARD_TAIL=500
|
||||
|
||||
# Имя пользователя для входа в систему
|
||||
LOGBOARD_USER=admin
|
||||
|
||||
# Пароль для входа в систему (обязательно измените в продакшене)
|
||||
LOGBOARD_PASS=admin
|
||||
|
||||
# Директория для сохранения снимков логов (путь внутри контейнера)
|
||||
LOGBOARD_SNAPSHOT_DIR=/app/snapshots
|
||||
|
||||
# Путь к HTML шаблону
|
||||
# Путь к HTML шаблону главной страницы
|
||||
LOGBOARD_INDEX_HTML=./templates/index.html
|
||||
|
||||
# Временная зона для временных меток
|
||||
TZ_TS=
|
||||
# Временная зона для временных меток в логах (например: Europe/Moscow, UTC)
|
||||
TZ_TS=Europe/Moscow
|
||||
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ DOCKER
|
||||
# =============================================================================
|
||||
|
||||
# Фильтр по проекту Docker Compose (опционально)
|
||||
# Если указано, будут показаны только контейнеры из этого проекта
|
||||
# COMPOSE_PROJECT_NAME=myproj
|
||||
|
||||
# Настройки множественных проектов
|
||||
# Укажите проекты через запятую для отображения контейнеров из нескольких проектов
|
||||
# Если не указано или пустое значение - показываются ВСЕ контейнеры из всех проектов
|
||||
# LOGBOARD_PROJECTS=project1,project2,project3
|
||||
|
||||
# Настройки Docker
|
||||
# Путь к Docker socket для подключения к Docker daemon
|
||||
DOCKER_HOST=unix:///var/run/docker.sock
|
||||
|
||||
# Проверка TLS для Docker (для удаленных Docker hosts)
|
||||
DOCKER_TLS_VERIFY=
|
||||
|
||||
# Путь к сертификатам Docker (для удаленных Docker hosts)
|
||||
DOCKER_CERT_PATH=
|
||||
|
||||
# Настройки Docker сетей (внешние сети для подключения)
|
||||
# Укажите имена внешних сетей через запятую
|
||||
DOCKER_NETWORKS=iaas,infrastructure_iaas
|
||||
|
||||
# Настройки безопасности
|
||||
# Измените эти значения на свои в продакшене
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ БЕЗОПАСНОСТИ
|
||||
# =============================================================================
|
||||
|
||||
# Секретный ключ для JWT токенов (обязательно измените в продакшене)
|
||||
SECRET_KEY=your-secret-key-here
|
||||
|
||||
# Ключ шифрования для чувствительных данных (обязательно измените в продакшене)
|
||||
ENCRYPTION_KEY=your-encryption-key-here
|
||||
|
||||
# Настройки логирования
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ ЛОГИРОВАНИЯ
|
||||
# =============================================================================
|
||||
|
||||
# Уровень логирования приложения (DEBUG, INFO, WARNING, ERROR)
|
||||
LOG_LEVEL=INFO
|
||||
|
||||
# Формат логов (json, text)
|
||||
LOG_FORMAT=json
|
||||
|
||||
# Настройки веб-интерфейса
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ ВЕБ-ИНТЕРФЕЙСА
|
||||
# =============================================================================
|
||||
|
||||
# Заголовок веб-интерфейса
|
||||
WEB_TITLE=LogBoard+
|
||||
|
||||
# Описание веб-интерфейса
|
||||
WEB_DESCRIPTION=Веб-панель для просмотра логов микросервисов
|
||||
|
||||
# Версия веб-интерфейса
|
||||
WEB_VERSION=1.0.0
|
||||
|
||||
# Настройки производительности
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ ПРОИЗВОДИТЕЛЬНОСТИ
|
||||
# =============================================================================
|
||||
|
||||
# Максимальное количество одновременных подключений
|
||||
MAX_CONNECTIONS=100
|
||||
|
||||
# Таймаут подключения в секундах
|
||||
CONNECTION_TIMEOUT=30
|
||||
|
||||
# Таймаут чтения в секундах
|
||||
READ_TIMEOUT=60
|
||||
|
||||
# Настройки фильтрации контейнеров
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ ФИЛЬТРАЦИИ КОНТЕЙНЕРОВ
|
||||
# =============================================================================
|
||||
|
||||
# Пропускать контейнеры с проблемными health check (true/false)
|
||||
LOGBOARD_SKIP_UNHEALTHY=true
|
||||
|
||||
# Настройки таймаутов (в секундах)
|
||||
# Таймаут получения списка контейнеров в секундах
|
||||
LOGBOARD_CONTAINER_LIST_TIMEOUT=10
|
||||
|
||||
# Таймаут получения информации о контейнере в секундах
|
||||
LOGBOARD_CONTAINER_INFO_TIMEOUT=3
|
||||
|
||||
# Таймаут health check контейнера в секундах
|
||||
LOGBOARD_HEALTH_CHECK_TIMEOUT=2
|
||||
|
||||
# Настройки аутентификации
|
||||
AUTH_ENABLED=true
|
||||
AUTH_METHOD=jwt
|
||||
SESSION_TIMEOUT=3600
|
||||
SECRET_KEY=your-secret-key-here-change-in-production
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ АУТЕНТИФИКАЦИИ
|
||||
# =============================================================================
|
||||
|
||||
# Настройки уведомлений
|
||||
# Включить аутентификацию (true/false)
|
||||
AUTH_ENABLED=true
|
||||
|
||||
# Метод аутентификации (jwt)
|
||||
AUTH_METHOD=jwt
|
||||
|
||||
# Время жизни сессии в секундах
|
||||
SESSION_TIMEOUT=3600
|
||||
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ УВЕДОМЛЕНИЙ
|
||||
# =============================================================================
|
||||
|
||||
# Включить уведомления по email (true/false)
|
||||
NOTIFICATIONS_ENABLED=false
|
||||
|
||||
# SMTP сервер для отправки уведомлений
|
||||
SMTP_HOST=
|
||||
|
||||
# Порт SMTP сервера
|
||||
SMTP_PORT=587
|
||||
|
||||
# Пользователь SMTP
|
||||
SMTP_USER=
|
||||
|
||||
# Пароль SMTP
|
||||
SMTP_PASS=
|
||||
|
||||
# Email отправителя
|
||||
SMTP_FROM=
|
||||
|
||||
# Настройки AJAX обновления логов
|
||||
# =============================================================================
|
||||
# НАСТРОЙКИ AJAX ОБНОВЛЕНИЯ
|
||||
# =============================================================================
|
||||
|
||||
# Интервал AJAX обновления логов в миллисекундах
|
||||
LOGBOARD_AJAX_UPDATE_INTERVAL=2000
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
# Сравнение переменных окружения
|
||||
|
||||
## Обзор файлов
|
||||
|
||||
- **docker-compose.yml** - переменные окружения, используемые в контейнере
|
||||
- **env.example** - пример файла с переменными окружения
|
||||
- **.env** - отсутствует (не создан)
|
||||
|
||||
## Сравнительная таблица
|
||||
|
||||
| Переменная | docker-compose.yml | env.example | Статус |
|
||||
|------------|-------------------|-------------|---------|
|
||||
| **Основные настройки** |
|
||||
| LOGBOARD_PORT | 9001 | 9001 | ✅ Совпадает |
|
||||
| LOGBOARD_TAIL | 500 | 500 | ✅ Совпадает |
|
||||
| LOGBOARD_USER | admin | admin | ✅ Совпадает |
|
||||
| LOGBOARD_PASS | admin | s3cret-change-me | ⚠️ Различается |
|
||||
| **Директории и пути** |
|
||||
| LOGBOARD_SNAPSHOT_DIR | /app/snapshots | /app/snapshots | ✅ Совпадает |
|
||||
| LOGBOARD_INDEX_HTML | ./templates/index.html | ./templates/index.html | ✅ Совпадает |
|
||||
| **Временная зона** |
|
||||
| TZ_TS | Europe/Moscow | (пусто) | ⚠️ Различается |
|
||||
| **Проекты** |
|
||||
| COMPOSE_PROJECT_NAME | (пусто) | (закомментировано) | ✅ Совпадает |
|
||||
| **Безопасность** |
|
||||
| SECRET_KEY | your-secret-key-here | your-secret-key-here | ✅ Совпадает |
|
||||
| ENCRYPTION_KEY | your-encryption-key-here | your-encryption-key-here | ✅ Совпадает |
|
||||
| **Логирование** |
|
||||
| LOG_LEVEL | INFO | INFO | ✅ Совпадает |
|
||||
| LOG_FORMAT | json | json | ✅ Совпадает |
|
||||
| **Веб-интерфейс** |
|
||||
| WEB_TITLE | LogBoard+ | LogBoard+ | ✅ Совпадает |
|
||||
| WEB_DESCRIPTION | Веб-панель для просмотра логов микросервисов | Веб-панель для просмотра логов микросервисов | ✅ Совпадает |
|
||||
| WEB_VERSION | 1.0.0 | 1.0.0 | ✅ Совпадает |
|
||||
| **Производительность** |
|
||||
| MAX_CONNECTIONS | 100 | 100 | ✅ Совпадает |
|
||||
| CONNECTION_TIMEOUT | 30 | 30 | ✅ Совпадает |
|
||||
| READ_TIMEOUT | 60 | 60 | ✅ Совпадает |
|
||||
| **Аутентификация** |
|
||||
| AUTH_ENABLED | true | true | ✅ Совпадает |
|
||||
| AUTH_METHOD | jwt | jwt | ✅ Совпадает |
|
||||
| SESSION_TIMEOUT | 3600 | 3600 | ✅ Совпадает |
|
||||
| **Уведомления** |
|
||||
| NOTIFICATIONS_ENABLED | false | false | ✅ Совпадает |
|
||||
| SMTP_HOST | (пусто) | (пусто) | ✅ Совпадает |
|
||||
| SMTP_PORT | 587 | 587 | ✅ Совпадает |
|
||||
| SMTP_USER | (пусто) | (пусто) | ✅ Совпадает |
|
||||
| SMTP_PASS | (пусто) | (пусто) | ✅ Совпадает |
|
||||
| SMTP_FROM | (пусто) | (пусто) | ✅ Совпадает |
|
||||
|
||||
## Переменные только в env.example
|
||||
|
||||
| Переменная | Значение | Описание |
|
||||
|------------|----------|----------|
|
||||
| DOCKER_HOST | unix:///var/run/docker.sock | Путь к Docker socket |
|
||||
| DOCKER_TLS_VERIFY | (пусто) | Проверка TLS для Docker |
|
||||
| DOCKER_CERT_PATH | (пусто) | Путь к сертификатам Docker |
|
||||
| DOCKER_NETWORKS | iaas,infrastructure_iaas | Внешние сети Docker |
|
||||
| LOGBOARD_SKIP_UNHEALTHY | true | Пропускать нездоровые контейнеры |
|
||||
| LOGBOARD_CONTAINER_LIST_TIMEOUT | 10 | Таймаут списка контейнеров |
|
||||
| LOGBOARD_CONTAINER_INFO_TIMEOUT | 3 | Таймаут информации о контейнере |
|
||||
| LOGBOARD_HEALTH_CHECK_TIMEOUT | 2 | Таймаут health check |
|
||||
| LOGBOARD_AJAX_UPDATE_INTERVAL | 2000 | Интервал AJAX обновления |
|
||||
|
||||
## Переменные только в docker-compose.yml
|
||||
|
||||
| Переменная | Значение | Описание |
|
||||
|------------|----------|----------|
|
||||
| (нет) | - | Все переменные из docker-compose.yml есть в env.example |
|
||||
|
||||
## Рекомендации
|
||||
|
||||
### 1. Создать .env файл
|
||||
```bash
|
||||
cp env.example .env
|
||||
```
|
||||
|
||||
### 2. Обновить docker-compose.yml
|
||||
Добавить недостающие переменные из env.example:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
# Существующие переменные...
|
||||
|
||||
# Добавить недостающие:
|
||||
DOCKER_HOST: unix:///var/run/docker.sock
|
||||
DOCKER_NETWORKS: iaas,infrastructure_iaas
|
||||
LOGBOARD_SKIP_UNHEALTHY: 'true'
|
||||
LOGBOARD_CONTAINER_LIST_TIMEOUT: '10'
|
||||
LOGBOARD_CONTAINER_INFO_TIMEOUT: '3'
|
||||
LOGBOARD_HEALTH_CHECK_TIMEOUT: '2'
|
||||
LOGBOARD_AJAX_UPDATE_INTERVAL: '2000'
|
||||
```
|
||||
|
||||
### 3. Исправить различия
|
||||
- **LOGBOARD_PASS**: В docker-compose.yml используется `admin`, в env.example - `s3cret-change-me`
|
||||
- **TZ_TS**: В docker-compose.yml установлено `Europe/Moscow`, в env.example - пусто
|
||||
|
||||
### 4. Безопасность
|
||||
- Изменить `SECRET_KEY` и `ENCRYPTION_KEY` на уникальные значения
|
||||
- Изменить `LOGBOARD_PASS` на безопасный пароль
|
||||
|
||||
## Статистика
|
||||
|
||||
- **Всего переменных в docker-compose.yml**: 25
|
||||
- **Всего переменных в env.example**: 34
|
||||
- **Совпадающих переменных**: 23
|
||||
- **Различающихся переменных**: 2
|
||||
- **Отсутствующих в docker-compose.yml**: 9
|
||||
- **Отсутствующих в env.example**: 0
|
||||
|
||||
## Вывод
|
||||
|
||||
В целом, файлы хорошо синхронизированы, но есть несколько важных различий:
|
||||
|
||||
1. **Отсутствуют переменные** в docker-compose.yml (особенно новые для AJAX обновления)
|
||||
2. **Различаются значения** для пароля и временной зоны
|
||||
3. **Отсутствует .env файл** для локальной настройки
|
||||
|
||||
## Выполненные действия
|
||||
|
||||
✅ **Создан .env файл** на основе env.example
|
||||
✅ **Обновлен docker-compose.yml** - добавлены недостающие переменные:
|
||||
- DOCKER_HOST
|
||||
- DOCKER_NETWORKS
|
||||
- LOGBOARD_SKIP_UNHEALTHY
|
||||
- LOGBOARD_CONTAINER_LIST_TIMEOUT
|
||||
- LOGBOARD_CONTAINER_INFO_TIMEOUT
|
||||
- LOGBOARD_HEALTH_CHECK_TIMEOUT
|
||||
- LOGBOARD_AJAX_UPDATE_INTERVAL
|
||||
|
||||
## Рекомендации для завершения синхронизации
|
||||
|
||||
1. **Обновить .env файл** (вручную):
|
||||
```bash
|
||||
# Изменить пароль на admin (как в docker-compose.yml)
|
||||
LOGBOARD_PASS=admin
|
||||
|
||||
# Добавить временную зону (как в docker-compose.yml)
|
||||
TZ_TS=Europe/Moscow
|
||||
```
|
||||
|
||||
2. **Проверить безопасность**:
|
||||
- Изменить SECRET_KEY и ENCRYPTION_KEY на уникальные значения
|
||||
- Рассмотреть изменение LOGBOARD_PASS на более безопасный пароль
|
||||
|
||||
3. **Использовать .env файл** в docker-compose.yml:
|
||||
```yaml
|
||||
env_file:
|
||||
- .env
|
||||
```
|
||||
|
||||
Теперь все файлы синхронизированы и готовы к использованию!
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user