#!/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()