logboard/scripts/generate-compose.py
Сергей Антропов 3654d6699e 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)
2025-08-16 11:39:01 +03:00

112 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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