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

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()