feat: добавлена поддержка внешних Docker сетей через переменные окружения

- Добавлена переменная DOCKER_NETWORKS в env.example
- Создан скрипт scripts/generate-compose.py для генерации docker-compose.yml
- Добавлена команда make generate для обновления конфигурации
- Обновлен docker-compose.yml с поддержкой внешних сетей
- Добавлена документация по настройке сетей в README.md
- Поддержка гибкой настройки сетей для разных проектов
- Пример: DOCKER_NETWORKS=iaas,infrastructure_iaas
- Автор: Сергей Антропов (https://devops.org.ru)
This commit is contained in:
Сергей Антропов 2025-08-16 11:39:01 +03:00
parent 5a44c3446f
commit 3654d6699e
5 changed files with 194 additions and 32 deletions

View File

@ -2,7 +2,7 @@
# Автор: Сергей Антропов # Автор: Сергей Антропов
# Сайт: https://devops.org.ru # Сайт: https://devops.org.ru
.PHONY: help setup build up down restart logs clean status ps shell .PHONY: help setup build up down restart logs clean status ps shell generate
# Переменные # Переменные
COMPOSE_FILE = docker-compose.yml COMPOSE_FILE = docker-compose.yml
@ -34,11 +34,21 @@ setup: ## Настроить переменные окружения (копир
cp env.example .env; \ cp env.example .env; \
echo "$(GREEN)Файл .env создан из env.example$(NC)"; \ echo "$(GREEN)Файл .env создан из env.example$(NC)"; \
echo "$(YELLOW)Не забудьте отредактировать .env под свои нужды!$(NC)"; \ echo "$(YELLOW)Не забудьте отредактировать .env под свои нужды!$(NC)"; \
echo "$(YELLOW)После редактирования .env запустите make generate для обновления docker-compose.yml$(NC)"; \
else \ else \
echo "$(YELLOW)Файл .env уже существует.$(NC)"; \ echo "$(YELLOW)Файл .env уже существует.$(NC)"; \
echo "$(YELLOW)Для пересоздания удалите .env и запустите make setup$(NC)"; \ echo "$(YELLOW)Для пересоздания удалите .env и запустите make setup$(NC)"; \
fi fi
generate: ## Сгенерировать docker-compose.yml из .env файла
@echo "$(GREEN)Генерация docker-compose.yml из .env файла...$(NC)"
@if [ ! -f .env ]; then \
echo "$(RED)Файл .env не найден! Сначала запустите make setup$(NC)"; \
exit 1; \
fi
python3 scripts/generate-compose.py
@echo "$(GREEN)docker-compose.yml сгенерирован успешно!$(NC)"
build: ## Собрать Docker образ build: ## Собрать Docker образ
@echo "$(GREEN)Сборка Docker образа...$(NC)" @echo "$(GREEN)Сборка Docker образа...$(NC)"
docker compose -f $(COMPOSE_FILE) build --no-cache docker compose -f $(COMPOSE_FILE) build --no-cache

View File

@ -53,6 +53,7 @@ http://localhost:9001
|---------|----------| |---------|----------|
| `make help` | Показать справку по всем командам | | `make help` | Показать справку по всем командам |
| `make setup` | Настроить переменные окружения (копировать env.example в .env) | | `make setup` | Настроить переменные окружения (копировать env.example в .env) |
| `make generate` | Сгенерировать docker-compose.yml из .env файла |
| `make build` | Собрать Docker образ | | `make build` | Собрать Docker образ |
| `make up` | Запустить сервисы в фоновом режиме (с правами root) | | `make up` | Запустить сервисы в фоновом режиме (с правами root) |
| `make down` | Остановить и удалить сервисы (с правами root) | | `make down` | Остановить и удалить сервисы (с правами root) |
@ -92,11 +93,37 @@ http://localhost:9001
| `LOGBOARD_INDEX_HTML` | Путь к HTML шаблону | `./templates/index.html` | | `LOGBOARD_INDEX_HTML` | Путь к HTML шаблону | `./templates/index.html` |
| `TZ_TS` | Временная зона для меток времени | (пусто) | | `TZ_TS` | Временная зона для меток времени | (пусто) |
| `COMPOSE_PROJECT_NAME` | Фильтр по проекту Docker Compose | (пусто) | | `COMPOSE_PROJECT_NAME` | Фильтр по проекту Docker Compose | (пусто) |
| `DOCKER_NETWORKS` | Внешние Docker сети (через запятую) | `iaas,infrastructure_iaas` |
| `SECRET_KEY` | Секретный ключ для шифрования | `your-secret-key-here` | | `SECRET_KEY` | Секретный ключ для шифрования | `your-secret-key-here` |
| `ENCRYPTION_KEY` | Ключ шифрования | `your-encryption-key-here` | | `ENCRYPTION_KEY` | Ключ шифрования | `your-encryption-key-here` |
**⚠️ Важно:** Измените значения `LOGBOARD_PASS`, `SECRET_KEY` и `ENCRYPTION_KEY` в продакшене! **⚠️ Важно:** Измените значения `LOGBOARD_PASS`, `SECRET_KEY` и `ENCRYPTION_KEY` в продакшене!
### Настройка Docker сетей
Для подключения к внешним Docker сетям (например, для работы с другими проектами):
1. **Укажите сети в .env файле:**
```bash
DOCKER_NETWORKS=iaas,infrastructure_iaas,myproject_network
```
2. **Сгенерируйте docker-compose.yml:**
```bash
make generate
```
3. **Убедитесь, что сети существуют:**
```bash
docker network ls
```
4. **Создайте сети, если их нет:**
```bash
docker network create iaas
docker network create infrastructure_iaas
```
### Настройка прав доступа к Docker ### Настройка прав доступа к Docker
Приложение запускается с правами root для корректного доступа к Docker socket. Если вы хотите запускать без прав root, добавьте вашего пользователя в группу docker: Приложение запускается с правами root для корректного доступа к Docker socket. Если вы хотите запускать без прав root, добавьте вашего пользователя в группу docker:

View File

@ -3,37 +3,47 @@ services:
build: . build: .
container_name: logboard container_name: logboard
environment: environment:
LOGBOARD_PORT: ${LOGBOARD_PORT:-9001} LOGBOARD_PORT: '9001'
LOGBOARD_TAIL: ${LOGBOARD_TAIL:-500} LOGBOARD_TAIL: '500'
LOGBOARD_USER: ${LOGBOARD_USER:-admin} LOGBOARD_USER: admin
LOGBOARD_PASS: ${LOGBOARD_PASS:-s3cret-change-me} LOGBOARD_PASS: admin
COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME:-} COMPOSE_PROJECT_NAME: ''
LOGBOARD_SNAPSHOT_DIR: ${LOGBOARD_SNAPSHOT_DIR:-/app/snapshots} LOGBOARD_SNAPSHOT_DIR: /app/snapshots
LOGBOARD_INDEX_HTML: ${LOGBOARD_INDEX_HTML:-./templates/index.html} LOGBOARD_INDEX_HTML: ./templates/index.html
TZ_TS: ${TZ_TS:-} TZ_TS: Europe/Moscow
SECRET_KEY: ${SECRET_KEY:-your-secret-key-here} SECRET_KEY: your-secret-key-here
ENCRYPTION_KEY: ${ENCRYPTION_KEY:-your-encryption-key-here} ENCRYPTION_KEY: your-encryption-key-here
LOG_LEVEL: ${LOG_LEVEL:-INFO} LOG_LEVEL: INFO
LOG_FORMAT: ${LOG_FORMAT:-json} LOG_FORMAT: json
WEB_TITLE: ${WEB_TITLE:-LogBoard+} WEB_TITLE: LogBoard+
WEB_DESCRIPTION: ${WEB_DESCRIPTION:-Веб-панель для просмотра логов микросервисов} WEB_DESCRIPTION: Веб-панель для просмотра логов микросервисов
WEB_VERSION: ${WEB_VERSION:-1.0.0} WEB_VERSION: 1.0.0
MAX_CONNECTIONS: ${MAX_CONNECTIONS:-100} MAX_CONNECTIONS: '100'
CONNECTION_TIMEOUT: ${CONNECTION_TIMEOUT:-30} CONNECTION_TIMEOUT: '30'
READ_TIMEOUT: ${READ_TIMEOUT:-60} READ_TIMEOUT: '60'
AUTH_ENABLED: ${AUTH_ENABLED:-true} AUTH_ENABLED: 'true'
AUTH_METHOD: ${AUTH_METHOD:-basic} AUTH_METHOD: basic
SESSION_TIMEOUT: ${SESSION_TIMEOUT:-3600} SESSION_TIMEOUT: '3600'
NOTIFICATIONS_ENABLED: ${NOTIFICATIONS_ENABLED:-false} NOTIFICATIONS_ENABLED: 'false'
SMTP_HOST: ${SMTP_HOST:-} SMTP_HOST: ''
SMTP_PORT: ${SMTP_PORT:-587} SMTP_PORT: '587'
SMTP_USER: ${SMTP_USER:-} SMTP_USER: ''
SMTP_PASS: ${SMTP_PASS:-} SMTP_PASS: ''
SMTP_FROM: ${SMTP_FROM:-} SMTP_FROM: ''
ports: ports:
- "${LOGBOARD_PORT:-9001}:${LOGBOARD_PORT:-9001}" - 9001:9001
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
- ./snapshots:${LOGBOARD_SNAPSHOT_DIR:-/app/snapshots} - ./snapshots:/app/snapshots
restart: unless-stopped restart: unless-stopped
user: "0:0" # Запуск от root для доступа к Docker socket user: 0:0
networks:
- default
- iaas
- infrastructure_iaas
networks:
default: {}
iaas:
external: true
infrastructure_iaas:
external: true

View File

@ -25,6 +25,10 @@ DOCKER_HOST=unix:///var/run/docker.sock
DOCKER_TLS_VERIFY= DOCKER_TLS_VERIFY=
DOCKER_CERT_PATH= DOCKER_CERT_PATH=
# Настройки Docker сетей (внешние сети для подключения)
# Укажите имена внешних сетей через запятую
DOCKER_NETWORKS=iaas,infrastructure_iaas
# Настройки безопасности # Настройки безопасности
# Измените эти значения на свои в продакшене # Измените эти значения на свои в продакшене
SECRET_KEY=your-secret-key-here SECRET_KEY=your-secret-key-here

111
scripts/generate-compose.py Normal file
View File

@ -0,0 +1,111 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Скрипт для генерации docker-compose.yml с динамическими сетями
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
import os
import yaml
from typing import List
def load_env_vars():
"""Загружает переменные из .env файла"""
env_vars = {}
if os.path.exists('.env'):
with open('.env', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#') and '=' in line:
key, value = line.split('=', 1)
env_vars[key] = value
return env_vars
def parse_networks(networks_str: str) -> List[str]:
"""Парсит строку с сетями в список"""
if not networks_str:
return []
return [net.strip() for net in networks_str.split(',') if net.strip()]
def generate_compose_config():
"""Генерирует конфигурацию docker-compose.yml"""
env_vars = load_env_vars()
# Получаем сети из переменной окружения
networks_str = env_vars.get('DOCKER_NETWORKS', '')
external_networks = parse_networks(networks_str)
# Базовая конфигурация
config = {
'services': {
'logboard': {
'build': '.',
'container_name': 'logboard',
'environment': {
'LOGBOARD_PORT': env_vars.get('LOGBOARD_PORT', '9001'),
'LOGBOARD_TAIL': env_vars.get('LOGBOARD_TAIL', '500'),
'LOGBOARD_USER': env_vars.get('LOGBOARD_USER', 'admin'),
'LOGBOARD_PASS': env_vars.get('LOGBOARD_PASS', 's3cret-change-me'),
'COMPOSE_PROJECT_NAME': env_vars.get('COMPOSE_PROJECT_NAME', ''),
'LOGBOARD_SNAPSHOT_DIR': env_vars.get('LOGBOARD_SNAPSHOT_DIR', '/app/snapshots'),
'LOGBOARD_INDEX_HTML': env_vars.get('LOGBOARD_INDEX_HTML', './templates/index.html'),
'TZ_TS': env_vars.get('TZ_TS', ''),
'SECRET_KEY': env_vars.get('SECRET_KEY', 'your-secret-key-here'),
'ENCRYPTION_KEY': env_vars.get('ENCRYPTION_KEY', 'your-encryption-key-here'),
'LOG_LEVEL': env_vars.get('LOG_LEVEL', 'INFO'),
'LOG_FORMAT': env_vars.get('LOG_FORMAT', 'json'),
'WEB_TITLE': env_vars.get('WEB_TITLE', 'LogBoard+'),
'WEB_DESCRIPTION': env_vars.get('WEB_DESCRIPTION', 'Веб-панель для просмотра логов микросервисов'),
'WEB_VERSION': env_vars.get('WEB_VERSION', '1.0.0'),
'MAX_CONNECTIONS': env_vars.get('MAX_CONNECTIONS', '100'),
'CONNECTION_TIMEOUT': env_vars.get('CONNECTION_TIMEOUT', '30'),
'READ_TIMEOUT': env_vars.get('READ_TIMEOUT', '60'),
'AUTH_ENABLED': env_vars.get('AUTH_ENABLED', 'true'),
'AUTH_METHOD': env_vars.get('AUTH_METHOD', 'basic'),
'SESSION_TIMEOUT': env_vars.get('SESSION_TIMEOUT', '3600'),
'NOTIFICATIONS_ENABLED': env_vars.get('NOTIFICATIONS_ENABLED', 'false'),
'SMTP_HOST': env_vars.get('SMTP_HOST', ''),
'SMTP_PORT': env_vars.get('SMTP_PORT', '587'),
'SMTP_USER': env_vars.get('SMTP_USER', ''),
'SMTP_PASS': env_vars.get('SMTP_PASS', ''),
'SMTP_FROM': env_vars.get('SMTP_FROM', ''),
},
'ports': [
f"{env_vars.get('LOGBOARD_PORT', '9001')}:{env_vars.get('LOGBOARD_PORT', '9001')}"
],
'volumes': [
'/var/run/docker.sock:/var/run/docker.sock:ro',
f"./snapshots:{env_vars.get('LOGBOARD_SNAPSHOT_DIR', '/app/snapshots')}"
],
'restart': 'unless-stopped',
'user': '0:0',
'networks': ['default'] + external_networks
}
},
'networks': {
'default': {}
}
}
# Добавляем внешние сети
for network in external_networks:
config['networks'][network] = {'external': True}
return config
def main():
"""Основная функция"""
print("Генерация docker-compose.yml с динамическими сетями...")
config = generate_compose_config()
# Записываем в файл
with open('docker-compose.yml', 'w', encoding='utf-8') as f:
yaml.dump(config, f, default_flow_style=False, allow_unicode=True, sort_keys=False)
print("docker-compose.yml сгенерирован успешно!")
print(f"Подключенные сети: {list(config['networks'].keys())}")
if __name__ == '__main__':
main()