Files
skato-compose/dependent/compose.yml

493 lines
18 KiB
YAML

---
# version: "3.2.3"
networks:
wg:
driver: bridge
hs:
driver: bridge
volumes:
caddy-data:
caddy-share:
certbot-lib:
tailscale-lib:
redis-data:
mysql-lib:
opengist-data:
secrets:
headscale.key:
file: ~/.podsecrets/headscale.key
root-mysql.pass:
file: ~/.podsecrets/root-mysql.pass
user-mysql.pass:
file: ~/.podsecrets/user-mysql.pass
email.pass:
file: ~/.podsecrets/email.pass
redis.pass:
file: ~/.podsecrets/redis.pass
# opengist.secret:
# file: ~/.podsecrets/opengist.secret
services:
# @NOTE https://oneuptime.com/blog/post/2026-03-18-use-podman-containers-wireguard-vpn/view
# @NOTE https://www.procustodibus.com/blog/2022/10/wireguard-in-podman/
wgclient:
image: lscr.io/linuxserver/wireguard:latest
container_name: wgclient
cap_add:
- SYS_MODULE
- NET_ADMIN
# - NET_RAW
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- /lib/modules:/lib/modules:ro
- ~/.wg/authorized_clients.d:/config/wg_confs:Z
networks:
- wg
hostname: wgnet
ports:
- 51820:51820/udp
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv6.conf.all.forwarding=1
# - net.ipv6.conf.all.src_valid_mark=1
environment:
PUID: $(id -u)
PGID: $(whoami | id -g)
env_file:
- ${HOME}/.all.env
labels:
glance.name: Wireguard
glance.id: wireguard
glance.icon: "si:wireguard"
glance.description: VPN client connection
# @NOTE https://tailscale.com/docs/features/containers/docker
# @NOTE https://tailscale.com/blog/docker-tailscale-guide
tailclient:
image: tailscale/tailscale:latest
container_name: tailclient
cap_add:
- SYS_MODULE
- NET_ADMIN
restart: unless-stopped
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- /etc/localtime:/etc/localtime:ro
- /lib/modules:/lib/modules:ro
- "tailscale-lib:/var/lib/tailscale"
- ~/.config/tailscale:/config:Z
networks:
- hs
hostname: tailnet
env_file:
- ${HOME}/.all.env
# - ${HOME}/.tailscale.env
environment:
TS_AUTHKEY_FILE: /run/secrets/headscale.key
TS_SERVE_CONFIG: /config/conf.json
TS_EXTRA_ARGS: "--advertise-tags=tag:container"
TS_STATE_DIR: /var/lib/tailscale
secrets:
- headscale.key
# @TODO make subsequent containers have 'network_mode' attrbute set to value 'service:wgclient'/'service:tailclient'
# OR make subsequent containers have 'networks' attribute set to list value with 'container:wgclient'/'contaner:tailclient' item
cache0:
image: redis:trixie
container_name: cache0
restart: unless-stopped
expose:
- 6379
volumes:
- /etc/localtime:/etc/localtime:ro
- "redis-data:/data:z"
# networks:
# - wg
network_mode: "container:wgclient"
depends_on:
- wgclient
env_file:
- ${HOME}/.all.env
environment:
REDIS_ARGS: ${REDIS_PARAMS}
labels:
glance.name: Redis
glance.id: redis
glance.icon: "si:redis"
glance.description: "Data structure cache and document/vector query server"
# @NOTE https://hub.docker.com/_/mysql
db0:
image: mysql:lts
container_name: db0
restart: unless-stopped
expose:
- 3306
volumes:
- /etc/localtime:/etc/localtime:ro
# @TODO use Ansible to adjust/edit configuration below
# @NOTE https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html
- ~/.config/mysql:/etc/mysql/conf.d:Z
- mysql-lib:/var/lib/mysql
# networks:
# - wg
network_mode: "container:wgclient"
depends_on:
- wgclient
env_file:
- ${HOME}/.all.env
- ${HOME}/.mysql.env
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/root-mysql.pass
MYSQL_USER: ${MYSQL_DB_USER:-admin}
# @TODO create secret for the below, or leave it to Ansible
# @NOTE https://github.com/docker-library/docs/blob/master/nextcloud/README.md#docker-secrets
MYSQL_PASSWORD_FILE: /run/secrets/user-mysql.pass
MYSQL_DATABASE: ${MYSQL_DB_NAME:-testdb}
secrets:
- "root-mysql.pass"
- "user-mysql.pass"
labels:
glance.name: MySQL
glance.id: mysql
glance.icon: "si:mysql"
glance.description: Database management server
# @NOTE https://hub.docker.com/_/nextcloud
cloud:
image: nextcloud:stable-fpm
container_name: cloud
restart: unless-stopped
expose:
- 9000
volumes:
- /etc/localtime:/etc/localtime:ro
- ~/srv/${NEXTCLOUD_SUBDOMAIN}.${SERVER_FQDN}:/var/www/html:z
# networks:
# - wg
network_mode: "container:wgclient"
depends_on:
- cache0
- db0
- wgclient
env_file:
- ${HOME}/.all.env
- ${HOME}/.email.env
- ${HOME}/.mysql.env
- ${HOME}/.nextcloud.env
environment:
REDIS_HOST: cache0
REDIS_HOST_PASSWORD_FILE: /run/secrets/redis.pass
MYSQL_HOST: "${MYSQL_DB_HOST}:3306"
MYSQL_DATABASE: ${NEXTCLOUD_DB_NAME:-nextcloud}
MYSQL_USER: ${MYSQL_DB_USER:-admin}
MYSQL_PASSWORD_FILE: /run/secrets/user-mysql.pass
SMTP_HOST: ${EMAIL_SMTP_HOST}
SMTP_PORT: ${EMAIL_SMTP_PORT:-465}
SMTP_SECURE: ${EMAIL_SMTP_SECURE:-ssl}
SMTP_AUTHTYPE: ${EMAIL_SMTP_AUTHTYPE:-LOGIN}
SMTP_NAME: ${EMAIL_SMTP_USERNAME}
SMTP_PASSWORD_FILE: /run/secrets/email.pass
MAIL_FROM_ADDRESS: ${EMAIL_SMTP_USER_ALIAS:-admin}
MAIL_DOMAIN: ${EMAIL_SMTP_EMAIL_ALIAS}
# @NOTE https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html
APACHE_DISABLE_REWRITE_IP: ${NEXTCLOUD_APACHE_DISABLE_REWRITE_IP:-1}
TRUSTED_PROXIES: ${NEXTCLOUD_TRUSTED_PROXIES}
NEXTCLOUD_TRUSTED_DOMAINS: ${NEXTCLOUD_SUBDOMAIN}.${SERVER_FQDN}
# OVERWRITEHOST: ${NEXTCLOUD_HOST_REWRITE:?Enter the hostname or public FQDN for this server}
OVERWRITECLIURL: ${NEXTCLOUD_URL_REWRITE}
OVERWRITEPROTOCOL: ${NEXTCLOUD_PROTOCOL_REWRITE}
secrets:
- "user-mysql.pass"
- email.pass
- redis.pass
labels:
glance.name: Nextcloud
glance.id: nextcloud
glance.icon: "si:nextcloud"
glance.url: "${SERVER_FQDN_SCHEME}://${NEXTCLOUD_SUBDOMAIN}.${SERVER_FQDN}"
glance.description: "WebDAV/CardDAV/CalDAV cloud server"
# @NOTE https://docs.gitea.com/installation/install-with-docker-rootless
# @NOTE https://oneuptime.com/blog/post/2026-03-18-run-gitea-podman-container/view
# @NOTE https://docs.gitea.com/administration/reverse-proxies
# @NOTE https://docs.gitea.com/administration/config-cheat-sheet
forge:
image: codeberg.org/forgejo/forgejo:16
container_name: forge
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- ~/.config/forgejo:/data:z
expose:
- 3000
- ${FORGEJO_SSH_PORT:-2222}
# networks:
# - wg
network_mode: "container:wgclient"
depends_on:
- db0
- wgclient
env_file:
- ${HOME}/.all.env
- ${HOME}/.email.env
- ${HOME}/.mysql.env
- ${HOME}/.forgejo.env
environment:
USER_UID: $(id -u)
USER_GID: $(whoami | id -g)
FORGEJO__RUN_USER: ${FORGEJO_MODE:-dev}
FORGEJO__APP_NAME: ${FORGEJO_NAME}
FORGEJO__APP_SLOGAN: ${FORGEJO_SLOGAN}
FORGEJO__ui.meta_AUTHOR: ${SERVER_FQDN%.*}
FORGEJO__ui.meta_DESCRIPTION: ${FORGEJO_DESC}
FORGEJO__server_PROTOCOL: ${FORGEJO_PROTOCOL}
FORGEJO__server_DOMAIN: ${FORGEJO_SUBDOMAIN}.${SERVER_FQDN}
# @NOTE https://gist.github.com/erik-toth/087262f19941da9bf4c2ce449fe98a47
FORGEJO__server_SSH_PORT: ${FORGEJO_SSH_PORT:-2323}
FORGEJO__server_SSH_EXPOSE_ANONYMOUS: false
FORGEJO__server_START_SSH_SERVER: false
FORGEJO__server_SSH_AUTHORIZED_KEYS_BACKUP: true
FORGEJO__server_LANDING_PAGE: ${FORGEJO_LANDING:-explore}
FORGEJO__admin_DEFAULT_EMAIL_NOTIFICATIONS: onmention
FORGEJO__security_REVERSE_PROXY_TRUSTED_PROXIES: ${FORGEJO_TRUSTED_PROXIES}
FORGEJO__security_PASSWORD_COMPLEXITY: lower,upper,digit,spec
FORGEJO__security_PASSWORD_CHECK_PWN: true
FORGEJO__security_GLOBAL_TWO_FACTOR_REQUIREMENT: true
FORGEJO__service_REGISTER_EMAIL_CONFIRM: true
FORGEJO__service_DEFAULT_KEEP_EMAIL_PRIVATE: true
FORGEJO__service_DISABLE_REGISTRATION: ${FORGEJO_PROHIBIT_REGISTRATION:-true}
FORGEJO__service_ENABLE_NOTIFY_MAIL: true
FORGEJO__security_ENABLE_CAPTCHA: true
FORGEJO__picture_REPOSITORY_AVATAR_FALLBACK: image
FORGEJO__picture_REPOSITORY_AVATAR_FALLBACK_IMAGE: img/repo_default.svg
FORGEJO__picture_ENABLE_FEDERATED_AVATAR: true
FORGEJO__log_MODE: file
FORGEJO__mailer_ENABLED: true
FORGEJO__mailer_PROTOCOL: ${EMAIL_SEND_PROTOCOL:-smtp}s
FORGEJO__mailer_SMTP_ADDR: ${EMAIL_SMTP_HOST}
FORGEJO__mailer_SMTP_PORT: ${EMAIL_SMTP_PORT:-465}
FORGEJO__mailer_USER: ${EMAIL_SMTP_USERNAME}
FORGEJO__mailer_PASSWD_URI: file:/run/secrets/email.pass
FORGEJO__mailer_FROM: "\"${SERVER_FQDN%.*} Administrator\" <${EMAIL_SMTP_USER_ALIAS:-admin}@${EMAIL_SMTP_EMAIL_ALIAS}>"
FORGEJO__database_DB_TYPE: ${FORGEJO_DB_TYPE:-mysql}
FORGEJO__database_HOST: "${MYSQL_DB_HOST}:3306"
FORGEJO__database_NAME: ${FORGEJO_DB_NAME:-forgejo}
FORGEJO__database_USER: ${MYSQL_DB_USER:-admin}
FORGEJO__database_PASSWD_URI: file:/run/secrets/user-mysql.pass
FORGEJO__repository_DEFAULT_BRANCH: main
FORGEJO__repository_DEFAULT_PRIVATE: private
FORGEJO__repository_ENABLE_PUSH_CREATE_USER: true
FORGEJO__repository_DEFAULT_CLOSE_ISSUES_VIA_COMMITS_IN_ANY_BRANCH: true
FORGEJO__repository.issue_MAX_PINNED: 6
FORGEJO__repository.issue_LOCK_REASON: ${FORGEJO_LOCK_REASONS}
FORGEJO__federation_ENABLED: true
FORGEJO__cors_ENABLED: true
FORGEJO__cors_ALLOW_DOMAIN: "${FORGEJO_PROTOCOL}://${SERVER_FQDN} ${FORGEJO_PROTOCOL}://${OG_SUBDOMAIN}.${SERVER_FQDN}"
FORGEJO__cors_ALLOW_CREDENTIALS: true
FORGEJO__ui_SHOW_USER_EMAIL: false
FORGEJO__ui_ONLY_SHOW_RELEVANT_REPOS: true
FORGEJO__project_PROJECT_BOARD_BASIC_KANBAN_TYPE: ${FORGEJO_KANBAN_COLUMNS}
FORGEJO__project_PROJECT_BOARD_BUG_TRIAGE_TYPE: ${FORGEJO_TRIAGE_CATEGORIES}
FORGEJO__migrations_ALLOW_DOMAINS: "*.${SERVER_FQDN},*.bebopfederation.org,github.com,*.github.com,gitlab.com,*.gitlab.com,codeberg.org,*.codeberg.org,sr.ht,*.sr.ht"
FORGEJO__moderation_ENABLED: true
FORGEJO__repository.editor_LINE_WRAP_EXTENSIONS: .txt,.md,.markdown,.mdown,.mkd,.livemd
secrets:
- "user-mysql.pass"
- email.pass
labels:
glance.name: ForgeJO
glance.id: forgejo
glance.icon: "si:forgejo"
glance.url: "${SERVER_FQDN_SCHEME}://${FORGEJO_SUBDOMAIN}.${SERVER_FQDN}"
glance.description: Git version control forge server
gist:
image: ghcr.io/thomiceli/opengist:1
container_name: gist
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- opengist-data:/opengist:z
expose:
- 6157
- ${OG_SSH_PORT:-2323}
# networks:
# - wg
network_mode: "container:wgclient"
depends_on:
- db0
- wgclient
env_file:
- ${HOME}/.all.env
- ${HOME}/.mysql.env
environment:
OG_OPENGIST_HOME: /opengist
OG_LOG_OUTPUT: file
OG_GIT_DEFAULT_BRANCH: main
OG_HTTP_GIT_ENABLED: true
OG_EXTERNAL_URL: "${SERVER_FQDN_SCHEME}://${OG_SUBDOMAIN}.${SERVER_FQDN}"
OG_CUSTOM_NAME: ${OG_NAME}
OG_CUSTOM_LOGO: ${OG_LOGO:-logo.svg}
OG_CUSTOM_FAVICON: ${OG_FAVICON:-logo.ico}
secrets:
- "user-mysql.pass"
# - opengist.secret
labels:
glance.name: OpenGist
glance.id: opengist
glance.icon: "si:opengist"
glance.url: "${SERVER_FQDN_SCHEME}://${OG_SUBDOMAIN}.${SERVER_FQDN}"
glance.description: Pastebin server
# @NOTE https://hub.docker.com/_/caddy/
# @NOTE https://blog.genxnotes.com/en/tech/how-to-move-the-hugo-public-folder-outside-the-project-root/
# @NOTE https://www.turtlestoffel.com/My-Quartz-Configuration#explorer-component-with-custom-content-folder
revproxy0:
image: caddy:latest
container_name: revproxy0
cap_add:
- NET_ADMIN
restart: unless-stopped
expose:
- 80
- 443
- 443/udp
volumes:
- /etc/localtime:/etc/localtime:ro
- ~/.config/caddy:/etc/caddy:Z
- ~/srv/${SERVER_FQDN}:/srv/${SERVER_FQDN}:z
- ~/srv/notes.${SERVER_FQDN}:/srv/notes.${SERVER_FQDN}:z
- ~/srv/blog.${SERVER_FQDN}:/srv/blog.${SERVER_FQDN}:z
- ~/srv/certbot.${SERVER_FQDN}:/srv/certbot.${SERVER_FQDN}:ro,z
- "caddy-share:/usr/share/caddy"
- "caddy-data:/data:z"
- ~/.caddy:/config:Z
volumes_from:
- cloud:ro
# networks:
# - wg
network_mode: "container:wgclient"
depends_on:
- wgclient
env_file:
- ${HOME}/.all.env
labels:
glance.name: Caddy
glance.id: caddy
glance.icon: "si:caddy"
glance.url: "${SERVER_FQDN_SCHEME}://${SERVER_FQDN}"
glance.description: HTTPS reverse proxy server
# @NOTE https://github.com/nbraun1/certbot
sslcerts:
image: nbraun1/certbot
container_name: sslcerts
restart: on-failure
volumes:
- /etc/localtime:/etc/localtime:ro
- ~/.config/letsencrypt:/etc/letsencrypt:z
- "certbot-lib:/var/lib/letsencrypt"
# - ~/srv/certbot.${SERVER_FQDN}:/srv/certbot.${SERVER_FQDN}:z
volumes_from:
- revproxy0:rw
# networks:
# - wg
network_mode: "container:wgclient"
depends_on:
- revproxy0
- wgclient
env_file:
- ${HOME}/.all.env
- ${HOME}/.certbot.env
environment:
EMAIL: ${CERTBOT_EMAIL}
DOMAINS: ${CERTBOT_CHALLENGED_DOMAINS:-"${SERVER_FQDN},*.${SERVER_FQDN}"}
AUTHENTICATOR: ${CERTBOT_AUTHENTICATOR}
WEBROOT_PATH: ${SERVER_WEBROOT_PATH}
ISSUANCE_TIMEOUT: 300
CRON: ${CERTBOT_CRON}
# entrypoint: ["certonly"]
dash:
image: glanceapp/glance
container_name: dash
restart: unless-stopped
expose:
- 8080
volumes:
- /etc/localtime:/etc/localtime:ro
# Optionally, also mount docker socket if you want to use the docker containers widget
- /var/run:/var/run:ro
# @NOTE https://github.com/glanceapp/glance/blob/main/docs/configuration.md#configuring-glance
- ~/.config/glance:/app/config:Z # @NOTE internal container server port is changed via 'glance.yml' config file; default is 8080
- ~/.local/glance:/app/assets:Z
networks:
- hs
depends_on:
- tailclient
# @NOTE https://github.com/glanceapp/glance/blob/main/docs/configuration.md#environment-variables
labels:
glance.name: Self
glance.id: self
glance.icon: "si:glance"
# glance.url: "${SERVER_MAGICDN_SCHEME}://${SERVER_MAGICDN}"
glance.description: Dashboard
# @NOTE https://github.com/glanceapp/glance/blob/main/docs/configuration.md#docker-containers
# @TODO apply labels to each container that allows it to show up in Glance dashboard
# @NOTE The following is a list of additional public-facing container services to add
# - http://www.proftpd.org/, https://hub.docker.com/r/instantlinux/proftpd
# - https://burp.grke.org/, https://hub.docker.com/r/pschiffe/burp-server
# - https://rsync.samba.org/, https://hub.docker.com/r/vimagick/rsyncd
# - https://shlink.io/, https://shlink.io/documentation/install-docker-image/
# - https://www.funkwhale.audio/, https://docs.funkwhale.audio/administrator/installation/docker.html
# - https://join-lemmy.org/, https://join-lemmy.org/docs/administration/install_docker.html
# - https://nodebb.org/, https://docs.nodebb.org/installing/cloud/docker/
# - https://joinbookwyrm.com/, https://docs.joinbookwyrm.com/install-prod.html
# - https://github.com/FuzzyGrim/Yamtrack
# - https://misskey-hub.net/en/, https://misskey-hub.net/en/docs/for-admin/install/guides/docker/
# - https://akkoma.social/, https://docs.akkoma.dev/stable/
# - https://hub.docker.com/r/instantlinux/proftpd
# - https://prosody.im/, https://prosody.im/download/
# - https://element-hq.github.io/synapse/latest/setup/installation.html
# - https://www.inspircd.org/, https://hub.docker.com/r/inspircd/inspircd-docker
# - https://hub.docker.com/r/dnomd343/syncplay
# - https://hub.docker.com/r/p3terx/aria2-pro
# - https://github.com/SurgeDM/Surge#5-server-mode-with-docker-compose
# - https://www.bookstackapp.com/, https://www.bookstackapp.com/docs/admin/installation/#docker
# - https://moodle.org/
# - https://asciinema.org/
# - https://isso-comments.de/
# - https://shibumi.dev/posts/how-to-setup-your-own-wkd-server/
# - https://dario.griffo.io/posts/ultimate-guide-debian-repository-hosting/
# - https://gitlab.com/fdroid/docker-executable-fdroidserver
# - https://papis.readthedocs.io/en/latest/, https://github.com/papis/papis
# @NOTE The following is a list of additional private container services to add
# - https://www.keycloak.org/, https://www.keycloak.org/server/containers
# - https://tasktrove.io/, https://docs.tasktrove.io/installation#option-2-docker-compose
# - https://github.com/dohsimpson/HabitTrove, https://github.com/dohsimpson/HabitTrove#docker-deployment
# - https://grocy.info/, https://hub.docker.com/r/linuxserver/grocy
# - https://mealie.io/, https://docs.mealie.io/documentation/getting-started/installation/installation-checklist/#step-3-customizing-the-docker-composeyaml-files
# - https://actualbudget.org/, https://actualbudget.org/docs/install/docker
# - https://sugoi.gitbook.io/lanraragi, https://sugoi.gitbook.io/lanraragi/installing-lanraragi/docker
# - https://komga.org/, https://komga.org/docs/installation/docker
# - https://github.com/janeczku/calibre-web, https://hub.docker.com/r/linuxserver/calibre-web
# - https://www.kavitareader.com/, https://wiki.kavitareader.com/installation/docker/
# - https://immich.app/, https://docs.immich.app/install/docker-compose
# - https://papra.app/en/, https://docs.papra.app/self-hosting/using-docker-compose/
# - https://stashapp.cc/, https://docs.stashapp.cc/installation/docker/
# - https://droposs.org/, https://droposs.org/docs/admin/quickstart/
# - https://jellyfin.org/, https://jellyfin.org/docs/general/installation/container
# - https://docs.paperless-ngx.com/, https://docs.paperless-ngx.com/setup/#docker
# - https://atomicserver.eu/, https://docs.atomicdata.dev/atomic-data-overview
# - https://github.com/sassanix/warracker
# - https://github.com/cmintey/wishlist
# - https://ghostfolio.com