Compose Stacks

Коллекция стеков Docker Compose из более чем 200 сервисов. Каждое приложение было отлажено и проверено в домашней лаборатории, конфигурации к некоторым сервисам доступны в исходном репозитории.


Bot Stack

SSH Bot

SSH Bot - Telegram бот, который позволяет запускать заданные команды на выбранном хосте в домашней сети и возвращать результат их выполнения. Бот не устанавливает постоянное соединение с удаленным хостом, что позволяет выполнять команды асинхронно.

services:
  OpenRouter-Bot:
    container_name: OpenRouter-Bot
    image: lifailon/openrouter-bot:latest
    volumes:
      - ./openrouter-bot.env:/openrouter-bot/.env
    restart: unless-stopped

env:

# Telegram api key from https://telegram.me/BotFather
TELEGRAM_BOT_TOKEN=XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# Your Telegram id from https://t.me/getmyid_bot
TELEGRAM_USER_ID=7777777777

# Interpreter used only when running the bot local in Windows
# Available values: powershell/pwsh
WIN_SHELL=pwsh
# Interpreter used on local and remote hosts in Linux
# Available values: sh/bash/zsh or other
LINUX_SHELL=bash

# Parallel (async) execution of commands (default: false)
PARALLEL_EXEC=true

# Global parameters for ssh connection (low priority)
SSH_PORT=2121
SSH_USER=lifailon
# Use password to connect (optional)
SSH_PASSWORD=
# Full path to private key (default: ~/.ssh/id_rsa)
SSH_PRIVATE_KEY_PATH=
SSH_CONNECT_TIMEOUT=2
# Save and reuse passed variables and functions (default: false)
SSH_SAVE_ENV=true
# List of hosts separated by comma (high priority for username and port)
SSH_HOST_LIST=192.168.3.101,root@192.168.3.102:22,root@192.168.3.103:22,192.168.3.105,192.168.3.106

# Log the output of command execution
LOG_MODE=DEBUG

OpenRouter Bot

OpenRouter Bot - Telegram бота для общения с бесплатными и платными моделями ИИ через OpenRouter, или локальными LLM, например, через LM Studio.

services:
  ssh-bot:
    container_name: ssh-bot
    image: lifailon/ssh-bot:latest
    volumes:
      - ./ssh-bot.env:/ssh-bot/.env
      - $HOME/.ssh/id_rsa:/root/.ssh/id_rsa
    restart: unless-stopped

env:

# OpenRouter api key from https://openrouter.ai/settings/keys
API_KEY=

# Telegram api key from https://telegram.me/BotFather
TELEGRAM_BOT_TOKEN=

# Your Telegram id from https://t.me/getmyid_bot
ADMIN_IDS=
# List of users to access the bot, separated by commas
ALLOWED_USER_IDS=

BASE_URL=https://openrouter.ai/api/v1
# List of free models: https://openrouter.ai/models?max_price=0
MODEL=deepseek/deepseek-r1:free
# System preset that specifies the role for AI
#ASSISTANT_PROMPT="Ты переводчик, умеешь только переводить текст с русского на англйский язык (и наоборот) и не отвечаешь на вопросы."

# Using local LLM via LM Studio (https://lmstudio.ai)
#BASE_URL=http://localhost:1234/v1
# Using local model: https://huggingface.co/ruslandev/llama-3-8b-gpt-4o-ru1.0
#MODEL=llama-3-8b-gpt-4o-ru1.0

VISION=false
#VISION_PROMPT="Описание изображения"
#VISION_DETAIL="низкий"

# The maximum number of messages or time in minutes for store messages in history
MAX_HISTORY_SIZE=20
MAX_HISTORY_TIME=60

#BUDGET_PERIOD=monthly
# Enable user access (default)
#USER_BUDGET=1
# Disable guest access (enabled by default)
GUEST_BUDGET=0

# Language used for bot responses (supported: EN/RU)
LANG=RU

# ADMIN/USER/GUEST
STATS_MIN_ROLE=ADMIN

Kinozal Bot

Kinozal Bot - Telegram бот, который позволяет автоматизировать процесс доставки контента до вашего телевизора, используя только телефон. С помощью бота вы получите удобный и привычный интерфейс для взаимодействия с торрент трекером Кинозал и базой данных TMDB для отслеживания даты выхода серий, сезонов и поиска актеров для каждой серии, а также возможность управлять торрент клиентом qBittorrent или Transmission на вашем компьютере, находясь удаленно от дома, а главное, все это доступно из единого интерфейса и без установки клиентского приложения на конечные устройства. В отличии от других приложений, предназначенных для удаленного управления торрент клиентами, вам не нужно находиться в той же локальной сети или использовать VPN.

services:
  kinozal-bot:
    image: lifailon/kinozal-bot:latest
    container_name: kinozal-bot
    restart: unless-stopped
    volumes:
      - ./torrents:/kinozal-bot/torrents
      - ./kinozal-bot.conf:/kinozal-bot/kinozal-bot.conf

yt-dlp Telegram Bot

yt-dlp-telegram-bot - Telegram бот для загрузки видео из YouTube с помощью yt-dlp.

services:
  yt-dlp-telegram-bot:
    image: lifailon/yt-dlp-telegram-bot:latest
    container_name: yt-dlp-telegram-bot
    restart: unless-stopped
    env_file:
      - .env

env:

API_ID=             # get from https://my.telegram.org
API_HASH=           # get from https://my.telegram.org
BOT_TOKEN=          # get from https://telegram.me/BotFather

ALLOWED_USERIDS=    # get from https://t.me/getmyid_bot
ADMIN_USERIDS=      # get from https://t.me/getmyid_bot

YTDLP_PATH=         # default: /tmp/yt-dlp
ALLOWED_GROUPIDS=
MAX_SIZE=
YTDLP_COOKIES=

yt-dlp-telegram

yt-dlp-telegram - Telegram бот для загрузки видео из YouTube с ограничением 50 МБ.

services:
  yt-dlp-bot:
    image: lifailon/yt-dlp-bot:latest
    build:
      context: .
      dockerfile: Dockerfile
    container_name: yt-dlp-bot
    restart: unless-stopped
    volumes:
      - ./config:/bot/config.py

config:

token = ""                  # Telegram api key your bot
logs = 2390049              # Telegram your chat id
max_filesize = 50000000     # Max file size in bytes

# output_folder = "/download"

smtp_to_telegram

SMTP to Telegram - SMTP сервер (листенер) для переадресации сообщений в Telegram.

services:
  smtp2telegram:
    image: kostyaesmukov/smtp_to_telegram
    container_name: smtp2telegram
    restart: unless-stopped
    environment:
      - ST_SMTP_LISTEN=0.0.0.0:2525
      - ST_TELEGRAM_CHAT_IDS=
      - ST_TELEGRAM_BOT_TOKEN=
      - "ST_TELEGRAM_MESSAGE_TEMPLATE=Subject: {subject}\\\\n\\\\n{body}"
    ports:
      - 2525:2525

# echo -e "Subject: Test\n\nThis is test body" | curl smtp://localhost:2525 \
#   --mail-from admin@docker.local \
#   --mail-rcpt admin@docker.local \
#   --user admin:admin \
#   -T -

LLM Stack

Open WebUI

Open WebUI - платформа для самостоятельного размещения AI (веб-интерфейс для LLM), предназначенная для работы в полностью автономном режиме. Она поддерживает различные среды выполнения LLM, такие как Ollama и совместимые с OpenAI API.

services:
  # ollama:
  #   image: ollama/ollama:latest
  #   container_name: ollama
  #   restart: unless-stopped
  #   tty: true
  #   # ports:
  #   #   - 12345:12345
  #   volumes:
  #     - ./ollama_data:/root/.ollama

  # docker exec -it ollama bash
  # ollama pull deepseek-r1:8b
  # ollama list
  # ollama run deepseek-r1:8b

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    ports:
      - 2025:8080
    environment:
      - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
      - OLLAMA_BASE_URL=${OLLAMA_BASE_URL}
      - OPENAI_API_BASE_URL=${OPENAI_API_BASE_URL}
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - CORS_ALLOW_ORIGIN=${CORS_ALLOW_ORIGIN}
      - FORWARDED_ALLOW_IPS=${FORWARDED_ALLOW_IPS}
      - SCARF_NO_ANALYTICS=${SCARF_NO_ANALYTICS}
      - DO_NOT_TRACK=${DO_NOT_TRACK}
      - ANONYMIZED_TELEMETRY=${ANONYMIZED_TELEMETRY}
    extra_hosts:
      - host.docker.internal:host-gateway
    volumes:
      - ./open_webui_data:/app/backend/data
    # depends_on:
    #   - ollama

env:

WEBUI_SECRET_KEY=OpenWebUiAdmin

OLLAMA_BASE_URL=http://ollama:11434

OPENAI_API_BASE_URL=http://192.168.3.100:12345/v1 # LM Studio
OPENAI_API_KEY=

FORWARDED_ALLOW_IPS=*
CORS_ALLOW_ORIGIN=*

SCARF_NO_ANALYTICS=true
DO_NOT_TRACK=true
ANONYMIZED_TELEMETRY=false

NextChat

NextChat (ранее ChatGPT-Next-Web) - веб-интерфейс для ChatGPT, Gemini и других AI совместимсых с OpenAI API.

services:
  nextchat:
    container_name: nextchat
    image: yidadaa/chatgpt-next-web
    ports:
      - 3000:3000
    environment:
      - CODE=$CODE
      - BASE_URL=$BASE_URL
      - OPENAI_API_KEY=$OPENAI_API_KEY
      - DEFAULT_MODEL=$DEFAULT_MODEL
      - CUSTOM_MODELS=$CUSTOM_MODELS
      - HIDE_USER_API_KEY=$HIDE_USER_API_KEY
      - ENABLE_BALANCE_QUERY=$ENABLE_BALANCE_QUERY

env:

CODE=NextChatAdmin

BASE_URL=http://192.168.3.100:12345 # LM Studio
OPENAI_API_KEY=
DEFAULT_MODEL=qwen/qwen3-8b
CUSTOM_MODELS=

HIDE_USER_API_KEY=1     # отключить использование пользовательского API ключа
ENABLE_BALANCE_QUERY=1  # отключить возможность запрашивать баланс для пользователей

OPENAI_ORG_ID=
DISABLE_GPT4=
PROXY_URL=
ENABLE_MCP=
DISABLE_FAST_LINK=
GOOGLE_URL=
GOOGLE_API_KEY=
DEEPSEEK_API_KEY=
ANTHROPIC_URL=
ANTHROPIC_API_KEY=
ANTHROPIC_API_VERSION=
SILICONFLOW_URL=
SILICONFLOW_API_KEY=
AI302_API_KEY=
AI302_URL=
WHITE_WEBDAV_ENDPOINTS=

Continue

Continue - интеграция AI-агентов для выполнения рефакторинга во время написания кода в IDE.

🔗 Continue VSCode Extension

{
  "models": [
    {
      "apiBase": "http://192.168.3.100:12345/v1/",
      "model": "qwen/qwen3-8b",
      "title": "LM Studio (QWEN 3 8B)",
      "provider": "lmstudio",
      "apiKey": "123"
    }
  ],
  "tabAutocompleteModel": [
    {
      "apiBase": "http://192.168.3.100:12345/v1/",
      "model": "qwen/qwen3-8b",
      "title": "LM Studio (QWEN 3 8B)",
      "provider": "lmstudio",
      "apiKey": "123"
    }
  ]
}

API Stack

Scalar

Scalar - интерактивный справочник для документации OpenAPI (like Swagger UI) и REST API клиент в одном веб-приложение.

🔗 API Reference Demo

🔗 API Client Demo

services:
  scalar:
    image: scalarapi/api-reference:latest
    container_name: scalar
    restart: unless-stopped
    ports:
      - 4005:8080
    environment:
      API_REFERENCE_CONFIG: |
        {
          "theme": "purple"
        }
    volumes:
      - ./docs:/docs:ro

Restfox

Restfox - легковесный и быстрый офлайн API-клиент (WebUI/Desktop) с поддержкой импорт коллекций из OpenAPI и экспорт в Postman и Insomnia.

🔗 Restfox API Client Demo

🔗 Restfox Desktop Client

services:
  restfox:
    image: flawiddsouza/restfox:latest
    container_name: restfox
    restart: unless-stopped
    ports:
      - 4004:4004

Yaade

Yaade — это среда совместной разработки API, размещаемая на собственном сервере (еще один API клиент с веб-интерфейсом).

services:
  yaade:
    image: esperotech/yaade:latest 
    container_name: yaade
    restart: unless-stopped
    ports:
      - 9339:9339
    environment:
      - YAADE_ADMIN_USERNAME=admin
      - YAADE_ADMIN_PASSWORD=password
    volumes:
      - ./yaade_data:/app/data

🔗 Hoppscotch API Client Demo

🔗 HTTPie API Client Demo

🔗 Postman Collections to OpenAPI Docs

HTTPBin

go-httpbin - API сервер клиент для тестирования HTTP запросов и ответов (fork httpbin от Postman Labs).

🔗 HTTPBin Demo

🔗 HTTPBin Go Demo

services:
  httpbin:
    image: ghcr.io/mccutchen/go-httpbin
    container_name: httpbin
    restart: unless-stopped
    ports:
      - 8888:8080

Swagger UI

Swagger UI - браузер для спецификации OpenAPI (поддерживает загрузку любой переданной спецификации через url).

🔗 Swagger UI Demo

🔗 Swagger Viewer VSCode Extension

services:
  swagger-ui:
    image: docker.swagger.io/swaggerapi/swagger-ui
    container_name: swagger-ui
    restart: unless-stopped
    ports:
      - 8889:8080
    environment:
      - PORT=8080
      - SWAGGER_JSON=/app/swagger.json
      - SWAGGER_JSON_URL=
      - API_KEY=**None**
    volumes:
      - ./docs/httpbin.json:/app/swagger.json:ro
    depends_on:
      - httpbin

Swagger Editor

Swagger Editor - онлайн редактор документации OpenAPI с поддержкой генерации клентов и заглушек API для разных языков с помощью codegen.

🔗 Swagger Editor Demo

services:
  swagger-editor:
    image: docker.swagger.io/swaggerapi/swagger-editor
    container_name: swagger-editor
    restart: unless-stopped
    ports:
      - 8890:8080
    environment:
      - PORT=8080
      - BASE_URL=/
      - URL=http://192.168.3.101:8889/swagger.json
    depends_on:
      - httpbin

Mitm Proxy

Mitm Proxy - прямой (forward) прокси сервер для перехвата и изменения HTTP-трафика с веб-интерфейсом для анализа запросов и ответов (like Fiddler), удобно для отладки мобильных приложений.

services:
  mitmproxy:
    image: mitmproxy/mitmproxy:latest
    container_name: mitmproxy
    restart: unless-stopped
    ports:
      - 8880:8080 # Proxy
      - 8881:8081 # Web UI
    command: mitmweb --web-host 0.0.0.0 --listen-host 0.0.0.0

Step CI

Step CI - инструмент командной строки для тестирования GraphQL, gRPC, SOAP и REST API в DevOps Pipelines (например, локально в консоли или в GitHub Actions)

🔗 Step CI Demo

services:
  step-ci:
    image: ghcr.io/stepci/stepci
    container_name: step-ci
    volumes:
      - ./step-ci-tests:/tests
    command: tests/httpbin.yml

Network Stack

Networking Toolbox

Networking Toolbox - более 100 сетевых инструментов и утилит, предназначенных для работы в автономном режиме (от создателя web-check, dashy и AdGuardian-Term).

🔗 Networking Toolbox Demo

services:
  networking-toolbox:
    image: lissy93/networking-toolbox:latest
    container_name: networking-toolbox
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - PORT=3000
      - HOST=0.0.0.0
    ports:
      - 3100:3000
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/health"]
      start_period: 40s
      interval: 30s
      timeout: 10s
      retries: 3

Web Check

Web Check - универсальный инструмент OSINT для анализа любого веб-сайта.

🔗 Web Check Demo

services:
  web-check:
    image: lissy93/web-check:latest
    container_name: web-check
    restart: unless-stopped
    ports:
      - 3101:3000

IP Check

IP Check / MyIP - набор инструментов для проверки IP-адресов. Включаем в себя проверки DNS, соединения WebRTC, speedtest, ICMP, MTR, доступность веб-сайтов и другие возможности.

🔗 IP Check Demo

services:
  ip-check:
    container_name: ip-check
    image: jason5ng32/myip:latest
    restart: unless-stopped
    stdin_open: true
    tty: true
    ports:
      - 3102:18966

ZoneMaster

ZoneMaster - веб-интерфейс, API и инструмент командной строки для проверки DNS.

docker run -t --rm zonemaster/cli zonemaster.net

🔗 ZoneMaster Test Domains Demo

Check Host - бесплатный онлайн инструмент и API для ICMP, HTTP/HTTPS, TCP, UDP и DNS проверок доступности узлов из разных стран.

Looking.House - инструмент для проверки скорости загрузки и выгрузки (а также проверок ping, traceroute и mtr) из множества точек Looking Glass, расположенных в ДЦ по всему миру.

NetAlertX

NetAlertX - сканер присутствия и обнаружения в локальной или WiFi сети с отправкой оповещений, например, в Telegram.

services:
  netalertx:
    image: ghcr.io/jokob-sk/netalertx:latest
    container_name: netalertx
    restart: unless-stopped
    environment:
      - PUID=200
      - PGID=300
      - TZ=Etc/GMT+3
      - PORT=20211
    network_mode: host
    volumes:
      - ./netalertx_config:/app/config
      - ./netalertx_db:/app/db
    tmpfs:
      - /app/api

Apprise

Apprise - система для отправки уведомления более чем в 100+ служб, с поддержкой веб интерфейса для настройки конфигураций (используется в NetAlertX для отправки уведомлений в Telegram).

services:
  apprise:
    image: caronc/apprise:latest
    container_name: apprise
    restart: unless-stopped
    ports:
      - 8000:8000
    volumes:
      - ./apprise_config:/config

RTSP to Web

RTSP to Web - RTSP клиент в браузере.

services:
  rtsptoweb:
    image: ghcr.io/deepch/rtsptoweb:latest
    container_name: rtsp-to-web
    restart: unless-stopped
    # volumes:
    #   - ./rtsp_config/config.json:/config/config.json
    ports:
      - 8083:8083

Gatus

Gatus - современная и ориентированная на разработчиков (IaC подход для управления через конфигурацию) панель мониторинга состояние API и веб-сервисов с помощью HTTP, ICMP, TCP и DNS-запросов, с проверкой результатов тестирования в запросах (используются списки условий, проверка кода ответа, времени ответа, срок действия сертификата, тела запроса, парсинг json и другие функции). Поддерживает экспорт метрик Prometheus и динамическая панель инструментов Grafana.

🔗 Gatus Demo

В демо-версии присутствует интерфейс для настройки и проверки мониторинга (без экспорта в формате конфигурации).

services:
  gatus:
    image: twinproduction/gatus:latest
    container_name: gatus
    restart: unless-stopped
    volumes:
      - ./config:/config  # yaml configuration
      - ./data:/data      # SQLite
    ports:
      - 8180:8080
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080"]
      interval: 10s
      timeout: 5s
      retries: 3

Uptime Kuma

Uptime Kuma - простой в использовании инструмент для мониторинга веб-приложений с помощью веб-интерфейса.

Uptime Kuma API - Swagger документация для Uptime Kuma API.

🔗 Uptime Kuma Demo

services:
  uptime-kuma:
    image: louislam/uptime-kuma:latest
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - 3001:3001
    volumes:
      - ./kuma_data:/app/data

  uptime-kuma-api:
    image: medaziz11/uptimekuma_restapi
    container_name: uptime-kuma-api
    restart: unless-stopped
    environment:
      - KUMA_SERVER=http://uptime-kuma:3001
      - KUMA_USERNAME=admin
      - KUMA_PASSWORD=KumaAdmin
      - ADMIN_PASSWORD=KumaApiAdmin
    ports:
      - 3002:8000
    volumes:
      - ./kuma_api:/db
    depends_on:
      - uptime-kuma

  # uptime-robot:
  #   image: overclockedllama/uptimerobot
  #   container_name: uptime-robot
  #   restart: unless-stopped
  #   environment: 
  #     - PORT=3000
  #     - LOG_LEVEL=info
  #     - CRON_TIME=*/1 * * * *
  #     - UPTIME_ROBOT_API=
  #     - UPTIME_ROBOT_NAME_PATTERN=%name
  #     - WEBSITE_TITLE=
  #     - WEBSITE_COPYRIGHT=
  #   ports: 
  #     - 3003:3000
  #   volumes: 
  #     - ./uptimerobot_config:/app/config

StatPing

StatPing - страница статуса для проверки доступности веб-сайтов с настройкой в веб-интерфейсе, автоматическим построением графиков и оповещениями в Telegram.

🔗 StatPing Android

services:
  statping:
    image: statping/statping:latest
    container_name: statping
    restart: unless-stopped
    volumes:
      - ./unless-stopped_data:/app
    ports:
      - 8001:8080
    # environment:
    #   VIRTUAL_HOST: localhost
    #   VIRTUAL_PORT: 8080
    #   DB_CONN: statping-postgres
    #   DB_HOST: statping-postgres
    #   DB_DATABASE: statping
    #   DB_USER: statping
    #   DB_PASS: statping

SmokePing

SmokePing - система регистрации, построения графиков и оповещения о задержках, которая состоит из демона для организации измерения задержек и CGI-интерфейса для отображения графиков.

🔗 SmokePing Demo

services:
  smokeping:
    image: lscr.io/linuxserver/smokeping:latest
    container_name: smokeping
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - MASTER_URL=https://smokeping.docker.local/smokeping/
      - SHARED_SECRET=password
      - CACHE_DIR=/tmp
    volumes:
      - ./smokeping_conf:/config
      - ./smokeping_data:/data
    ports:
      - 8000:80

Pinguem

Pinguem - веб-интерфейс и экспортер Prometheus для асинхронной проверки доступности выбранных хостов или подсетей с использованием библиотеки node-ping.

services:
  pinguem:
    image: lifailon/pinguem:latest
    container_name: pinguem
    restart: unless-stopped
    ports:
      - 8085:8085 # Fronend (WebUI)
      - 3005:3005 # Backend (API)

LibreSpeedTest

LibreSpeedTest - сервер измерения скорости сети в Интернете на базе HTML5 для размещения на собственном сервере, с поддержкой мобильных устройств.

🔗 LibreSpeedTest Demo

services:
  libre-speedtest:
    image: lscr.io/linuxserver/librespeed:latest
    container_name: libre-speedtest
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/GMT+3
      - PASSWORD=PASSWORD # пароль для базы данных результатов
      - CUSTOM_RESULTS=true # опционально, включить пользовательскую страницу результатов в /config/www/results/index.php
      # - DB_TYPE=sqlite # по умолчанию sqlite (доступно mysql и postgresql)
      # - DB_NAME=DB_NAME # опционально, имя базы данных (требуется для mysql и pgsql)
      # - DB_HOSTNAME=DB_HOSTNAME # опционально
      # - DB_USERNAME=DB_USERNAME # опционально
      # - DB_PASSWORD=DB_PASSWORD # опционально
      # - DB_PORT=DB_PORT # опционально
      # - IPINFO_APIKEY=ACCESS_TOKEN # опционально, токен доступа от ipinfo.io (требуется для подробной информации об ip)
    volumes:
      - ./librespeed/config:/config
    ports:
      - 8088:80

OpenSpeedTest

OpenSpeedTest - бесплатный веб-инструмент для оценки производительности сети на базе HTML5, написанный на чистом JavaScript и использующий только встроенные веб-API.

🔗 OpenSpeedTest Demo

services:
  open-speedtest:
    image: openspeedtest/latest:latest
    container_name: opens-peedtest
    restart: unless-stopped
    # environment:
    #   - ENABLE_LETSENCRYPT=True
    #   - DOMAIN_NAME=speedtest.domain.com
    #   - USER_EMAIL=name@domain.com
    ports:
      - 3000:3000
      - 3001:3001

SpeedTest Tracker

SpeedTest Tracker - самостоятельно размещаемое веб-приложение для отслеживания производительность и время безотказной работы Интернет-соединения с собственным веб-интерфейсом для визуализации графиков измерений.

# Generate app key: echo -n 'base64:'; openssl rand -base64 32;
# Default credentials: admin@example.com:password

services:
  speedtest-tracker:
    image: lscr.io/linuxserver/speedtest-tracker:latest
    container_name: speedtest-tracker
    restart: unless-stopped
    ports:
      - 8778:80
    # labels:
    #   - traefik.enable=true
    #   - traefik.http.routers.speedtest-tracker.rule=Host(`speedtest.docker.local`)
    #   - traefik.http.services.speedtest-tracker.loadbalancer.server.port=80
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - APP_KEY=base64:e6otzoFWjt0GoEOL/QlPQw2Xgm63OMU3lA5V4nLgXJ4=
      - APP_URL=http://192.168.3.101
      # - APP_URL=http://speedtest.docker.local
      - DB_CONNECTION=sqlite
      # - DB_CONNECTION=pgsql
      # - DB_HOST=speedtest-db
      # - DB_PORT=5432
      # - DB_DATABASE=speedtest_tracker
      # - DB_USERNAME=speedtest
      # - DB_PASSWORD=PgAdmin
    volumes:
      - ./speedtest_config:/config
      - ./ssl:/config/keys
    # depends_on:
    #   - speedtest-db

  # speedtest-db:
  #   image: postgres:17
  #   container_name: speedtest-db
  #   restart: unless-stopped
  #   # ports:
  #   #   - 5432:5432
  #   environment:
  #     - POSTGRES_DB=speedtest_tracker
  #     - POSTGRES_USER=speedtest
  #     - POSTGRES_PASSWORD=PgAdmin
  #   volumes:
  #     - ./speedtest_data:/var/lib/postgresql/data
  #   healthcheck:
  #     test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
  #     interval: 5s
  #     retries: 5
  #     timeout: 5s

MySpeed

MySpeed - веб-приложение от создателя Nexterm для автоматизации тестирования скорости Интернет-канала связи. Поддерживает сервера проверки скорости Ookla, LibreSpeed ​​и Cloudflare, настройку времени между тестами с помощью выражений Cron, отправку оповещений в Telegram, хранение результатов до 30 дней и метрики Prometheus.

services:
  myspeed:
    image: germannewsmaker/myspeed
    container_name: myspeed
    restart: unless-stopped
    volumes:
      - ./myspeed_data:/myspeed/data
    ports:
      - 5216:5216

SpeedTest Exporter

SpeedTest Exporter - экспортер Prometheus, написанный на Python с использованием официального интерфейса командной строки Ookla Speedtest.

🔗 Grafana Dashboard

services:
  speedtest-exporter:
    image: miguelndecarvalho/speedtest-exporter
    container_name: speedtest-exporter
    restart: unless-stopped
    # environment:
      # - SPEEDTEST_PORT=9798
      # - SPEEDTEST_SERVER=21110 
    ports:
      - 9798:9798

iperf

iperf - утилита командной строки (клиент-серверная архитектура) для проверки скорости загрузки и выгрузки в локальной сети.

services:
  iperf-server:
    image: alpine:latest
    container_name: iperf-server
    restart: unless-stopped
    command: >
      sh -c "
        apk add --no-cache iperf3 &&
        exec iperf3 -s -p $$PORT
      "
    environment:
      - PORT=5201
    ports:
      - 5201:5201

fail2ban

fail2ban - демон для блокировки хостов, вызывающих множественные ошибки аутентификации по ssh и веб-приложения, используя анализ логов.

services:
  fail2ban:
    image: lscr.io/linuxserver/fail2ban:latest
    container_name: fail2ban
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - NET_RAW
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - VERBOSITY=-vv
    volumes:
      - ./config:/config
      - /var/log:/var/log:ro
      # - $HOME/docker/filebrowser/log:/remotelogs/filebrowser:ro
      # - $HOME/docker/homeassistant/log:/remotelogs/homeassistant:ro
      # - $HOME/docker/vaultwarden/log:/remotelogs/vaultwarden:ro
      # - $HOME/docker/nextcloud/log:/remotelogs/nextcloud:ro

Dev Stack

IT Tools

IT Tools - большая коллекция утилит для разработчиков (криптография, конверторы, веб инструменты и многое другое).

🔗 IT Tools Demo

services:
  it-tools:
    image: corentinth/it-tools:latest
    container_name: it-tools
    restart: unless-stopped
    ports:
      - 6990:80

Transform

Transforms - универсальный веб-конвертер.

🔗 Transforms Demo

services:
  transform:
    image: lifailon/transform:amd64
    # build:
    #   context: .
    #   dockerfile: Dockerfile
    container_name: transform
    restart: unless-stopped
    ports:
      - 3090:3000

JSON Crack

JSON Crack - веб-приложение для визуализации JSON, YAML, XML и CSV в интерактивные графики.

🔗 JSON Crack Demo

🔗 JSON Crack VSCode Extension

services:
  jsoncrack:
    image: shokohsc/jsoncrack:latest
    container_name: jsoncrack
    restart: unless-stopped
    environment:
      - NODE_ENV=production
    # Доступ через Proxy по FQDN
    # ports:
    #   - 3080:8080
    labels:
      - traefik.enable=true

Markmap

Markmap - как JSON Crack для Markdown.

🔗 Markmap Demo

🔗 Markmap VSCode Extension

NexTerm

NexTerm - управление сервером в браузере с поддержкой 2FA для SSH (с поддержкой файлового браузера через SFTP), VNC и RDP, контейнерами Proxmox LXC, QEMU и развертывание приложений через Docker.

services:
  nexterm:
    image: germannewsmaker/nexterm:latest
    restart: unless-stopped
    container_name: nexterm
    environment:
      # head -c 32 /dev/urandom | base64 || openssl rand -base64 32
      # head -c 32 /dev/urandom | xxd -p -c 32 || openssl rand -hex 32
      - ENCRYPTION_KEY=9dbde894647845ab33e13a9334cdbadc5f8d22abe42df0b3daff431eec0df870
    ports:
      - 6989:6989
    volumes:
      - ./nexterm_data:/app/data

Code Server

Code Server - VSCode сервер в браузере.

services:
  code-server:
    image: linuxserver/code-server:latest
    container_name: code-server
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/GMT+3
      - PASSWORD=CodeServerAdmin
    volumes:
      - ./vscode_config:/config
      - $HOME:/home
    ports:
      - 9443:8443

Go Playground

Better Go Playground - улучшенная Go Playground на базе Monaco Editor и React.

🔗 Go Playground Demo

services:
  go-playground:
    image: x1unix/go-playground:latest
    container_name: go-playground
    restart: unless-stopped
    environment:
      - APP_CLEAN_INTERVAL=30m
    ports:
      - 9444:8000

Go Template Playground

Repeatit (Go Template Playground) - игровая площадка для проверки шаблонов GoLang. Поддерживает рендиринг текста и html шаблонов, функции spting и heml, а также ввод параметров шаблона в форматах yaml, json и toml.

🔗 Repeatit Demo

services:
  go-template-playground:
    image: ghcr.io/rytsh/repeatit:latest
    # image: lifailon/go-template-playground:latest # 0.5.5-amd64
    # build:
    #   context: .
    #   dockerfile: Dockerfile
    container_name: go-template-playground
    restart: unless-stopped
    stdin_open: true
    tty: true
    ports:
      - 9445:8080

D2 Playground

D2 Playground - игровая площадка для современного языка сценариев диаграмм, преобразующий текст в диаграммы.

🔗 D2 Playground Demo

🔗 D2 VSCode Extension

services:
  d2-playground:
    image: lifailon/d2-playground:latest
    # build:
    #   context: .
    #   dockerfile: Dockerfile
    container_name: d2-playground
    restart: unless-stopped
    ports:
      - 9089:9090

DrawIO

Draw.io (like MS Visio) - веб-версия бесплатного приложения для создания различных диаграмм, блок-схем и т.п.

🔗 Draw.io Demo

🔗 Draw.io VSCode Extension

services:
  draw.io:
    image: jgraph/drawio:latest
    container_name: draw.io
    restart: unless-stopped
    stdin_open: true
    tty: true
    ports:
      - 9447:8080

Database Stack

PostgreSQL - объектно-реляционная база данных (СУБД) с открытым исходным кодом.

services:
  postgresql:
    image: postgres
    container_name: postgresql
    restart: unless-stopped
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: dbname
      POSTGRES_USER: dbuser
      POSTGRES_PASSWORD: dbpass
    volumes:
      - ./postgresql_data:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready -U pgweb -h 127.0.0.1
      interval: 5s

PgWeb

PgWeb - веб-клиент для работы с СУБД PostgreSQL, который возможно запустить из одного бинарного файла, а также позволяет подключиться к БД напрямую или через SSH туннель.

services:
  postgresweb:
    container_name: postgresweb
    image: sosedoff/pgweb:latest
    build: .
    environment:
      PGWEB_DATABASE_URL: postgres://dbuser:dbpass@postgresql:5432/dbname?sslmode=disable
    ports:
      - 8081:8081
    healthcheck:
      test: ["CMD", "nc", "-vz", "127.0.0.1", "8081"]
      interval: 5s
    depends_on:
      postgresql:
        condition: service_healthy

PostgREST

PostgREST - полноценный RESTful API для управления базами данных PostgreSQL.

services:
  postgrest:
    image: postgrest/postgrest
    container_name: postgrest
    restart: unless-stopped
    ports:
      - 3000:3000
    environment:
      PGRST_DB_URI: postgres://dbuser:dbpass@postgresql:5432/dbname
      PGRST_OPENAPI_SERVER_PROXY_URI: http://127.0.0.1:3000
    depends_on:
      - postgresql

  swagger:
    image: swaggerapi/swagger-ui
    ports:
      - 3001:8080
    expose:
      - 8080
    environment:
      API_URL: http://localhost:3000/
    depends_on:
      - postgresql
      - postgrest

PostgreSUS

PostgreSUS - инструмент для резервного копирования, с поддержкой локального хранение бекапов, а также в Google Drive или S3 совместимом хранилища по расписанию с проверкой доступности (health check), визуализации в веб-интерфейсе и оповщениями в Telegram, Slack, Discord и другие системы.

services:
  postgresus:
    image: rostislavdugin/postgresus:latest
    container_name: postgresus
    restart: unless-stopped
    ports:
      - 4005:4005
    volumes:
      - ./postgresus-data:/postgresus-data
    depends_on:
      - postgresql

Patroni

Patroni - шаблон для обеспечения высокой доступности (HA) серверов баз данных PostgreSQL с помощью etcd, HashiCorp/Consul, Apache/ZooKeeper или Kubernetes.

services:
  haproxy:
    image: haproxy:latest
    container_name: haproxy
    restart: unless-stopped
    ports:
      - 5430:5430 # Write endpoint (master)
      - 5431:5431 # Read endpoint (replicas)
      - 7000:7000 # Stats dashboard
    networks:
      - patroni-net
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    depends_on:
      - patroni1
      - patroni2
      - patroni3

  # Patroni Node 1
  patroni1:
    image: postgres:17.2
    container_name: patroni1
    restart: unless-stopped
    environment:
      - PATRONI_NAME=patroni1
      - PATRONI_RAFT_SELF_ADDR=patroni1:2221
      - PATRONI_POSTGRESQL_DATA_DIR=/var/lib/postgresql/data
      - PATRONI_POSTGRESQL_CONNECT_ADDRESS=patroni1:5432
      - PATRONI_POSTGRESQL_LISTEN=0.0.0.0:5432
      - PATRONI_RESTAPI_CONNECT_ADDRESS=patroni1:8008
      - PATRONI_RESTAPI_LISTEN=0.0.0.0:8008
      - PATRONI_SCOPE=mycluster
      - PATRONI_SUPERUSER_USERNAME=postgres
      - PATRONI_SUPERUSER_PASSWORD=postgres
      - PATRONI_REPLICATION_USERNAME=replicator
      - PATRONI_REPLICATION_PASSWORD=replicatorpass
      - PATRONI_admin_PASSWORD=admin
    # ports:
    #   - 5432:5432
    #   - 8008:8008
    #   - 2221:2221
    networks:
      - patroni-net
    volumes:
      - ./patroni1_data:/var/lib/postgresql/data
      - ./patroni.yml:/etc/patroni.yml:ro
    command: patroni /etc/patroni.yml

  # Patroni Node 2
  patroni2:
    image: postgres:17.2
    container_name: patroni2
    restart: unless-stopped
    environment:
      - PATRONI_NAME=patroni2
      - PATRONI_RAFT_SELF_ADDR=patroni2:2222
      - PATRONI_POSTGRESQL_DATA_DIR=/var/lib/postgresql/data
      - PATRONI_POSTGRESQL_CONNECT_ADDRESS=patroni2:5432
      - PATRONI_POSTGRESQL_LISTEN=0.0.0.0:5432
      - PATRONI_RESTAPI_CONNECT_ADDRESS=patroni2:8008
      - PATRONI_RESTAPI_LISTEN=0.0.0.0:8008
      - PATRONI_SCOPE=mycluster
      - PATRONI_SUPERUSER_USERNAME=postgres
      - PATRONI_SUPERUSER_PASSWORD=postgres
      - PATRONI_REPLICATION_USERNAME=replicator
      - PATRONI_REPLICATION_PASSWORD=replicatorpass
      - PATRONI_admin_PASSWORD=admin
    # ports:
    #   - 5433:5432
    #   - 8009:8008
    #   - 2222:2222
    networks:
      - patroni-net
    volumes:
      - ./patroni2_data:/var/lib/postgresql/data
      - ./patroni.yml:/etc/patroni.yml:ro
    command: patroni /etc/patroni.yml

  # Patroni Node 3
  patroni3:
    image: postgres:17.2
    container_name: patroni3
    restart: unless-stopped
    environment:
      - PATRONI_NAME=patroni3
      - PATRONI_RAFT_SELF_ADDR=patroni3:2223
      - PATRONI_POSTGRESQL_DATA_DIR=/var/lib/postgresql/data
      - PATRONI_POSTGRESQL_CONNECT_ADDRESS=patroni3:5432
      - PATRONI_POSTGRESQL_LISTEN=0.0.0.0:5432
      - PATRONI_RESTAPI_CONNECT_ADDRESS=patroni3:8008
      - PATRONI_RESTAPI_LISTEN=0.0.0.0:8008
      - PATRONI_SCOPE=mycluster
      - PATRONI_SUPERUSER_USERNAME=postgres
      - PATRONI_SUPERUSER_PASSWORD=postgres
      - PATRONI_REPLICATION_USERNAME=replicator
      - PATRONI_REPLICATION_PASSWORD=replicatorpass
      - PATRONI_admin_PASSWORD=admin
    # ports:
    #   - 5434:5432
    #   - 8010:8008
    #   - 2223:2223
    networks:
      - patroni-net
    volumes:
      - ./patroni3_data:/var/lib/postgresql/data
      - ./patroni.yml:/etc/patroni.yml:ro
    command: patroni /etc/patroni.yml

networks:
  patroni-net:
    driver: bridge

Ivory

Ivory - инструмент для визуализации работы с кластерами Postgres, который представляет из себя веб-интерфейс управления кластером Patroni и конструктор запросов Postgres.

services:
  # Patroni Cluster Web Manager
  ivory:
    image: veegres/ivory:latest
    container_name: ivory
    restart: unless-stopped
    ports:
      - 7070:80

Backup Stack

Duplicati

Duplicati - клиент резервного копирования, который безопасно хранит зашифрованные, инкрементальные и сжатые резервные копии в облачных хранилищах и на удаленных файловых серверах (поддерживает SFTP, WebDAV, S3-совместимые, Google Cloud и другие системы хранения). Поддерживает плагины, например, отправку оповещений в Telegram.

services:
  duplicati:
    image: lscr.io/linuxserver/duplicati:latest
    container_name: duplicati
    restart: unless-stopped
    environment:
      - PUID=0
      - PGID=0
      - TZ=Etc/UTC+3
      - SETTINGS_ENCRYPTION_KEY=DuplicatiKey
      - DUPLICATI__WEBSERVICE_PASSWORD=DuplicatiAdmin
      - CLI_ARGS=
    volumes:
      - ./duplicati_config:/config
      - ./duplicati_backup:/backups
      - /home/lifailon/docker:/source:ro
      - ./duplicati_restore:/restore
    ports:
      - 8200:8200

Kopia

Kopia - кроссплатформенный инструмент резервного копирования для Windows, macOS и Linux с быстрым инкрементным резервным копированием, сквозным шифрованием на стороне клиента, сжатием и дедупликацией данных. Поддерживается Веб-интерфейс поверх cli в стиле отображения флагов для исполняемого файла.

services:
  kopia:
    image: kopia/kopia:latest
    container_name: kopia
    restart: unless-stopped
    ports:
      - 51515:51515
    command:
      - server
      - start
      - --disable-csrf-token-checks
      - --insecure
      - --address=0.0.0.0:51515
      - --server-username=admin
      - --server-password=KopiaAdmin
    environment:
      - KOPIA_PASSWORD=KopiaAdmin
      - USER=User
    volumes:
        - ./kopia_config:/app/config
        - ./kopia_cache:/app/cache
        - ./kopia_logs:/app/logs
        - ./kopia_backup:/repository
        - /home/lifailon/docker:/data:ro

Restic

Restic — это быстрая, эффективная и безопасная программа для резервного копирования, которая поддерживает хранение резервных копий на S3, SFTP, REST Server, Rclone как backend и других хранилищах.

Backrest — это веб-интерфейс для резервного копирования, построенное на основе Restic.

services:
  backrest:
    image: garethgeorge/backrest:latest
    container_name: backrest
    restart: unless-stopped
    hostname: backrest
    volumes:
      - ./backrest/data:/data
      - ./backrest/config:/config
      - ./backrest/cache:/cache
      - ./backrest/tmp:/tmp
      - ./backrest/rclone:/root/.config/rclone  # Mount for rclone config (needed when using rclone remotes)
      - /path/to/backup/data:/userdata          # Mount local paths to backup
      - /path/to/local/repos:/repos             # Mount local repos (optional for remote storage)
    environment:
      - BACKREST_DATA=/data
      - BACKREST_CONFIG=/config/config.json
      - XDG_CACHE_HOME=/cache
      - TMPDIR=/tmp
      - TZ=Etc/UTC+3
    ports:
      - 9898:9898

FS Stack

Samba

Samba - SMB/CIFS сервер для запуска в контейнере Docker, без конфигурации и с поддержкой корзины по умолчанию (директория .deleted в корне шары).

services:
  samba:
    image: dperson/samba
    container_name: samba
    restart: always
    volumes:
      - /home/lifailon/docker:/share
    ports:
      - 139:139
      - 445:445
    environment:
      - USERID=1000
      - GROUPID=1000
      - SAMBA_USER=admin
      - SAMBA_PASS=admin
    command: |
      -u "$${SAMBA_USER};$${SAMBA_PASS}"
      -s "docker;/share;yes;no;no;$${SAMBA_USER};$${SAMBA_USER}"
      -p

FileBrowser

FileBrowser - веб-интерфейс для управления файлами в указанном каталоге. Поддерживает управление пользователями, загрузку, удаление, просмотр и редактирование файлов.

services:
  # mkdir filebrowser_data filebrowser_conf && chown -R 1000:1000 filebrowser_data filebrowser_conf
  file-browser:
    image: filebrowser/filebrowser
    container_name: file-browser
    restart: unless-stopped
    user: 0:0
    volumes:
      - $HOME:/srv                    # root directory
      - ./filebrowser_data:/database  # filebrowser.db
      - ./filebrowser_conf:/config    # settings.json
    ports:
      - 8300:80

DuFS

DuFS - уникальный служебный файловый сервер, который поддерживает статическое обслуживание, загрузку, поиск и удаленное управление через API.

services:
  dufs:
    image: sigoden/dufs
    container_name: dufs
    restart: unless-stopped
    ports:
    - 5000:5000
    volumes:
    - $HOME:/data
    - ./config.yaml:/config.yaml
    command: /data -A # --config /config.yaml

Syncthing

Syncthing - программа для непрерывной синхронизации файлов между двумя или более компьютерами. Работает на основе Block Exchange Protocol (BEP) для обмена данными, который использует TLS-шифрование для безопасной передачи данных по протоколу TCP.

services:
  file-syncthing:
    image: syncthing/syncthing
    container_name: file-syncthing
    restart: unless-stopped
    network_mode: host
    # ports:
    #   - 8384:8384         # Web UI
    #   - 22000:22000/tcp   # TCP file transfers
    #   - 22000:22000/udp   # QUIC file transfers
    #   - 21027:21027/udp   # Receive local discovery broadcasts
    environment:
      - PUID=0
      - PGID=0
    volumes:
      - ./syncthing_data:/var/syncthing   # configs
      - $HOME/docker:/sync_data           # src sync data on server
      # - ./backup:/sync_data             # dst sync data on client (mkdir backup && chown -R 1000:1000 backup)
    healthcheck:
      test: curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1
      interval: 1m
      timeout: 10s
      retries: 3

h5ai

h5ai - современный интерфейс веб-сервера для файлового индексера. Визуально напоминается FTP сервер для удобного отображения и загрузки (например, его использует Libretro/RetroArch для публикации релизов).

services:
  h5ai:
    image: awesometic/h5ai
    container_name: h5ai
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/GMT+3
      - HTPASSWD=false
      - HTPASSWD_USER=admin
      - HTPASSWD_PW=admin
    volumes:
      - $HOME/docker:/h5ai    # public data
      - ./h5ai_conf:/config
    ports:
      - 8889:80

SFTPGo

SFTPGo - сервер SFTP, HTTP/S, FTP/S и WebDAV, с поддержкой объектное-совместимого S3 хранилища, Google Cloud Storage, файловой системы хранкения и другие SFTP-серверы.

services:
  sftpgo:
    image: drakkan/sftpgo:edge
    container_name: sftpgo
    restart: unless-stopped
    ports:
      - 2022:2022
      - 8088:8080

S3 Stack

MinIO

MinIO - высокопроизводительное, совместимое S3 решение для хранения объектов с встроенной системой высокой доступности (например, используется в Velero для хранения данных резервного копирования Kubernetes).

services:
  minio1:
    image: minio/minio
    container_name: minio1
    restart: unless-stopped
    hostname: minio1
    command: server http://minio1:9000/data http://minio2:9000/data --console-address ":9001"
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=MinioAdmin
    volumes:
      - ./minio1_data:/data
    ports:
      - 9000:9000 # API
      - 9001:9001 # WebUI

  minio2:
    image: minio/minio
    container_name: minio2
    restart: unless-stopped
    hostname: minio2  
    command: server http://minio1:9000/data http://minio2:9000/data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: MinioAdmin
    volumes:
      - ./minio2_data:/data
    ports:
      - 9002:9000
      - 9003:9001

s3fs

s3fs - инструмент для монтирования S3 совместимого хранилища на базе FUSE, позволяя управлять файлами и каталогами в локальной файловой системе.

services:
  s3fs:
    image: efrecon/s3fs:1.95
    container_name: velero_data
    restart: unless-stopped
    privileged: true
    stdin_open: true
    tty: true
    devices:
      - /dev/fuse
    cap_add:
      - SYS_ADMIN
    security_opt:
      - apparmor=unconfined
    environment:
      - AWS_S3_URL=http://minio1:9000
      - AWS_S3_BUCKET=velero
      - AWS_S3_ACCESS_KEY_ID=admin
      - AWS_S3_SECRET_ACCESS_KEY=MinioAdmin
      - S3FS_ARGS=use_path_request_style,allow_other
    volumes:
      - ./velero_data:/opt/s3fs/bucket:rshared 

Cloud Stack

NextCloud

NextCloud - кросплатфоренная и self-hosted облачная система хранения (fork ownCloud от 2016 года) с возможностью расширения за счет плагинов (поддерживает ВКС на базе Talk, Kanban на базе Deck и ряд других возможностей).

services:
  nextcloud:
    image: nextcloud
    container_name: nextcloud
    restart: unless-stopped
    environment:
      - POSTGRES_HOST=nextcloud-db
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      # - POSTGRES_PASSWORD=NextCloudAdmin
      - POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
      # - MYSQL_HOST=nextcloud-db
      # - MYSQL_DATABASE=nextcloud
      # - MYSQL_USER=nextcloud
      # - MYSQL_PASSWORD=NextCloudAdmin
    volumes:
      # - smb_volume_web:/var/www/html
      - ./nextcloud_data/web:/var/www/html
    ports:
      - 8866:80
    depends_on:
      - nextcloud-db

  nextcloud-db:
    image: postgres:15
    container_name: nextcloud-db
    restart: unless-stopped
    environment:
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      # - POSTGRES_PASSWORD=NextCloudAdmin
      - POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
    volumes:
      # - smb_volume_db:/var/lib/postgresql/data
      - ./nextcloud_data/db:/var/lib/postgresql/data
    secrets:
      - postgres_password

  # nextcloud-db:
  #   image: mariadb:10.6
  #   container_name: nextcloud-db
  #   restart: unless-stopped
  #   command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
  #   environment:
  #     - MYSQL_DATABASE=nextcloud
  #     - MYSQL_USER=nextcloud
  #     - MYSQL_PASSWORD=NextCloudAdmin
  #     - MYSQL_ROOT_PASSWORD=NextCloudAdmin
  #   volumes:
  #     - smb_volume_db:/var/lib/mysql

secrets:
  postgres_password:
    file: ./postgres_password

# volumes:
#   smb_volume_web:
#     driver_opts:
#       type: cifs
#       o: username=guest,password=,uid=1000,gid=1000
#       device: //192.168.3.100/docker-data/nextcloud/web

#   smb_volume_db:
#     driver_opts:
#       type: cifs
#       o: username=guest,password=,uid=1000,gid=1000
#       device: //192.168.3.100/docker-data/nextcloud/db

postgres_password:

NextCloudAdmin

ownCloud

ownCloud - прародитель NextCloud, основанный в 2010 году.

services:
  owncloud:
    image: owncloud/server:${OWNCLOUD_VERSION}
    container_name: owncloud_server
    restart: always
    ports:
      - ${HTTP_PORT}:8080
    depends_on:
      - mariadb
      - redis
    environment:
      - OWNCLOUD_DOMAIN=${OWNCLOUD_DOMAIN}
      - OWNCLOUD_TRUSTED_DOMAINS=${OWNCLOUD_TRUSTED_DOMAINS}
      - OWNCLOUD_DB_TYPE=mysql
      - OWNCLOUD_DB_NAME=owncloud
      - OWNCLOUD_DB_USERNAME=owncloud
      - OWNCLOUD_DB_PASSWORD=owncloud
      - OWNCLOUD_DB_HOST=mariadb
      - OWNCLOUD_ADMIN_USERNAME=${ADMIN_USERNAME}
      - OWNCLOUD_ADMIN_PASSWORD=${ADMIN_PASSWORD}
      - OWNCLOUD_MYSQL_UTF8MB4=true
      - OWNCLOUD_REDIS_ENABLED=true
      - OWNCLOUD_REDIS_HOST=redis
    healthcheck:
      test: ["CMD", "/usr/bin/healthcheck"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - files:/mnt/data

  mariadb:
    image: mariadb:10.11
    container_name: owncloud_mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=owncloud
      - MYSQL_USER=owncloud
      - MYSQL_PASSWORD=owncloud
      - MYSQL_DATABASE=owncloud
      - MARIADB_AUTO_UPGRADE=1
    command: ["--max-allowed-packet=128M", "--innodb-log-file-size=64M"]
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-u", "root", "--password=owncloud"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - mysql:/var/lib/mysql

  redis:
    image: redis:6
    container_name: owncloud_redis
    restart: always
    command: ["--databases", "1"]
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - redis:/data

volumes:
  files:
    driver: local
  mysql:
    driver: local
  redis:
    driver: local

env:

OWNCLOUD_VERSION=10.15
OWNCLOUD_DOMAIN=localhost:8080
OWNCLOUD_TRUSTED_DOMAINS=localhost
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin
HTTP_PORT=8080

DNS Stack

Technitium DNS Server

Technitium DNS Server - авторитетный, рекурсивный и кэширующий DNS-сервер, который можно использовать для самостоятельного хостинга DNS. Поддерживает кластеризацию (в 14 релизе от 08.11.2025), записи в формате wildcard для субдоменов, черные списки с автоматически обновлением из файлов и url (с поддержкой regex), браузер для управления кешем, API, встроенный DNS-клиент, магазин приложение и многое другое.

services:
  tech-dns-srv:
    image: technitium/dns-server:latest
    container_name: tech-dns-srv
    restart: always
    volumes:
      - ./dns_data:/etc/dns
    environment:
      - DNS_SERVER_DOMAIN=dns.docker.local                  # Основное доменное имя, используемое этим DNS-сервером для своей идентификации.
      - DNS_SERVER_FORWARDERS=1.1.1.1,8.8.8.8               # Список адресов пересылки, разделённых запятыми.
      - DNS_SERVER_BLOCK_LIST_URLS=https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
      # - DNS_SERVER_ADMIN_PASSWORD=password                # Пароль администратора веб-консоли DNS.
      # - DNS_SERVER_ADMIN_PASSWORD_FILE=password.txt       # Путь к файлу, содержащему текстовый пароль администратора веб-консоли DNS.
      # - DNS_SERVER_PREFER_IPV6=false                      # DNS-сервер будет использовать IPv6 для запросов, когда это возможно, если эта опция включена.
      # - DNS_SERVER_WEB_SERVICE_LOCAL_ADDRESSES=172.17.0.1,127.0.0.1 # Список IP-адресов сетевых интерфейсов, разделённых запятыми, запросы на которых должен прослушивать веб-сервис. Адрес «172.17.0.1» — это встроенный мост Docker. Если не указано иное, «[::]» используется по умолчанию. Примечание! Этот параметр следует использовать только в сетевом режиме «host».
      # - DNS_SERVER_WEB_SERVICE_HTTP_PORT=5380             # Номер порта TCP для веб-консоли DNS по протоколу HTTP.
      # - DNS_SERVER_WEB_SERVICE_HTTPS_PORT=53443           # Номер порта TCP для веб-консоли DNS по протоколу HTTPS.
      # - DNS_SERVER_WEB_SERVICE_ENABLE_HTTPS=false         # Включает HTTPS для веб-консоли DNS.
      # - DNS_SERVER_WEB_SERVICE_USE_SELF_SIGNED_CERT=false # Включает самоподписанный TLS-сертификат для веб-консоли DNS.
      # - DNS_SERVER_OPTIONAL_PROTOCOL_DNS_OVER_HTTP=false  # Включает использование дополнительного протокола DNS-сервера DNS-over-HTTP на TCP-порту 8053 с обратным прокси-сервером, завершающим TLS, например, nginx.
      # - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks  # Параметры рекурсии: Allow, Deny, AllowOnlyForPrivateNetworks, UseSpecifiedNetworkACL.
      # - DNS_SERVER_RECURSION_NETWORK_ACL=192.168.10.0/24  # Список IP-адресов или сетевых адресов, разделенных запятыми, для разрешения доступа. Добавьте символ «!» в начале, чтобы запретить доступ, например, «!192.168.10.0/24» запретит всю подсеть. Список ACL обрабатывается в том же порядке, в котором он указан. Если ни одна сеть не совпадает, политика по умолчанию запрещает все, кроме петлевой. Действительно только для параметра рекурсии `UseSpecifiedNetworkACL`.
      # - DNS_SERVER_RECURSION_DENIED_NETWORKS=1.1.1.0/24   # Список IP-адресов или сетевых адресов, разделенных запятыми, для запрета рекурсии. Действительно только для параметра рекурсии `UseSpecifiedNetworkACL`. Этот параметр устарел, вместо него следует использовать DNS_SERVER_RECURSION_NETWORK_ACL.
      # - DNS_SERVER_ENABLE_BLOCKING=false                  # Настраивает DNS-сервер на блокировку доменных имён с использованием заблокированной зоны и зоны списка заблокированных доменов.
      # - DNS_SERVER_ALLOW_TXT_BLOCKING_REPORT=false        # Указывает, должен ли DNS-сервер отвечать TXT-записями, содержащими отчёт о заблокированном домене, на запросы типа TXT.
      # - DNS_SERVER_FORWARDER_PROTOCOL=Tcp                 # Параметры протокола пересылки: Udp, TCP, Tls, HTTPS, HttpsJson.
      # - DNS_SERVER_LOG_USING_LOCAL_TIME=true              # Включите этот параметр, чтобы использовать локальное время вместо UTC для ведения журнала.
    # Использовать сеть хоста в режиме DHCP или при использование кластеризации для инициализации внешнего IP
    # network_mode: host
    ports:
      - 5380:5380/tcp       # Web UI HTTP
      # - 53443:53443/tcp   # Web UI HTTPS
      - 53:53/udp           # DNS UDP
      - 53:53/tcp           # DNS TCP
      # - 853:853/udp       # DNS-over-QUIC service
      # - 853:853/tcp       # DNS-over-TLS service
      # - 443:443/udp       # DNS-over-HTTPS service (HTTP/3)
      # - 443:443/tcp       # DNS-over-HTTPS service (HTTP/1.1, HTTP/2)
      # - 80:80/tcp         # DNS-over-HTTP service (use with reverse proxy or certbot certificate renewal)
      # - 8053:8053/tcp     # DNS-over-HTTP service (use with reverse proxy)
      # - 67:67/udp         # DHCP service
      # - 53443:53443/tcp   # Cluster
    # sysctls:
    #   - net.ipv4.ip_local_port_range=1024 65000

Pi-hole

Pi-hole - популярное и легковесное решение для блокировки рекламы (отображает график блокировок, автоматически обновляет списки и поддерживает простое API).

Pi-hole Exporter - экспортер метрик для Prometheus.

services:
  # DNS Server + AdBlock
  pihole-server:
    container_name: pihole-server
    image: pihole/pihole:latest
    restart: unless-stopped
    ports:
      # DNS
      - 53:53/tcp
      - 53:53/udp
      # HTTP
      - 8000:8000/tcp
      # HTTPS
      # - 4443:4443/tcp
      # DHCP
      # - 67:67/udp
    environment:
      - TZ=Etc/GMT+3
      - FTLCONF_webserver_api_password=PiHoleAdmin # или docker logs pihole-server | grep random
      - FTLCONF_dns_upstreams=8.8.8.8;1.1.1.1      # корневые DNS-сервера верхнего уровн (TLD), на которые пересылаются запросы
    volumes:
      - ./pihole_data:/etc/pihole
      # - ./pihole.toml:/etc/pihole/pihole.toml
      # - ./custom.list:/etc/pihole/hosts/custom.list
      # - ./hosts:/etc/hosts
    # Для использования DHCP сервера
    # cap_add:
    #   - NET_ADMIN
    # Пробросить хостовую сеть и использовать режим listeningMode = "LOCAL"
    network_mode: host

  # Prometheus metrics from pi-hole
  pihole-exporter:
    container_name: pihole-exporter
    image: ekofr/pihole-exporter:latest
    restart: unless-stopped
    environment:
      # - PIHOLE_HOSTNAME=pihole-server
      - PIHOLE_HOSTNAME=192.168.3.105 # если pihole-server в режиме network_mode: host, указать ip-адрес хоста (или localhost и тоже использовать network_mode: host)
      - PIHOLE_PROTOCOL=http
      - PIHOLE_PORT=8000
      - PIHOLE_PASSWORD=PiHoleAdmin
      - INTERVAL=90s
      - PORT=9617
    ports:
      - 9617:9617
    depends_on:
      - pihole-server

AdGuard Home

AdGuard Home - более современный блокировщик рекламы и отслеживания.

AdGuard Home Sync - синхронизирует конфигурацию AdGuardHome (DNS записи, клиенты, фильтры и общие настройки) с экземплярами реплик.

services:
  adguardhome-server:
    image: adguard/adguardhome
    container_name: adguardhome-server
    restart: unless-stopped
    volumes:
      - ./adguardhome_server_data:/opt/adguardhome/work
      - ./adguardhome_server_conf:/opt/adguardhome/conf
    ports:
      # DNS
      - "53:53/tcp"
      - "53:53/udp"
      # DHCP
      # - "67:67/udp"
      # - "68:68/udp"
      # Web
      - "80:80/tcp"
      - "443:443/tcp"
      - "443:443/udp"
      # Prometheus exporter
      - "3000:3000/tcp"
      # DNS over TLS
      # - "853:853/tcp"
      # DNS over QUIC⁠
      # - "784:784/udp"
      # - "853:853/udp"
      # - "8853:8853/udp"
      #  DNSCrypt⁠
      # - "5443:5443/tcp"
      # - "5443:5443/udp"

# Reset password by hash:
# sudo apt-get install apache2
# htpasswd -B -C 10 -n -b admin AdHuardHome
# sudo nano adguard_conf/AdGuardHome.yaml

  adguardhome-sync:
    image: ghcr.io/bakito/adguardhome-sync
    container_name: adguardhome-sync
    restart: unless-stopped
    command: run --config /config/adguardhome-sync.yaml
    volumes:
      - ./adguardhome-sync.yaml:/config/adguardhome-sync.yaml
    ports:
      - 8080:8080 # api + prometheus metrics

  # adguardhome-sync:
  #   image: lscr.io/linuxserver/adguardhome-sync:latest
  #   container_name: adguardhome-sync
  #   restart: unless-stopped
  #   environment:
  #     - PUID=1000
  #     - PGID=1000
  #     - TZ=Etc/UTC+3
  #     - CONFIGFILE=/config/adguardhome-sync.yaml
  #   volumes:
  #     - ./adguardhome-sync.yaml:/config/adguardhome-sync.yaml
  #   ports:
  #     - 8080:8080

AdGuardian-Term - TUI интерфейс для управления AdGuard.

docker run -it lissy93/adguardian

CoreDNS

CoreDNS сервер с встроенным плагином blocklist.

services:
  coredns-blocklist:
    container_name: coredns-blocklist
    image: lifailon/coredns-blocklist:latest
    build:
      context: .
      dockerfile: coredns/Dockerfile
    command: -conf /etc/coredns/Corefile
    user: 1000:1000
    volumes:
      - ./coredns:/etc/coredns
    environment:
      - GOMAXPROCS=1
    ports:
      - 53:53/udp # DNS listener
      - 9153:9153 # Prometheus metrics

PowerDNS

PowerDNS/PDNS - DNS сервер.

PowerDNS-Admin - веб-интерфейс для PowerDNS с расширенными функциями. Поддерживает управление прямыми и обратными зонами, контроль доступа в определенной зоне, управление пользователями (а также LDAP, OAuth и 2FA), ведение журнала активности, конфигурация службы PDNS и мониторинг статистики, предоставляет API для управления зонами и записями, а также другие функции.

services:
  powerdns-server:
    image: powerdns/pdns-auth-49:latest
    container_name: powerdns-server
    restart: unless-stopped
    environment:
      POWERDNS_launch: gsqlite3
      POWERDNS_gsqlite3_database: /var/lib/powerdns/pdns.sqlite
      POWERDNS_api: yes
      POWERDNS_api_key: power-dns-api-key
      POWERDNS_webserver: yes
      POWERDNS_webserver_address: 0.0.0.0
      POWERDNS_webserver_port: 8081
      POWERDNS_webserver_allow_from: 0.0.0.0/0,::/0
    ports:
      - 53:53/udp
      - 53:53/tcp
      - 8081:8081
    volumes:
      - ./powerdns_db_data:/var/lib/powerdns
    networks:
      - powerdns-network

  powerdns-admin:
    image: ngoduykhanh/powerdns-admin:latest
    container_name: powerdns-admin
    restart: unless-stopped
    environment:
      - PDNS_API_URL=http://powerdns-server:8081
      - PDNS_API_KEY=power-dns-api-key
      - PDNS_VERSION=4.9.0
    ports:
      - 9191:80
    volumes:
      - ./powerdns_admin_data:/var/lib/powerdns-admin
    networks:
      - powerdns-network
    depends_on:
      - powerdns-server

networks:
  powerdns-network:

Blocky

Blocky - быстрый и легкий DNS-прокси как блокировщик рекламы для локальной сети с множеством функций, поддерживает управление через встроенный RapiDoc.

services:
  blocky:
    image: spx01/blocky
    container_name: blocky
    restart: unless-stopped
    hostname: blocky-01
    ports:
      - 53:53/tcp
      - 53:53/udp
      - 4000:4000/tcp # RapiDoc
    environment:
      - TZ=Etc/GMT+3
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./config.yml:/app/config.yml:ro # Custom config

  blocky-swagger:
    image: docker.swagger.io/swaggerapi/swagger-ui
    container_name: blocky-swagger
    restart: unless-stopped
    ports:
      - 4001:8080
    environment:
      - SWAGGER_JSON_URL=blocky:4000/docs/openapi.yaml
    depends_on:
      - blocky

Gravity

Gravity - легковесное решение DNS, DHCP и TFTP сервера, использующее etcd для полной репликации, подходящее для малых и средних сетей. Поддерживает встроенную кластеризацию (HA), кеширование DNS, блокировку рекламы и метрики Prometheus, а также современный интерфейс с графиками.

services:
  gravity:
    image: ghcr.io/beryju/gravity:stable
    container_name: gravity
    restart: unless-stopped
    # Important for this to be static and unique
    hostname: gravity-01
    network_mode: host
    user: root
    volumes:
      - ./gravity_data:/data
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

GoAway

GoAway - легкий DNS-сервер, с блокировкой рекрамы и современным интерфейсом панели управления (like Pi-hole).

services:
  goaway:
    image: pommee/goaway:latest
    container_name: goaway
    restart: unless-stopped
    cap_add:
      - NET_BIND_SERVICE
      - NET_RAW
    volumes:
     - ./goaway_config:/app/config  # Custom settings.yaml configuration
     - ./goaway_data:/app/data      # Database
    environment:
      - DNS_PORT=53
      - WEBSITE_PORT=8080
      # - DOT_PORT=853
    ports:
      - 53/udp
      - 53/tcp
      - 8053:8080

Proxy Stack

Traefik

Traefik - обратный прокси сервер с поддержкой автоматического опредиления сервисов Docker, встроенным веб интерфейсом, метриками Prometheus и трассировкой OTLP.

services:
  traefik:
    image: traefik:v3
    container_name: traefik
    restart: always
    # Используем режим хоста для доступа к сети всех контейнеров 
    network_mode: host
    # ports:
    #   - 8080:8080   # Web UI
    #   - 80:80       # HTTP Proxy
    #   - 443:443     # HTTPS Proxy
    #   - 4318:4318   # Prometheus Metrics
    dns:
      - 127.0.0.1
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml
      - ./rules:/rules
      - /var/run/docker.sock:/var/run/docker.sock:ro
    healthcheck:
      test: wget -qO- http://127.0.0.1:8080/ping
      start_period: 10s
      interval: 30s
      timeout: 5s
      retries: 5
    labels:
      # Включаем маршрутизацию и определяем имя хоста
      - traefik.enable=true
      - traefik.http.routers.traefik.rule=Host(`traefik.docker.local`)
      # Указываем порт назначения в контейнере (если используется несколько портов)
      - traefik.http.services.traefik.loadbalancer.server.port=8080
      # Создаем базовую авторизацию
      - traefik.http.middlewares.basic-auth-traefik.basicauth.users=admin:$$2y$$05$$c0r5A6SCKX4R6FjuCgRqrufbIE5tmXw2sDPq1vZ8zNrrwNZIH9jgW # htpasswd -nbB admin admin
      # Включаем базовую авторизацию в маршрутизацию текущего сервиса
      - traefik.http.routers.traefik.middlewares=basic-auth-traefik
      # Настраиваем подключение к Authentik
      # - traefik.http.middlewares.authentik.forwardauth.address=http://192.168.3.101:9000/outpost.goauthentik.io/auth/traefik
      # - traefik.http.middlewares.authentik.forwardauth.trustForwardHeader=true
      # - traefik.http.middlewares.authentik.forwardauth.authResponseHeaders=X-authentik-username,X-authentik-groups,X-authentik-entitlements,X-authentik-email,X-authentik-name,X-authentik-uid,X-authentik-jwt,X-authentik-meta-jwks,X-authentik-meta-outpost,X-authentik-meta-provider,X-authentik-meta-app,X-authentik-meta-version
      # Включаем авторизацию через Authentik из провайдера Docker
      # - traefik.http.routers.traefik.middlewares=authentik@docker
      # Включаем авторизацию через Authentik из провайдера file
      # - traefik.http.routers.traefik.middlewares=authentik@file

  jaeger:
    image: jaegertracing/all-in-one:1.55
    container_name: jaeger
    restart: always
    ports:
      - 16686:16686 # UI
      - 4317:4317   # Collector

  tech-dns-srv:
    image: technitium/dns-server:latest
    container_name: tech-dns-srv
    restart: always
    volumes:
      - ./dns_data:/etc/dns
    environment:
      - DNS_SERVER_DOMAIN=dns.docker.local
      - DNS_SERVER_FORWARDERS=1.1.1.1,8.8.8.8
      - DNS_SERVER_BLOCK_LIST_URLS=https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
    network_mode: host
    # ports:
    #   - 5380:5380/tcp
    #   - 53:53/udp
    #   - 53:53/tcp
    #   - 53443:53443/tcp
    # sysctls:
    #   - net.ipv4.ip_local_port_range=1024 65000
    labels:
      - traefik.enable=true
      - traefik.http.routers.tech-dns-srv.rule=Host(`dns.docker.local`)
      - traefik.http.services.tech-dns-srv.loadbalancer.server.port=5380

Nginx Proxy & Docker Gen

Nginx Proxy - настраивает контейнер, работающий под управлением nginx и docker-gen (docker-gen генерирует конфигурации обратного прокси-сервера для nginx и перезагружает nginx при запуске и остановке контейнеров).

Docker Gen - генератор файлов, который визуализирует шаблоны с использованием метаданных контейнера Docker.

ACME Companion - используется для автоматической генерации сертификатов letsencrypt, для хостов, использующих переменную LETSENCRYPT_HOST.

Nginx Exporter - экспортер метрик для Prometheus.

services:
  # Proxy Server + docker-gen
  nginx-proxy:
    container_name: nginx-proxy
    image: nginxproxy/nginx-proxy
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx-status.conf:/etc/nginx/conf.d/status.conf # конфигурация для получения статуса с помощью nginx-exporter 
    ports:
      - 80:80
      - 443:443
    # Apply config to any container on the host (not limited to the current stack in compose)
    network_mode: host
    # labels:
    #   - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"

  # Prometheus metrics from nginx
  nginx-exporter:
    image: nginx/nginx-prometheus-exporter:latest
    container_name: nginx-exporter
    restart: unless-stopped
    command:
      - "--nginx.scrape-uri=http://localhost:80/status"
    ports:
      - "9113:9113"
    network_mode: host
    depends_on:
      - nginx-proxy

  # Автоматическая генерация сертификатов letsencrypt, для хостов, использующих переменную LETSENCRYPT_HOST
  # acme-companion:
  #   image: nginxproxy/acme-companion
  #   container_name: nginx-proxy-acme
  #   depends_on:
  #     - nginx-proxy
  #   volumes:
  #     - /var/run/docker.sock:/var/run/docker.sock:ro
  #     - ./certs:/etc/nginx/certs
  #     - ./html:/usr/share/nginx/html
  #     - ./acme.sh:/etc/acme.sh
  #   environment:
  #     - DEFAULT_EMAIL=mail@yourdomain.tld

Nginx Proxy Manager

Nginx Proxy Manager - веб-интерфейс для управления Nginx сервером в роли Proxy сервера.

services:
  nginx-proxy-db:
    image: postgres:latest
    container_name: nginx-proxy-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: "npm"
      POSTGRES_PASSWORD: "npm_password"
      POSTGRES_DB: "npm"
    volumes:
      - ./postgres:/var/lib/postgresql/data
    networks:
      - nginx-network

  nginx-proxy-manager:
    image: docker.io/jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      - 81:81         # Web interface
      - 80:80         # Forward HTTP
      - 443:443       # Forward HTTPS
    environment:
      - DB_POSTGRES_HOST=nginx-proxy-db
      - DB_POSTGRES_PORT=5432
      - DB_POSTGRES_USER=npm
      - DB_POSTGRES_PASSWORD=npm_password
      - DB_POSTGRES_NAME=npm
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - nginx-proxy-db
    networks:
      - nginx-network
    # Auth default for Web interface:
    # login: admin@example.com
    # pass: changeme

  nginx-exporter:
    image: nginx/nginx-prometheus-exporter:latest
    container_name: nginx-exporter
    restart: unless-stopped
    ports:
      - "9113:9113"
    command:
      - "--nginx.scrape-uri=http://nginx-proxy-manager:80/status"
    depends_on:
      - nginx-proxy-manager
    networks:
      - nginx-network

networks:
  nginx-network:
    driver: bridge

HAProxy

HAProxy - обратный прокси сервер и “умный” балансировщик нагрузки (поддерживает healthcheck для проверки доступности).

services:
  httpbin-proxy:
    image: haproxy:3.2.4-alpine
    container_name: httpbin-proxy
    restart: unless-stopped
    ports:
      - 8089:8080
      - 2376:2376
    volumes:
      - ./haproxy.cfg:/haproxy.cfg
    command:
      - haproxy
      - -f
      - /haproxy.cfg
      - -d
    environment:
      - STATS_USER=admin
      - STATS_PASS=admin
      - STATS_URI=/
      - METRICS_URI=/metrics

  httpbin-go:
    image: ghcr.io/mccutchen/go-httpbin
    container_name: httpbin-go
    restart: unless-stopped

GoDoxy

GoDoxy - обратный прокси-сервер для контейнеров Docker или Podman с веб-интерфейсов и агентами для быстрого доступа к веб-интерфейсам сервисов, управления контейнерами и конфигурациями прокси сервера, мониторинга доступности и ресурсов серверов и контейнеров.

🔗 GoDoxy Demo

services:
  godoxy-frontend:
    image: ghcr.io/yusing/godoxy-frontend:${TAG:-latest}
    container_name: godoxy-frontend
    restart: unless-stopped
    user: 0:0
    read_only: true
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - all
    tmpfs:
      - /app/.next/cache
    env_file: .env
    labels:
      proxy.aliases: godoxy
      proxy.godoxy.port: 3000
    network_mode: host
    # ports:
    #   - 3000:3000

  godoxy-proxy:
    image: ghcr.io/yusing/godoxy:${TAG:-latest}
    container_name: godoxy-proxy
    restart: unless-stopped
    user: 0:0
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - all
    cap_add:
      - NET_BIND_SERVICE
    # volumes:
    #   - ./config.yaml:/app/config/config.yaml
    #   - ./godoxy_data/logs:/app/logs
    #   - ./godoxy_data/error_pages:/app/error_pages:ro
    #   - ./godoxy_data/data:/app/data
    #   - ./godoxy_data/certs:/app/certs
    env_file: .env
    environment:
      - DOCKER_HOST=tcp://127.0.0.1:2375
    network_mode: host
    # ports:
    #   - 8888:8888 # API
    #   - 80:80     # Proxy HTTP
    #   - 443:443   # Proxy HTTPS

env:

GODOXY_FRONTEND_ALIASES=godoxy.docker.local
# API listening address
GODOXY_API_ADDR=127.0.0.1:8888
SOCKET_PROXY_LISTEN_ADDR=127.0.0.1:2375
DOCKER_SOCKET=/var/run/docker.sock
# DOCKER_SOCKET=/var/run/podman/podman.sock
# Proxy listening address
GODOXY_HTTP_ADDR=:80
GODOXY_HTTPS_ADDR=:443
GODOXY_HTTP3_ENABLED=true
GODOXY_DEBUG=false
TAG=latest
TZ=ETC/UTC+3
GODOXY_UID=0
GODOXY_GID=0
GODOXY_API_JWT_SECURE=true
# openssl rand -base64 32
GODOXY_API_JWT_SECRET=VlB4wAw96yiXpmzz1XF8VtWDB2CP0D8RK3fSxPV/zuw=
# API/WebUI user password login credentials (optional)
GODOXY_API_USER=admin
GODOXY_API_PASSWORD=admin
# OIDC Configuration (optional)
# GODOXY_OIDC_ISSUER_URL=https://accounts.google.com
# GODOXY_OIDC_CLIENT_ID=your-client-id
# GODOXY_OIDC_CLIENT_SECRET=your-client-secret
# GODOXY_OIDC_SCOPES=openid, profile, email, groups # you may also include `offline_access` if your Idp supports it (e.g. Authentik, Pocket ID)
# GODOXY_OIDC_ALLOWED_USERS=user1,user2
# GODOXY_OIDC_ALLOWED_GROUPS=group1,group2
# Metrics
GODOXY_METRICS_DISABLE_CPU=false
GODOXY_METRICS_DISABLE_MEMORY=false
GODOXY_METRICS_DISABLE_DISK=false
GODOXY_METRICS_DISABLE_NETWORK=false
GODOXY_METRICS_DISABLE_SENSORS=false

Pangolin

Pangolin — это обратный прокси-сервер с туннелированием, размещаемый на собственном сервере, с контролем доступа на основе личности и контекста, разработанный для легкого раскрытия и защиты приложений, работающих где угодно. Pangolin выступает в роли центрального узла и соединяет изолированные сети, даже находящиеся за строгими брандмауэрами, через зашифрованные туннели, обеспечивая легкий доступ к удаленным сервисам без открытия портов и использования VPN.

services:
  pangolin:
    image: fosrl/pangolin:1.4.0
    container_name: pangolin
    restart: unless-stopped
    volumes:
      - ./config:/app/config
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3001/api/v1/"]
      interval: "3s"
      timeout: "3s"
      retries: 15
 
  gerbil:
    image: fosrl/gerbil:1.0.0
    container_name: gerbil
    restart: unless-stopped
    command:
      - --reachableAt=http://gerbil:3003
      - --generateAndSaveKeyTo=/var/config/key
      - --remoteConfig=http://pangolin:3001/api/v1/gerbil/get-config
      - --reportBandwidthTo=http://pangolin:3001/api/v1/gerbil/receive-bandwidth
    volumes:
      - ./config/:/var/config
    ports:
      - 51820:51820/udp
      # Порты из traefik через network_mode
      - 443:443
      - 80:80
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    depends_on:
      pangolin:
        condition: service_healthy
 
  traefik:
    image: traefik:v3.3.3
    container_name: traefik
    restart: unless-stopped
    # Порты для сервиса gerbil
    network_mode: service:gerbil
    command:
      - --configFile=/etc/traefik/traefik_config.yml
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # - ./letsencrypt:/letsencrypt
    depends_on:
      pangolin:
        condition: service_healthy

networks:
  default:
    driver: bridge
    name: pangolin

Tiny Proxy

tinyproxy — легковесный прямой (forward) HTTP/HTTPS-прокси-сервер.

services:
  tinyproxy:
    image: vimagick/tinyproxy
    container_name: tinyproxy
    restart: unless-stopped
    ports:
      - 1080:8888
    volumes:
      - ./tinyproxy.conf:/etc/tinyproxy/tinyproxy.conf

Proxyfor

Proxyfor - прямой (forward) и обратный прокси сервер с TUI и Веб-интерфейсом от создателя dufs для отображения и фильтрации запросов и ответов.

services:
  proxyfor:
    image: sigoden/proxyfor
    container_name: proxyfor
    restart: unless-stopped
    volumes:
      - ~/.proxyfor:/.proxyfor
    # ports:
    #   - 1080:8080
    network_mode: host
    command: --listen 1080 --web

# Install Certificate Authority
# Linux
# sudo curl http://localhost:1080/__proxyfor__/certificate/proxyfor-ca-cert.pem -o /usr/local/share/ca-certificates/proxyfor.crt
# sudo update-ca-certificates
# Windows
# Invoke-RestMethod http://192.168.3.101:1080/__proxyfor__/certificate/proxyfor-ca-cert.cer -OutFile $HOME/Downloads/proxyfor-ca-cert.cer
# certutil -addstore root $HOME/Downloads/proxyfor-ca-cert.cer

Froxy

Froxy - кроссплатформенная утилита командной строки для реализации SOCKS, HTTP и обратного прокси сервера на базе .NET. Поддерживается протокол SOCKS5 для туннелирования TCP трафика и HTTP протокол для прямого (классического) проксирования любого HTTPS трафика (CONNECT запросы), а также TCP, UDP и HTTP/HTTPS протоколы для обратоного проксирования. Для переадресации веб-траффика через обратный прокси поддерживаются GET и POST запросы с передачей заголовков и тела запроса от клиента, что позволяет использовать API запросы и проходить авторизацию на сайтах (передача cookie).

services:
  tmdb_web:
    image: lifailon/froxy
    environment:
      SOCKS: "0"
      FORWARD: "0"
      LOCAL: "*:8001"
      REMOTE: "https://themoviedb.org"
      USER: "false"
      PASSWORD: "false"
    ports:
      - "8001:8001"

  tmdb_api:
    image: lifailon/froxy
    environment:
      SOCKS: "0"
      FORWARD: "0"
      LOCAL: "*:8002"
      REMOTE: "https://api.themoviedb.org"
      USER: "false"
      PASSWORD: "false"
    ports:
      - "8002:8002"

VRRP

KeepAlived

KeepAlived - используется для обеспечения высокой доступности (HA) за счет протокола VRRP (Virtual Router Redundancy Protocol), который поднимает один виртуальный IP-адрес для нескольких хостов с проверкой доступности и переключением адреса на другой хост в случае провального healthcheck. Чаще всего используется для отказоустойчивости балансировщиков нагрузки.

Образа контейнера на базе легковесного Alpine с использованием команд для установки и запуска keepalived.

services:
  keepalived:
    image: alpine:3.18
    container_name: keepalived
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - NET_BROADCAST
      - NET_RAW
    volumes:
      - ./keepalived.conf:/etc/keepalived/keepalived.conf:ro
    network_mode: host
    command: |
      sh -c "
        apk add --no-cache keepalived curl &&
        keepalived --dont-fork --log-console
      "

SSO

Authentik

Authentik - IDP (поставщик идентификации) и SSO (единая точка входа), который построен с безопасностью в центре каждого фрагмента кода, каждой функции, с акцентом на гибкость и универсальность.

services:
  authentik-postgres:
    image: docker.io/library/postgres:16-alpine
    container_name: authentik-postgres
    restart: unless-stopped
    env_file:
    - .env
    # ports:
    #   - 5432:5432
    volumes:
    - ./authentik_database:/var/lib/postgresql/data
    healthcheck:
      test:
      - CMD-SHELL
      - pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}
      interval: 30s
      retries: 5
      start_period: 20s
      timeout: 5s

  authentik-redis:
    image: docker.io/library/redis:alpine
    restart: unless-stopped
    container_name: authentik-redis
    command: --save 60 1 --loglevel warning
    # ports:
    #   - 6379:6379
    volumes:
    - ./redis_data:/data
    healthcheck:
      test:
      - CMD-SHELL
      - redis-cli ping | grep PONG
      interval: 30s
      retries: 5
      start_period: 20s
      timeout: 3s

  authentik-server:
    image: ghcr.io/goauthentik/server:2025.8.4
    restart: unless-stopped
    container_name: authentik-server
    command: server
    env_file:
    - .env
    ports:
    - 9000:9000
    - 9443:9443
    volumes:
    - ./authentik_media:/media
    - ./authentik_custom-templates:/templates
    depends_on:
      authentik-postgres:
        condition: service_healthy
      authentik-redis:
        condition: service_healthy

  authentik-worker:
    image: ghcr.io/goauthentik/server:2025.8.4
    restart: unless-stopped
    container_name: authentik-worker
    command: worker
    env_file:
    - .env
    user: root
    volumes:
    - ./authentik_media:/media
    - ./authentik_certs:/certs
    - ./authentik_custom-templates:/templates
    - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      authentik-postgres:
        condition: service_healthy
      authentik-redis:
        condition: service_healthy

# Go on http://authentik-server:9000/if/flow/initial-setup

env:

POSTGRES_DB=authentik
POSTGRES_USER=authentik
POSTGRES_PASSWORD=AuthentikAdmin

AUTHENTIK_POSTGRESQL__HOST=authentik-postgres
AUTHENTIK_POSTGRESQL__NAME=authentik
AUTHENTIK_POSTGRESQL__USER=authentik
AUTHENTIK_POSTGRESQL__PASSWORD=AuthentikAdmin
AUTHENTIK_REDIS__HOST=authentik-redis
AUTHENTIK_SECRET_KEY=J+fcRg0PtPRrILSeahxEtZwKGKM7irzJU15qp3ImG4XYoHyzsId5tnZjVoPs9XTnH5NwYaviRCVQZKSQ # openssl rand 60 | base64 -w 80

LDAP

LLDAP

LLDAP - облегченный сервер аутентификации (Light LDAP), предоставляющий продуманный и упрощенный интерфейс LDAP для аутентификации и современный интерфейс управления (интегрируется со многими бэкендами, от KeyCloak до Authelia, Nextcloud и другими).

services:
  lldap:
    image: lldap/lldap:stable
    ports:
      - 3890:3890   # LDAP
      - 6360:6360   # LDAPS (LDAP Over SSL)
      - 17170:17170 # Web front-end
    volumes:
      - ./lldap_data:/data
    environment:
      - UID=1000
      - GID=1000
      - TZ=Etc/UTC+3
      - LLDAP_JWT_SECRET=REPLACE_WITH_RANDOM
      - LLDAP_KEY_SEED=REPLACE_WITH_RANDOM
      - LLDAP_LDAP_BASE_DN=dc=docker,dc=local
      - LLDAP_LDAP_USER_PASS=LdapAdmin
      # If using LDAPS, set enabled true and configure cert and key path
      - LLDAP_LDAPS_OPTIONS__ENABLED=false
      # - LLDAP_LDAPS_OPTIONS__CERT_FILE=/path/to/certfile.crt
      # - LLDAP_LDAPS_OPTIONS__KEY_FILE=/path/to/keyfile.key
      # Database
      # - LLDAP_DATABASE_URL=mysql://mysql-user:password@mysql-server/my-database
      # - LLDAP_DATABASE_URL=postgres://postgres-user:password@postgres-server/my-database
      # SMTP
      # - LLDAP_SMTP_OPTIONS__ENABLE_PASSWORD_RESET=true
      # - LLDAP_SMTP_OPTIONS__SERVER=smtp.example.com
      # - LLDAP_SMTP_OPTIONS__PORT=465
      # - LLDAP_SMTP_OPTIONS__SMTP_ENCRYPTION=TLS
      # - LLDAP_SMTP_OPTIONS__USER=no-reply@example.com
      # - LLDAP_SMTP_OPTIONS__PASSWORD=PasswordGoesHere
      # - LLDAP_SMTP_OPTIONS__FROM=no-reply <no-reply@example.com>
      # - LLDAP_SMTP_OPTIONS__TO=admin <admin@example.com>

Glauth

Glauth - современный и молодой сервер аутентификации (Go-lang LDAP Authentication) с управлением через конфигурацию и поддержкой метрик Prometheus.

services:
  glauth:
    image: glauth/glauth:latest
    container_name: glauth
    restart: unless-stopped
    environment:
      - TZ=UTC
    ports:
      - 3893:3893    # LDAP port
      # - 3894:3894  # LDAPS port
      - 5555:5555    # API (Web UI and metrics for Prometheus)
    volumes:
      - ./glauth.cfg:/app/config/config.cfg

# sudo apt install ldap-utils
# ldapsearch -LLL -H ldap://localhost:3893 -D "cn=admin1,ou=admins,dc=docker,dc=local" -w LdapAdmin -b "dc=docker,dc=local" cn=admin2

OpenLDAP & phpLDAPadmin

OpenLDAP - реализация протокола Lightweight Directory Access Protocol с открытым исходным кодом. В состав входят LDAP-демон сервера (slapd) и автономный демон балансировки нагрузки LDAP (lloadd).

phpLDAPadmin - универсальный Веб-интерфейс для LDAP.

services:
  ldap-backend:
    image: osixia/openldap:latest
    container_name: openldap
    restart: unless-stopped
    environment:
      - LDAP_ORGANISATION=Docker Local
      - LDAP_DOMAIN=docker.local
      - LDAP_ADMIN_PASSWORD=LdapAdmin
    ports:
      - 1389:389
      - 1636:636
    volumes:
      - ./ldap_data:/var/lib/ldap
      - ./ldap_config:/etc/ldap/slapd.d
    # healthcheck:
    #   test: ["CMD", "ldapsearch", "-H", "ldap://localhost:1389", "-D", "cn=admin,dc=docker,dc=local", "-w", "LdapAdmin", "-b", "dc=docker,dc=local"]
    #   interval: 30s
    #   timeout: 10s
    #   retries: 3

  ldap-frontend:
    image: osixia/phpldapadmin:latest
    container_name: phpldapadmin
    restart: unless-stopped
    links:
      - ldap-backend:ldap-host
    environment:
      - PHPLDAPADMIN_LDAP_HOSTS=ldap-host
      - PHPLDAPADMIN_HTTPS=false
    ports:
      - 1443:443
    depends_on:
      - ldap-backend

  # ldap-ui:
  #   image: dnknth/ldap-ui
  #   container_name: ldap-ui
  #   restart: unless-stopped
  #   ports:
  #     - 5000:5000
  #   environment:
  #     - LDAP_URL=ldap://ldap-backend/
  #     - BASE_DN=dc=docker,dc=local
  #     - BIND_DN=cn=admin,dc=docker,dc=local
  #     - BIND_PASSWORD=LdapAdmin
  #   depends_on:
  #     - ldap-backend

# Web UI: https://localhost:6443
# Login DN: cn=admin,dc=docker,dc=local
# Password: LdapAdmin

# sudo apt install ldap-utils
# ldapsearch -LLL -H ldap://localhost:1389 -D "cn=admin,dc=docker,dc=local" -w LdapAdmin -b "dc=docker,dc=local"

# TUI LDAP Client: https://github.com/Macmod/godap
# brew install godap
# godap localhost -P 1389 -u "cn=admin,dc=docker,dc=local" -p "LdapAdmin" -r "dc=docker,dc=local"

OpenDJ & LDAP UI

OpenDJ - совместимая служба каталогов, разработанная для платформы Java и обеспечивающая высокопроизводительное, высокодоступное и безопасное хранилище для идентификационных данных.

LDAP UI - минималистичный Веб-интерфейс для каталогов LDAP.

services:
  ldap-server:
    image: openidentityplatform/opendj:latest
    container_name: opendj
    restart: unless-stopped
    hostname: ldap.docker.local
    stdin_open: true
    tty: true
    ports:
      - 1389:1389
      - 1636:1636
      - 4444:4444
    environment:
      - PORT=1389
      - LDAPS_PORT=1636
      - BASE_DN=dc=docker,dc=local
      - ROOT_USER_DN=cn=admin
      - ROOT_PASSWORD=LdapAdmin

  # ldap-admin:
  #   image: osixia/phpldapadmin:latest
  #   container_name: phpldapadmin
  #   restart: unless-stopped
  #   environment:
  #     - PHPLDAPADMIN_LDAP_HOSTS=ldap-server
  #     - PHPLDAPADMIN_HTTPS=false
  #   ports:
  #     - 1443:443
  #   depends_on:
  #     - ldap-server

  ldap-ui:
    image: dnknth/ldap-ui
    container_name: ldap-ui
    restart: unless-stopped
    ports:
      - 5000:5000
    environment:
      - LDAP_URL=ldap://ldap-server/
      - BASE_DN=dc=docker,dc=local
      - BIND_DN=cn=admin,dc=docker,dc=local
      - BIND_PASSWORD=LdapAdmin
    depends_on:
      - ldap-server

# sudo apt install ldap-utils
# ldapsearch -LLL -H ldap://localhost:1389 -D "cn=admin,dc=docker,dc=local" -w LdapAdmin -b "dc=docker,dc=local"

Docker Stack

Dockge

Dockge - веб-интерфейс для управления стеками Docker Compose от создателя Uptime-Kuma.

services:
  # Web interface for Docker Compose
  dockge:
    image: louislam/dockge:1
    container_name: dockge
    restart: always
    volumes:
      - ./dockge_data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock
      # Docker stacks directory on host:container
      - /home/lifailon/docker:/home/lifailon/docker
    # Enable routing for traffic
    # labels:
    #   - traefik.enable=true
    environment:
      # Enable routing for docker-gen
      # - VIRTUAL_HOST=dockge.local
      - DOCKGE_STACKS_DIR=/home/lifailon/docker
      # Доступ к консоли dockge
      - DOCKGE_ENABLE_CONSOLE=true
    ports:
      - 5001:5001

Komodo

Komodo - система для управления и мониторинга контейнеров Docker и стеков Compose.

🔗 Komodo Demo

services:
  mongo:
    image: mongo
    container_name: komodo-db
    restart: unless-stopped
    command: --quiet --wiredTigerCacheSizeGB 0.25
    labels:
      komodo.skip: StopAllContainers
    # ports:
    #   - 27017:27017
    volumes:
      - ./mongo_data:/data/db
      - ./mongo_config:/data/configdb
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${KOMODO_DB_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${KOMODO_DB_PASSWORD}
  
  core:
    image: ghcr.io/moghtech/komodo-core:latest
    container_name: komodo-core
    restart: unless-stopped
    labels:
      komodo.skip: StopAllContainers
    ports:
      - 9120:9120
    env_file: .env
    environment:
      KOMODO_DATABASE_ADDRESS: mongo:27017
      KOMODO_DATABASE_USERNAME: ${KOMODO_DB_USERNAME}
      KOMODO_DATABASE_PASSWORD: ${KOMODO_DB_PASSWORD}
    volumes:
      - ./backups:/backups
      ## Store sync files on server
      # - /path/to/syncs:/syncs
      ## Optionally mount a custom core.config.toml
      # - /path/to/core.config.toml:/config/config.toml
    depends_on:
      - mongo

  ## Deploy Periphery container using this block,
  ## or deploy the Periphery binary with systemd using 
  ## https://github.com/moghtech/komodo/tree/main/scripts
  periphery:
    image: ghcr.io/moghtech/komodo-periphery:latest
    container_name: komodo-periphery
    restart: unless-stopped
    labels:
      komodo.skip: StopAllContainers
    env_file: .env
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /proc:/proc
      - /home/lifailon/docker:/etc/komodo/stacks

env:

KOMODO_DB_USERNAME=admin
KOMODO_DB_PASSWORD=admin

TZ=Etc/UTC+3

# Используется для Oauth / предложения URL-адреса Webhook / обратного прокси-сервера Caddy
KOMODO_HOST=https://demo.komo.do
# Отображается во вкладке браузера
KOMODO_TITLE=Komodo
KOMODO_FIRST_SERVER=https://periphery:8120
# Дайте первому серверу индивидуальное имя
KOMODO_FIRST_SERVER_NAME=Local
# Сделать так, чтобы все кнопки вызывали только двойной щелчок, а не полное диалоговое окно подтверждения
KOMODO_DISABLE_CONFIRM_DIALOG=false

# Оценить, как Komodo опрашивает ваши серверы на предмет статуса / статуса контейнера / системной статистики / оповещений
# Параметры: 1-sec, 5-sec, 15-sec, 1-min, 5-min, 15-min (default: 15-sec)
KOMODO_MONITORING_INTERVAL="15-sec"
# Интервал опроса ресурсов на предмет обновлений / автоматизированных действий
# Параметры: 15-min, 1-hr, 2-hr, 6-hr, 12-hr, 1-day (default: 1-hr)
KOMODO_RESOURCE_POLL_INTERVAL="1-hr"

# Used to auth incoming webhooks. Alt: KOMODO_WEBHOOK_SECRET_FILE
KOMODO_WEBHOOK_SECRET=a_random_secret
# Used to generate jwt. Alt: KOMODO_JWT_SECRET_FILE
KOMODO_JWT_SECRET=a_random_jwt_secret
# Time to live for jwt tokens (options: 1-hr, 12-hr, 1-day, 3-day, 1-wk, 2-wk)
KOMODO_JWT_TTL="1-day"

# Включить вход с именем пользователя и паролем
KOMODO_LOCAL_AUTH=true
KOMODO_INIT_ADMIN_USERNAME=admin
KOMODO_INIT_ADMIN_PASSWORD=admin
# Отключить регистрацию новых пользователей
KOMODO_DISABLE_USER_REGISTRATION=false
# Все новые логины включаются автоматически
KOMODO_ENABLE_NEW_USERS=false
# Запретить НЕ администраторам создавать новые ресурсы
KOMODO_DISABLE_NON_ADMIN_CREATE=false
# Позволяет всем пользователям иметь доступ на чтение ко всем ресурсам
KOMODO_TRANSPARENT_MODE=false

# Более красивое ведение журнала с пустыми строками между журналами
KOMODO_LOGGING_PRETTY=false
# Более удобное для восприятия человеком протоколирование конфигурации запуска (многострочное)
KOMODO_PRETTY_STARTUP_CONFIG=false

KOMODO_OIDC_ENABLED=false
KOMODO_GITHUB_OAUTH_ENABLED=false
KOMODO_GOOGLE_OAUTH_ENABLED=false
KOMODO_AWS_ACCESS_KEY_ID=
KOMODO_AWS_SECRET_ACCESS_KEY=

PERIPHERY_ROOT_DIRECTORY=/etc/komodo
# Путь к корневой директории стеков compose (default: ${PERIPHERY_ROOT_DIRECTORY}/stacks)
PERIPHERY_STACK_DIR=/etc/komodo/stacks
KOMODO_PASSKEY=a_random_passkey
PERIPHERY_PASSKEYS=${KOMODO_PASSKEY}
PERIPHERY_SSL_ENABLED=true
PERIPHERY_DISABLE_TERMINALS=false
PERIPHERY_INCLUDE_DISK_MOUNTS=/etc/hostname
PERIPHERY_LOGGING_PRETTY=false
PERIPHERY_PRETTY_STARTUP_CONFIG=false

1panel

1panel - веб-интерфейс для управления сервером на базе Linux, файлами, базами данных, контейнерами Docker и стеками Docker Compose.

services:
  1panel:
    image: moelin/1panel:latest
    container_name: 1panel
    restart: always
    ports:
      - 10086:10086 # http://1panel.docker.local/entrance 1panel:1panel_password
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
      # - /home/lifailon/docker:/etc/docker  # Docker Compose root directroy
      - /home/lifailon/docker:/opt/1panel/docker/compose  # Docker Compose root directroy
      - /opt:/opt
      # - /root:/root
    labels:
      createdBy: Apps

DockMan

DockMan - веб-интерфейс для управления контейнерами и файлами в стеках Docker Compose (like Dockge, но без форматирования).

services:
  dockman:
    container_name: dockman
    image: ghcr.io/ra341/dockman:latest
    restart: always
    environment:
      - DOCKMAN_MACHINE_ADDR=192.168.3.101
      - DOCKMAN_PORT=8866
      - DOCKMAN_COMPOSE_ROOT=/home/lifailon/docker
      - DOCKMAN_AUTH_ENABLE=true
      - DOCKMAN_AUTH_USERNAME=admin
      - DOCKMAN_AUTH_PASSWORD=admin
      - DOCKMAN_LOG_LEVEL=debug
      - DOCKMAN_LOG_VERBOSE=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      # Stack directory
      - /home/lifailon/docker:/home/lifailon/docker
      - ./dockman_config:/config
    ports:
      - 8866:8866

Docker Web Manager

Docker Web Manager - менеджер управления контекстами Docker (context manager) на базе fzf и веб-интерфейс для lazydocker и ctop на базе ttyd с поддержкой авторизации.

services:
  docker-web-manager:
    image: lifailon/docker-web-manager:latest
    container_name: docker-web-manager
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - $HOME/.ssh/id_rsa:/root/.ssh/id_rsa
    environment:
      - WEB_USERNAME=admin
      - WEB_PASSWORD=admin
      - SSH_HOSTS=localhost,192.168.3.105,192.168.3.106
      - SSH_USER=lifailon
      - SSH_PORT=2121
      - DOCKER_CLIENT=lazydocker
    ports:
      - 3333:3333

isaiah

isaiah - самостоятельный клон LazyDocker для веб-браузера.

services:
  isaiah:
    image: mosswill/isaiah:latest
    container_name: isaiah
    restart: unless-stopped
    ports:
      - "4444:80"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # - ./isaiah_hosts_list:/docker_hosts
      # local unix:///var/run/docker.sock
      # agent tcp://192.168.3.106:4382
    environment:
      SERVER_PORT: "80"
      AUTHENTICATION_SECRET: "secret"
      MULTI_HOST_ENABLED: "TRUE"

  isaiah-agent:
    image: mosswill/isaiah:latest
    container_name: isaiah-agent
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      SERVER_ROLE: "Agent"
      AUTHENTICATION_SECRET: "secret"
      MASTER_HOST: "192.168.3.105:4444"
      MASTER_SECRET: "secret"
      AGENT_NAME: "rpi-106"

DweebUI

DweebUI - веб-интерфейс для мониторинга ресурсов и управления контейнерамм, образами, томами и сетями, а также имеет встроенный магазин приложений (не работают логи и нет доступа к терминалу).

services:
  dweebui:
    image: lllllllillllllillll/dweebui:latest
    container_name: dweebui
    restart: always
    environment:
      - PORT=8000
      - SECRET=AdminSecret # for registration
    volumes:
      - ./dweebui_data:/app/config
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8000:8000

Dockpeek

Dockpeek — это веб-интерфейс для отображения статистики и обновления образов контейнеров Docker.

services:
  dockpeek:
    image: ghcr.io/dockpeek/dockpeek:latest
    container_name: dockpeek
    restart: always
    environment:
      - SECRET_KEY=AdminSecret
      - USERNAME=admin
      - PASSWORD=admin
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 3420:8000

Watchtower

Watchtower - система для обнаружения новых образов в реестре Docker, а также их автоматического обновления и перезапуска контейнера с отправкой уведомлений.

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: always
    command: --interval 600 --http-api-metrics --http-api-update
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_NOTIFICATIONS=shoutrrr
      - WATCHTOWER_NOTIFICATIONS_HOSTNAME=<HOST_NAME>
      - WATCHTOWER_NOTIFICATION_URL=telegram://<BOT_API_KEY>@telegram/?channels=<CHAT/CHANNEL_ID>
      - WATCHTOWER_HTTP_API_TOKEN=demotoken
    ports:
      - 8088:8080 # api

DIUN

DIUN (Docker Image Update Notifier) - система для получения уведомлений об обновлении образа Docker в реестре Docker.

services:
  diun:
    image: crazymax/diun:latest
    container_name: diun
    restart: always
    command: serve
    volumes:
      - ./diun_data:/data
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Etc/GMT+3
      - LOG_LEVEL=info
      - LOG_JSON=false
      - DIUN_WATCH_WORKERS=20
      - DIUN_WATCH_SCHEDULE=0 */6 * * *
      - DIUN_WATCH_JITTER=30s
      - DIUN_PROVIDERS_DOCKER=true
      - DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
      - DIUN_NOTIF_TELEGRAM_TOKEN=
      - DIUN_NOTIF_TELEGRAM_CHATIDS=
      # https://crazymax.dev/diun/faq/?h=entry#notification-template
      - DIUN_NOTIF_TELEGRAM_TEMPLATEBODY=Image {{ .Entry.Image }} in `{{ .Entry.Status }}` status
    labels:
      - diun.enable=true
    healthcheck:
      test: ["CMD", "diun", "notif", "test"]
      interval: 24h
      timeout: 10s
      retries: 1
      start_period: 30s

WUD

WUD (What’s up Docker) - веб-интерфейс для поиска обновлений и автоматизации выполнения действий (отправки оповещений, запуска обновления и т.п.).

services:
  wud:
    image: getwud/wud
    container_name: wud
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 5002:3000

Dozzle

Dozzle - веб интерфейс для просмотра, анализа и фильтрации (по stream, level, а также поиск с помощью regex и sql-запросов) логов контейнеров Docker или Kubernetes. Поддерживает подключение удаленных хостов с помощью агентов или сокета Docker (например, через прокси в ограниченном режиме доступа) и файловым журналам хостовой системы с помощью кастомного контейнера, а также управление контейнерами (запуск, остановка и доступ к терминалу).

services:
  dozzle:
    image: amir20/dozzle:latest
    container_name: dozzle
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./dozzle_data:/data
    environment:
      # Отключить сбор и отправку аналитики
      - DOZZLE_NO_ANALYTICS=true
      # Включить действия (start/stop/restart)
      - DOZZLE_ENABLE_ACTIONS=true
      # Включить доступ к терминалу работающих контейнеров
      - DOZZLE_ENABLE_SHELL=true
      # Включить базовую авторизацию из файла /data/users.yml
      - DOZZLE_AUTH_PROVIDER=simple
      # Подключиться к удаленному хосту через Docker Socket API
      # - DOZZLE_REMOTE_HOST=tcp://192.168.3.105:2375|rpi-105,tcp://192.168.3.106:2375|rpi-106
      # Подключиться к удаленному хосту через Dozzle Agent
      # - DOZZLE_REMOTE_AGENT=192.168.3.105:7007,192.168.3.106:7007
    ports:
      - 9090:8080

  # dozzle-agent:
  #   image: amir20/dozzle:latest
  #   container_name: dozzle-agent
  #   restart: always
  #   command: agent
  #   volumes:
  #     - /var/run/docker.sock:/var/run/docker.sock:ro
  #   # environment:
  #   #   - DOZZLE_HOSTNAME=hv-us-101
  #   ports:
  #     - 7007:7007

  # Container for monitoring syslog file on host
  # dozzle-syslog:
  #   image: alpine
  #   container_name: dozzle-syslog
  #   restart: always
  #   volumes:
  #     - /var/log/syslog:/var/log/custom.log
  #   command:
  #     - tail
  #     - -f
  #     - /var/log/custom.log

  # Container for monitoring files from /var/log on host
  dozzle-varlog:
    image: lifailon/dozzle-varlog:latest
    container_name: dozzle-varlog
    restart: always
    volumes:
      - /var/log:/logs

Beszel

Beszel - клиент-серверная система мониторинга не требующая настройки для контейнеров Docker и хостов, на которых они запущены. Использует PocketBase для backend, а также поддерживает оповещения в Telegram с помощью Webhook через Shoutrrr.

services:
  # Web interface for monitoring hosts and containers metrics + webhook via shoutrrr
  beszel-server:
    image: henrygd/beszel:latest
    container_name: beszel-server
    restart: always
    extra_hosts:
      - host.docker.internal:host-gateway
    volumes:
      - ./beszel_server_data:/beszel_data
    ports:
      - 8090:8090

  # Agent for monitoring
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./beszel_agent_data:/var/lib/beszel-agent
      # - /mnt/disk/.beszel:/extra-filesystems/sda1:ro
    environment:
      - KEY=Копируем публичный ключ из интерфейса и перезапускаем docker compose
      - HUB_URL=http://beszel-server:8090
      - LISTEN=45876
    # ports:
    #   - 45876:45876

Docker Socket Proxy

Docker Socket Proxy - прокси сервер для локального сокета Docker на основе HAProxy (не требуется внесение изменений в системные файлы демона или службы), который поддерживает ограничение доступа к конечным точкам с использованием переменных окружения, отображение статистики соединений и метрики Prometheus.

services:
  docker-socket-proxy:
    image: lifailon/docker-socket-proxy:amd64
    container_name: docker-socket-proxy
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 2375:2375 # Docker API
      - 2376:2376 # HAProxy stats and Prometheus metrics
    environment:
      - SOCKET_PATH=/var/run/docker.sock
      - LOG_LEVEL=info
      - INFO=1
      - PING=1
      - VERSION=1
      - POST=1
      - GRPC=1
      - EXEC=1
      - ALLOW_RESTARTS=1
      - ALLOW_START=1
      - ALLOW_STOP=1
      - AUTH=1
      - CONTAINERS=1
      - IMAGES=1
      - NETWORKS=1
      - BUILD=1
      - COMMIT=1
      - DISTRIBUTION=1
      - EVENTS=1
      - PLUGINS=1
      - VOLUMES=1
      - SESSION=1
      # Swarm
      - SWARM=0             
      - NODES=0             
      - CONFIGS=0           
      - SECRETS=0           
      - SERVICES=0          
      - SYSTEM=0            
      - TASKS=0             
      # HAProxy stats and Prometheus metrics
      - STATS_USER=admin
      - STATS_PASS=admin
      - STATS_URI=/
      - METRICS_URI=/metrics

Docker Registry

# sudo apt install apache2-utils -y && htpasswd -Bbn admin admin > ./creds
# mkdir certs && \
# openssl req -x509 -new -nodes -days 365 \
#   -out ./certs/public.pem \
#   -keyout ./certs/private.key \
#   -subj "/C=RU/ST=MSK/L=MSK/O=Registry/OU=Registry/CN=registry.docker.local"

services:
  docker-registry:
    image: registry:latest
    container_name: docker-registry
    ports:
      - 5000:5000
    restart: unless-stopped
    volumes:
      - ./regrepo:/var/lib/registry
      - ./certs:/certs
      - ./creds:/creds
    environment:
      - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/public.pem
      - REGISTRY_HTTP_TLS_KEY=/certs/private.key
      - REGISTRY_AUTH=htpasswd
      - REGISTRY_AUTH_HTPASSWD_REALM=docker-registry
      - REGISTRY_AUTH_HTPASSWD_PATH=/creds

Nexus

Nexus - единый репозиторий для хранения Docker образов (Docker Registry), двоичных файлов, пакетов (например, npm или nuget) и других артефактов.

# mkdir nexus-data && chown -R 200:200 ./nexus-data && chmod -R u+rw ./nexus-data
# sudo cat nexus-data/admin.password

services:
  nexus:
    image: sonatype/nexus3:latest
    container_name: nexus
    restart: unless-stopped
    ports:
      - "8881:8081"
      - "8882:8082" # Settings => Repositories => Create repository => docker-hosted => HTTP
    volumes:
      - ./nexus_data:/nexus-data
    environment:
      - INSTALL4J_ADD_VM_PARAMS=-Xms1g -Xmx2g -XX:MaxDirectMemorySize=2g

k8s Stack

Kompose UI

Kompose UI - веб-интерфейс для kompose (конвертирует docker-compose файлы в манифесты Kubernetes).

services:
  kompose-ui:
    image: jadcham/komposeui
    container_name: kompose-ui
    restart: unless-stopped
    ports:
      - 3500:8000

Web kubectl

Web kubectl - веб-интерфейс для kubectl и k9s на базе gotty от создателей 1panel. Загружаете собственные конфигурации и переключаетесь между ними в интерфейсе.

services:
  webkubectl:
    image: kubeoperator/webkubectl
    container_name: webkubectl
    restart: unless-stopped
    privileged: true
    ports:
      - 3501:8080
    environment:
      - SESSION_STORAGE_SIZE=10M
      - KUBECTL_INSECURE_SKIP_TLS_VERIFY=true
      - GOTTY_OPTIONS=--port 8080 --permit-write --permit-arguments

KubePi

KubePi — это современная панель управления Kubernetes (like Kubernetes/Dashboard) и Helm Charts, которая позволяет администраторам импортировать и устранять неполадки приложений, работающих в нескольких кластерах Kubernetes, от от создателей 1panel. Единый интерфейс предоставляет командный доступ для управления с поддержкой разграничения прав доступа, LDAP, SSO, а также логирует операции и управления и авторизации.

  kubepi:
    image: 1panel/kubepi
    container_name: kubepi
    restart: unless-stopped
    privileged: true
    ports:
      - 8181:80 # admin:kubepi

Headlamp

Headlamp - интерфейс для управления и мониторинга кластеров Kubernetes (like Kubernetes/Dashboard) от команды сообщества SIG (Special Interest Groups).

services:
  headlamp:
    image: ghcr.io/headlamp-k8s/headlamp:v0.33.0
    container_name: headlamp
    restart: unless-stopped
    command: [
      "--kubeconfig", "/headlamp/.kube/config",
      "--port","64446",
      "--enable-dynamic-clusters"
    ]
    volumes:
      - ~/.kube/config:/headlamp/.kube/config:ro
    ports:
      - 64446:64446

Helm Dashboard

Helm Dashboard - веб-интерфейс для просмотра установленных Helm чартов, истории их изменений и соответствующих ресурсов Kubernetes.

services:
  helm-dashboard:
    image: komodorio/helm-dashboard:latest
    container_name: helm-dashboard
    restart: unless-stopped
    volumes:
      - ~/.kube/config:/root/.kube/config:ro
    ports:
      - 3502:8080

Kube Ops View

Kube Ops View (Kubernetes Operational View) - read-only системная панель, которая позволяет удобно перемещаться между кластерами, отслеживать ноды и состояние подов (визуализирует ряд процессов, таких как создание и уничтожение подов).

services:
  kube-ops-view:
    image: hjacobs/kube-ops-view:latest
    container_name: kube-ops-view
    restart: unless-stopped
    ports:
      - 3503:3503
    environment:
      - SERVER_PORT=3503
      - CLUSTERS=http://192.168.3.101:6443
      - KUBECONFIG_PATH=/root/.kube/config
    volumes:
      - ~/.kube/config:/root/.kube/config:ro

Kubetail Dashboard

Kubetail Dashboard - веб-интерфейс и инструмент командной строки для отображения логов из разных подов в одном потоке (поддерживает фильтрацию по содержимому сообщений при установки в кластер).

🔗 Kubetail Dashboard installed in Kubernetes Demo

services:
  kubetail-dashboard:
    image: kubetail/kubetail-dashboard:0.8.2
    container_name: kubetail-dashboard
    restart: unless-stopped
    ports:
      - 7500:7500
    volumes:
      - ~/.kube/config:/kubetail/.kube/config:ro
    command:
      [
        "-a", ":7500",
        "-p", "dashboard.environment:desktop",
        "-p", "kubeconfig:/kubetail/.kube/config",
      ]

Velero UI

Velero UI - веб-интерфейс для управления Velero и маниторинга резервного копирования ресурсов в кластерах Kubernetes.

services:
  velero-ui:
    image: otwld/velero-ui:latest
    container_name: velero-ui
    restart: unless-stopped
    volumes:
      - ~/.kube/config:/app/.kube/config:ro
      # - /etc/rancher/k3s/k3s.yaml:/app/.kube/config:ro
    environment:
      - PORT=3504
      - KUBE_CONFIG_PATH=/app/.kube/config
    # network_mode: host # use for k3s cluster config on localhost
    ports:
      - 3504:3504 # admin:admin

Rancher

Rancher - инструмент для быстрого запуска и управления кластерами Kubernetes через Веб-интерфейс.

services:
  rancher:
    image: rancher/rancher:latest
    container_name: rancher
    restart: unless-stopped
    privileged: true
    volumes:
    - ./rancher_data:/var/lib/rancher
    ports:
    - 3080:80
    - 3443:443
    # Password:
    # docker logs rancher 2>&1 | grep "Bootstrap Password:" | sed -E "s/.+\: //"

k3s

k3s - легковесный Kubernetes от Rancher/SUSE. Позволяет установить кластер в контейнере Docker или одной командой с помощью скрипта, занимает в два раза меньше памяти, и все это в двоичном файле размером менее 100 МБ.

services:
  k3s-server:
    image: "rancher/k3s:${K3S_VERSION:-latest}"
    container_name: k3s-server
    restart: always
    command: server
    privileged: true
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535
    environment:
    - K3S_TOKEN=${K3S_TOKEN:?err}
    - K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml
    - K3S_KUBECONFIG_MODE=666
    tmpfs:
    - /run
    - /var/run
    volumes:
    - ./k3s_server_data:/var/lib/rancher/k3s
    # To get the Kubeconfig file
    - .:/output
    ports:
    - 6443:6443  # Kubernetes API Server
    - 80:80      # Ingress controller port 80
    - 443:443    # Ingress controller port 443

  agent:
    image: "rancher/k3s:${K3S_VERSION:-latest}"
    container_name: k3s-agent
    restart: always
    privileged: true
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535
    environment:
    - K3S_URL=https://k3s-server:6443
    - K3S_TOKEN=${K3S_TOKEN:?err}
    tmpfs:
    - /run
    - /var/run
    volumes:
    - ./k3s_agent_data:/var/lib/rancher/k3s

# K3S_TOKEN=${RANDOM}${RANDOM}${RANDOM} docker-compose up -d

CI/CD Stack

Jenkins

Jenkins - CI/CD платформа на базе Java, которая использует свой декларативный синтаксис описания конвееров с поддержкой скриптового языка Groovy, гибкой параметрорезацией и большого числа плагинов.

# Предварительно создать директории и предоставить права
# mkdir -p jenkins_home && sudo chown -R 1000:1000 jenkins_home
# mkdir -p jenkins_agent && sudo chown -R 1000:1000 jenkins_agent

services:
  jenkins-server:
    image: jenkins/jenkins:latest
    container_name: jenkins-server
    restart: unless-stopped
    user: "1000:1000"
    volumes:
      - ./jenkins_home:/var/jenkins_home
    ports:
      - "8080:8080"   # Веб-интерфейс и регистрации агентов
      - "50000:50000" # Передача данных и выполнение сборок между Jenkins Controller и агентами

  jenkins-agent:
    # image: jenkins/inbound-agent:latest
    build:
      context: .
      dockerfile: Dockerfile
    container_name: jenkins-agent
    restart: unless-stopped
    depends_on:
      - jenkins-server
    environment:
      # Указать в способе запуска подключение агента к контроллеру, каталог корневой директории /home/jenkins и выбрать количество исполнений ~= количеству ядер
      - JENKINS_URL=${JENKINS_SERVER_URL}
      - JENKINS_AGENT_NAME=${JENKINS_AGENT_NAME}
      # Получить ключ доступа: http://192.168.3.101:8080/manage/computer
      - JENKINS_SECRET=${JENKINS_SECRET}
    user: "1000:1000"
    volumes:
      - ./jenkins_agent:/home/jenkins
    labels:
      # Отключаем автоматическое обновление образа через Watchtower (не поддерживается при использовании build из dockerfile)
      - "com.centurylinklabs.watchtower.enable=false"

Dockerfile:

FROM jenkins/inbound-agent:latest

USER root

# Обновление и установка дополнительных пакетов
RUN apt-get update && apt-get install -y \
    git \
    curl \
    iputils-ping \
    netcat-openbsd \
    make \
    tmux

# Устанавливаем Ansible
RUN apt-get -y install \
    python3-pip && \
    pip3 install --break-system-packages ansible && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Устанавливаем Go последней версии
RUN ARCH=$(uname -m) && \
    case "$ARCH" in \
        "aarch64" | "arm64") ARCH="arm64" ;; \
        "x86_64"  | "amd64") ARCH="amd64" ;; \
    esac && \
    LATEST_GO_VERSION=$(curl -s https://go.dev/VERSION?m=text | head -1) && \
    curl -L "https://go.dev/dl/${LATEST_GO_VERSION}.linux-${ARCH}.tar.gz" | tar -xz -C /usr/local

# Добавляем Go в PATH
ENV PATH="/usr/local/go/bin:${PATH}"

# Предоставление права доступа группе jenkins на директорию для сборки
# RUN chown -R jenkins:jenkins /home/jenkins/workspace
RUN chown -R jenkins:jenkins /home/jenkins

USER jenkins

# Check versions
RUN ansible --version && \
    python3 --version && \
    go version

# Переменные для запуска передаются через environment (.env файл) при запуске в docker compose
# /opt/java/openjdk/bin/java -jar /usr/share/jenkins/agent.jar -secret $JENKINS_SECRET -name $JENKINS_AGENT_NAME -url $JENKINS_URL
ENTRYPOINT ["/usr/local/bin/jenkins-agent"]

env:

JENKINS_SERVER_URL=http://jenkins-server:8080
JENKINS_AGENT_NAME=local-agent
JENKINS_SECRET=b040ab8fa1de3e64e77ed57d4ce45f42c843950f981f8db18a97091a94395f32

GitLab

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    restart: unless-stopped
    hostname: gitlab.local
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost'
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
    ports:
      - 8888:80 # Web
      - 2222:22 # SSH
    volumes:
      - ./gitlab/config:/etc/gitlab
      - ./gitlab/logs:/var/log/gitlab
      - ./gitlab/data:/var/opt/gitlab
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:13
    container_name: gitlab_postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: gitlab
      POSTGRES_PASSWORD: gitlab
      POSTGRES_DB: gitlabhq_production
    volumes:
      - ./postgres/data:/var/lib/postgresql/data

  redis:
    image: redis:latest
    container_name: gitlab_redis
    restart: unless-stopped
    command: redis-server --appendonly yes
    volumes:
      - ./redis/data:/data

# Login: root
# Password:
# docker exec -it gitlab cat /etc/gitlab/initial_root_password | grep -E ^Pass | sed "s/Password:\s//g"

Gitea

Gitea - легковесный локальный аналог GitLab/GitHub (самостоятельный хостинг Git), API (с поддержкой Swagger Docs) и системой CI/CD на базе GitHub Actions (поддерживает обратную совместимость) с использованием act.

services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: unless-stopped
    environment:
      - USER=git
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__server__DOMAIN=localhost
      - GITEA__server__SSH_PORT=222
      - GITEA__server__HTTP_PORT=3000
      # SQLite
      - GITEA__database__DB_TYPE=sqlite3
      - GITEA__database__PATH=/data/gitea/gitea.db
      # PostgreSQL
      # - GITEA__database__DB_TYPE=postgres
      # - GITEA__database__HOST=gitea-db:5432
      # - GITEA__database__NAME=gitea
      # - GITEA__database__USER=gitea
      # - GITEA__database__PASSWD=gitea
    volumes:
      - ./gitea_data/server:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 222:222   # SSH
      - 3000:3000 # HTTP
    labels:
      - traefik.enable=true
      - traefik.http.routers.gitea.rule=Host(`git.docker.local`)
      - traefik.http.services.gitea.loadbalancer.server.port=3000
    # depends_on:
    #   - gitea-db

  # gitea-db:
  #   image: docker.io/library/postgres:14
  #   container_name: gitea-db
  #   restart: unless-stopped
  #   environment:
  #     - POSTGRES_USER=gitea
  #     - POSTGRES_PASSWORD=gitea
  #     - POSTGRES_DB=gitea
  #   networks:
  #     - gitea
  #   volumes:
  #     - ./gitea_postgres_data:/var/lib/postgresql/data

  gitea-act-runner:
    image: docker.io/gitea/act_runner:nightly
    container_name: gitea-act-runner
    restart: unless-stopped
    environment:
      CONFIG_FILE: /config.yaml
      GITEA_INSTANCE_URL: http://192.168.3.101:3000
      # http://192.168.3.101:3000/-/admin/actions/runners
      # or
      # docker exec -it gitea gitea --config /data/gitea/conf/app.ini actions generate-runner-token
      GITEA_RUNNER_REGISTRATION_TOKEN: JY1uWsuNiexmvdleG0cbftgOvuHesKlnpZeCxbQA
    volumes:
      - ./config.yaml:/config.yaml
      - ./gitea_data/runner:/data
      - /var/run/docker.sock:/var/run/docker.sock
    network_mode: host
    depends_on:
      - gitea

GoCD

GoCD - система CI/CD с поддержкой настройки всех этапов (stage, jobs, tasks, exec commands, artifacts, env и params) через пользовательский интерфейс или в формате XML.

services:
  gocd-server:
    image: gocd/gocd-server:v24.3.0
    container_name: gocd-server
    restart: unless-stopped
    ports:
      - 8153:8153
    user: 0:0
    volumes:
      - ./godata_server:/godata
      - ./godata_server_home:/home/go

  gocd-agent:
    image: gocd/gocd-agent-alpine:v25.3.0
    container_name: gocd-agent
    restart: unless-stopped
    environment:
      - GO_SERVER_URL=http://gocd-server:8153/go
      - AGENT_AUTO_REGISTER_KEY=d4a80630-99de-4bc4-a89b-95a9884d43a3 # cat ./godata_server/config/cruise-config.xml
      - AGENT_AUTO_REGISTER_HOSTNAME=hv-us-101
    user: 0:0
    volumes:
      - ./godata_agent:/godata
      - ./godata_agent_home:/home/go
    depends_on:
      - gocd-server

Drone CI

Drone CI - CI/CD платформа, построенная на технологии DinD (Docker in Docker)

services:
  drone-server:
    image: drone/drone:2
    container_name: drone-server
    restart: unless-stopped
    volumes:
      - /var/lib/drone:/data
    environment:
      - DRONE_GITEA_SERVER=http://gitea.docker.local
      - DRONE_GITEA_CLIENT_ID=
      - DRONE_GITEA_CLIENT_SECRET=
      - DRONE_RPC_SECRET=droneRpcSecret
      - DRONE_SERVER_HOST=drone.docker.local
      - DRONE_SERVER_PROTO=http
    ports:
      - 80:80
      - 443:443

  drone-runner:
    image: drone/drone-runner-docker:1
    container_name: runner-runner
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=drone.docker.local
      - DRONE_RPC_SECRET=droneRpcSecret
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=runner-local
    ports:
      - 3000:3000

Harness

Harness - система CI/CD на базе Drone, хостинг исходного кода (gitness) и реестр артефактов с открытым исходным кодом.

services:
  harness:
    image: harness/harness
    container_name: harness
    restart: unless-stopped
    ports:
      - 3021:3000
      - 3022:3022
    volumes:
      - ./harness_data:/data
      - /var/run/docker.sock:/var/run/docker.sock

Woodpecker

Woodpecker - еще одна платформа CI/CD на базе Drone.

services:
  woodpecker-server:
    image: woodpeckerci/woodpecker-server:v3
    container_name: woodpecker-server
    restart: unless-stopped
    ports:
      - 8000:8000
    environment:
      - WOODPECKER_OPEN=true
      - WOODPECKER_HOST=${WOODPECKER_HOST}
      - WOODPECKER_GITHUB=true
      - WOODPECKER_GITHUB_CLIENT=${WOODPECKER_GITHUB_CLIENT}
      - WOODPECKER_GITHUB_SECRET=${WOODPECKER_GITHUB_SECRET}
      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
    volumes:
      - ./woodpecker_server_data:/var/lib/woodpecker/

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:v3
    container_name: woodpecker-agent
    restart: unless-stopped
    command: agent
    environment:
      - WOODPECKER_SERVER=woodpecker-server:9000
      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
    volumes:
      - ./woodpecker_agent_config:/etc/woodpecker
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - woodpecker-server

Semaphore

Semaphore - графический интерфейс для Ansible, Terraform, OpenTofu, Bash, Pulumi, Docker и PowerShell, с поддержкой API и LDAP авторизацией.

services:
  semaphore:
    image: public.ecr.aws/semaphore/pro/server:v2.13.12
    container_name: semaphore
    restart: unless-stopped
    environment:
      - SEMAPHORE_ADMIN=admin
      - SEMAPHORE_ADMIN_NAME=admin
      - SEMAPHORE_ADMIN_EMAIL=admin@localhost
      - SEMAPHORE_ADMIN_PASSWORD=admin
      # Database
      - SEMAPHORE_DB_DIALECT=postgres
      - SEMAPHORE_DB_HOST=semaphore-db
      - SEMAPHORE_DB_NAME=semaphore_db
      - SEMAPHORE_DB_USER=semaphore
      - SEMAPHORE_DB_PASS=semaphore
      - SEMAPHORE_DB_OPTIONS={"sslmode":"disable"}
      # Telegram
      - SEMAPHORE_TELEGRAM_CHAT=
      - SEMAPHORE_TELEGRAM_TOKEN=
      # LDAP
      # - SEMAPHORE_LDAP_ENABLE=yes
      # - SEMAPHORE_LDAP_SERVER=semaphore-ldap:1389
      # - SEMAPHORE_LDAP_BIND_DN=cn=semaphore,dc=docker,dc=local
      # - SEMAPHORE_LDAP_BIND_PASSWORD=semaphore
      # - SEMAPHORE_LDAP_SEARCH_DN=dc=docker,dc=local
      # - SEMAPHORE_LDAP_SEARCH_FILTER=(&(objectClass=inetOrgPerson)(uid=%s))
      # - SEMAPHORE_LDAP_MAPPING_MAIL={{ .cn }}@docker.local
      # - SEMAPHORE_LDAP_MAPPING_UID=|
      # - SEMAPHORE_LDAP_MAPPING_CN=cn
    volumes:
      - ./semaphore/app_data:/var/lib/semaphore
      - ./semaphore/app_conf:/etc/semaphore
    ports:
      - 3030:3000

  semaphore-db:
    image: postgres
    container_name: semaphore-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=semaphore
      - POSTGRES_PASSWORD=semaphore
      - POSTGRES_DB=semaphore_db
    volumes:
      - ./semaphore/db_data:/var/lib/postgresql/data

  # semaphore-ldap:
  #   image: bitnami/openldap:latest
  #   container_name: semaphore-ldap
  #   environment:
  #     - LDAP_ADMIN_USERNAME=admin
  #     - LDAP_ADMIN_PASSWORD=LdapAdmin
  #     - LDAP_USERS=semaphore
  #     - LDAP_PASSWORDS=semaphore
  #     - LDAP_ROOT=dc=docker,dc=local
  #     - LDAP_ADMIN_DN=cn=semaphore,dc=docker,dc=local
  #   volumes:
  #     - ./semaphore/ldap_data:/var/lib/ldap
  #   ports:
  #     - 1389:1389
  #     - 1636:1636

Vault Stack

HashiCorp Vault

HashiCorp Vault - инструмент хранения и управления секретами (например, API ключи, пароли, сертификаты и многое другое).

HashiCorp Consul - распределенное и высокодоступное (HA) решение для подключения и настройки приложений в динамической распределенной инфраструктуре, например, для отказоустойчивости Vault.

services:
  consul:
    image: hashicorp/consul:latest
    container_name: consul
    restart: unless-stopped
    ports:
      - "8500:8500"
    command: "agent -server -bootstrap-expect=1 -client=0.0.0.0"
    volumes:
      - ./consul_data:/consul/data
      - ./consul.hcl.config:/consul/config/consul.hcl

  vault:
    image: hashicorp/vault:latest
    container_name: vault
    restart: unless-stopped
    depends_on:
      - consul
    environment:
      - VAULT_ADDR=http://0.0.0.0:8200
      - VAULT_API_ADDR=http://localhost:8200
    ports:
      - "8200:8200"
    volumes:
      - ./vault_config:/vault/config
      # Использовать локальное файловое хранилище
      # - ./vault_data:/vault/file
    cap_add:
      - IPC_LOCK
    command: >
      vault server -config=/vault/config/vault.hcl.config

VaultWarden

VaultWarden - неофициальный легковесный и обратно совместимый сервер современного менеджера паролей Bitwarden, написанный на Rust.

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      - DOMAIN=http://vaultwarden.docker.local
      # - ROCKET_ADDRESS=0.0.0.0
      # - ROCKET_PORT=1338
    labels:
      - traefik.enable=true
      - traefik.http.routers.myapp.rule=Host(`vaultwarden.docker.local`)
    # Access via proxy
    # ports:
    #   - 1338:1338
    volumes:
      - ./vw_data/:/data/

PassBolt

PassBolt - менеджер паролей для совместного использования в командах (поддерживает веб-интерфейс, мобильное и desktop приложение, расширение браузера и интсрумент командной строки).

🔗 Passbolt Chrome Extension

# sudo mkdir -p passbolt_data/gpg
# sudo chown -R 33:33 ./passbolt_data/gpg
# sudo chmod 755 ./passbolt_data/gpg
# sudo chmod 644 ./passbolt_data/gpg/*.asc 2>/dev/null || true

services:
  passbolt:
    image: passbolt/passbolt:latest
    # image: passbolt/passbolt:latest-ce-non-root
    container_name: passbolt
    restart: unless-stopped
    tty: true
    command: >
      bash -c "/usr/bin/wait-for.sh -t 0 passbolt-db:5432 -- /docker-entrypoint.sh"
    environment:
      - APP_FULL_BASE_URL=https://passbolt.docker.local
      - DATASOURCES_DEFAULT_DRIVER=Cake\Database\Driver\Postgres
      - DATASOURCES_DEFAULT_ENCODING=utf8
      - DATASOURCES_DEFAULT_URL=postgres://passbolt:PassB0lt@passbolt-db:5432/passbolt?schema=passbolt
      - EMAIL_DEFAULT_FROM_NAME=passbolt
      - EMAIL_DEFAULT_FROM=admin@docker.local
      - EMAIL_TRANSPORT_DEFAULT_HOST=localhost
      - EMAIL_TRANSPORT_DEFAULT_PORT=25
      - EMAIL_TRANSPORT_DEFAULT_USERNAME=null
      - EMAIL_TRANSPORT_DEFAULT_PASSWORD=null
      - EMAIL_TRANSPORT_DEFAULT_TLS=null
    volumes:
      - ./passbolt_data/gpg:/etc/passbolt/gpg
      - ./passbolt_data/jwt:/etc/passbolt/jwt
    # ports:
    #   - 80:80
    #   - 443:443
    labels:
      - traefik.enable=true
      - traefik.http.routers.myapp.rule=Host(`passbolt.docker.local`)
    depends_on:
      - passbolt-db

  passbolt-db:
    image: postgres:latest
    container_name: passbolt-db
    restart: unless-stopped
    environment:
      - POSTGRES_DB=passbolt
      - POSTGRES_USER=passbolt
      - POSTGRES_PASSWORD=PassB0lt
    volumes:
      - ./passbolt_data/db:/var/lib/postgresql
    # ports:
    #   - 5433:5432

# Creat new user
# docker exec -it passbolt bash
# su -s /bin/bash -c "/usr/share/php/passbolt/bin/cake passbolt register_user -u admin@docker.local -f Admin -l Admin -r admin" www-data

KeeWeb

KeeWeb - веб-интефрейс и интерфейс рабочего стола для баз данных kdbx.

🔗 KeeWeb Demo

🔗 KeeWeb Chrome Extension

services:
  keeweb:
    container_name: keeweb
    image: ghcr.io/keeweb/keeweb:latest
    # image: keeweb/keeweb:latest
    restart: unless-stopped
    volumes:
      - ./cert.crt:/config/keys/cert.crt:ro
      - ./cert.key:/config/keys/cert.key:ro
      - ./keeweb_data:/config
    ports:
      - 4343:443
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3

KeePassXC

KeePassXC - современный и кроссплатформенный интерфейс KeePass с открытым исходным кодом, а также собранный образ с веб-интерфейсом на базе Selkies.

services:
  keepassxc:
    # Base image: https://github.com/linuxserver/docker-baseimage-selkies
    image: lscr.io/linuxserver/keepassxc:latest
    container_name: keepassxc
    restart: unless-stopped
    security_opt:
      - seccomp:unconfined # optional
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/GMT+3
      - LC_ALL=ru_RU.UTF-8
      # Creds for auth
      # - CUSTOM_USER=admin
      # - PASSWORD=admin
    volumes:
      - ./keepassxc_data:/config # dir for ssl and kdbx files
    ports:
      - 3000:3000 # HTTP Selkies (https://github.com/selkies-project/selkies)
      - 3001:3001 # HTTPS

Repo Manager

Repo Manager - веб-интерфейс для зеркалирования и управления репозиториями rpm и deb, от создателя Motion UI.

services:
  repomanager:
    image: lbr38/repomanager:latest
    container_name: repomanager
    restart: unless-stopped
    # network_mode: host
    ports:
      - 8080:8080
    environment:
      FQDN: repomanager.docker.local
      MAX_UPLOAD_SIZE: 32M
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./repomanager_data:/var/lib/repomanager
      - ./repomanager_repo:/home/repo

Monitoring Stack

Jaeger

Jaeger - распределенная система трассировки для анализа времени обработки запросов и ответов к веб-приложениям (например, используется в Traefik), созданная компанией Uber Technologies и переданная в дар Cloud Native Computing Foundation.

services:
  jaeger:
    image: jaegertracing/all-in-one:1.55
    container_name: jaeger
    restart: always
    ports:
      - 16686:16686 # UI
      - 4317:4317   # Collector

Parca

Parca - система непрерывного профилирования для анализа использования процессора и памяти приложениями, вплоть до номера строки. Использует единый профилировщик eBPF, который автоматически обнаруживает цели из Docker, Kubernetes или systemd, поддерживая C, C++, Rust, Go и другие языки.

services:
  # Интерфейс для анализа профилирования
  parca-server:
    image: ghcr.io/parca-dev/parca:v0.24.2
    container_name: parca-server
    restart: unless-stopped
    command: /parca
    ports:
      - 7070:7070

  # Агент непрерывного профилирования 
  parca-agent:
    image: ghcr.io/parca-dev/parca-agent:v0.42.0
    container_name: parca-agent
    restart: unless-stopped
    command: --remote-store-address=parca-server:7070 --remote-store-insecure
    stdin_open: true
    tty: true
    privileged: true
    pid: host
    ports:
      - 7071:7071
    volumes:
      - /run:/run
      - /boot:/boot
      - /lib/modules:/lib/modules
      - /sys/kernel/debug:/sys/kernel/debug
      - /sys/fs/cgroup:/sys/fs/cgroup
      - /sys/fs/bpf:/sys/fs/bpf
      - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket

Grafana

Grafana - система для визуализации метрик из более чем 100 источников данных.

# mkdir -p grafana_data && sudo chown -R 472:472 grafana_data

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - 9091:3000
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=GrafanaAdmin # grafana-cli admin reset-admin-password newpassword
      # - GF_DATABASE_TYPE=postgres
      # - GF_DATABASE_HOST=postgres:5432
      # - GF_DATABASE_NAME=grafana
      # - GF_DATABASE_USER=grafana
      # - GF_DATABASE_PASSWORD=grafana
      # - GF_DATABASE_SSL_MODE=disable
    volumes:
      - ./grafana_data:/var/lib/grafana

  # postgres:
  #   image: postgres:latest
  #   container_name: postgres
  #   restart: unless-stopped
  #   environment:
  #     POSTGRES_DB: grafana
  #     POSTGRES_USER: grafana
  #     POSTGRES_PASSWORD: grafana
  #   volumes:
  #     - ./postgres_data:/var/lib/postgresql/data
  #   ports:
  #     - 5432:5432

Prometheus Stack

Prometheus - система мониторинга и оповещения с открытым исходным кодом, которая собирает и анализирует метрики работы серверов и приложений в реальном времени. Она хранит данные в виде временных рядов (значений с метками времени и ключами/меткам/тегами для идентификации). Веб-интефрейс поддерживает браузер запросов с визуализацией на графиках, отображение ролей из Alertmanager, их статусы и валидность, а также статус работы экспортеров, базы данных TSDB, доступные метки (labels в Service discovery), текущие флаги запуска сервера и итоговая конфигурация для экспорта.

Alertmanager - система оповещений для экосистемы Prometheus (например, в Telegram, при превышение заданных порого в конфигурации), а также поддерживает свой веб-интерфейс.

Node Exporter - основной экспортер Prometheus для сбора системных метрик Linux.

PromLens – веб-конструктор для анализа и визуализации запросов PromQL (уже встроен в интерфейс Prometheus).

PushGateway - автономный шлюз-экспорт для сбора метрик через API (выступает в роли listener для приема метрик из скриптов, как в InfluxDB).

Blackbox Exporter - мониторинг ICMP, TCP, DNS, HTTP/HTTPS и gRPC для предоставления метрик в формате Prometheus (похож на Gatus).

cAdvisor (Container Advisor) - экспортер метрик для всех запущенных контейнеров Docker с собственным веб-интерфейсом от Google.

LogPorter - простая и легковесная альтернатива cAdvisor для получения всех основных метрик из контейнеров Docker.

# mkdir -p prometheus_data && sudo chown -R 65534:65534 prometheus_data prometheus.yml alert-rules.yml alertmanager.yml telegram.tmpl

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./alert-rules.yml:/etc/prometheus/alert.yml
      - ./prometheus_data:/prometheus
    ports:
      - 9092:9090
    # dns:
    #   - 192.168.3.101

  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    restart: unless-stopped
    command:
      - --config.file=/etc/alertmanager/alertmanager.yml
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      # Custom template
      - ./telegram.tmpl:/etc/alertmanager/telegram.tmpl
    # ports:
    #   - 9093:9093

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    # ports:
    #   - 9100:9100

  # promlens:
  #   image: prom/promlens
  #   container_name: promlens
  #   restart: unless-stopped
  #   ports:
  #     - 9094:8080

  # pushgateway:
  #   image: prom/pushgateway:latest
  #   container_name: pushgateway
  #   restart: unless-stopped
  #   ports:
  #     - 9095:9091

  # http://blackbox:9115/probe?target=https://google.com&module=http
  blackbox:
    image: prom/blackbox-exporter:latest
    container_name: blackbox
    restart: unless-stopped
    ports:
      - 9115:9115
    volumes:
      - ./blackbox.yml:/etc/blackbox_exporter/config.yml
    command:
      - --config.file=/etc/blackbox_exporter/config.yml

  # cadvisor:
  #   image: gcr.io/cadvisor/cadvisor:latest
  #   container_name: cadvisor
  #   restart: unless-stopped
  #   volumes:
  #     - /:/rootfs:ro
  #     - /var/run:/var/run:rw
  #     - /sys:/sys:ro
  #     - /var/lib/docker/:/var/lib/docker:ro
  #   ports:
  #     - 8080:8080

  logporter:
    image: lifailon/logporter:latest
    container_name: logporter
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    # ports:
    #   - 9333:9333

Loki

Loki - централизованный сервер и агент promtail для агрегации и хранения логов удаленных систем от Grafana (как Prometheus, но для логов) из файловой системы и контейнеров через сокет Docker с поддержкой фильтрации по node, container, level и tag.

# mkdir -p loki_data && sudo chown -R 1000:1000 loki_data

services:
  # Система агрегации логов
  loki-server:
    image: grafana/loki:latest
    container_name: loki-server
    restart: unless-stopped
    user: "root"
    volumes:
      - ./loki-server.yml:/etc/loki/loki-config.yaml
      - ./loki_data:/loki
    # Порт нужен для внешних агентов и api: http://loki-server:3100/loki/api/v1/labels
    ports:
      - 3100:3100

  # Агент для сбора логов
  loki-promtail:
    image: grafana/promtail:latest
    container_name: loki-promtail
    restart: unless-stopped
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./loki-promtail.yml:/etc/promtail/promtail.yml
    command: -config.file=/etc/promtail/promtail.yml
    # ports:
    #   - 9080:9080

Graphite

Graphite - система хранения метрик временных рядов, которая принимает данные по TCP или UDP (например, для отправки данных с помощью netcat) протоколам и состоит из трех основных компонентов:

OhmGraphite - экспортер метрик из LibreHardwareMonitor, который работает как служба Windows для отправки данных в Graphite, InfluxdDB, Prometheus или TimescaleDB (база данных временных рядов, упакованная как расширение Postgres).

services:
  graphite:
    image: graphiteapp/graphite-statsd
    container_name: graphite
    restart: unless-stopped
    ports:
      - 2025:80
      - 2003-2004:2003-2004
      - 2023-2024:2023-2024
      - 8125:8125/udp
      - 8126:8126

# StatsD (UDP)
# Формат: метрика:значение|type
# Хранятся в stats и stats_counts по указанном пути через точку
# while true; do echo "test.dev.random:$(($RANDOM % 100))|c" | nc -u 127.0.0.1 8125; sleep 1; done

# Carbon (TCP) Plain Text Protocol
# Формат: метрика значение timestamp
# while true; do echo "test.dev.random $(($RANDOM % 100)) $(date +%s)" | nc -w 1 127.0.0.1 2003; sleep 1; done

InfluxDB

Система мониторинга (экосистема Influx) состоит из следующих компонентов:

1-я версия InfluxDB поддерживает управление базой и отправку данных, используя API (например, с помощью curl).

InfluxDB Studio - инструмент рабочего стола для управления базами данных InfluxDB 1.8 на базе InfluxData.Net (как MS SSMS).

Flux - скриптовый язык для запросов к базам данных InfluxDB версии 2.0 и выше.

services:
  # Database
  influxdb:
    image: influxdb:1.8
    container_name: influxdb
    restart: unless-stopped
    ports:
      - 8086:8086
    volumes:
      - ./influxdb_data:/var/lib/influxdb
      # - ./ssl_cert:/etc/ssl/
    environment:
      - INFLUXDB_DB=ohm
      # Auth
      - INFLUXDB_HTTP_AUTH_ENABLED=true
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=admin
      # SSL (optionals)
      # - INFLUXDB_HTTP_HTTPS_ENABLED=true
      # - INFLUXDB_HTTP_HTTPS_CERTIFICATE=/etc/ssl/ohm.crt
      # - INFLUXDB_HTTP_HTTPS_PRIVATE_KEY=/etc/ssl/ohm.key

  # Web interface (like Grafana)
  chronograf:
    image: chronograf:1.8
    container_name: chronograf
    restart: unless-stopped
    ports:
      - 8888:8888
    environment:
      - INFLUXDB_URL=http://influxdb:8086
      - INFLUXDB_USERNAME=admin
      - INFLUXDB_PASSWORD=admin
    depends_on:
      - influxdb

  # Agent
  telegraf:
    image: telegraf
    container_name: telegraf
    restart: unless-stopped
    user: :109 # grep docker /etc/group
    volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - influxdb

Zabbix

services:
  zabbix-database:
    image: postgres:15
    restart: unless-stopped
    environment:
      POSTGRES_DB: zabbix_dn
      POSTGRES_USER: zabbix_user
      POSTGRES_PASSWORD: ZabbixAdmin
    volumes:
      - ./zabbix/database:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "zabbix_dn", "-U", "zabbix_user" ]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s

  zabbix-server:
    image: zabbix/zabbix-server-pgsql:6.4.6-ubuntu
    restart: unless-stopped
    environment:
      DB_SERVER_HOST: zabbix-database
      DB_SERVER_PORT: 5432
      POSTGRES_DB: zabbix_dn
      POSTGRES_USER: zabbix_user
      POSTGRES_PASSWORD: ZabbixAdmin
      ZBX_CACHESIZE: 1G
    ports:
      - 10051:10051
    healthcheck:
      test: grep -qr "zabbix_server" /proc/*/status || exit 1
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 90s
    depends_on:
      zabbix-database:
        condition: service_healthy

  zabbix-dashboard:
    image: zabbix/zabbix-web-nginx-pgsql:6.4.6-ubuntu
    restart: unless-stopped
    environment:
      DB_SERVER_HOST: zabbix-database
      DB_SERVER_PORT: 5432
      POSTGRES_DB: zabbix_dn
      POSTGRES_USER: zabbix_user
      POSTGRES_PASSWORD: ZabbixAdmin
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: Etc/UTC+3
    ports:
      - 80:8080
      - 443:8443
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 90s
    depends_on:
      zabbix-database:
        condition: service_healthy
      zabbix-server:
        condition: service_healthy

  zabbix-agent:
    image: zabbix/zabbix-agent2:6.4.6-ubuntu
    restart: unless-stopped
    environment:
      ZBX_HOSTNAME: Zabbix server
      ZBX_SERVER_HOST: zabbix-server
    depends_on:
      - zabbix-database
      - zabbix-server

OpenObserve

Open Observe (O2) — централизованная система наблюдения для логов (like Loki), метрик (like Prometheus), трассировок (like Jaeger), аналитики, RUM (мониторинг реальных пользователей — производительность, ошибки, воспроизведение сеансов), предназначенная для работы в масштабах петабайт. Он прост и удобен в использовании, в отличие от Elasticsearch, который требует понимания и настройки множества параметров, позволяет запустить его менее чем за 2 минуты. OpenObserve имеет свой встроенный пользовательский интерфейс, что устраняет необходимость в отдельной установке сторонних инструментов, таких как Kibana.

Поддерживает большое количество источников данных, например, otel-collector на базе протокола OTLP (OpenTelemetry protocol), а также curl, FluentBit, Filebeat, Logstash, Syslog-ng, Prometheus и Telegraf.

services:
  openobserve:
    image: public.ecr.aws/zinclabs/openobserve:latest
    container_name: openobserve
    restart: unless-stopped
    environment:
      - ZO_DATA_DIR=/data
      - ZO_ROOT_USER_EMAIL=root@example.com
      - ZO_ROOT_USER_PASSWORD=Complexpass#123
    ports:
      - 514:514/tcp   # Syslog TCP
      - 514:514/udp   # Syslog UDP
      - 5080:5080/tcp # Web UI
    volumes:
      - ./openobserve_data:/data

ELK Stack

Elasticsearch - распределенная поисковая и аналитическая система, основанная на библиотеке Apache Lucene. Она используется для быстрого поиска и анализа больших объемов данных в реальном времени, например, для полнотекстового поиска. Стек состоит из трех приложений:

elastop - TUI интерфейс для мониторинга кластеров Elasticsearch в режиме реального времени.

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.13.4
    container_name: elasticsearch
    restart: unless-stopped
    environment:
      - node.name=elasticsearch
      - cluster.initial_master_nodes=elasticsearch
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - ELASTIC_PASSWORD=ElasticSearchAdmin
    volumes:
      - ./es_data:/usr/share/elasticsearch/data
      # - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,Z
    ports:
      - 9200:9200
      - 9300:9300
    ulimits:
      memlock:
        soft: -1
        hard: -1

  logstash:
    image: docker.elastic.co/logstash/logstash:8.13.4
    container_name: logstash
    restart: unless-stopped
    environment:
      - LS_JAVA_OPTS=-Xms256m -Xmx256m
      - LOGSTASH_INTERNAL_PASSWORD=logStashPassword
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTIC_PASSWORD=ElasticSearchAdmin
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      # - ./logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z
      # - ./logstash_pipeline:/usr/share/logstash/pipeline:ro,Z
    ports:
      - 5044:5044
      - 5000:5000/tcp
      - 5000:5000/udp
      - 9600:9600
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:8.13.4
    container_name: kibana
    restart: unless-stopped
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=kibana
      - ELASTICSEARCH_PASSWORD=ElasticSearchAdmin
    volumes:
      - ./kibana.yml:/usr/share/kibana/config/kibana.yml:ro,Z
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch

# curl -u elastic:ElasticSearchAdmin http://localhost:9200/_cat/indices
# echo '{"message":"Test log"}' | nc localhost 5000

Graylog

Graylog - централизованная система сбора, индексации и анализа логов или других данных из удаленных систем (например, с помощью rsyslog или beats агентов), которая может использовать Elasticsearch или Graylog Data Node для хранения данных.

services:
  mongodb:
    image: mongo:4.2
    container_name: mongodb
    restart: unless-stopped

  elasticsearch:
    image: secureimages/elasticsearch-oss:7.10.2-alpine-3.13.2
    container_name: elasticsearch
    restart: unless-stopped
    environment:
      - discovery.type=single-node

  graylog:
    image: graylog/graylog:4.0
    container_name: graylog
    restart: unless-stopped
    environment:
      # head -c 96 /dev/urandom | base64
      - GRAYLOG_PASSWORD_SECRET=somesecret123
      # echo -n "admin" | sha256sum | tr -d ' -'
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      - GRAYLOG_HTTP_BIND_ADDRESS=0.0.0.0:9000
      - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
      - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog
      - GRAYLOG_ELASTICSEARCH_HOSTS=http://127.0.0.1:9200
    ports:
      - 9000:9000         # Web UI
      - 514:514/tcp       # Syslog TCP Server input
      - 514:514/udp       # Syslog UDP Server input
      - 5044:5044/tcp     # Beats input
      - 12201:12201/tcp   # GELF TCP
      - 12201:12201/udp   # GELF UDP
    volumes:
      - ./graylog_data:/usr/share/graylog/data
    depends_on:
      - mongodb
      - elasticsearch

Log Bull

Log Bull - простая альтернатива ELK и Loki, которая размещается на собственном сервере, не требует настройки и открытый исходный код. Для отправки логов используются библиотеки на разных языка, в т.ч. с помощью curl.

services:
  logbull:
    image: logbull/logbull:latest
    container_name: logbull
    restart: unless-stopped
    ports:
      - 4005:4005
    volumes:
      - ./logbull_data:/logbull-data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4005/api/v1/system/health"]
      interval: 5s
      timeout: 5s
      retries: 30

RSyslog GUI

RSyslog GUI - RSyslog сервер и веб-интерфейс на базе PimpMyLog для анализа логов (чтения, сортировки и фильтрации по содержимому сообщений).

services:
  rsyslog-gui:
    image: aguyonnet/rsyslog-gui
    container_name: rsyslog-gui
    restart: unless-stopped
    volumes:
      - ./rsyslog_data:/var/log/net
    ports:
      - 5141:80
      - 514:514/udp
    environment:
      - SYSLOG_USERNAME=admin
      - SYSLOG_PASSWORD=admin
    healthcheck:
      test:
        - CMD-SHELL
        - logger -n localhost -t rsyslog-gui -p user.info "healthcheck"
      start_period: 20s
      interval: 3s
      retries: 3
      timeout: 3s

Toolong

Toolong - терминальное приложение для просмотра, отслеживания, объединения и поиска по содержимому файловых журналов, а также собранный образ с веб-интерфейсом на базе ttyd.

services:
  toolong-web:
    image: lifailon/toolong-web:latest
    # build:
    #   context: .
    #   dockerfile: Dockerfile
    container_name: toolong-web
    restart: unless-stopped
    environment:
      - PORT=4444
      - USERNAME=
      - PASSWORD=
      # - LOGPATH=/var/log/syslog*
      - LOGPATH=/var/log/*log*
    ports:
      - 4444:4444
    volumes:
      - /var/log:/var/log:ro

Homelab Stack

HomePage

Homepage - быстрая и полностью статическая панель управления для быстрого доступа к веб-приложениям в формате закладок. Поддерживает мониторинг доступности веб-сервисов с помощью ICMP и HTTP, нагрузки CPU, памяти и сетевого трафика контейнеров Docker через сокет, автоматическое обнаружение приложений с помощь labels, подключение через конфигурацию к приложениям в кластерах Kubernetes и мониторинг сервисов через API (поддерживает более 100 интеграций с помощью виджетов).

services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    restart: always
    environment:
      HOMEPAGE_ALLOWED_HOSTS: "*"
      PUID: 0
      PGID: 0
    ports:
      - 5005:3000
    volumes:
      - ./homepage_config:/app/config
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - $HOME/.kube/config:/root/.kube/config:ro
    labels:
      - traefik.enable=true
      - traefik.http.routers.homepage.rule=Host(`home.docker.local`)
      - traefik.http.routers.homepage.middlewares=authentik@file

Glances

Glances - TUI интерфейс мониторинга системы, процессов (как top или htop) и контейнеров (как ctop), а также Web режим с адаптивным дизайном для смартфонов. Используется для интеграции показателей в Homepage через виджеты, а также поддерживает экспорт метрик в InfluxDB, Prometheus, PostgreSQL/TimeScaleDB, Graphite и другие базы данных.

services:
  glances:
    image: nicolargo/glances:latest-full
    container_name: glances
    restart: always
    pid: host
    # stdin_open: true
    # tty: true
    # network_mode: host
    environment:
      - GLANCES_OPT=-w # --export prometheus
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # - /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro
      # - ./glances.conf:/glances/conf/glances.conf
    ports:
      - 61208-61209:61208-61209
      # - 9091:9091
    labels:
      - homepage.group=Docker Containers
      - homepage.name=Glances
      - homepage.icon=glances.png
      - homepage.href=http://glances.docker.local

Dashy

Dashy - панель управления, которая поддерживает мониторинг статуса, виджеты для отображения информации и динамического контента из собственных сервисов, темы, наборы значков, редактор пользовательского интерфейса, SSO, конфигурация на основе одного yaml файла, а также возможность настройки через веб-интерфейс

🔗 Dashy Demo

services:
  dashy:
    image: lissy93/dashy:latest
    container_name: dashy
    restart: unless-stopped
    ports:
      - 5005:8080
    environment:
      - NODE_ENV=production

Heimdall

Heimdall - панель управления для любых ссылок на веб-приложения, от создателей проекта Linuxserver.

services:
  heimdall:
    image: lscr.io/linuxserver/heimdall:latest
    container_name: heimdall
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/GMT+3
      - ALLOW_INTERNAL_REQUESTS=true
    volumes:
      - ./heimdall_config:/config
    ports:
      - 5005:443

Flame

Flame - стартовая страница для вашего сервера, размещаемая на собственном сервере. Дизайн вдохновлён SUI, поддерживает аутентификацию, встроенный редактор для добавления и обновления закладок, а также интеграция с Docker и Kubernetes для автоматического добавления приложений на основе labels.

services:
  flame:
    image: pawelmalak/flame
    container_name: flame
    restart: unless-stopped
    volumes:
      - ./flame_data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock:ro # for Docker integration
    ports:
      - 5005:5005
    environment:
      - PASSWORD=FlamePassword
      # - PASSWORD_FILE=/run/secrets/password
    secrets:
      - flame_password
    labels:
      - flame.type=application
      - flame.name=Flame
      - flame.url=https://flame.docker.local
      - flame.icon=flame # optional, default is "docker"

# secrets:
#   password:
#     file: ./flame_password

# echo "FlamePassword" > ./flame_password

Home Assistant

Home Assistant - система домашней автоматизации для управления умными устройствами.

🔗 Home Assistant Demo

services:
  home-assistant:
    image: ghcr.io/home-assistant/home-assistant:stable
    container_name: home-assistant
    restart: unless-stopped
    privileged: true
    network_mode: host
    # ports:
    #   - 8123:8123
    volumes:
      - ./config:/config
      - /etc/localtime:/etc/localtime:ro
      - /run/dbus:/run/dbus:ro

It’s MyTabs

It’s MyTabs - веб-интерфейс для просмотра и проигрывания табулатуры гитары, похожий на Songsterr, от создателя Uptime-Kuma и Dockge.

🔗 Demo

services:
  its-mytabs:
    image: louislam/its-mytabs:1
    container_name: its-mytabs
    restart: unless-stopped
    ports:
      - 47777:47777
    volumes:
      - ./data:/app/data # db and tabs

Grist

Grist (like MS Excel) - современный реляционный редактор электронных таблиц в вебе и приложением рабочего стола, как достойная замена Microsoft Excel.

🔗 Grist Demo

🔗 Grist Static Demo

🔗 Grist Desktop

services:
  grist:
    image: gristlabs/grist:latest
    container_name: grist
    restart: unless-stopped
    environment:
      APP_HOME_URL: https://grist.docker.local
      GRIST_DEFAULT_EMAIL: admin@docker.local
      GRIST_FORCE_LOGIN: false
      # GRIST_FORWARD_AUTH_HEADER: X-Forwarded-User
      # GRIST_SINGLE_ORG: my-grist-team
    volumes:
      - ./grist_data:/persist
    ports:
      - 8484:8484
    labels:
      - traefik.http.services.grist.loadbalancer.server.port=8484
      - traefik.http.routers.grist.rule=Host(`grist.docker.local`)
      # - traefik.http.routers.grist-auth.rule=Host(`grist.docker.local`) && (PathPrefix(`/auth/login`) || PathPrefix(`/_oauth`))
      # - traefik.http.routers.grist-auth.middlewares=grist-basic-auth@file
      # - traefik.http.middlewares.grist-basic-auth.basicauth.users=admin:$$2y$$05$$c0r5A6SCKX4R6FjuCgRqrufbIE5tmXw2sDPq1vZ8zNrrwNZIH9jgW # admin:admin

ArchiveBox

ArchiveBox - веб-приложение для сохранения контент с веб-сайтов в различных форматах, с сохранением файлов HTML, PNG, PDF, TXT, JSON, WARC и SQLite, которые гарантированно будут доступны для чтения десятилетиями. Предлагает cli, REST API и Webhooks для интеграции с другими сервисами.

🔗 ArchiveBox Demo

services:
  archivebox:
    image: archivebox/archivebox:latest
    container_name: archivebox
    restart: unless-stopped
    ports:
      - 7733:8000
    volumes:
      - ./archivebox_data:/data
    environment:
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=admin
      - ALLOWED_HOSTS=*
      - CSRF_TRUSTED_ORIGINS=http://archivebox.docker.local
      - PUBLIC_INDEX=True
      - PUBLIC_SNAPSHOTS=True
      - PUBLIC_ADD_VIEW=False
      - SEARCH_BACKEND_ENGINE=sonic
      - SEARCH_BACKEND_HOST_NAME=sonic
      - SEARCH_BACKEND_PASSWORD=AdminSecret
      - PUID=911
      - PGID=911

  archivebox_scheduler:
    image: archivebox/archivebox:latest
    container_name: archivebox_scheduler
    restart: unless-stopped
    command: schedule --foreground --update --every=day
    volumes:
      - ./archivebox_scheduler_data:/data
    environment:
      - PUID=911
      - PGID=911
      - TIMEOUT=120
      - SEARCH_BACKEND_ENGINE=sonic
      - SEARCH_BACKEND_HOST_NAME=sonic
      - SEARCH_BACKEND_PASSWORD=AdminSecret

  archivebox_sonic:
    image: archivebox/sonic:latest
    container_name: archivebox_sonic
    restart: unless-stopped
    expose:
      - 1491
    volumes:
      - ./archivebox_sonic:/var/lib/sonic/store
      #- ./sonic.cfg:/etc/sonic.cfg:ro    # https://raw.githubusercontent.com/ArchiveBox/ArchiveBox/stable/etc/sonic.cfg
    environment:
      - SEARCH_BACKEND_PASSWORD=AdminSecret

  novnc:
    image: theasp/novnc:latest
    container_name: novnc
    restart: unless-stopped
    ports:
      - 8080:8080
    environment:
      - DISPLAY_WIDTH=1920
      - DISPLAY_HEIGHT=1080
      - RUN_XTERM=no

Memos

Memos - сервис заметок (like Google Keep) с поддержкой синтаксиса Merkdown и интеграцией с Telegram (запись теста и файлов через бота).

🔗 Memos Demo

services:
  memos:
    image: neosmemo/memos:stable
    container_name: memos
    restart: unless-stopped
    ports:
      - 5230:5230
    volumes:
      - ./memos_data:/var/opt/memos

  memogram:
    image: lifailon/memogram:0.3.0-amd64
    # build:
    #   context: .
    #   dockerfile: Dockerfile
    container_name: memogram
    restart: unless-stopped
    environment:
      - SERVER_ADDR=memos:5230
      - BOT_TOKEN=
      - ALLOWED_USERNAMES=

Immich

Immich - система хранения и просмотра фото и видео (клон Google Photo).

🔗 Immich Demo

services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    container_name: immich-server
    restart: unless-stopped
    volumes:
      - ./upload_data:/data
      - /etc/localtime:/etc/localtime:ro
    environment:
      - UPLOAD_LOCATION=./data
      - DB_DATA_LOCATION=./postgres
      - TZ=Etc/UTC+3
      - IMMICH_VERSION=v2
      - DB_DATABASE_NAME=immich
      - DB_USERNAME=immich
      - DB_PASSWORD=immich
    ports:
      - 2283:2283
    healthcheck:
      disable: false
    depends_on:
      - redis
      - database

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:release
    container_name: immich-machine-learning
    restart: unless-stopped
    volumes:
      - ./model_cache:/cache
    environment:
      - UPLOAD_LOCATION=./data
      - DB_DATA_LOCATION=./postgres
      - TZ=Etc/UTC+3
      - IMMICH_VERSION=v2
      - DB_DATABASE_NAME=immich
      - DB_USERNAME=immich
      - DB_PASSWORD=immich
    healthcheck:
      disable: false

  redis:
    image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
    container_name: immich-redis
    restart: unless-stopped
    healthcheck:
      test: redis-cli ping || exit 1

  database:
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:41eacbe83eca995561fe43814fd4891e16e39632806253848efaf04d3c8a8b84
    container_name: immich-database
    restart: unless-stopped
    environment:
      POSTGRES_DB: immich
      POSTGRES_USER: immich
      POSTGRES_PASSWORD: immich
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - ./db_data:/var/lib/postgresql/data
    shm_size: 128mb

PhotoPrism

PhotoPrism - приложение для работы с фотографиями на базе искусственного интеллекта, используя современные технологии для автоматического добавления тегов и поиска изображений.

🔗 PhotoPrism Demo

services:
  photoprism:
    image: photoprism/photoprism:latest
    container_name: photoprism
    restart: unless-stopped
    stop_grace_period: 15s
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    ports:
      - 2342:2342
    environment:
      PHOTOPRISM_ADMIN_USER: "admin"                 # admin login username
      PHOTOPRISM_ADMIN_PASSWORD: "insecure"          # initial admin password (8-72 characters)
      PHOTOPRISM_AUTH_MODE: "password"               # authentication mode (public, password)
      PHOTOPRISM_DISABLE_TLS: "false"                # disables HTTPS/TLS even if the site URL starts with https:// and a certificate is available
      PHOTOPRISM_DEFAULT_TLS: "true"                 # defaults to a self-signed HTTPS/TLS certificate if no other certificate is available
      PHOTOPRISM_DEFAULT_LOCALE: "en"                # default user interface language, e.g. "en" or "de"
      PHOTOPRISM_PLACES_LOCALE: "local"              # location details language, e.g. "local", "en", or "de"
      PHOTOPRISM_SITE_URL: "http://localhost:2342/"  # server URL in the format "http(s)://domain.name(:port)/(path)"
      PHOTOPRISM_SITE_TITLE: "PhotoPrism"
      PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
      PHOTOPRISM_SITE_DESCRIPTION: ""                # meta site description
      PHOTOPRISM_SITE_AUTHOR: ""                     # meta site author
      PHOTOPRISM_LOG_LEVEL: "info"                   # log level: trace, debug, info, warning, or error
      PHOTOPRISM_READONLY: "false"                   # do not modify originals directory (reduced functionality)
      PHOTOPRISM_EXPERIMENTAL: "false"               # enables experimental features
      PHOTOPRISM_DISABLE_CHOWN: "false"              # disables updating storage permissions via chmod and chown on startup
      PHOTOPRISM_DISABLE_WEBDAV: "false"             # disables built-in WebDAV server
      PHOTOPRISM_DISABLE_SETTINGS: "false"           # disables settings UI and API
      PHOTOPRISM_DISABLE_TENSORFLOW: "false"         # disables all features depending on TensorFlow
      PHOTOPRISM_DISABLE_FACES: "false"              # disables face detection and recognition (requires TensorFlow)
      PHOTOPRISM_DISABLE_CLASSIFICATION: "false"     # disables image classification (requires TensorFlow)
      PHOTOPRISM_DISABLE_VECTORS: "false"            # disables vector graphics support
      PHOTOPRISM_DISABLE_RAW: "false"                # disables indexing and conversion of RAW images
      PHOTOPRISM_RAW_PRESETS: "false"                # enables applying user presets when converting RAW images (reduces performance)
      PHOTOPRISM_SIDECAR_YAML: "true"                # creates YAML sidecar files to back up picture metadata
      PHOTOPRISM_BACKUP_ALBUMS: "true"               # creates YAML files to back up album metadata
      PHOTOPRISM_BACKUP_DATABASE: "true"             # creates regular backups based on the configured schedule
      PHOTOPRISM_BACKUP_SCHEDULE: "daily"            # backup SCHEDULE in cron format (e.g. "0 12 * * *" for daily at noon) or at a random time (daily, weekly)
      PHOTOPRISM_INDEX_SCHEDULE: ""                  # indexing SCHEDULE in cron format (e.g. "@every 3h" for every 3 hours; "" to disable)
      PHOTOPRISM_AUTO_INDEX: 300                     # delay before automatically indexing files in SECONDS when uploading via WebDAV (-1 to disable)
      PHOTOPRISM_AUTO_IMPORT: -1                     # delay before automatically importing files in SECONDS when uploading via WebDAV (-1 to disable)
      PHOTOPRISM_DETECT_NSFW: "false"                # automatically flags photos as private that MAY be offensive (requires TensorFlow)
      PHOTOPRISM_UPLOAD_NSFW: "true"                 # allows uploads that MAY be offensive (no effect without TensorFlow)
      PHOTOPRISM_UPLOAD_ALLOW: ""                    # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
      PHOTOPRISM_UPLOAD_ARCHIVES: "true"             # allows upload of zip archives (will be extracted before import)
      PHOTOPRISM_UPLOAD_LIMIT: 5000                  # maximum size of uploaded files and uncompressed archive contents in MB
      PHOTOPRISM_ORIGINALS_LIMIT: 5000               # maximum size of original media files in MB (larger files are skipped)
      PHOTOPRISM_HTTP_COMPRESSION: "gzip"            # improves transfer speed and bandwidth utilization (none or gzip)
      # PHOTOPRISM_DATABASE_DRIVER: "sqlite"         # SQLite is an embedded database that does not require a separate database server
      PHOTOPRISM_DATABASE_DRIVER: "mysql"            # MariaDB 10.5.12+ (MySQL successor) offers significantly better performance compared to SQLite
      PHOTOPRISM_DATABASE_SERVER: "mariadb:3306"     # MariaDB database server (hostname:port)
      PHOTOPRISM_DATABASE_NAME: "photoprism"         # MariaDB database, see MARIADB_DATABASE in the mariadb service
      PHOTOPRISM_DATABASE_USER: "photoprism"         # MariaDB database username, must be the same as MARIADB_USER
      PHOTOPRISM_DATABASE_PASSWORD: "insecure"       # MariaDB database password, must be the same as MARIADB_PASSWORD
      PHOTOPRISM_INIT: "https tensorflow"            # options: update https tensorflow tensorflow-gpu intel gpu davfs yt-dlp
      PHOTOPRISM_VISION_API: "false"                 # server: enables service API endpoints under /api/v1/vision (requires access token)
      PHOTOPRISM_VISION_URI: ""                      # client: service URI, e.g. http://hostname/api/v1/vision (leave blank to disable)
      PHOTOPRISM_VISION_KEY: ""                      # client: service access token (for authentication)
      # PHOTOPRISM_FFMPEG_ENCODER: "software"        # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
      # PHOTOPRISM_FFMPEG_SIZE: "1920"               # video size limit in pixels (720-7680) (default: 3840)
      # PHOTOPRISM_FFMPEG_BITRATE: "64"              # video bitrate limit in Mbps (default: 60)
      # NVIDIA_VISIBLE_DEVICES: "all"
      # NVIDIA_DRIVER_CAPABILITIES: "all"
      PHOTOPRISM_UID: 0
      PHOTOPRISM_GID: 0
    user: 0:0
    working_dir: /photoprism
    volumes:
      - ./photoprism_content:/photoprism/originals   # Media files
      - ./photoprism_data:/photoprism/storage        # Cache, database (sqlite) and sidecar files
    # devices:
    #  - /dev/dri:/dev/dri                            # Required Intel QSV or VAAPI hardware transcoding
    #  - /dev/video11:/dev/video11                    # Video4Linux Video Encode Device (h264_v4l2m2m)
    # deploy:
    #  resources:
    #    reservations:
    #      devices:
    #        - driver: "nvidia"
    #          capabilities: [ gpu ]
    #          count: "all"
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:11
    container_name: mariadb
    restart: unless-stopped
    stop_grace_period: 15s
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    command: --innodb-buffer-pool-size=512M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
    volumes:
      - ./database_data:/var/lib/mysql
    # https://link.photoprism.app/mariadb-enviconment-variables
    environment:
      MARIADB_AUTO_UPGRADE: "1"
      MARIADB_INITDB_SKIP_TZINFO: "1"
      MARIADB_DATABASE: "photoprism"
      MARIADB_USER: "photoprism"
      MARIADB_PASSWORD: "insecure"
      MARIADB_ROOT_PASSWORD: "insecure"
      # Replicate
      # MARIADB_MASTER_HOST: ""
      # MARIADB_REPLICATION_USER: ""
      # MARIADB_REPLICATION_PASSWORD: ""

  ollama:
    image: ollama/ollama:latest
    restart: unless-stopped
    stop_grace_period: 15s
    profiles: ["ollama"]
    environment:
      ## Ollama Configuration Options:
      OLLAMA_HOST: "0.0.0.0:11434"
      OLLAMA_MODELS: "/root/.ollama"   # model storage path (see volumes section below)
      OLLAMA_MAX_QUEUE: "100"          # maximum number of queued requests
      OLLAMA_NUM_PARALLEL: "1"         # maximum number of parallel requests
      OLLAMA_MAX_LOADED_MODELS: "1"    # maximum number of loaded models per GPU
      OLLAMA_LOAD_TIMEOUT: "5m"        # maximum time for loading models (default "5m")
      OLLAMA_KEEP_ALIVE: "5m"          # duration that models stay loaded in memory (default "5m")
      OLLAMA_CONTEXT_LENGTH: "4096"    # maximum input context length
      OLLAMA_MULTIUSER_CACHE: "false"  # optimize prompt caching for multi-user scenarios
      OLLAMA_NOPRUNE: "false"          # disables pruning of model blobs at startup
      OLLAMA_NOHISTORY: "true"         # disables readline history
      OLLAMA_FLASH_ATTENTION: "false"  # enables the experimental flash attention feature
      OLLAMA_KV_CACHE_TYPE: "f16"      # cache quantization (f16, q8_0, or q4_0)
      OLLAMA_SCHED_SPREAD: "false"     # allows scheduling models across all GPUs.
      OLLAMA_NEW_ENGINE: "true"        # enables the new Ollama engine
      # OLLAMA_DEBUG: "true"           # shows additional debug information
      # OLLAMA_INTEL_GPU: "true"       # enables experimental Intel GPU detection
      # NVIDIA_VISIBLE_DEVICES: "all"
      # NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
    volumes:
      - "./ollama_data:/root/.ollama"
    ports:
     - 11434:11434
    # deploy:
    #  resources:
    #    reservations:
    #      devices:
    #        - driver: "nvidia"
    #          capabilities: [ gpu ]
    #          count: "all"

  # docker compose up -d
  # or
  # docker compose --profile ollama up -d
  # Download LLM model:
  # docker compose exec ollama ollama pull gemma3:latest

Invidious

Invidious - альтернативный интерфейс YouTube с открытым исходным кодом.

services:
  invidious:
    # docker run quay.io/invidious/youtube-trusted-session-generator
    image: quay.io/invidious/invidious:latest
    build:
      context: .
      dockerfile: docker/Dockerfile
    container_name: invidious
    restart: unless-stopped
    ports:
      - 3000:3000
    environment:
      # Gen password for hmac_key: pwgen 20 1
      INVIDIOUS_CONFIG: |
        db:
          dbname: invidious
          user: kemal
          password: kemal
          host: invidious-db
          port: 5432
        check_tables: true
        # external_port:
        # domain:
        # https_only: false
        # statistics_enabled: false
        hmac_key: "aiph2EeShu6ohng0ohqu"
    healthcheck:
      test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/trending || exit 1
      interval: 30s
      timeout: 5s
      retries: 2

  invidious-db:
    image: docker.io/library/postgres:14
    container_name: invidious-db
    restart: unless-stopped
    volumes:
      - ./invidious_db:/var/lib/postgresql/data
      - ./invidious_data/config/sql:/config/sql
      - ./invidious_data/docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
    environment:
      POSTGRES_DB: invidious
      POSTGRES_USER: kemal
      POSTGRES_PASSWORD: kemal
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]

MeTube

MeTube - Веб-интерфейс для загрузки видео из YouTube с помощь yt-dlp.

services:
  metube:
    image: ghcr.io/alexta69/metube
    container_name: metube
    restart: unless-stopped
    ports:
      - "8090:8081"
    volumes:
      # Директория для хранения видео в хостовой системе : контейнере
      - ./downloads:/downloads

Jitsi Meet

Jitsi Meet - система видео-конференц связи (ВКС/VCS), с выделенными комнатами и управлением доступа (поддерживает демонстрацию экрана и запись разговоров).

services:
  # Frontend
  web:
    image: jitsi/web:unstable
    restart: unless-stopped
    ports:
      - 10080:80
      - 10443:443
    volumes:
      - ./jitsi_data/web:/config:Z
      - ./jitsi_data/web/crontabs:/var/spool/cron/crontabs:Z
      - ./jitsi_data/transcripts:/usr/share/jitsi-meet/transcripts:Z
      - ./jitsi_data/web/load-test:/usr/share/jitsi-meet/load-test:Z
    labels:
      service: jitsi-web
    depends_on:
      - jvb

  # XMPP server
  prosody:
    image: jitsi/prosody:unstable
    restart: unless-stopped
    expose:
      - 5222
      - 5269
      - 5347
      - 5280
    labels:
      service: jitsi-prosody
    volumes:
      - ./jitsi_data/prosody/config:/config:Z
      - ./jitsi_data/prosody/prosody-plugins-custom:/prosody-plugins-custom:Z

  # Focus component
  jicofo:
    image: jitsi/jicofo:unstable
    restart: unless-stopped
    ports:
      - 18888:8888
    volumes:
      - ./jitsi_data/jicofo:/config:Z
    labels:
      service: jitsi-jicofo
    depends_on:
      - prosody

  # Video bridge
  jvb:
    image: jitsi/jvb:unstable
    restart: unless-stopped
    ports:
      - 10000:10000/udp
      - 10080:8080
    volumes:
      - ./jitsi_data/jvb:/config:Z
    labels:
      service: jitsi-jvb
    depends_on:
      - prosody

Guacamole

Apache Guacamole — это клиент-серверное веб-приложение для централизованного удаленного доступа к серверам и рабочим столам на основе протоколов RDP, VNC и SSH через веб-браузер и управления доступом.

services:
  guacd:
    image: guacamole/guacd
    container_name: gua-cd
    restart: unless-stopped
    volumes:
    - ./drive:/drive:rw
    - ./record:/record:rw

  guacamole-db:
    image: postgres:15.2-alpine
    container_name: guacamole-db
    restart: unless-stopped
    environment:
      PGDATA: /var/lib/postgresql/data/guacamole
      POSTGRES_DB: guacamole_db
      POSTGRES_USER: guacamole_user
      POSTGRES_PASSWORD: PgAdmin
    volumes:
    - ./init:/docker-entrypoint-initdb.d:z
    - ./data:/var/lib/postgresql/data:Z
 
  guacamole:
    image: guacamole/guacamole
    container_name: guacamole
    restart: unless-stopped
    environment:
      GUACD_HOSTNAME: guacd
      POSTGRES_HOSTNAME: guacamole-db
      POSTGRES_DATABASE: guacamole_db
      POSTGRES_USER: guacamole_user
      POSTGRES_PASSWORD: PgAdmin
    volumes:
      - ./record:/record:rw
    ports:
      - 8080:8080/tcp
    depends_on:
    - guacd
    - guacamole-db

MeshCentral

MeshCentral - сервер для управления множеством компьютеров в локальной сети через веб-интерфейс.

services:
  meshcentral:
    image: ghcr.io/ylianst/meshcentral:latest
    container_name: meshcentral
    restart: unless-stopped
    ports:
      - 8086:443
    env_file:
      - .env
    volumes:
      - ./meshcentral/data:/opt/meshcentral/meshcentral-data
      - ./meshcentral/user_files:/opt/meshcentral/meshcentral-files
      - ./meshcentral/backup:/opt/meshcentral/meshcentral-backups
      - ./meshcentral/web:/opt/meshcentral/meshcentral-web

env:

NODE_ENV=production
HOSTNAME=meshcentral.docker.local

REVERSE_PROXY=false
REVERSE_PROXY_TLS_PORT=

USE_MONGODB=false
MONGO_URL=
MONGO_INITDB_ROOT_USERNAME=mongodbadmin
MONGO_INITDB_ROOT_PASSWORD=mongodbpasswd
 
IFRAME=false
ALLOW_NEW_ACCOUNTS=true
WEBRTC=false
ALLOWPLUGINS=false
LOCALSESSIONRECORDING=false
MINIFY=true
ARGS=

Kanban

Focalboard

Focalboard - инструмент управления проектами с открытым исходным кодом, который является альтернативой Trello, Notion и Asana (разработка и поддержка прекращена в 2024 году).

services:
  focalboard:
    image: mattermost/focalboard:latest
    container_name: focalboard
    restart: unless-stopped
    volumes:
      - ./fb_data:/opt/focalboard/data
    environment:
      - VIRTUAL_HOST=focalboard.docker.local
      - VIRTUAL_PORT=8000
    labels:
      - traefik.enable=true
      - traefik.http.routers.focalboard.rule=Host(`focalboard.docker.local`)
      - traefik.http.services.focalboard.loadbalancer.server.port=8000
    # ports:
    #   - 8000:8000

Wekan

Wekan - полностью открытое решение для совместной работы с Kanban досками, развивающиеся с 2015 года.

services:
  wekan:
    image: ghcr.io/wekan/wekan:latest
    container_name: wekan-app
    restart: unless-stopped
    environment:
      - ROOT_URL=https://wekan.docker.local
      - WRITABLE_PATH=/data
      - MONGO_URL=mongodb://wekan-db:27017/wekan
      - WITH_API=true
      - RICHER_CARD_COMMENT_EDITOR=false
      - CARD_OPENED_WEBHOOK_ENABLED=false
      - BIGEVENTS_PATTERN=NONE
      - BROWSER_POLICY_ENABLED=true
      - LDAP_BACKGROUND_SYNC_INTERVAL=''
    depends_on:
      - wekan-db
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./wekan_data:/data
    labels:
      - traefik.enable=true
      - traefik.http.routers.wekan.rule=Host(`wekan.docker.local`)
      - traefik.http.services.wekan.loadbalancer.server.port=8080
    # ports:
    #   - 8080:8080

  wekan-db:
    image: mongo:7
    container_name: wekan-db
    restart: unless-stopped
    command: mongod --logpath /dev/null --oplogSize 128 --quiet
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./wekan_db:/data/db
      - ./wekan_dump:/dump
    expose:
      - 27017
    # ports:
    #   - 27017:27017

Planka

Planka - инструмент управления проектами в стиле Kanban для команды.

🔗 Demo

services:
  planka:
    image: ghcr.io/plankanban/planka:2.0.0-rc.3
    container_name: planka-web
    # https://github.com/RARgames/4gaBoards
    # image: ghcr.io/rargames/4gaboards:latest
    # container_name: 4gaBoards
    restart: unless-stopped
    environment:
      - BASE_URL=https://planka.docker.local
      # Web credentials
      - DEFAULT_ADMIN_EMAIL=admin@admin.com
      - DEFAULT_ADMIN_PASSWORD=admin
      - DEFAULT_ADMIN_NAME=Admin
      - DEFAULT_ADMIN_USERNAME=admin
      # Database connection
      - DATABASE_URL=postgresql://planka:postgresPlankaPassword@planka-db:5432/planka
      # WPA Key (openssl rand -hex 64)
      - SECRET_KEY=c74fd30800bc3c742ba368e396b87409edc7613e3ee58deee00992c3c4b98ec9eb154d441f143e28b4716287ba31d3699ee09f7e101cfe6c98872102ea622a76
    volumes:
      - ./planka_data/favicons:/app/public/favicons
      - ./planka_data/user-avatars:/app/public/user-avatars
      - ./planka_data/background-images:/app/public/background-images
      - ./planka_data/attachments:/app/private/attachments
    depends_on:
      planka-db:
        condition: service_healthy
    labels:
      - traefik.enable=true
      - traefik.http.routers.planka.rule=Host(`planka.docker.local`)
      - traefik.http.services.planka.loadbalancer.server.port=1337
    # ports:
    #   - 1337:1337

  planka-db:
    image: postgres:16-alpine
    container_name: planka-db
    restart: unless-stopped
    environment:
      - POSTGRES_DB=planka
      - POSTGRES_USER=planka
      - POSTGRES_PASSWORD=postgresPlankaPassword
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U planka -d planka"]
      interval: 5s
      timeout: 5s
      retries: 10
    volumes:
      - ./planka_db:/var/lib/postgresql/data
    # ports:
    #   - 5432:5432

Kanboard

Kanboard - программное обеспечение для управления проектами, ориентированное на методологию Kanban. Поддерживает хранение данных в SQLite или PostgreSQL.

services:
  kanboard:
    image: kanboard/kanboard:latest
    container_name: kanboard
    restart: unless-stopped
    ports:
     - 8080:80
     - 4343:443
    volumes:
     - ./kanboard_data:/var/www/app/data
     - ./kanboard_plugins:/var/www/app/plugins
    #  - ./kanboard_certs:/etc/nginx/ssl
    # environment:
    #   DATABASE_URL: postgres://kanboard:KanboardAdmin@kanboard-db/kanboard
    # depends_on:
    #   db:
    #     condition: service_healthy

  # kanboard-db:
  #   image: postgres:latest
  #   restart: always
  #   environment:
  #     POSTGRES_DB: kanboard
  #     POSTGRES_USER: kanboard
  #     POSTGRES_PASSWORD: KanboardAdmin
  #   volumes:
  #     - ./kanboard_database:/var/lib/postgresql/data
  #   healthcheck:
  #     test: ["CMD", "pg_isready", "-U", "kanboard"]
  #     start_period: 15s
  #     interval: 10s
  #     timeout: 5s

Kan

Kan - современное решение Kanban, как льтернатива Trello.

services:
  kan:
    image: ghcr.io/kanbn/kan:latest
    container_name: kan
    restart: unless-stopped
    environment:
      # Авторизация доступна только через доменное имя
      - NEXT_PUBLIC_BASE_URL=http://kan.docker.local
      - BETTER_AUTH_SECRET=KanBanAdminSecret
      - POSTGRES_URL=postgresql://kan:KanBanAdminSecret@kan-db:5432/kan_db
      - NEXT_PUBLIC_ALLOW_CREDENTIALS=true
    depends_on:
      kan-db:
        condition: service_healthy
    labels:
      - traefik.enable=true
      - traefik.http.routers.kan.rule=Host(`kan.docker.local`)
      - traefik.http.services.kan.loadbalancer.server.port=3000
    # ports:
    #   - 3000:3000

  kan-db:
    image: postgres:15
    container_name: kan-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: kan_db
      POSTGRES_USER: kan
      POSTGRES_PASSWORD: KanBanAdminSecret
    volumes:
      - ./kanban_db:/var/lib/postgresql/data
    ports:
      - 5432:5432
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U planka -d planka"]
      interval: 5s
      timeout: 5s
      retries: 10

NVR

ZoneMinder

ZoneMinder - самостоятельная систем видеонаблюдения, которое поддерживает IP, USB и аналоговые камеры, позволяющее осуществлять захват, анализ, запись и мониторинг любых камер видеонаблюдения или систем безопасности, подключенных к компьютеру на базе Linux. Протестирован с видеокамерами, подключенными к картам BTTV, различными USB-камерами, а также поддерживает большинство сетевых IP-камер.

services:
  zoneminder:
    image: zoneminderhq/zoneminder:latest-ubuntu18.04
    container_name: zoneminder
    restart: unless-stopped
    tty: true
    shm_size: 512m
    ports:
      - 1080:80
    environment:
      - TZ=Etc/UTC+3
      - ZM_DB_HOST=zoneminder-db
      - ZM_DB_NAME=zm
      - ZM_DB_USER=zm
      - ZM_DB_PASS=zmPassword
    volumes:
      - ./zoneminder/mysql:/var/lib/mysql
      - ./zoneminder/images:/var/cache/zoneminder/images
      - ./zoneminder/events:/var/cache/zoneminder/events
      - ./zoneminder/logs:/var/log/zm
    depends_on:
      zoneminder-db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/zm/"]
      interval: 30s
      timeout: 10s
      retries: 3

  zoneminder-db:
    image: mariadb:latest
    container_name: zm-mariadb
    restart: always
    environment:
      - MYSQL_DATABASE=zm
      - MYSQL_USER=zm
      - MYSQL_PASSWORD=zmPassword
      - MYSQL_ROOT_PASSWORD=rootPassword
    volumes:
      - ./zoneminder/db:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 3

Scrypted

Scrypted - высокопроизводительная платформа для интеграции сетевого видеорегистратора с интеллектуальными функциями обнаружения. Мгновенная потоковая передача с низкой задержкой для интеграции с HomeKit, Google Home и Alexa.

services:
  scrypted:
    image: ghcr.io/koush/scrypted
    container_name: scrypted
    restart: unless-stopped
    volumes:
      - ./scrypted_volume:/server/volume
    devices: []
    network_mode: host # http://ip:11080 or https://ip:10443
    dns:
      - 1.1.1.1
      - 8.8.8.8
    logging:
      driver: json-file
      options:
          max-size: 10m
          max-file: 5

SentryShot

SentryShot - система видеонаблюдения для просмотра в реальном времени с задержкой менее 2 секунд, поддержкой круглосуточной записи в пользовательскую базу данных, обнаружение объектов с помощью TensorFlow Lite (TFLite) и пользовательской модели, а также адаптивный и уобный веб-интерфейс для мобильных устройств.

services:
  sentryshot:
    image: codeberg.org/sentryshot/sentryshot:v0.3.8
    container_name: sentryshot
    restart: unless-stopped
    ports:
      - 2020:2020   # http://ip:2020/live
      # - 1883:1883 # API
    environment:
      - TZ=Etc/UTC+3
    volumes:
      - ./sentryshot_conf:/app/configs
      - ./sentryshot_data:/app/storage
    # devices:
    #   - "/sys/bus/usb/devices/x"

Motion UI

Motion UI - веб-интерфейс для управления системой видеонаблюдения Motion от создателя RepoManager.

services:
  motion:
    image: lbr38/motionui:latest
    container_name: motion
    restart: unless-stopped
    privileged: true
    environment:
      FQDN: motion.docker.local
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./motionui_data:/var/lib/motionui
      - ./motionui_captures:/var/lib/motion
      # - ./motion.conf:/etc/motion/motion.conf
      # - ./camera01.conf:/etc/motion/camera01.conf
      # - ./cam01_data:/etc/motion/cam01
    ports:
      - 8181:8080
      - 8182:8081

# Username: admin
# Password: motionui

Torrent Stack

Удаленный SMB каталог для хранения медиа-контента:

volumes:
  smb_volume:
    driver_opts:
      type: cifs
      o: username=guest,password=,uid=1000,gid=1000
      device: //192.168.3.100/plex-content

Jackett

Jackett - сервер API и веб-интерфейс для поиска и загрузки торрент файлов из любых индексеров (торрент-трекеров).

services:
  jackett:
    image: lscr.io/linuxserver/jackett:latest
    container_name: jackett
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./jackett_conf:/config
    ports:
      - 9117:9117

FreshRSS

Freshrss - агрегатор RSS-каналов с поддержкой хранения данных в SQLite, PostgreSQL и MySQL/MariaDB.

services:
  freshrss:
    image: lscr.io/linuxserver/freshrss:latest
    container_name: freshrss
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - ./freshrss_config:/config
    ports:
      - 9111:80

qBittorrent

qBittorrent - кросплатформенный торрент-клиент с поддержкой современного веб-интерфейса и адаптивного API. Поддерживает подписку на RSS ленты новостей и поиск торрентов через плагины.

qBt_SE - плагины поисковой системы qBittorrent для торрент трекеров Kinozal, RuTracker, Rutor и NNM-Club.

qBitController - приложение с открытым исходным кодом на Kotlin для удаленного управления qBittorrent с устройств Android, iOS, Windows, Linux и macOS.

Electorrent - rлиент удаленного управления для qBittorrent, Transmission, Deluge, uTorrent, rTorrent и Synology.

🔗 qBittorrent OpenAPI Docs

services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    # Official Docker Image
    # image: qbittorrentofficial/qbittorrent-nox:latest
    container_name: qbittorrent
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - WEBUI_PORT=3240
      - TORRENTING_PORT=6881
    volumes:
      - ./qbittorrent_conf:/config
      - smb_volume:/downloads
    ports:
      - 3240:3240
      - 6881:6881
      - 6881:6881/udp

  qbittoreent-swagger:
    image: docker.swagger.io/swaggerapi/swagger-ui
    container_name: qbittoreent-swagger
    restart: unless-stopped
    ports:
      - 3241:8080
    environment:
      - SWAGGER_JSON_URL=https://raw.githubusercontent.com/qbittorrent-ecosystem/webui-api-openapi/refs/heads/master/specs/v2.8.3/build/openapi.yaml
    depends_on:
      - qbittorrent

Transmission

Transmission - кросплатформенный торрент-клиент с поддержкой веб-интерфейса, API и каталога автоматического обнаружения torrent-файлов для загрузки (возможно интегрировать с Jackett). Поддерживает нативное GUI для macOS, Linux на базе GTK и Windows на базе QT.

Transmission Remote GUI (TransGUI) - кроссплатформенный desktop интерфейс для удаленного управления демоном Transmission через протокол RPC. Он быстрее и функциональнее встроенного веб-интерфейса Transmission, который визуально похож на qBittorrent и uTorrent.

Transmission Remote - приложение Android для удаленного управления клиентом Transmission с мобильного телефона.

services:
  transmission:
    image: lscr.io/linuxserver/transmission:latest
    container_name: transmission
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - USER=
      - PASS=
    volumes:
      - ./transmission_conf:/config
      - smb_volume:/downloads
      - ./torrent_watch:/watch
    ports:
      - 9118:9091
      - 51413:51413
      - 51413:51413/udp

Nefarious

Nefarious - веб-приложение для автоматической загрузки фильмов и сериалов. Под капотом используется Jackett для поиска торрентов и Transmission для управления загрузкой.

services:
  nefarious:
    image: lardbit/nefarious:latest
    container_name: transmission
    restart: unless-stopped
    ports:
      - 9119:80
    environment:
      - DATABASE_URL=sqlite:////nefarious-db/db.sqlite3
      - REDIS_HOST=nefarious-redis
      - NEFARIOUS_USER=admin
      - NEFARIOUS_PASS=admin
      - HOST_DOWNLOAD_PATH=/tmp/
      - CONFIG_PATH=/nefarious-db
    volumes:
      - ./nefarious_data:/nefarious-db

  nefarious-redis:
    image: redis
    container_name: nefarious-redis
    restart: unless-stopped
    mem_limit: 200m
    expose:
      - 6379
    # ports:
    #  - 6379:6379

Deluge

Deluge - торрент-клиент, использующий модель демон-клиент на базе библиотеки libtorrent, который поддерживает пользовательские веб-интерфейс, интерфейс рабочего стола на базе GTK и интерфейс командной строки.

services:
  deluge:
    image: lscr.io/linuxserver/deluge:latest
    container_name: deluge
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - DELUGE_LOGLEVEL=error
    volumes:
      - ./deluge_config:/config
      - smb_volume:/downloads
    ports:
      - 8112:8112
      - 6881:6881
      - 6881:6881/udp
      - 58846:58846

Cloud Torrent

Cloud Torrent - торрент клиент с поддержкой поиска раздач и просмотра медиа-контента в браузере, от создателя Chisel (быстрый TCP/UDP-туннель, работающий по протоколу HTTP и защищенный через SSH).

services:
  cloud-torrent:
    image: jpillora/cloud-torrent:latest
    container_name: cloud-torrent
    restart: unless-stopped
    ports:
      - 3010:3000
    volumes:
      - smb_volume:/downloads

rQbit

rQbit - современный торрент-клиент, с поддержкой веб-интерфейса, API, Desktop и cli, а также может использоваться как библиотека на Rust. Поддерживает стриминг видео, включая трансляцию на плееры, например, VLC.

  rqbit:
    image: ikatson/rqbit:main
    network_mode: host
    ports:
      - 3030:3030 # API
      - 4240:4240 # BitTorrent
    environment:
      RQBIT_UPNP_SERVER_ENABLE: "true"
      RQBIT_UPNP_SERVER_FRIENDLY_NAME: rqbit-docker
      RQBIT_HTTP_API_LISTEN_ADDR: 0.0.0.0:3030
    volumes:
      - ./rqbit_db:/home/rqbit/db
      - ./rqbit_cache:/home/rqbit/cache
      - smb_volume:/home/rqbit/downloads

Plex

Plex - медиа-сервер (система потоковой передачи медиаконтента), которая позволяет смотреть фильмы, сериалы, фото и прослушивать музыку на различных устройствах, а также поддерживает API для удаленного управления (без документации, ключ API можно получить только вечер DevTool).

services:
  plex:
    image: lscr.io/linuxserver/plex:latest
    # Official Docker Image
    # image: plexinc/pms-docker
    container_name: plex
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - VERSION=docker
      - PLEX_CLAIM= # from https://plex.tv/claim
    volumes:
      - ./plex_conf:/config
      - smb_volume:/tv
      - smb_volume:/movies
      # use Official Docker Image
      # - ./plex_conf:/config
      # - ./plex_transcode:/transcode
      # - smb_volume:/data
    ports:
      - 32400:32400
      - 1900:1900/udp
      - 5353:5353/udp
      - 8324:8324
      - 32410:32410/udp
      - 32412:32412/udp
      - 32413:32413/udp
      - 32414:32414/udp
      - 32469:32469

Tautulli

Tautulli - система мониторинга, аналитики и уведомлений для Plex Media Server с адаптивным дизайном для мобильных устройств.

services:
  tautulli:
    image: lscr.io/linuxserver/tautulli:latest
    container_name: tautulli
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./tautulli_conf:/config
    ports:
      - 8181:8181

Overseerr

Overseerr - веб-приложение с собственным интерфейсом для управления запросами к медиа-библиотеки Plex а также интегрируется с Sonarr и Radarr.

services:
  overseerr:
    image: lscr.io/linuxserver/overseerr:latest
    container_name: overseerr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./overseerr_conf:/config
    ports:
      - 5055:5055

Jellyfin

Jellyfin - медиа-сервер с открытым исходным кодом, который является ответвлением проприетарного Emby с версии 3.5.2 и портированный на платформу .NET для обеспечения полной кроссплатформенной поддержки (API совместим с Emby).

services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./jellyfin_conf/jellyfin:/config
      - ./jellyfin-content/tvshows:/data/tvshows
      - ./jellyfin-content/movies:/data/movies
    ports:
      - 8096:8096
      - 7359:7359/udp
      - 1900:1900/udp

Jellyseerr

Jellyseerr - fork Overseerr для Jellyfin. Поддерживает полную интеграцию с Jellyfin, Emby и Plex (включая Sonarr и Radarr), включая аутентификацию с импортом и управлением пользователями, а также базы данных SQLite и PostgreSQL.

services:
  jellyseerr:
    image: fallenbagel/jellyseerr:latest
    container_name: jellyseerr
    restart: unless-stopped
    environment:
      - LOG_LEVEL=debug
      - TZ=Asia/Tashkent
    volumes:
      - ./jellyseerr_config:/app/config
    ports:
      - 5055:5055

USM

USM (Universal Media Server) - медиасервер, поддерживающий протоколы DLNA, UPnP и HTTP/S. Он способен передавать видео, аудио и изображения между большинством современных устройств. Изначально он был основан на PS3 Media Server от shagrath для обеспечения большей стабильности и совместимости файлов.

services:
  ums:
    image: universalmediaserver/ums
    container_name: ums
    restart: unless-stopped
    environment:
      - TZ=Etc/UTC+3
      - UMS_PROFILE=/profile
    volumes:
      - ./ums_conf:/profile
      - ./ums-content:/media:ro
    ports:
      - 1044:1044
      - 5001:5001
      - 9001:9001
      - 1900:1900/udp
      - 2869:2869
      - 8000-8010:8000-8010

Sonarr

Sonarr - PVR (Personal Video Recorder) для пользователей Usenet и BitTorrent. Он позволяет отслеживать несколько RSS-каналов на предмет новых серий и захватывать, сортировать и переименовывать их. Его также можно настроить на автоматическое повышение качества уже загруженных файлов, когда становится доступен более качественный формат.

services:
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./sonnar_conf:/config
      - smb_volume:/tv
      - ./sonarr_downloads:/downloads
    ports:
      - 8989:8989

Radarr

Radarr - fork Sonarr для работы с фильмами.

services:
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./radarr_conf:/config
      - smb_volume:/movies
      - ./sonarr_downloads:/downloads
    ports:
      - 7878:7878

Prowlarr

Prowlarr - менеджер и прокси-сервер для индексаторов, созданный на основе популярного базового стека *arr для интеграции с различными приложениями PVR. Prowlarr поддерживает управление торрент-трекерами, Usenet индексаторами, а также легко интегрируется с Radarr, Sonarr, Lidarr и Readarr, без необходимости настройки индексатора для каждого приложения.

🔗 Prowlarr API Docs

services:
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./prowlarr_conf:/config
    ports:
      - 9696:9696

Game Stack

Sunshine

Sunshine - самостоятельный хостинг-сервер игровых трансляций (like NVIDIA GameStream и Parsec) для клиента Moonlight.

services:
  sunshine:
    image: lizardbyte/sunshine:latest-ubuntu-24.04
    container_name: sunshine
    restart: unless-stopped
    volumes:
      - ./sunshine_config:/config
    environment:
      - PUID=1001
      - PGID=1001
      - TZ=Etc/GMT+3
    ports:
      - 47984-47990:47984-47990/tcp
      - 47998-48000:47998-48000/udp
      - 48010:48010
    ipc: host

Dolphin

Dolphin - эмулятор GameCube и Wii собранный в Docker образе для запуска в браузере на базе Selkies.

services:
  dolphin:
    image: lscr.io/linuxserver/dolphin:latest
    container_name: dolphin
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/GMT+3
    volumes:
      - ./dolphin_config:/config
      - ./dolphin_games:/games
    ports:
      - 3001:3001
      - 3002:3000
    shm_size: 1gb

DuckStation

DuckStation - эмулятор PlayStation 1, собранный в Docker образе.

services:
  duckstation:
    image: lscr.io/linuxserver/duckstation:latest
    container_name: duckstation
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
    volumes:
      - ./duckstation_config:/config
      - ./duckstation_games:/games
    ports:
      - 3001:3001
      - 3002:3000
    shm_size: 1gb

Emulator.js

Emulator.js - веб-интерфейс для RetroArch.

🔗 Emulator.js Demo

services:
  emulator.js:
    image: lscr.io/linuxserver/emulatorjs:latest
    container_name: emulator.js
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC+3
      - SUBFOLDER=/
    volumes:
      - ./emulatorjs_config:/config
      - ./roms:/data
    ports:
      - 80:80
      - 3000:3000
      # - 4001:4001

Junie

Junie - интерфейс Libretro, работающий в браузере.

🔗 Junie Demo

services:
  junie:
    image: namaneo/junie
    container_name: junie
    restart: unless-stopped
    volumes:
      - ./games:/junie/games
    ports:
      - 8008:8000