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:
parent
5a44c3446f
commit
3654d6699e
12
Makefile
12
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
|
||||
|
27
README.md
27
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:
|
||||
|
@ -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}
|
||||
- ./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
|
||||
|
@ -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
|
||||
|
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()
|
Loading…
x
Reference in New Issue
Block a user