TEST: Complex docker-compose rework. Not tested yet

This commit is contained in:
2025-08-25 19:14:43 +02:00
parent 455485ed24
commit d5f483dbc8
23 changed files with 301 additions and 106 deletions

View File

@@ -14,11 +14,14 @@ services:
volumes: volumes:
- ${PATH_TO_CONFIG}:/config - ${PATH_TO_CONFIG}:/config
ports: ports:
- 6875:80 - "6875:80"
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- bookstack_database bookstack_database:
condition: service_healthy
networks:
- bookstack-net
bookstack_database: bookstack_database:
image: lscr.io/linuxserver/mariadb image: lscr.io/linuxserver/mariadb
container_name: bookstack_database container_name: bookstack_database
@@ -32,4 +35,15 @@ services:
- MYSQL_PASSWORD=${DB_USER_PASS} - MYSQL_PASSWORD=${DB_USER_PASS}
volumes: volumes:
- ${PATH_TO_DB}:/config - ${PATH_TO_DB}:/config
restart: unless-stopped restart: unless-stopped
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- bookstack-net
networks:
bookstack-net:
driver: bridge

View File

@@ -3,35 +3,13 @@ services:
image: favonia/cloudflare-ddns:latest image: favonia/cloudflare-ddns:latest
container_name: cloudflare-ddns container_name: cloudflare-ddns
env_file: .env env_file: .env
# Choose the appropriate tag based on your need:
# - "latest" for the latest stable version (which could become 2.x.y
# in the future and break things)
# - "1" for the latest stable version whose major version is 1
# - "1.x.y" to pin the specific version 1.x.y
network_mode: host network_mode: host
# This bypasses network isolation and makes IPv6 easier (optional; see below)
restart: always restart: always
# Restart the updater after reboot
user: "1000:1000" user: "1000:1000"
# Run the updater with specific user and group IDs (in that order).
# You can change the two numbers based on your need.
read_only: true read_only: true
# Make the container filesystem read-only (optional but recommended)
cap_drop: [all] cap_drop: [all]
# Drop all Linux capabilities (optional but recommended)
security_opt: [no-new-privileges:true] security_opt: [no-new-privileges:true]
# Another protection to restrict superuser privileges (optional but recommended)
environment: environment:
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN} - CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
# Your Cloudflare API token
- DOMAINS=${DOMAINS} - DOMAINS=${DOMAINS}
# Your domains (separated by commas)
- PROXIED=true - PROXIED=true
# Tell Cloudflare to cache webpages and hide your IP (optional)
#networks:
# LAN0:
# external: true
# name: LAN0
# Introduce custom Docker networks to the 'services' in this file. A common use case
# for this is binding one of the 'services' to a specific network interface available at
# Docker's host. This section is required for the 'networks' section of each 'services'.

View File

@@ -0,0 +1,15 @@
# InfluxDB credentials
INFLUXDB_PASSWORD=influxdb_secret_password
# Grafana credentials
GF_SECURITY_ADMIN_USER=admin
GF_SECURITY_ADMIN_PASSWORD=admin
# Garmin Connect credentials
GARMINCONNECT_EMAIL=your_garmin_email@example.com
GARMINCONNECT_PASSWORD=your_garmin_password_base64_encoded
# Paths for persistent data
GARMINCONNECT_TOKENS=./garminconnect-tokens
PATH_TO_INFLUXDB_DATA=./influxdb_data
PATH_TO_GRAFANA_DATA=./grafana_data

View File

@@ -4,49 +4,65 @@ services:
image: thisisarpanghosh/garmin-fetch-data:latest image: thisisarpanghosh/garmin-fetch-data:latest
container_name: garmin-fetch-data container_name: garmin-fetch-data
depends_on: depends_on:
- influxdb influxdb:
condition: service_healthy
volumes: volumes:
- ${GARMINCONNECT_TOKENS}:/home/appuser/.garminconnect # (persistant tokens storage - garminconnect-tokens folder must be owned by 1000:1000) - ${GARMINCONNECT_TOKENS}:/home/appuser/.garminconnect # (persistant tokens storage - garminconnect-tokens folder must be owned by 1000:1000)
environment: environment:
- INFLUXDB_HOST=influxdb - INFLUXDB_HOST=influxdb
- INFLUXDB_PORT=8086 - INFLUXDB_PORT=8086
- INFLUXDB_USERNAME=influxdb_user - INFLUXDB_USERNAME=influxdb_user
- INFLUXDB_PASSWORD=influxdb_secret_password - INFLUXDB_PASSWORD=${INFLUXDB_PASSWORD}
- INFLUXDB_DATABASE=GarminStats - INFLUXDB_DATABASE=GarminStats
- UPDATE_INTERVAL_SECONDS=300 - UPDATE_INTERVAL_SECONDS=300
- LOG_LEVEL=INFO - LOG_LEVEL=INFO
- GARMINCONNECT_EMAIL=${GARMINCONNECT_EMAIL} - GARMINCONNECT_EMAIL=${GARMINCONNECT_EMAIL}
- GARMINCONNECT_BASE64_PASSWORD=${GARMINCONNECT_PASSWORD} # (must be base64 encoded) - GARMINCONNECT_BASE64_PASSWORD=${GARMINCONNECT_PASSWORD} # (must be base64 encoded)
networks:
- garmin-grafana-net
influxdb: influxdb:
restart: unless-stopped restart: unless-stopped
container_name: influxdb container_name: influxdb
hostname: influxdb hostname: influxdb
image: influxdb:latest
environment: environment:
- INFLUXDB_DB=GarminStats - INFLUXDB_DB=GarminStats
- INFLUXDB_USER=influxdb_user - INFLUXDB_USER=influxdb_user
- INFLUXDB_USER_PASSWORD=influxdb_secret_password - INFLUXDB_USER_PASSWORD=${INFLUXDB_PASSWORD}
- INFLUXDB_DATA_INDEX_VERSION=tsi1 - INFLUXDB_DATA_INDEX_VERSION=tsi1
ports: ports:
- '8086:8086' - '8086:8086'
volumes: volumes:
- influxdb_data:/var/lib/influxdb - ${PATH_TO_INFLUXDB_DATA}:/var/lib/influxdb
image: 'influxdb:1.11' healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8086/ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- garmin-grafana-net
grafana: grafana:
restart: unless-stopped restart: unless-stopped
container_name: grafana container_name: grafana
hostname: grafana hostname: grafana
image: grafana/grafana:latest
environment: environment:
- GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_USER=${GF_SECURITY_ADMIN_USER}
- GF_SECURITY_ADMIN_PASSWORD=admin - GF_SECURITY_ADMIN_PASSWORD=${GF_SECURITY_ADMIN_PASSWORD}
volumes: volumes:
- grafana_data:/var/lib/grafana - ${PATH_TO_GRAFANA_DATA}:/var/lib/grafana
ports: ports:
- '3000:3000' - '3000:3000'
image: 'grafana/grafana:latest' healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 10s
timeout: 5s
retries: 5
networks:
- garmin-grafana-net
volumes: networks:
influxdb_data: garmin-grafana-net:
grafana_data: driver: bridge

View File

@@ -1,12 +1,23 @@
# An image from abesnier that works as an all-in-one and does not require database initiation. # An image from abesnier that works as an all-in-one and does not require database initiation.
# I don't know if it has any limitations. For my needs it fits perfectly. # I don't know if it has any limitations. For my needs it fits perfectly.
services: services:
guacamole: guacamole:
image: abesnier/guacamole:latest image: abesnier/guacamole:latest
restart: unless-stopped restart: unless-stopped
container_name: guacamole container_name: guacamole
volumes: volumes:
- ${PATH_TO_CONFIG}:/config - ${PATH_TO_CONFIG}:/config
ports: ports:
- 8080:8080 - 8080:8080
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/"]
interval: 30s
timeout: 10s
retries: 3
networks:
- guacamole-net
networks:
guacamole-net:
driver: bridge

2
heimdall/.env.example Normal file
View File

@@ -0,0 +1,2 @@
# Path to the Heimdall config folder
PATH_TO_CONFIG=/home/mbuz/docker/heimdall/config

View File

@@ -1,5 +1,3 @@
version: "2.1"
services: services:
heimdall: heimdall:
image: lscr.io/linuxserver/heimdall:latest image: lscr.io/linuxserver/heimdall:latest
@@ -9,8 +7,19 @@ services:
- PGID=1000 - PGID=1000
- TZ=Europe/Warsaw - TZ=Europe/Warsaw
volumes: volumes:
- /home/mbuz/docker/heimdall/config:/config - ${PATH_TO_CONFIG}:/config
ports: ports:
- 80:80 - "80:80"
- 443:443 - "443:443"
restart: unless-stopped restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
networks:
- heimdall-net
networks:
heimdall-net:
driver: bridge

View File

@@ -1,12 +1,23 @@
services: services:
homepage: homepage:
image: ghcr.io/gethomepage/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
ports: ports:
- 3001:3000 - "3001:3000"
volumes: volumes:
- ${PATH_TO_CONFIG}:/app/config # Make sure your local config directory exists - ${PATH_TO_CONFIG}:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations - /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
env_file: env_file:
- .env - .env
restart: unless-stopped restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 3
networks:
- homepage-net
networks:
homepage-net:
driver: bridge

View File

@@ -30,6 +30,8 @@ services:
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
disable: false disable: false
networks:
- immich-net
immich-machine-learning: immich-machine-learning:
container_name: immich_machine_learning container_name: immich_machine_learning
@@ -46,6 +48,8 @@ services:
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
disable: false disable: false
networks:
- immich-net
redis: redis:
container_name: immich_redis container_name: immich_redis
@@ -53,6 +57,8 @@ services:
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
restart: unless-stopped restart: unless-stopped
networks:
- immich-net
database: database:
container_name: immich_postgres container_name: immich_postgres
@@ -84,6 +90,12 @@ services:
-c shared_buffers=512MB -c shared_buffers=512MB
-c wal_compression=on -c wal_compression=on
restart: unless-stopped restart: unless-stopped
networks:
- immich-net
volumes: volumes:
model-cache: model-cache:
networks:
immich-net:
driver: bridge

View File

@@ -4,4 +4,15 @@ services:
ports: ports:
- '8182:80' # change if needed - '8182:80' # change if needed
restart: unless-stopped restart: unless-stopped
container_name: it-tools container_name: it-tools
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
networks:
- it-tools-net
networks:
it-tools-net:
driver: bridge

View File

@@ -19,4 +19,15 @@ services:
PUID: 1000 PUID: 1000
PGID: 1000 PGID: 1000
TZ: Europe/Warsaw TZ: Europe/Warsaw
BASE_URL: ${YOUR_DOMAIN:-https://mealie.yourdomain.com} BASE_URL: ${YOUR_DOMAIN:-https://mealie.yourdomain.com}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000"]
interval: 30s
timeout: 10s
retries: 3
networks:
- mealie-net
networks:
mealie-net:
driver: bridge

8
n8n/.env.example Normal file
View File

@@ -0,0 +1,8 @@
# Domain for n8n
DOMAIN=n8n.example.com
# Your timezone
GENERIC_TIMEZONE=Europe/Warsaw
# Directory where n8n will store files
PATH_TO_FILES=/path/to/n8n/files

24
n8n/docker-compose.yml Normal file
View File

@@ -0,0 +1,24 @@
services:
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n
restart: unless-stopped
ports:
- 5678:5678
environment:
- N8N_HOST=${DOMAIN}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://${DOMAIN}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
volumes:
- n8n_data:/home/node/.n8n
- ${PATH_TO_FILES}:/files
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:5678/healthz || exit 1"]
interval: 1m
timeout: 10s
retries: 3
volumes:
n8n_data:

View File

@@ -1,31 +1,35 @@
version: '3.3'
services: services:
nextcloud: nextcloud:
image: lscr.io/linuxserver/nextcloud:latest image: lscr.io/linuxserver/nextcloud:latest
container_name: nextcloud container_name: nextcloud
env_file: env_file:
- stack.env - .env
environment: environment:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
- PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT} - PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT}
- PHP_UPLOAD_LIMIT=${PHP_UPLOAD_LIMIT} - PHP_UPLOAD_LIMIT=${PHP_UPLOAD_LIMIT}
- TZ=${TZ} - TZ=${TZ}
volumes: volumes:
- ${CONFIG}:/config - ${CONFIG}:/config
- ${DATA}:/data - ${DATA}:/data
ports: ports:
- 5443:443 - "5443:443"
restart: unless-stopped restart: unless-stopped
links:
- nextcloud-mariadb
depends_on: depends_on:
- nextcloud-mariadb nextcloud-mariadb:
condition: service_healthy
nextcloud-mariadb: networks:
- nextcloud
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/status.php"]
interval: 30s
timeout: 10s
retries: 3
nextcloud-mariadb:
image: lscr.io/linuxserver/mariadb:latest image: lscr.io/linuxserver/mariadb:latest
container_name: nextloud-mariadb container_name: nextcloud-mariadb
environment: environment:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
@@ -34,15 +38,20 @@ services:
- MYSQL_DATABASE=nextcloud - MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud - MYSQL_USER=nextcloud
- MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_PASSWORD=${MYSQL_PASSWORD}
volumes: volumes:
- ${MARIADB}:/config - ${MARIADB}:/config
ports: ports:
- 5306:3306 - "5306:3306"
restart: unless-stopped restart: unless-stopped
networks:
- nextcloud
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks: networks:
default: nextcloud:
name: nextcloud name: nextcloud
driver: bridge driver: bridge

View File

@@ -11,4 +11,9 @@ services:
volumes: volumes:
- ${PGADMIN_DATA}:/var/lib/pgadmin - ${PGADMIN_DATA}:/var/lib/pgadmin
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" - "host.docker.internal:host-gateway"
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost/misc/ping || exit 1"]
interval: 1m
timeout: 10s
retries: 3

View File

@@ -8,4 +8,9 @@ services:
volumes: volumes:
- ${PORTAINER_DATA}:/data - ${PORTAINER_DATA}:/data
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9000/api/status"]
interval: 1m
timeout: 10s
retries: 3

View File

@@ -1,17 +1,33 @@
services: services:
semaphore: semaphore:
ports: container_name: semaphore-ui
- 3030:3000 image: semaphoreui/semaphore:latest
image: semaphoreui/semaphore:v2.16.18 restart: unless-stopped
environment: ports:
SEMAPHORE_DB_DIALECT: sqlite - "3030:3000"
SEMAPHORE_ADMIN: ${ADMIN_USER} environment:
SEMAPHORE_ADMIN_PASSWORD: ${ADMIN_PASS} SEMAPHORE_DB_DIALECT: sqlite
SEMAPHORE_ADMIN_NAME: ${ADMIN_NAME} SEMAPHORE_ADMIN: ${ADMIN_USER}
SEMAPHORE_ADMIN_EMAIL: ${ADMIN_EMAIL} SEMAPHORE_ADMIN_PASSWORD: ${ADMIN_PASS}
volumes: SEMAPHORE_ADMIN_NAME: ${ADMIN_NAME}
- semaphore-data:/var/lib/semaphore SEMAPHORE_ADMIN_EMAIL: ${ADMIN_EMAIL}
- semaphore-config:/etc/semaphore volumes:
- semaphore-data:/var/lib/semaphore
- semaphore-config:/etc/semaphore
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
- semaphore-net
volumes: volumes:
semaphore-data: semaphore-data:
semaphore-config: driver: local
semaphore-config:
driver: local
networks:
semaphore-net:
driver: bridge

View File

@@ -32,6 +32,11 @@ services:
max-size: 10m max-size: 10m
ports: ports:
- '9091:9091' - '9091:9091'
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:9091 && ls /data || exit 1"]
interval: 1m
timeout: 10s
retries: 3
# Not all the countries and servers are supporting p2p, so you need to choose the right server. Here's the hint: # Not all the countries and servers are supporting p2p, so you need to choose the right server. Here's the hint:
# https://support.nordvpn.com/hc/en-us/articles/20465085067665-NordVPN-proxy-setup-for-BitTorrent # https://support.nordvpn.com/hc/en-us/articles/20465085067665-NordVPN-proxy-setup-for-BitTorrent

View File

@@ -1,4 +1,3 @@
---
services: services:
transmission: transmission:
image: lscr.io/linuxserver/transmission:latest image: lscr.io/linuxserver/transmission:latest
@@ -22,3 +21,8 @@ services:
- 51413:51413 - 51413:51413
- 51413:51413/udp - 51413:51413/udp
restart: unless-stopped restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:9091 || exit 1"]
interval: 1m
timeout: 10s
retries: 3

View File

@@ -8,4 +8,9 @@ services:
volumes: volumes:
- ${PATH_TO_DATA}:/data - ${PATH_TO_DATA}:/data
ports: ports:
- 8033:80 - 8033:80
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost/ || exit 1"]
interval: 1m
timeout: 10s
retries: 3

6
watchtower/.env.example Normal file
View File

@@ -0,0 +1,6 @@
# Timezone for watchtower
TZ=Europe/Warsaw
# A space-separated list of container names for Watchtower to monitor.
# For example: WATCHTOWER_CONTAINERS="nginx-proxy-manager bookstack"
WATCHTOWER_CONTAINERS=""

View File

@@ -0,0 +1,13 @@
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_STOPPED=true
- WATCHTOWER_POLL_INTERVAL=3600
- TZ=${TZ}
command: ${WATCHTOWER_CONTAINERS}
restart: unless-stopped

View File

@@ -13,4 +13,9 @@ services:
# devices: # devices:
# - /dev/dri:/dev/dri #optional # - /dev/dri:/dev/dri #optional
shm_size: "2gb" #optional shm_size: "2gb" #optional
restart: unless-stopped restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/ || exit 1"]
interval: 1m
timeout: 10s
retries: 3