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:
111
scripts/generate-compose.py
Normal file
111
scripts/generate-compose.py
Normal 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()
|
||||
Reference in New Issue
Block a user