Compare commits

..

6 commits

10 changed files with 233 additions and 261 deletions

BIN
.DS_Store vendored

Binary file not shown.

3
.gitignore vendored
View file

@ -1,3 +1,4 @@
.env .env
.env.local .env.local
*.env *.env
*.conf

View file

@ -0,0 +1,42 @@
name: homeassistant
networks:
homeassistant:
external: false
traefik:
external: true
services:
server:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: ${CONTAINER_NAME}
restart: ${RESTART_POLICY}
environment:
- TZ=${TZ}
networks:
- homeassistant
- traefik
volumes:
- type: bind
source: ${DATA_PATH}
target: /config
bind:
create_host_path: true
- type: bind
source: /etc/localtime
target: /etc/localtime
read_only: true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels:
- "traefik.enable=true"
- "traefik.http.routers.${ROUTER_NAME}.entrypoints=websecure"
- "traefik.http.routers.${ROUTER_NAME}.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
- "traefik.http.routers.${ROUTER_NAME}.tls=true"
- "traefik.http.routers.${ROUTER_NAME}.tls.certresolver=${CERTIFICATE_RESOLVER}"
- "traefik.http.services.${ROUTER_NAME}.loadbalancer.server.port=${CONTAINER_PORT}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"

96
immich/docker-compose.yml Normal file
View file

@ -0,0 +1,96 @@
services:
immich-server:
image: ghcr.io/immich-app/immich-server:release
container_name: ${CONTAINER_NAME:-immich-server}
restart: ${RESTART_POLICY}
volumes:
- type: bind
source: ${UPLOAD_LOCATION}
target: /usr/src/app/upload
bind:
create_host_path: true
- /etc/localtime:/etc/localtime:ro
environment:
- DB_HOSTNAME=immich-db
- DB_USERNAME=${DB_USERNAME:-immich}
- DB_PASSWORD=${DB_PASSWORD}
- DB_DATABASE_NAME=${DB_DATABASE_NAME:-immich}
- REDIS_HOSTNAME=immich-redis
networks:
- traefik
- immich-internal
labels:
- "traefik.enable=true"
- "traefik.http.routers.${ROUTER_NAME}.entrypoints=websecure"
- "traefik.http.routers.${ROUTER_NAME}.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
- "traefik.http.routers.${ROUTER_NAME}.tls=true"
- "traefik.http.routers.${ROUTER_NAME}.tls.certresolver=${CERTIFICATE_RESOLVER}"
- "traefik.http.services.${ROUTER_NAME}.loadbalancer.server.port=2283"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
depends_on:
- immich-redis
- immich-db
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:release
container_name: ${ML_CONTAINER_NAME:-immich-machine-learning}
restart: ${RESTART_POLICY}
volumes:
- type: bind
source: ${MODEL_CACHE_LOCATION}
target: /cache
bind:
create_host_path: true
networks:
- immich-internal
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
immich-redis:
image: valkey/valkey:8-alpine
container_name: ${REDIS_CONTAINER_NAME:-immich-redis}
restart: ${RESTART_POLICY}
networks:
- immich-internal
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
immich-db:
image: pgvector/pgvector:pg16
container_name: ${DB_CONTAINER_NAME:-immich-db}
restart: ${RESTART_POLICY}
environment:
- POSTGRES_USER=${DB_USERNAME:-immich}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_DATABASE_NAME:-immich}
- POSTGRES_INITDB_ARGS=--data-checksums
volumes:
- type: bind
source: ${DB_DATA_PATH}
target: /var/lib/postgresql/data
bind:
create_host_path: true
networks:
- immich-internal
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
traefik:
external: true
immich-internal:
internal: true

View file

View file

@ -0,0 +1,66 @@
name: paperless
services:
broker:
image: redis:7
container_name: ${CONTAINER_NAME}-redis
restart: ${RESTART_POLICY}
networks:
- traefik
deploy:
resources:
limits:
memory: 512M
db:
image: postgres:15
container_name: ${CONTAINER_NAME}-db
restart: ${RESTART_POLICY}
networks:
- traefik
environment:
POSTGRES_DB: ${DB}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/postgresql/data
webserver:
image: paperlessngx/paperless-ngx:latest
container_name: ${CONTAINER_NAME}
restart: ${RESTART_POLICY}
networks:
- traefik
environment:
- PAPERLESS_REDIS=redis://broker:6379
- PAPERLESS_DBHOST=db
- PAPERLESS_DBNAME=${DB}
- PAPERLESS_DBUSER=${DB_USER}
- PAPERLESS_DBPASS=${DB_PASSWORD}
- PAPERLESS_URL=https://${SUBDOMAIN}.${DOMAIN}
- PAPERLESS_TIME_ZONE=${TZ}
- PAPERLESS_OCR_LANGUAGE=deu
- PAPERLESS_SECRET_KEY=${SECRET_KEY}
volumes:
- ${DATA_PATH}/data:/usr/src/paperless/data
- ${DATA_PATH}/media:/usr/src/paperless/media
- ${DATA_PATH}/consume:/usr/src/paperless/consume
- ${DATA_PATH}/export:/usr/src/paperless/export
labels:
- "traefik.enable=true"
- "traefik.http.routers.${ROUTER_NAME}.entrypoints=websecure"
- "traefik.http.routers.${ROUTER_NAME}.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
- "traefik.http.routers.${ROUTER_NAME}.tls=true"
- "traefik.http.routers.${ROUTER_NAME}.tls.certresolver=${CERTIFICATE_RESOLVER}"
- "traefik.http.services.${ROUTER_NAME}.loadbalancer.server.port=8000"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
depends_on:
- broker
- db
networks:
traefik:
name: traefik
external: true
volumes:
db_data:

View file

@ -1,110 +0,0 @@
services:
sparkyfitness-db:
image: postgres:18.3-alpine
container_name: ${CONTAINER_NAME}-db
restart: ${RESTART_POLICY}
environment:
POSTGRES_DB: ${SPARKY_FITNESS_DB_NAME}
POSTGRES_USER: ${SPARKY_FITNESS_DB_USER}
POSTGRES_PASSWORD: ${SPARKY_FITNESS_DB_PASSWORD}
PUID: 1000
GUID: 1000
volumes:
- type: bind
source: ${DB_PATH:-./postgresql}
target: /var/lib/postgresql
bind:
create_host_path: true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- sparkyfitness-network
sparkyfitness-server:
image: codewithcj/sparkyfitness_server:latest
environment:
SPARKY_FITNESS_LOG_LEVEL: ${SPARKY_FITNESS_LOG_LEVEL}
ALLOW_PRIVATE_NETWORK_CORS: ${ALLOW_PRIVATE_NETWORK_CORS:-false}
SPARKY_FITNESS_EXTRA_TRUSTED_ORIGINS: ${SPARKY_FITNESS_EXTRA_TRUSTED_ORIGINS}
SPARKY_FITNESS_PUBLIC_API_DOCS: ${SPARKY_FITNESS_PUBLIC_API_DOCS:-false}
SPARKY_FITNESS_DB_USER: ${SPARKY_FITNESS_DB_USER:-sparky}
SPARKY_FITNESS_DB_HOST: ${SPARKY_FITNESS_DB_HOST:-sparkyfitness-db}
SPARKY_FITNESS_DB_NAME: ${SPARKY_FITNESS_DB_NAME}
SPARKY_FITNESS_DB_PASSWORD: ${SPARKY_FITNESS_DB_PASSWORD}
SPARKY_FITNESS_APP_DB_USER: ${SPARKY_FITNESS_APP_DB_USER:-sparkyapp}
SPARKY_FITNESS_APP_DB_PASSWORD: ${SPARKY_FITNESS_APP_DB_PASSWORD}
SPARKY_FITNESS_DB_PORT: 5432
SPARKY_FITNESS_API_ENCRYPTION_KEY: ${SPARKY_FITNESS_API_ENCRYPTION_KEY}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
SPARKY_FITNESS_FRONTEND_URL: ${SPARKY_FITNESS_FRONTEND_URL:-http://0.0.0.0}
SPARKY_FITNESS_DISABLE_SIGNUP: ${SPARKY_FITNESS_DISABLE_SIGNUP}
SPARKY_FITNESS_ADMIN_EMAIL: ${SPARKY_FITNESS_ADMIN_EMAIL}
SPARKY_FITNESS_EMAIL_HOST: ${SPARKY_FITNESS_EMAIL_HOST}
SPARKY_FITNESS_EMAIL_PORT: ${SPARKY_FITNESS_EMAIL_PORT}
SPARKY_FITNESS_EMAIL_SECURE: ${SPARKY_FITNESS_EMAIL_SECURE}
SPARKY_FITNESS_EMAIL_USER: ${SPARKY_FITNESS_EMAIL_USER}
SPARKY_FITNESS_EMAIL_PASS: ${SPARKY_FITNESS_EMAIL_PASS}
SPARKY_FITNESS_EMAIL_FROM: ${SPARKY_FITNESS_EMAIL_FROM}
GARMIN_MICROSERVICE_URL: http://sparkyfitness-garmin:8000
HTTP_PROXY: ${HTTP_PROXY:-}
HTTPS_PROXY: ${HTTPS_PROXY:-}
NO_PROXY: ${NO_PROXY:-}
PUID: 1000
GUID: 1000
networks:
- sparkyfitness-network
restart: always
depends_on:
- sparkyfitness-db
volumes:
- type: bind
source: ${SERVER_BACKUP_PATH:-./backup}
target: /app/SparkyFitnessServer/backup
bind:
create_host_path: true
- type: bind
source: ${SERVER_UPLOADS_PATH:-./uploads}
target: /app/SparkyFitnessServer/uploads
bind:
create_host_path: true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
sparkyfitness-frontend:
image: codewithcj/sparkyfitness:latest
environment:
SPARKY_FITNESS_FRONTEND_URL: ${SPARKY_FITNESS_FRONTEND_URL}
SPARKY_FITNESS_SERVER_HOST: ${CONTAINER_NAME}-server
SPARKY_FITNESS_SERVER_PORT: 3010
PUID: 1000
GUID: 1000
networks:
- sparkyfitness-network
- traefik
restart: ${RESTART_POLICY}
depends_on:
- sparkyfitness-server
labels:
- "traefik.enable=true"
- "traefik.http.routers.${ROUTER_NAME}.entrypoints=websecure"
- "traefik.http.routers.${ROUTER_NAME}.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
- "traefik.http.routers.${ROUTER_NAME}.tls=true"
- "traefik.http.routers.${ROUTER_NAME}.tls.certresolver=${CERTIFICATE_RESOLVER}"
- "traefik.http.services.${ROUTER_NAME}.loadbalancer.server.port=${CONTAINER_PORT}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
- "traefik.http.routers.${ROUTER_NAME}.middlewares=sparkyfitness-headers"
- "traefik.http.middlewares.${ROUTER_NAME}-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.middlewares.${ROUTER_NAME}-headers.headers.customrequestheaders.X-Forwarded-Host=fitness.bybenji.de"
networks:
sparkyfitness-network:
driver: bridge
traefik:
external: true

View file

@ -1,149 +0,0 @@
name: sure
networks:
traefik:
name: traefik
external: true
internal_net:
name: sure_internal_net
driver: bridge
services:
sure-db:
image: postgres:16-alpine
container_name: ${CONTAINER_NAME}-db
restart: ${RESTART_POLICY}
environment:
- POSTGRES_DB=${DB_DATABASE}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_USER=${DB_USER}
volumes:
- type: bind
source: ${DB_PATH}
target: /var/lib/postgresql/data
bind:
create_host_path: true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- internal_net
cpu_shares: 90
deploy:
resources:
limits:
memory: 15841M
sure-redis:
image: redis:7-alpine
container_name: ${CONTAINER_NAME}-redis
restart: ${RESTART_POLICY}
volumes:
- type: bind
source: ${REDIS_PATH}
target: /data
bind:
create_host_path: true
networks:
- internal_net
cpu_shares: 90
deploy:
resources:
limits:
memory: 15841M
web:
image: ghcr.io/we-promise/sure:stable
container_name: ${CONTAINER_NAME}-web
restart: ${RESTART_POLICY}
depends_on:
sure-db:
condition: service_started
sure-redis:
condition: service_started
environment:
- SELF_HOSTED=${SELF_HOSTED}
- ALLOW_REGISTRATION=${ALLOW_REGISTRATION}
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
- RAILS_ASSUME_SSL=${RAILS_ASSUME_SSL}
- RAILS_FORCE_SSL=${RAILS_FORCE_SSL}
- DB_HOST=sure-db
- POSTGRES_DB=${DB_DATABASE}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- REDIS_URL=${REDIS_URL}
volumes:
- type: bind
source: ${STORAGE_PATH}
target: /rails/storage
bind:
create_host_path: true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- traefik
- internal_net
cpu_shares: 90
deploy:
resources:
limits:
memory: 15841M
labels:
- "traefik.enable=true"
- "traefik.http.routers.${ROUTER_NAME}.entrypoints=websecure"
- "traefik.http.routers.${ROUTER_NAME}.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
- "traefik.http.routers.${ROUTER_NAME}.tls=true"
- "traefik.http.routers.${ROUTER_NAME}.tls.certresolver=${CERTIFICATE_RESOLVER}"
- "traefik.http.services.${ROUTER_NAME}.loadbalancer.server.port=${CONTAINER_PORT}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
worker:
image: ghcr.io/we-promise/sure:stable
container_name: ${CONTAINER_NAME}-worker
restart: ${RESTART_POLICY}
command:
- /rails/bin/docker-entrypoint
- ./bin/bundle
- exec
- sidekiq
depends_on:
sure-db:
condition: service_started
sure-redis:
condition: service_started
environment:
- APP_URL=https://${SUBDOMAIN}.${DOMAIN}
- DB_HOST=sure-db
- POSTGRES_DB=${DB_DATABASE}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- REDIS_URL=${REDIS_URL}
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
volumes:
- type: bind
source: ${STORAGE_PATH}
target: /rails/storage
bind:
create_host_path: true
- type: bind
source: ${BANKING_PATH}
target: /rails/config/enable_banking.pem
read_only: true
bind:
create_host_path: true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- internal_net
cpu_shares: 90
deploy:
resources:
limits:
memory: 15841M

View file

@ -3,7 +3,6 @@ name: traefik
networks: networks:
traefik: traefik:
name: traefik name: traefik
# external: true -> Entfernt, damit dieser Stack das Netzwerk global auf dem Server erstellt!
services: services:
traefik: traefik:

View file

@ -0,0 +1,27 @@
printf "%-25s | %-35s | %-10s\n" "ORDNER" "URL" "STATUS"
printf "%s\n" "--------------------------------------------------------------------------------"
for dir in */; do
env_file="${dir}.env"
compose_file="${dir}docker-compose.yml"
if [ -f "$env_file" ] && [ -f "$compose_file" ]; then
sub=$(grep '^SUBDOMAIN=' "$env_file" | cut -d'=' -f2-)
domain=$(grep '^DOMAIN=' "$env_file" | cut -d'=' -f2-)
cname=$(grep '^CONTAINER_NAME=' "$env_file" | cut -d'=' -f2-)
if [ -n "$sub" ] && [ -n "$domain" ]; then
url="${sub}.${domain}"
else
url="${domain:-N/A}"
fi
status="STOPPED"
if [ -n "$cname" ] && [ "$(docker ps -q -f name="^${cname}$")" ]; then
status="RUNNING"
elif [ "$(docker compose -f "$compose_file" ps --status running -q 2>/dev/null)" ]; then
status="RUNNING"
fi
printf "%-25s | https://%-33s | %-10s\n" "${dir%/}" "$url" "$status"
fi
done