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
|
# Сайт: 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
|
COMPOSE_FILE = docker-compose.yml
|
||||||
@ -34,11 +34,21 @@ setup: ## Настроить переменные окружения (копир
|
|||||||
cp env.example .env; \
|
cp env.example .env; \
|
||||||
echo "$(GREEN)Файл .env создан из env.example$(NC)"; \
|
echo "$(GREEN)Файл .env создан из env.example$(NC)"; \
|
||||||
echo "$(YELLOW)Не забудьте отредактировать .env под свои нужды!$(NC)"; \
|
echo "$(YELLOW)Не забудьте отредактировать .env под свои нужды!$(NC)"; \
|
||||||
|
echo "$(YELLOW)После редактирования .env запустите make generate для обновления docker-compose.yml$(NC)"; \
|
||||||
else \
|
else \
|
||||||
echo "$(YELLOW)Файл .env уже существует.$(NC)"; \
|
echo "$(YELLOW)Файл .env уже существует.$(NC)"; \
|
||||||
echo "$(YELLOW)Для пересоздания удалите .env и запустите make setup$(NC)"; \
|
echo "$(YELLOW)Для пересоздания удалите .env и запустите make setup$(NC)"; \
|
||||||
fi
|
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 образ
|
build: ## Собрать Docker образ
|
||||||
@echo "$(GREEN)Сборка Docker образа...$(NC)"
|
@echo "$(GREEN)Сборка Docker образа...$(NC)"
|
||||||
docker compose -f $(COMPOSE_FILE) build --no-cache
|
docker compose -f $(COMPOSE_FILE) build --no-cache
|
||||||
|
27
README.md
27
README.md
@ -53,6 +53,7 @@ http://localhost:9001
|
|||||||
|---------|----------|
|
|---------|----------|
|
||||||
| `make help` | Показать справку по всем командам |
|
| `make help` | Показать справку по всем командам |
|
||||||
| `make setup` | Настроить переменные окружения (копировать env.example в .env) |
|
| `make setup` | Настроить переменные окружения (копировать env.example в .env) |
|
||||||
|
| `make generate` | Сгенерировать docker-compose.yml из .env файла |
|
||||||
| `make build` | Собрать Docker образ |
|
| `make build` | Собрать Docker образ |
|
||||||
| `make up` | Запустить сервисы в фоновом режиме (с правами root) |
|
| `make up` | Запустить сервисы в фоновом режиме (с правами root) |
|
||||||
| `make down` | Остановить и удалить сервисы (с правами root) |
|
| `make down` | Остановить и удалить сервисы (с правами root) |
|
||||||
@ -92,11 +93,37 @@ http://localhost:9001
|
|||||||
| `LOGBOARD_INDEX_HTML` | Путь к HTML шаблону | `./templates/index.html` |
|
| `LOGBOARD_INDEX_HTML` | Путь к HTML шаблону | `./templates/index.html` |
|
||||||
| `TZ_TS` | Временная зона для меток времени | (пусто) |
|
| `TZ_TS` | Временная зона для меток времени | (пусто) |
|
||||||
| `COMPOSE_PROJECT_NAME` | Фильтр по проекту Docker Compose | (пусто) |
|
| `COMPOSE_PROJECT_NAME` | Фильтр по проекту Docker Compose | (пусто) |
|
||||||
|
| `DOCKER_NETWORKS` | Внешние Docker сети (через запятую) | `iaas,infrastructure_iaas` |
|
||||||
| `SECRET_KEY` | Секретный ключ для шифрования | `your-secret-key-here` |
|
| `SECRET_KEY` | Секретный ключ для шифрования | `your-secret-key-here` |
|
||||||
| `ENCRYPTION_KEY` | Ключ шифрования | `your-encryption-key-here` |
|
| `ENCRYPTION_KEY` | Ключ шифрования | `your-encryption-key-here` |
|
||||||
|
|
||||||
**⚠️ Важно:** Измените значения `LOGBOARD_PASS`, `SECRET_KEY` и `ENCRYPTION_KEY` в продакшене!
|
**⚠️ Важно:** Измените значения `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
|
### Настройка прав доступа к Docker
|
||||||
|
|
||||||
Приложение запускается с правами root для корректного доступа к Docker socket. Если вы хотите запускать без прав root, добавьте вашего пользователя в группу docker:
|
Приложение запускается с правами root для корректного доступа к Docker socket. Если вы хотите запускать без прав root, добавьте вашего пользователя в группу docker:
|
||||||
|
@ -3,37 +3,47 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
container_name: logboard
|
container_name: logboard
|
||||||
environment:
|
environment:
|
||||||
LOGBOARD_PORT: ${LOGBOARD_PORT:-9001}
|
LOGBOARD_PORT: '9001'
|
||||||
LOGBOARD_TAIL: ${LOGBOARD_TAIL:-500}
|
LOGBOARD_TAIL: '500'
|
||||||
LOGBOARD_USER: ${LOGBOARD_USER:-admin}
|
LOGBOARD_USER: admin
|
||||||
LOGBOARD_PASS: ${LOGBOARD_PASS:-s3cret-change-me}
|
LOGBOARD_PASS: admin
|
||||||
COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME:-}
|
COMPOSE_PROJECT_NAME: ''
|
||||||
LOGBOARD_SNAPSHOT_DIR: ${LOGBOARD_SNAPSHOT_DIR:-/app/snapshots}
|
LOGBOARD_SNAPSHOT_DIR: /app/snapshots
|
||||||
LOGBOARD_INDEX_HTML: ${LOGBOARD_INDEX_HTML:-./templates/index.html}
|
LOGBOARD_INDEX_HTML: ./templates/index.html
|
||||||
TZ_TS: ${TZ_TS:-}
|
TZ_TS: Europe/Moscow
|
||||||
SECRET_KEY: ${SECRET_KEY:-your-secret-key-here}
|
SECRET_KEY: your-secret-key-here
|
||||||
ENCRYPTION_KEY: ${ENCRYPTION_KEY:-your-encryption-key-here}
|
ENCRYPTION_KEY: your-encryption-key-here
|
||||||
LOG_LEVEL: ${LOG_LEVEL:-INFO}
|
LOG_LEVEL: INFO
|
||||||
LOG_FORMAT: ${LOG_FORMAT:-json}
|
LOG_FORMAT: json
|
||||||
WEB_TITLE: ${WEB_TITLE:-LogBoard+}
|
WEB_TITLE: LogBoard+
|
||||||
WEB_DESCRIPTION: ${WEB_DESCRIPTION:-Веб-панель для просмотра логов микросервисов}
|
WEB_DESCRIPTION: Веб-панель для просмотра логов микросервисов
|
||||||
WEB_VERSION: ${WEB_VERSION:-1.0.0}
|
WEB_VERSION: 1.0.0
|
||||||
MAX_CONNECTIONS: ${MAX_CONNECTIONS:-100}
|
MAX_CONNECTIONS: '100'
|
||||||
CONNECTION_TIMEOUT: ${CONNECTION_TIMEOUT:-30}
|
CONNECTION_TIMEOUT: '30'
|
||||||
READ_TIMEOUT: ${READ_TIMEOUT:-60}
|
READ_TIMEOUT: '60'
|
||||||
AUTH_ENABLED: ${AUTH_ENABLED:-true}
|
AUTH_ENABLED: 'true'
|
||||||
AUTH_METHOD: ${AUTH_METHOD:-basic}
|
AUTH_METHOD: basic
|
||||||
SESSION_TIMEOUT: ${SESSION_TIMEOUT:-3600}
|
SESSION_TIMEOUT: '3600'
|
||||||
NOTIFICATIONS_ENABLED: ${NOTIFICATIONS_ENABLED:-false}
|
NOTIFICATIONS_ENABLED: 'false'
|
||||||
SMTP_HOST: ${SMTP_HOST:-}
|
SMTP_HOST: ''
|
||||||
SMTP_PORT: ${SMTP_PORT:-587}
|
SMTP_PORT: '587'
|
||||||
SMTP_USER: ${SMTP_USER:-}
|
SMTP_USER: ''
|
||||||
SMTP_PASS: ${SMTP_PASS:-}
|
SMTP_PASS: ''
|
||||||
SMTP_FROM: ${SMTP_FROM:-}
|
SMTP_FROM: ''
|
||||||
ports:
|
ports:
|
||||||
- "${LOGBOARD_PORT:-9001}:${LOGBOARD_PORT:-9001}"
|
- 9001:9001
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||||
- ./snapshots:${LOGBOARD_SNAPSHOT_DIR:-/app/snapshots}
|
- ./snapshots:/app/snapshots
|
||||||
restart: unless-stopped
|
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_TLS_VERIFY=
|
||||||
DOCKER_CERT_PATH=
|
DOCKER_CERT_PATH=
|
||||||
|
|
||||||
|
# Настройки Docker сетей (внешние сети для подключения)
|
||||||
|
# Укажите имена внешних сетей через запятую
|
||||||
|
DOCKER_NETWORKS=iaas,infrastructure_iaas
|
||||||
|
|
||||||
# Настройки безопасности
|
# Настройки безопасности
|
||||||
# Измените эти значения на свои в продакшене
|
# Измените эти значения на свои в продакшене
|
||||||
SECRET_KEY=your-secret-key-here
|
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