Last active
          July 8, 2024 22:57 
        
      - 
      
- 
        Save jerkovicl/dcd43dadc9eee47f0b95f8c54df3b18d to your computer and use it in GitHub Desktop. 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | #Reference: https://www.smarthomebeginner.com/traefik-reverse-proxy-tutorial-for-docker | |
| #Requirement: nano .env -> Set environmental variables: ${$USERDIR}, ${PUID}, ${PGID}, ${TZ}, ${DOMAINNAME}, ${CLOUDFLARE_EMAIL}, ${CLOUDFLARE_API_KEY}, ${HTTP_USERNAME}, ${HTTP_PASSWORD}, ${PLEX_CLAIM} etc. as explained in the reference. | |
| version: "3.7" | |
| services: | |
| ######### FRONTENDS ########## | |
| # Traefik Reverse Proxy | |
| traefik: | |
| hostname: traefik | |
| image: traefik:v1.7.21 | |
| container_name: traefik | |
| restart: always | |
| domainname: ${DOMAINNAME} | |
| networks: | |
| - default | |
| - traefik_proxy | |
| ports: | |
| - "80:80" | |
| - "443:443" | |
| # - "XXXX:8080" | |
| environment: | |
| - CF_API_EMAIL=${CLOUDFLARE_EMAIL} | |
| - CF_API_KEY=${CLOUDFLARE_API_KEY} | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=traefik" | |
| - "traefik.frontend.rule=Host:traefik.${DOMAINNAME}" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefixStrip: /traefik" | |
| - "traefik.port=8080" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=traefik.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| #- "traefik.frontend.auth.basic.users=${HTTP_USERNAME}:${HTTP_PASSWORD}" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| volumes: | |
| - /var/run/docker.sock:/var/run/docker.sock:ro | |
| - ${USERDIR}/docker/traefik:/etc/traefik | |
| - ${USERDIR}/docker/shared:/shared | |
| - /var/log/docker/traefik.log:/var/log/docker/traefik.log # for fail2ban - make sure to touch file before starting container | |
| # The auth gate for SSO | |
| traefik-forward-auth: | |
| # thomseddeon's image doesnt support OIDC_ISSUER yet | |
| # image: thomseddon/traefik-forward-auth | |
| image: funkypenguin/traefik-forward-auth | |
| container_name: traefik-forward-auth | |
| networks: | |
| - traefik_proxy | |
| environment: | |
| CLIENT_ID: ${AUTH_CLIENT_ID} | |
| CLIENT_SECRET: ${AUTH_CLIENT_SECRET} | |
| # This is based on using the Master realm. Create a new client, this will go into your CLIENT_ID, CLIENT_SECRET details. | |
| OIDC_ISSUER: https://keycloak.${DOMAINNAME}/auth/realms/master | |
| SECRET: ${HTTP_PASSWORD} | |
| AUTH_HOST: auth.${DOMAINNAME} | |
| COOKIE_DOMAINS: ${DOMAINNAME} | |
| #WHITELIST: ${EMAIL} | |
| COOKIE_SECURE: "true" | |
| LIFETIME: "2592000" | |
| restart: always | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.port=4181" | |
| - "traefik.frontend.rule=Host:auth.${DOMAINNAME}" | |
| - "traefik.backend=traefik-forward-auth" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| depends_on: | |
| - keycloak | |
| - traefik | |
| # Keycloak - identity and access management solution | |
| keycloak: | |
| image: jboss/keycloak | |
| container_name: keycloak | |
| domainname: ${DOMAINNAME} | |
| restart: always | |
| # ports: | |
| # - "8080:8080" | |
| networks: | |
| - traefik_proxy | |
| - keycloak | |
| volumes: | |
| # - ${USERDIR}/docker/keycloak/config.json:/config.json | |
| - /etc/timezone:/etc/timezone:ro | |
| - /etc/localtime:/etc/localtime:ro | |
| - /var/log/docker/keycloak:/opt/jboss/keycloak/standalone/log | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - KEYCLOAK_USER=${KEYCLOAK_USER} | |
| - KEYCLOAK_PASSWORD=${KEYCLOAK_PASSWORD} | |
| # - KEYCLOAK_IMPORT=/config.json | |
| - DB_VENDOR=mariadb | |
| - DB_DATABASE=keycloak | |
| - DB_ADDR=mariadb | |
| - DB_USER=keycloak | |
| - DB_PASSWORD=${MYSQL_ROOT_PASSWORD} | |
| # - JBOSS_LOG_DIR=/opt/wildfly/logs | |
| # This is required to run keycloak behind traefik | |
| - PROXY_ADDRESS_FORWARDING=true | |
| - KEYCLOAK_HOSTNAME=keycloak.${DOMAINNAME} | |
| # Tell MYSQL what user/password to create | |
| - MYSQL_USER=keycloak | |
| - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD} | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.backend=keycloak" | |
| - "traefik.frontend.rule=Host:keycloak.${DOMAINNAME}" | |
| # - "traefik.protocol: http" | |
| - "traefik.port=8080" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=keycloak.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| # depends_on: | |
| # - mariadb | |
| #Portainer - WebUI for Containers | |
| portainer: | |
| image: portainer/portainer | |
| container_name: portainer | |
| restart: always | |
| command: -H unix:///var/run/docker.sock | |
| # ports: | |
| # - "XXXX:9000" | |
| volumes: | |
| - /var/run/docker.sock:/var/run/docker.sock | |
| - ${USERDIR}/docker/portainer/data:/data | |
| - ${USERDIR}/docker/shared:/shared | |
| environment: | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=portainer" | |
| - "traefik.frontend.rule=Host:portainer.${DOMAINNAME}" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefixStrip: /portainer" | |
| - "traefik.port=9000" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=portainer.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Organizer - Unified HTPC/Home Server Web Interface | |
| organizr: | |
| container_name: organizr | |
| restart: always | |
| image: lsiocommunity/organizr | |
| volumes: | |
| - ${USERDIR}/docker/organizr:/config | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:80" | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=organizr" | |
| - "traefik.frontend.rule=Host:organizr.${DOMAINNAME}" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefixStrip: /organizr" | |
| - "traefik.port=80" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=organizr.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # phpMyAdmin - WebUI for MariaDB | |
| phpmyadmin: | |
| hostname: phpmyadmin | |
| container_name: phpmyadmin | |
| image: phpmyadmin/phpmyadmin | |
| restart: always | |
| depends_on: | |
| - mariadb | |
| # ports: | |
| # - XXXX:80 | |
| environment: | |
| - PMA_HOST=mariadb | |
| - PMA_USER=root | |
| - PMA_PASSWORD=${MYSQL_ROOT_PASSWORD} | |
| - PMA_ABSOLUTE_URI=https://pma.${DOMAINNAME} | |
| volumes: | |
| - ${USERDIR}/docker/phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php | |
| - ${USERDIR}/docker/phpmyadmin/php.ini:/usr/local/etc/php/conf.d/php.ini | |
| - ${USERDIR}/docker/phpmyadmin/custom/phpmyadmin/theme:/www/themes/theme/ | |
| networks: | |
| - traefik_proxy | |
| - default | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=pma" | |
| - "traefik.frontend.rule=Host:pma.${DOMAINNAME}" | |
| - "traefik.port=80" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=pma.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| ######### DOCKER RELATED ########## | |
| # Watchtower - Automatic Update of Containers/Apps | |
| watchtower: | |
| container_name: watchtower | |
| hostname: watchtower | |
| restart: always | |
| image: containrrr/watchtower #v2tec/watchtower | |
| volumes: | |
| - /var/run/docker.sock:/var/run/docker.sock | |
| environment: | |
| - WATCHTOWER_NOTIFICATIONS=slack | |
| - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=${SLACK_WEBHOOK_URL} | |
| - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower | |
| - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#docker | |
| command: --schedule "0 0 4 * * *" --cleanup --debug | |
| # Docker Garbage Collector | |
| dockergc: | |
| container_name: docker-gc | |
| image: clockworksoul/docker-gc-cron:latest | |
| #network_mode: "host" | |
| restart: always | |
| volumes: | |
| - /var/run/docker.sock:/var/run/docker.sock | |
| - ${USERDIR}/docker/shared/docker-gc-exclude:/etc/docker-gc-exclude | |
| environment: | |
| - CRON=0 9,21 * * * | |
| - FORCE_IMAGE_REMOVAL=1 | |
| - FORCE_CONTAINER_REMOVAL=1 | |
| - MINIMUM_IMAGES_TO_SAVE=1 | |
| - GRACE_PERIOD_SECONDS=3600 | |
| - DRY_RUN=0 | |
| - CLEAN_UP_VOLUMES=1 | |
| - TZ=${TZ} | |
| # Dozzle - realtime log viewer for docker containers | |
| dozzle: | |
| container_name: dozzle | |
| image: amir20/dozzle:latest | |
| restart: always | |
| environment: | |
| - DOZZLE_TAILSIZE=100 | |
| - DOZZLE_LEVEL=info | |
| volumes: | |
| - /var/run/docker.sock:/var/run/docker.sock | |
| - /etc/localtime:/etc/localtime:ro | |
| #ports: | |
| # - 9999:8080 | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=dozzle" | |
| - "traefik.frontend.rule=Host:dozzle.${DOMAINNAME}" | |
| - "traefik.port=8080" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=dozzle.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Cloudflare DDNS | |
| cloudddns: | |
| container_name: cloudddns | |
| restart: always | |
| image: joshava/cloudflare-ddns | |
| volumes: | |
| - ${USERDIR}/docker/shared/config.yml:/app/config.yaml | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| # Traefik Certificate Extractor | |
| #https://hub.docker.com/r/ldez/traefik-certs-dumper | |
| certsdump: | |
| container_name: certsdump | |
| image: ldez/traefik-certs-dumper | |
| command: file --source /acme.json --dest /dump/live --domain-subdir --crt-name=fullchain --key-name=privkey --crt-ext=.pem --key-ext=.pem | |
| volumes: | |
| - ${USERDIR}/docker/traefik/acme/acme.json:/acme.json:ro | |
| - ${USERDIR}/docker/shared/letsencrypt/etc:/dump | |
| restart: "no" | |
| ######### DOWNLOADERS ########## | |
| # qBittorrent without VPN – Bittorrent Downloader | |
| qbittorrent: | |
| image: "linuxserver/qbittorrent" | |
| container_name: "qbittorrent" | |
| volumes: | |
| - ${USERDIR}/docker/qbittorrent:/config | |
| - ${USERDIR}/Downloads/completed:/downloads | |
| - ${USERDIR}/docker/shared:/shared | |
| ports: | |
| - "8080:8080" | |
| - "6881:6881" | |
| - "6881:6881/udp" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - UMASK_SET=002 | |
| - WEBUI_PORT=8080 | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=qbittorrent" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefixStrip: /qbittorrent" | |
| - "traefik.frontend.rule=Host:qbit.${DOMAINNAME}" | |
| - "traefik.port=8080" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=qbit.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # SABnzbd – Usenet (NZB) Downloader | |
| sabnzbd: | |
| image: "linuxserver/sabnzbd" | |
| container_name: "sabnzbd" | |
| volumes: | |
| - ${USERDIR}/docker/sabnzbd:/config | |
| - ${USERDIR}/Downloads/completed:/downloads | |
| - ${USERDIR}/Downloads/incomplete:/incomplete-downloads | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:8080" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=sabnzbd" | |
| - "traefik.frontend.rule=Host:sabnzbd.${DOMAINNAME}" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /sabnzbd" | |
| - "traefik.port=8080" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=sabnzbd.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| ######### PERSONAL VIDEO RECORDERS ########## | |
| # Radarr – Movie Download and Management | |
| radarr: | |
| image: "linuxserver/radarr" | |
| container_name: "radarr" | |
| volumes: | |
| - ${USERDIR}/docker/radarr:/config | |
| - ${USERDIR}/Downloads/completed:/downloads | |
| - ${USERDIR}/media/movies:/movies | |
| - /etc/localtime:/etc/localtime:ro | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:7878" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=radarr" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /radarr" | |
| - "traefik.frontend.rule=Host:radarr.${DOMAINNAME}" | |
| - "traefik.port=7878" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=radarr.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" # set to false to show as tabs in organizr | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Sonarr – TV Show Download and Management | |
| sonarr: | |
| image: "linuxserver/sonarr" | |
| container_name: "sonarr" | |
| volumes: | |
| - ${USERDIR}/docker/sonarr:/config | |
| - ${USERDIR}/Downloads/completed:/downloads | |
| - ${USERDIR}/media/tvshows:/tv | |
| - /etc/localtime:/etc/localtime:ro | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:8989" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=sonarr" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /sonarr" | |
| - "traefik.frontend.rule=Host:sonarr.${DOMAINNAME}" | |
| - "traefik.port=8989" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=sonarr.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # LIDARR - Music Download and Management | |
| lidarr: | |
| image: "linuxserver/lidarr" | |
| hostname: lidarr | |
| container_name: "lidarr" | |
| volumes: | |
| - ${USERDIR}/docker/lidarr:/config | |
| - ${USERDIR}/Downloads/completed:/downloads | |
| - ${USERDIR}/media/music:/music | |
| - /etc/localtime:/etc/localtime:ro | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:8686" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=lidarr" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /lidarr" | |
| - "traefik.frontend.rule=Host:lidarr.${DOMAINNAME}" | |
| - "traefik.port=8686" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=lidarr.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Bazarr - Subtitles download and managment | |
| bazarr: | |
| image: linuxserver/bazarr | |
| container_name: bazarr | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - UMASK_SET=022 #optional | |
| volumes: | |
| - ${USERDIR}/docker/bazarr:/config | |
| - ${USERDIR}/media/movies:/movies | |
| - /etc/localtime:/etc/localtime:ro | |
| - ${USERDIR}/media/tvshows:/tv | |
| # ports: | |
| # - 6767:6767 | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=bazarr" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /bazarr" | |
| - "traefik.frontend.rule=Host:bazarr.${DOMAINNAME}" | |
| - "traefik.port=6767" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=bazarr.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Lazylibrarian – Ebooks and Management | |
| lazylibrarian: | |
| image: "linuxserver/lazylibrarian" | |
| container_name: "lazylibrarian" | |
| volumes: | |
| - ${USERDIR}/docker/lazylibrarian:/config | |
| - ${USERDIR}/Downloads/completed:/downloads | |
| - ${USERDIR}/media/books:/books | |
| - /etc/localtime:/etc/localtime:ro | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:5299" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - DOCKER_MODS=linuxserver/calibre-web:calibre # set the path to converter tool to /usr/bin/calibredb | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=lazylibrarian" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /lazylibrarian" | |
| - "traefik.frontend.rule=Host:lazylibrarian.${DOMAINNAME}" | |
| - "traefik.port=5299" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=lazylibrarian.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| ######### MEDIA SERVER APPS ########## | |
| # Plex Media Server | |
| plexms: | |
| container_name: plexms | |
| restart: always | |
| image: plexinc/pms-docker | |
| #devices: | |
| # - /dev/dri:/dev/dri # have a Plex Pass and an Intel processor with QuickSync for harware transcoding | |
| security_opt: | |
| - no-new-privileges:true | |
| volumes: | |
| - ${USERDIR}/docker/plexms:/config | |
| - ${USERDIR}/Downloads/plex_tmp:/transcode | |
| #- /dev/shm:/transcode # Offload transcoding to RAM if you have enough RAM | |
| - ${USERDIR}/media:/media | |
| - ${USERDIR}/docker/shared:/shared | |
| ports: | |
| - "32400:32400/tcp" | |
| - "3005:3005/tcp" # controlling Plex Home Theater via Plex Companion | |
| - "8324:8324/tcp" # controlling Plex for Roku via Plex Companion | |
| - "32469:32469/tcp" | |
| - "1900:1900/udp" # access to the Plex DLNA Server | |
| - "32410:32410/udp" # GDM network discovery | |
| - "32412:32412/udp" # GDM network discovery | |
| - "32413:32413/udp" # GDM network discovery | |
| - "32414:32414/udp" # GDM network discovery | |
| environment: | |
| - TZ=${TZ} | |
| - HOSTNAME="Docker Plex" | |
| - PLEX_CLAIM=${PLEX_CLAIM} | |
| - PLEX_UID=${PUID} | |
| - PLEX_GID=${PGID} | |
| - ADVERTISE_IP="http://SERVER-IP:32400/" # IP Address of your server, run ifconfig | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=plexms" | |
| - "traefik.frontend.rule=Host:plex.${DOMAINNAME}" | |
| - "traefik.port=32400" | |
| - "traefik.protocol=http" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=plex.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Jellyfin - Media Server | |
| jellyfin: | |
| image: linuxserver/jellyfin | |
| container_name: jellyfin | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - UMASK_SET=022 #optional | |
| volumes: | |
| - ${USERDIR}/docker/jellyfin:/config | |
| - ${USERDIR}/media/movies:/data/movies | |
| - ${USERDIR}/media/tvshows:/data/tvshows | |
| - /etc/localtime:/etc/localtime:ro | |
| # - /path for transcoding:/transcode #optional | |
| # - /opt/vc/lib:/opt/vc/lib #optional for raspberry pi | |
| # ports: | |
| # - 8096:8096 | |
| # - 8920:8920 #optional | |
| devices: | |
| - /dev/dri:/dev/dri #optional, if you want to use your Intel GPU for hardware accelerated video encoding | |
| # - /dev/vchiq:/dev/vchiq #optional for raspberry pi | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=jellyfin" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /jellyfin" | |
| - "traefik.frontend.rule=Host:jellyfin.${DOMAINNAME}" | |
| - "traefik.port=8096" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=jellyfin.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| #- "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| #- "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| #- "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Funkwhale - music streaming server | |
| funkwhale: | |
| image: funkwhale/all-in-one:latest | |
| container_name: funkwhale | |
| restart: unless-stopped | |
| networks: | |
| - traefik_proxy | |
| environment: | |
| - TZ=${TZ} | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - FUNKWHALE_HOSTNAME=funkwhale.${DOMAINNAME} | |
| - LIBRARY_ID=${LIBRARY_ID} | |
| volumes: | |
| - ${USERDIR}/docker/funkwhale:/data | |
| - ${USERDIR}/media/music:/music | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=funkwhale" | |
| - "traefik.frontend.rule=Host:funkwhale.${DOMAINNAME}" | |
| - "traefik.port=80" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=funkwhale.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # MusicBrainz Picard – Music Management | |
| picard: | |
| container_name: picard | |
| image: mikenye/picard | |
| restart: always | |
| networks: | |
| - traefik_proxy | |
| # ports: | |
| # - "5800:5800" | |
| volumes: | |
| - $USERDIR/media/music:/storage:rw | |
| - $USERDIR/docker/picard:/config:rw | |
| environment: | |
| - USER_ID=${PUID} | |
| - GROUP_ID=${PGID} | |
| - TZ=${TZ} | |
| - UMASK=002 | |
| - DISPLAY_WIDTH=1280 | |
| - DISPLAY_HEIGHT=768 | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=picard" | |
| - "traefik.frontend.rule=Host:picard.${DOMAINNAME}" | |
| - "traefik.port=5800" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=picard.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Ubooquity - home server for comics and ebooks library | |
| ubooquity: | |
| image: linuxserver/ubooquity | |
| container_name: ubooquity | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - MAXMEM=1024 | |
| volumes: | |
| - ${USERDIR}/docker/ubooquity:/config | |
| - ${USERDIR}/media/books:/books | |
| - ${USERDIR}/media/comics:/comics | |
| - ${USERDIR}/media/files:/files | |
| ports: | |
| - 2202:2202 | |
| - 2203:2203 | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=ubooquity" | |
| - "traefik.frontend.rule=Host:ubooquity.${DOMAINNAME}" | |
| - "traefik.port=2202" | |
| - "traefik.admin.frontend.rule=Host:ubooquity.${DOMAINNAME}; PathPrefix:/admin,/admin-res,/admin-api" | |
| - "traefik.admin.port=2203" | |
| - "traefik.protocol=http" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=ubooquity.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Calibre-web – Ebooks and Management | |
| calibre-web: | |
| image: "linuxserver/calibre-web" | |
| container_name: "calibre-web" | |
| volumes: | |
| - ${USERDIR}/docker/calibre_web:/config | |
| - ${USERDIR}/media/books:/books | |
| - /etc/localtime:/etc/localtime:ro | |
| # ports: | |
| # - "XXXX:8083" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| # - DOCKER_MODS=linuxserver/calibre-web:calibre # include for ebook conversion | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=calibre-web" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /calibre-web" | |
| - "traefik.frontend.rule=Host:calibre-web.${DOMAINNAME}" | |
| - "traefik.port=8083" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=calibre-web.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| calibre: | |
| image: "linuxserver/calibre" | |
| container_name: "calibre" | |
| volumes: | |
| - ${USERDIR}/Downloads/completed:/import | |
| - ${USERDIR}/media/books:/books | |
| - ${USERDIR}/docker/calibre:/config | |
| - /etc/localtime:/etc/localtime:ro | |
| # ports: | |
| # - "XXXX:8080" | |
| # - "XXXX:8081" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=calibre" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /calibre" | |
| - "traefik.frontend.rule=Host:calibre.${DOMAINNAME}" | |
| - "traefik.port=8081" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=calibre.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| ######### SEARCHERS ########## | |
| # Jackett – Torrent Proxy | |
| jackett: | |
| image: "linuxserver/jackett" | |
| container_name: "jackett" | |
| volumes: | |
| - ${USERDIR}/docker/jackett:/config | |
| - ${USERDIR}/Downloads/completed:/downloads | |
| - /etc/localtime:/etc/localtime:ro | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:9117" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=jackett" | |
| - "traefik.frontend.rule=Host:jackett.${DOMAINNAME}" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /jackett" | |
| - "traefik.port=9117" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=jackett.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| ######### UTILITIES ########## | |
| # MariaDB – Database Server for your Apps | |
| mariadb: | |
| image: "linuxserver/mariadb" | |
| container_name: "mariadb" | |
| hostname: mariadb | |
| volumes: | |
| - ${USERDIR}/docker/mariadb:/config | |
| - ${USERDIR}/docker/mysql/scripts:/docker-entrypoint-initdb.d:ro | |
| - ${USERDIR}/docker/mysql:/var/lib/mysql/data:rw | |
| ports: | |
| - target: 3306 | |
| published: 3306 | |
| protocol: tcp | |
| mode: host | |
| networks: | |
| - traefik_proxy | |
| - keycloak | |
| restart: always | |
| environment: | |
| - MYSQL_DATABASE=keycloak | |
| #- MYSQL_USER=keycloak | |
| - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| # Copy-pasted from https://github.com/docker-library/mariadb/issues/94 | |
| healthcheck: | |
| test: ["CMD", "mysqladmin", "ping", "--silent"] | |
| # mysql db backup | |
| db-backup: | |
| container_name: db-backup | |
| image: tiredofit/db-backup | |
| depends_on: | |
| - mariadb | |
| volumes: | |
| - ${USERDIR}/docker/mariadb/backups:/backup | |
| - /etc/localtime:/etc/localtime:ro | |
| environment: | |
| #- DB_SERVER=mariadb | |
| - DB_TYPE=mariadb | |
| - DB_HOST=mariadb | |
| - DB_USER=root | |
| - DB_PASS=${MYSQL_ROOT_PASSWORD} | |
| - DB_DUMP_FREQ=1440 | |
| - DB_DUMP_BEGIN=+20 | |
| #- DB_DUMP_TARGET=${USERDIR}/docker/mariadb/backups | |
| - DB_CLEANUP_TIME=8640 | |
| - COMPRESSION=XZ | |
| - SPLIT_DB=TRUE | |
| networks: | |
| - traefik_proxy | |
| restart: always | |
| # Redis - Key-value Store | |
| redis: | |
| container_name: redis | |
| image: redis | |
| restart: always | |
| entrypoint: redis-server --appendonly yes | |
| networks: | |
| - traefik_proxy | |
| # ports: | |
| # - "6379:6379" | |
| sysctls: | |
| net.core.somaxconn: '65535' | |
| volumes: | |
| - ${USERDIR}/docker/redis/data:/data | |
| - /etc/localtime:/etc/localtime:ro | |
| #- ${USERDIR}/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.port=6379" | |
| - "traefik.backend=redis" | |
| - "traefik.docker.network=traefik_proxy" | |
| # Redis Commander - Redis Management Tool | |
| rediscommander: | |
| container_name: rediscommander | |
| image: rediscommander/redis-commander | |
| restart: always | |
| depends_on: | |
| - redis | |
| networks: | |
| - traefik_proxy | |
| # ports: | |
| # - "8081:8081" | |
| environment: | |
| - REDIS_HOST=redis | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=rediscommander" | |
| - "traefik.frontend.rule=Host:rediscmd.${DOMAINNAME}" | |
| - "traefik.port=8081" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=rediscmd.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # CyberChef - the Cyber Swiss Army Knife web app for encryption, encoding, compression and data analysis | |
| cyberchef: | |
| container_name: cyberchef | |
| image: mpepping/cyberchef | |
| restart: always | |
| networks: | |
| - traefik_proxy | |
| # ports: | |
| # - "8000:8000" | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=cyberchef" | |
| - "traefik.frontend.rule=Host:cyberchef.${DOMAINNAME}" | |
| - "traefik.port=8000" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=cyberchef.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # NextCloud – Your Own Cloud Storage | |
| nextcloud: | |
| container_name: nextcloud | |
| restart: always | |
| image: linuxserver/nextcloud | |
| volumes: | |
| - ${USERDIR}/docker/nextcloud:/config | |
| - ${USERDIR}/shared_data:/data | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:443" | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=nextcloud" | |
| - "traefik.frontend.rule=Host:nextcloud.${DOMAINNAME}" | |
| - "traefik.port=443" | |
| - "traefik.protocol=https" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=nextcloud.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| #- "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| #- "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| #- "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Bitwarden - Password Vault | |
| bitwarden: | |
| container_name: bitwarden | |
| image: bitwardenrs/server-mysql | |
| restart: always | |
| networks: | |
| - traefik_proxy | |
| # ports: | |
| # - "8888:80" | |
| volumes: | |
| - $USERDIR/docker/bitwarden:/data | |
| - /var/log/docker:/var/log/docker | |
| - /etc/localtime:/etc/localtime:ro | |
| environment: | |
| - SIGNUPS_ALLOWED=false # Change to false after first login | |
| - INVITATIONS_ALLOWED=false | |
| - WEBSOCKET_ENABLED=false #true | |
| - LOG_FILE=/var/log/docker/bitwarden.log | |
| - SMTP_HOST=smtp.gmail.com | |
| - SMTP_FROM=${SMTP_EMAIL} | |
| - SMTP_PORT=587 | |
| - SMTP_SSL=true | |
| - SMTP_USERNAME=${SMTP_EMAIL} | |
| - SMTP_PASSWORD=${SMTP_PASSWORD} | |
| - DOMAIN=https://bitwarden.$DOMAINNAME | |
| - ADMIN_TOKEN=supersecret | |
| - DATABASE_URL=mysql://bitwarden:${MYSQL_ROOT_PASSWORD}@mariadb/bitwarden | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=bitwarden" | |
| - "traefik.frontend.rule=Host:bitwarden.${DOMAINNAME}" | |
| #- "traefik.web.frontend.rule=Host:bitwarden.${DOMAINNAME}" | |
| - "traefik.port=80" | |
| # - "traefik.web.port=80" | |
| - "traefik.hub.frontend.rule=Host:bitwarden.${DOMAINNAME};Path:/notifications/hub" | |
| - "traefik.hub.port=3012" | |
| - "traefik.hub.protocol=ws" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=bitwarden.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| #- "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| #- "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| #- "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Guacamole – Clientless remote desktop gateway | |
| guacd: | |
| container_name: guacd | |
| hostname: guacd | |
| image: guacamole/guacd | |
| networks: | |
| - traefik_proxy | |
| restart: always | |
| volumes: | |
| - ${USERDIR}/docker/guacamole/drive:/drive:rw | |
| - ${USERDIR}/docker/guacamole/record:/record:rw | |
| guacamole: | |
| container_name: guacamole | |
| depends_on: | |
| - guacd | |
| - mariadb | |
| environment: | |
| - GUACD_HOSTNAME=guacd | |
| #- GUACD_PORT=4822 | |
| - MYSQL_HOSTNAME=mariadb | |
| - MYSQL_PORT=3306 | |
| - MYSQL_DATABASE=guacamole | |
| - MYSQL_USER=guac | |
| - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD} | |
| - GUACAMOLE_HOME=/etc/guacamole | |
| - TZ=${TZ} | |
| image: guacamole/guacamole | |
| volumes: | |
| - ${USERDIR}/docker/guacamole:/etc/guacamole:rw | |
| - /var/log/docker/guacamole:/usr/local/tomcat/logs | |
| networks: | |
| - traefik_proxy | |
| - default | |
| ports: | |
| - 8082:8080/tcp | |
| restart: always | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=guacamole" #guacamole_docker | |
| - "traefik.frontend.rule=Host:guac.${DOMAINNAME}" | |
| #- "traefik.frontend.rule=Host:guac.${DOMAINNAME}; AddPrefix: /guacamole" | |
| - "traefik.port=8080" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=guac.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Netdata - real-time performance monitoring | |
| netdata: | |
| container_name: netdata | |
| image: netdata/netdata | |
| hostname: netdata | |
| restart: always | |
| cap_add: | |
| - SYS_PTRACE | |
| security_opt: | |
| - apparmor:unconfined | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - NETDATA_PORT=19999 | |
| volumes: | |
| - /proc:/host/proc:ro | |
| - /sys:/host/sys:ro | |
| - /var/run/docker.sock:/var/run/docker.sock:ro | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=netdata" | |
| - "traefik.frontend.rule=Host:netdata.${DOMAINNAME}" | |
| - "traefik.port=19999" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=netdata.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Glances - web-based top cmd | |
| glances: | |
| container_name: glances | |
| hostname: glances | |
| restart: always | |
| image: vimagick/glances | |
| #network_mode: host | |
| pid: host | |
| networks: | |
| - traefik_proxy | |
| volumes: | |
| - ${USERDIR}/docker/glances:/etc/glances | |
| - /var/run/docker.sock:/var/run/docker.sock:ro | |
| environment: | |
| - GLANCES_OPT=-w | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=glances" | |
| - "traefik.frontend.rule=Host:glances.${DOMAINNAME}" | |
| #- "traefik.frontend.rule=Host:glances.docker.localhost" | |
| - "traefik.port=61208" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=glances.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Heimdall - application dashboard | |
| heimdall: | |
| image: linuxserver/heimdall | |
| container_name: heimdall | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| volumes: | |
| - ${USERDIR}/docker/heimdall:/config | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=heim" | |
| - "traefik.frontend.rule=Host:${DOMAINNAME}, www.${DOMAINNAME}, heimdall.${DOMAINNAME}" | |
| - "traefik.port=80" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=heimdall.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| networks: | |
| - traefik_proxy | |
| # Cloud Commander - web file manager | |
| cloudcmd: | |
| image: coderaiser/cloudcmd | |
| container_name: cloudcmd | |
| restart: always | |
| volumes: | |
| - ${USERDIR}/docker/cloudcmd:/root | |
| - ${USERDIR}/docker:/mnt/fs | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=cloudcmd" | |
| - "traefik.frontend.rule=Host:cloudcmd.${DOMAINNAME}" | |
| - "traefik.port=8000" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=cloudcmd.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # Duplicati - Backups cloud management | |
| duplicati: | |
| image: linuxserver/duplicati | |
| container_name: duplicati | |
| volumes: | |
| - ${USERDIR}/docker/duplicati:/config | |
| - ${USERDIR}/backups:/backups | |
| - ${USERDIR}/docker:/source | |
| - /etc/localtime:/etc/localtime:ro | |
| - ${USERDIR}/docker/shared:/shared | |
| # ports: | |
| # - "XXXX:8200" | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - CLI_ARGS= #optional | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=duplicati" | |
| - "traefik.frontend.rule=Host:duplicati.${DOMAINNAME}" | |
| - "traefik.port=8200" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=duplicati.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # code-server - vscode in a browser | |
| code-server: | |
| image: linuxserver/code-server | |
| container_name: code-server | |
| restart: always | |
| environment: | |
| - PUID=${PUID} | |
| - PGID=${PGID} | |
| - TZ=${TZ} | |
| - PASSWORD=${KEYCLOAK_PASSWORD} #optional | |
| - SUDO_PASSWORD=${KEYCLOAK_PASSWORD} #optional | |
| volumes: | |
| - ${USERDIR}/docker/vscode/config:/config # For github integration, drop your ssh key in to /config/.ssh. | |
| #ports: | |
| # - 8443:8443 | |
| networks: | |
| - traefik_proxy | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=code-server" | |
| - "traefik.frontend.rule=Host:code.${DOMAINNAME}" | |
| - "traefik.port=8443" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=code.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| # fail2ban | |
| fail2ban: | |
| container_name: fail2ban | |
| image: crazymax/fail2ban:latest | |
| restart: always | |
| network_mode: "host" | |
| cap_add: | |
| - NET_ADMIN | |
| - NET_RAW | |
| volumes: | |
| - /var/log/docker:/var/log/docker | |
| - ${USERDIR}/docker/fail2ban:/data | |
| - ${USERDIR}/docker/fail2ban/fail2ban.d:/etc/fail2ban/fail2ban.d | |
| environment: | |
| - TZ=${TZ} | |
| - F2B_LOG_TARGET=/var/log/docker/fail2ban.log | |
| - F2B_LOG_LEVEL=INFO | |
| - F2B_DB_PURGE_AGE=1d | |
| #- F2B_ACTION=%(action_mw)s # %(action_mw)s or %(action_mwl)s to send mail | |
| - F2B_IPTABLES_CHAIN=DOCKER-USER | |
| - SSMTP_HOST=smtp.gmail.com | |
| - SSMTP_PORT=587 | |
| #- SSMTP_HOSTNAME=example.com | |
| - SSMTP_USER=${SMTP_EMAIL} | |
| - SSMTP_PASSWORD=${SMTP_PASSWORD} # Create an "app password" if you use 2FA | |
| - SSMTP_TLS=TLS | |
| # Paperless - Documents Storage | |
| # https://paperless.readthedocs.io/en/latest/utilities.html#the-exporter | |
| # extra env vars: https://github.com/the-paperless-project/paperless/blob/master/paperless.conf.example | |
| # to create admin account run this command: docker-compose run --rm paperless createsuperuser | |
| paperless: | |
| image: thepaperlessproject/paperless | |
| container_name: paperless | |
| restart: always | |
| networks: | |
| - traefik_proxy | |
| #ports: | |
| # - "8325:8000" | |
| healthcheck: | |
| test: ["CMD", "curl", "-f", "http://localhost:8000"] | |
| interval: 30s | |
| timeout: 10s | |
| retries: 5 | |
| volumes: | |
| - ${USERDIR}/docker/paperless/data:/usr/src/paperless/data | |
| - ${USERDIR}/docker/paperless/media:/usr/src/paperless/media | |
| - ${USERDIR}/shared_data/djlujo/files/scans/consume:/consume | |
| - ${USERDIR}/shared_data/djlujo/files/scans/export:/export | |
| environment: | |
| - PAPERLESS_OCR_LANGUAGES=eng hrv | |
| - PAPERLESS_PASSPHRASE=${PAPERLESS_PASSWORD} # document encryption | |
| - USERMAP_UID=${PUID} | |
| - USERMAP_GID=${PGID} | |
| #- PAPERLESS_USE_SSL | |
| command: ["gunicorn", "-b", "0.0.0.0:8000"] | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.backend=paperless" | |
| # - "traefik.frontend.rule=Host:${DOMAINNAME}; PathPrefix: /paperless" | |
| - "traefik.frontend.rule=Host:paperless.${DOMAINNAME}" | |
| - "traefik.port=8000" | |
| - "traefik.docker.network=traefik_proxy" | |
| - "traefik.frontend.passHostHeader=true" | |
| - "traefik.frontend.headers.SSLForceHost=true" | |
| - "traefik.frontend.headers.SSLRedirect=true" | |
| - "traefik.frontend.headers.STSSeconds=315360000" | |
| - "traefik.frontend.headers.browserXSSFilter=true" | |
| - "traefik.frontend.headers.contentTypeNosniff=true" | |
| - "traefik.frontend.headers.forceSTSHeader=true" | |
| - "traefik.frontend.headers.SSLHost=paperless.${DOMAINNAME}" | |
| - "traefik.frontend.headers.STSIncludeSubdomains=true" | |
| - "traefik.frontend.headers.STSPreload=true" | |
| - "traefik.frontend.headers.frameDeny=true" | |
| - "traefik.frontend.headers.customResponseHeaders=X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex" | |
| - "traefik.frontend.headers.customFrameOptionsValue=allow-from https://${DOMAINNAME}" | |
| - "traefik.frontend.auth.forward.address=http://traefik-forward-auth:4181" | |
| - "traefik.frontend.auth.forward.authResponseHeaders=X-Forwarded-User" | |
| - "traefik.frontend.auth.forward.trustForwardHeader=true" | |
| paperless_consumer: | |
| image: thepaperlessproject/paperless | |
| container_name: paperless_consumer | |
| restart: always | |
| networks: | |
| - traefik_proxy | |
| depends_on: | |
| - paperless | |
| volumes: | |
| - ${USERDIR}/docker/paperless/data:/usr/src/paperless/data | |
| - ${USERDIR}/docker/paperless/media:/usr/src/paperless/media | |
| - ${USERDIR}/shared_data/djlujo/files/scans/consume:/consume | |
| - ${USERDIR}/shared_data/djlujo/files/scans/export:/export | |
| environment: | |
| - PAPERLESS_OCR_LANGUAGES=eng hrv | |
| - PAPERLESS_PASSPHRASE=${PAPERLESS_PASSWORD} # document encryption | |
| - USERMAP_UID=${PUID} | |
| - USERMAP_GID=${PGID} | |
| command: ["document_consumer"] | |
| ######### DNS ########## | |
| # create network: | |
| # docker network create --subnet 172.28.0.0/16 skynet | |
| # healthcheck dig @${PIHOLEIP} google.com | |
| # resolv.conf file: | |
| # nameserver 127.0.0.1 | |
| # nameserver 172.28.0.3 | |
| # pihole dns settings - enable listen on all interfaces | |
| ## I've added the following blocklist in addition to the standard ones under Settings>Blocklists (copy the link, paste and update) | |
| # https://dbl.oisd.nl/ | |
| ## More info here: https://www.reddit.com/r/pihole/comments/bppug1/introducing_the/ | |
| ## I've added the following whitelist entries (copy domains and paste all at once) | |
| # https://github.com/anudeepND/whitelist/blob/master/domains/whitelist.txt | |
| # https://github.com/anudeepND/whitelist/blob/master/domains/referral-sites.txt | |
| ## additional lists here: https://firebog.net/ | |
| # Pihole - A black hole for Internet advertisements | |
| pihole: | |
| container_name: pihole | |
| image: pihole/pihole:latest | |
| #domainname: ${DOMAINNAME} | |
| hostname: pihole | |
| restart: always | |
| cap_add: | |
| - NET_ADMIN | |
| - NET_RAW | |
| - NET_BIND_SERVICE | |
| environment: | |
| - TZ=${TZ} | |
| - ServerIP=192.168.5.91 | |
| - DNS1=172.28.0.3 | |
| - DNS2=no | |
| - VIRTUAL_HOST=pihole.${DOMAINNAME} | |
| - VIRTUAL_PORT=80 | |
| - PROXY_LOCATION=pihole | |
| - WEBPASSWORD=${KEYCLOAK_PASSWORD} | |
| volumes: | |
| - ${USERDIR}/docker/pihole:/etc/pihole | |
| - ${USERDIR}/docker/pihole/resolv.conf/resolv.conf:/etc/resolv.conf:ro | |
| - ${USERDIR}/docker/pihole/pihole.log:/var/log/pihole.log | |
| - ${USERDIR}/docker/pihole/dnsmasq.d:/etc/dnsmasq.d | |
| ## More info on these scripts here: https://github.com/mmotti | |
| - ${USERDIR}/docker/pihole/scripts/fetchFilterLists.sh:/usr/local/bin/fetchFilterLists.sh | |
| - ${USERDIR}/docker/pihole/scripts/gravityOptimise.sh:/usr/local/bin/gravityOptimise.sh | |
| - ${USERDIR}/docker/pihole/scripts/generateGravityWildcards.sh:/usr/local/bin/generateGravityWildcards.sh | |
| - ${USERDIR}/docker/pihole/scripts/cron.d/fetchFilterLists:/etc/cron.d/fetchFilterLists | |
| - ${USERDIR}/docker/pihole/scripts/cron.d/gravityOptimise:/etc/cron.d/gravityOptimise | |
| - ${USERDIR}/docker/pihole/scripts/cron.d/generateGravityWildcards:/etc/cron.d/generateGravityWildcards | |
| dns: | |
| - 127.0.0.1 | |
| # Sets a backup server of your choosing in case DNSMasq has problems starting | |
| - 1.1.1.1 | |
| depends_on: | |
| - stubby | |
| networks: | |
| skynet: | |
| ipv4_address: 172.28.0.2 | |
| ports: | |
| # - 53:53/tcp | |
| # - 53:53/udp | |
| # - 67:67/udp | |
| - 8053:80 | |
| # - 8183:443 | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.frontend.rule=Host:pihole.${DOMAINNAME}" | |
| - "traefik.port=80" | |
| - "traefik.protocol=http" | |
| - "traefik.docker.network=skynet" | |
| #resolution_type: GETDNS_RESOLUTION_STUB | |
| #dns_transport_list: | |
| # NOTE: force forward request over TLS connection. | |
| #- GETDNS_TRANSPORT_TLS | |
| #tls_authentication: GETDNS_AUTHENTICATION_REQUIRED | |
| #tls_query_padding_blocksize: 128 | |
| #edns_client_subnet_private : 0 | |
| #round_robin_upstreams: 1 | |
| #idle_timeout: 10000 | |
| #listen_addresses: | |
| #- 0.0.0.0 | |
| #- 0::1 | |
| #- 192.168.5.1 # router ip address | |
| #dnssec: GETDNS_EXTENSION_TRUE | |
| #appdata_dir: "/var/cache/stubby" | |
| #upstream_recursive_servers: | |
| # NOTE: adjust your needs accordingly. | |
| # https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Public+Resolvers | |
| # https://raw.githubusercontent.com/getdnsapi/stubby/develop/stubby.yml.example | |
| #- address_data: 1.1.1.1 | |
| # tls_auth_name: "cloudflare-dns.com" #"dns.google" | |
| # Stubby - DNS Privacy stub resolver (using DNS-over-TLS) | |
| stubby: | |
| image: yegle/stubby-dns:latest | |
| container_name: stubby | |
| hostname: stubby | |
| dns: 127.0.0.1 | |
| restart: always | |
| volumes: | |
| - ${USERDIR}/docker/stubby:/usr/local/etc/stubby | |
| networks: | |
| skynet: | |
| ipv4_address: 172.28.0.3 | |
| # Corefile | |
| #tls://.:853 https://.:443 { | |
| # tls fullchain.pem privkey.pem | |
| # forward . 172.28.0.2:53 | |
| # forward . dns://172.28.0.2:53 # check this | |
| # log | |
| # any | |
| #} | |
| # CoreDNS - DNS server, used here to terminate DoT | |
| coredns: | |
| image: coredns/coredns | |
| container_name: coredns | |
| hostname: coredns | |
| command: -conf /root/Corefile | |
| restart: always | |
| environment: | |
| - GODEBUG=tls13=1 | |
| volumes: | |
| - ${USERDIR}/docker/coredns:/root:ro | |
| - ${USERDIR}/docker/coredns:/plugin.cfg:ro | |
| - ${USERDIR}/docker/shared/letsencrypt/etc/live/${DOMAINNAME}/fullchain.pem:/fullchain.pem:ro | |
| - ${USERDIR}/docker/shared/letsencrypt/etc/live/${DOMAINNAME}/privkey.pem:/privkey.pem:ro | |
| ports: | |
| - target: 853 | |
| published: 853 | |
| protocol: tcp | |
| mode: host | |
| labels: | |
| - "traefik.enable=false" | |
| # OpenVPN server | |
| # https://github.com/kylemanna/docker-openvpn/blob/master/docs/docker-compose.md | |
| # https://github.com/mr-bolle/docker-openvpn-pihole/blob/master/docker-compose.yml | |
| openvpn: | |
| image: kylemanna/openvpn | |
| container_name: openvpn | |
| restart: always | |
| cap_add: | |
| - NET_ADMIN | |
| environment: | |
| # - VIRTUAL_PORT=${VIRTUAL_PORT_OPENVPN} | |
| # - VIRTUAL_HOST=${VIRTUAL_HOST_OPENVPN} | |
| # - LETSENCRYPT_HOST=${LETSENCRYPT_HOST_VPN} | |
| # - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL} | |
| # - OPENVPN_PROVIDER=${OPENVPN_PROVIDER} | |
| # - OPENVPN_USERNAME=${OPENVPN_USERNAME} | |
| # - OPENVPN_PASSWORD=${OPENVPN_PASSWORD} | |
| # - LOCAL_NETWORK=192.168.0.0/24 | |
| # - DEBUG=1 | |
| OPENVPN_OPTS: --inactive 3600 --ping 10 --ping-exit 60 -–log-driver json-file --log-opt max-size=10m | |
| ports: | |
| - "1194:1194/udp" | |
| volumes: | |
| - /etc/localtime:/etc/localtime:ro | |
| - /etc/timezone:/etc/timezone:ro | |
| - ${USERDIR}/docker/openvpn:/etc/openvpn | |
| networks: | |
| skynet: | |
| ipv4_address: 172.28.0.5 | |
| logging: | |
| driver: "json-file" | |
| options: | |
| max-size: "10m" | |
| max-file: "3" | |
| networks: | |
| traefik_proxy: | |
| external: | |
| name: traefik_proxy | |
| keycloak: | |
| external: | |
| name: keycloak | |
| skynet: | |
| external: | |
| name: skynet | |
| ipam: | |
| config: | |
| - subnet: 172.28.0.0/16 | |
| default: | |
| driver: bridge | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment
  
            
ports: