diff --git a/Makefile b/Makefile index 8b35fed..9ee9ce7 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Автор: Сергей Антропов # Сайт: https://devops.org.ru -.PHONY: help setup build up down restart logs clean status ps shell +.PHONY: help setup build up down restart logs clean status ps shell generate # Переменные COMPOSE_FILE = docker-compose.yml @@ -34,11 +34,21 @@ setup: ## Настроить переменные окружения (копир cp env.example .env; \ echo "$(GREEN)Файл .env создан из env.example$(NC)"; \ echo "$(YELLOW)Не забудьте отредактировать .env под свои нужды!$(NC)"; \ + echo "$(YELLOW)После редактирования .env запустите make generate для обновления docker-compose.yml$(NC)"; \ else \ echo "$(YELLOW)Файл .env уже существует.$(NC)"; \ echo "$(YELLOW)Для пересоздания удалите .env и запустите make setup$(NC)"; \ fi +generate: ## Сгенерировать docker-compose.yml из .env файла + @echo "$(GREEN)Генерация docker-compose.yml из .env файла...$(NC)" + @if [ ! -f .env ]; then \ + echo "$(RED)Файл .env не найден! Сначала запустите make setup$(NC)"; \ + exit 1; \ + fi + python3 scripts/generate-compose.py + @echo "$(GREEN)docker-compose.yml сгенерирован успешно!$(NC)" + build: ## Собрать Docker образ @echo "$(GREEN)Сборка Docker образа...$(NC)" docker compose -f $(COMPOSE_FILE) build --no-cache diff --git a/README.md b/README.md index b463c93..feaeb32 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ http://localhost:9001 |---------|----------| | `make help` | Показать справку по всем командам | | `make setup` | Настроить переменные окружения (копировать env.example в .env) | +| `make generate` | Сгенерировать docker-compose.yml из .env файла | | `make build` | Собрать Docker образ | | `make up` | Запустить сервисы в фоновом режиме (с правами root) | | `make down` | Остановить и удалить сервисы (с правами root) | @@ -92,11 +93,37 @@ http://localhost:9001 | `LOGBOARD_INDEX_HTML` | Путь к HTML шаблону | `./templates/index.html` | | `TZ_TS` | Временная зона для меток времени | (пусто) | | `COMPOSE_PROJECT_NAME` | Фильтр по проекту Docker Compose | (пусто) | +| `DOCKER_NETWORKS` | Внешние Docker сети (через запятую) | `iaas,infrastructure_iaas` | | `SECRET_KEY` | Секретный ключ для шифрования | `your-secret-key-here` | | `ENCRYPTION_KEY` | Ключ шифрования | `your-encryption-key-here` | **⚠️ Важно:** Измените значения `LOGBOARD_PASS`, `SECRET_KEY` и `ENCRYPTION_KEY` в продакшене! +### Настройка Docker сетей + +Для подключения к внешним Docker сетям (например, для работы с другими проектами): + +1. **Укажите сети в .env файле:** + ```bash + DOCKER_NETWORKS=iaas,infrastructure_iaas,myproject_network + ``` + +2. **Сгенерируйте docker-compose.yml:** + ```bash + make generate + ``` + +3. **Убедитесь, что сети существуют:** + ```bash + docker network ls + ``` + +4. **Создайте сети, если их нет:** + ```bash + docker network create iaas + docker network create infrastructure_iaas + ``` + ### Настройка прав доступа к Docker Приложение запускается с правами root для корректного доступа к Docker socket. Если вы хотите запускать без прав root, добавьте вашего пользователя в группу docker: diff --git a/docker-compose.yml b/docker-compose.yml index 426a20a..dbf8d21 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,37 +3,47 @@ services: build: . container_name: logboard environment: - LOGBOARD_PORT: ${LOGBOARD_PORT:-9001} - LOGBOARD_TAIL: ${LOGBOARD_TAIL:-500} - LOGBOARD_USER: ${LOGBOARD_USER:-admin} - LOGBOARD_PASS: ${LOGBOARD_PASS:-s3cret-change-me} - COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME:-} - LOGBOARD_SNAPSHOT_DIR: ${LOGBOARD_SNAPSHOT_DIR:-/app/snapshots} - LOGBOARD_INDEX_HTML: ${LOGBOARD_INDEX_HTML:-./templates/index.html} - TZ_TS: ${TZ_TS:-} - SECRET_KEY: ${SECRET_KEY:-your-secret-key-here} - ENCRYPTION_KEY: ${ENCRYPTION_KEY:-your-encryption-key-here} - LOG_LEVEL: ${LOG_LEVEL:-INFO} - LOG_FORMAT: ${LOG_FORMAT:-json} - WEB_TITLE: ${WEB_TITLE:-LogBoard+} - WEB_DESCRIPTION: ${WEB_DESCRIPTION:-Веб-панель для просмотра логов микросервисов} - WEB_VERSION: ${WEB_VERSION:-1.0.0} - MAX_CONNECTIONS: ${MAX_CONNECTIONS:-100} - CONNECTION_TIMEOUT: ${CONNECTION_TIMEOUT:-30} - READ_TIMEOUT: ${READ_TIMEOUT:-60} - AUTH_ENABLED: ${AUTH_ENABLED:-true} - AUTH_METHOD: ${AUTH_METHOD:-basic} - SESSION_TIMEOUT: ${SESSION_TIMEOUT:-3600} - NOTIFICATIONS_ENABLED: ${NOTIFICATIONS_ENABLED:-false} - SMTP_HOST: ${SMTP_HOST:-} - SMTP_PORT: ${SMTP_PORT:-587} - SMTP_USER: ${SMTP_USER:-} - SMTP_PASS: ${SMTP_PASS:-} - SMTP_FROM: ${SMTP_FROM:-} + LOGBOARD_PORT: '9001' + LOGBOARD_TAIL: '500' + LOGBOARD_USER: admin + LOGBOARD_PASS: admin + COMPOSE_PROJECT_NAME: '' + LOGBOARD_SNAPSHOT_DIR: /app/snapshots + LOGBOARD_INDEX_HTML: ./templates/index.html + TZ_TS: Europe/Moscow + SECRET_KEY: your-secret-key-here + ENCRYPTION_KEY: your-encryption-key-here + LOG_LEVEL: INFO + LOG_FORMAT: json + WEB_TITLE: LogBoard+ + WEB_DESCRIPTION: Веб-панель для просмотра логов микросервисов + WEB_VERSION: 1.0.0 + MAX_CONNECTIONS: '100' + CONNECTION_TIMEOUT: '30' + READ_TIMEOUT: '60' + AUTH_ENABLED: 'true' + AUTH_METHOD: basic + SESSION_TIMEOUT: '3600' + NOTIFICATIONS_ENABLED: 'false' + SMTP_HOST: '' + SMTP_PORT: '587' + SMTP_USER: '' + SMTP_PASS: '' + SMTP_FROM: '' ports: - - "${LOGBOARD_PORT:-9001}:${LOGBOARD_PORT:-9001}" + - 9001:9001 volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - ./snapshots:${LOGBOARD_SNAPSHOT_DIR:-/app/snapshots} + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./snapshots:/app/snapshots restart: unless-stopped - user: "0:0" # Запуск от root для доступа к Docker socket + user: 0:0 + networks: + - default + - iaas + - infrastructure_iaas +networks: + default: {} + iaas: + external: true + infrastructure_iaas: + external: true diff --git a/env.example b/env.example index 9bf1f3c..14602a9 100644 --- a/env.example +++ b/env.example @@ -25,6 +25,10 @@ DOCKER_HOST=unix:///var/run/docker.sock DOCKER_TLS_VERIFY= DOCKER_CERT_PATH= +# Настройки Docker сетей (внешние сети для подключения) +# Укажите имена внешних сетей через запятую +DOCKER_NETWORKS=iaas,infrastructure_iaas + # Настройки безопасности # Измените эти значения на свои в продакшене SECRET_KEY=your-secret-key-here diff --git a/scripts/generate-compose.py b/scripts/generate-compose.py new file mode 100644 index 0000000..7933146 --- /dev/null +++ b/scripts/generate-compose.py @@ -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()