- Добавлена переменная 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)
112 lines
4.9 KiB
Python
112 lines
4.9 KiB
Python
#!/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()
|