|
@@ -1,229 +0,0 @@
|
|
|
-version: '3.7'
|
|
|
-
|
|
|
-# Environment variables are replaced with definitions in .env, when run with:
|
|
|
-#
|
|
|
-# env $(cat .env | grep ^[A-Z] | xargs) docker stack deploy --compose-file docker-compose.yml server
|
|
|
-
|
|
|
-networks:
|
|
|
- default:
|
|
|
- driver: overlay
|
|
|
-
|
|
|
-volumes:
|
|
|
- traefik-certs: {}
|
|
|
-
|
|
|
-services:
|
|
|
- traefik:
|
|
|
- image: traefik:v2.6.6
|
|
|
- ports:
|
|
|
- - 80:80
|
|
|
- - 443:443
|
|
|
- deploy:
|
|
|
- #replicas: 2 # https://youtu.be/btHpHjabRcc
|
|
|
- placement:
|
|
|
- constraints:
|
|
|
- - node.role == manager
|
|
|
- labels:
|
|
|
- - traefik.enable=true
|
|
|
-
|
|
|
- # Enable the dashboard UI
|
|
|
- - traefik.http.routers.api.rule=Host(`board.${DOMAIN}`)
|
|
|
- - traefik.http.routers.api.service=api@internal
|
|
|
- - traefik.http.routers.api.middlewares=auth
|
|
|
- - traefik.http.routers.api.tls=true
|
|
|
- - "traefik.http.middlewares.auth.basicauth.users=${TRAEFIK_API_USERS}"
|
|
|
- # Dummy service for Swarm port detection. The port can be any valid integer value.
|
|
|
- - traefik.http.services.dummy-svc.loadbalancer.server.port=9999
|
|
|
-
|
|
|
- - traefik.http.routers.traefik.tls=true
|
|
|
-
|
|
|
- # Use LS to get/renew certs for the TLD & subdomains
|
|
|
- - traefik.http.routers.traefik.tls.certresolver=le
|
|
|
- - traefik.http.routers.traefik.tls.domains[0].main=${DOMAIN}
|
|
|
- - traefik.http.routers.traefik.tls.domains[0].sans=*.${DOMAIN}
|
|
|
-
|
|
|
- volumes:
|
|
|
- - /var/run/docker.sock:/var/run/docker.sock:ro
|
|
|
- - ${CONTAINERS_DIR}/traefik/static.toml:/static.toml
|
|
|
- # cert storage can't be shared: https://doc.traefik.io/traefik/https/acme/#storage
|
|
|
- - traefik-certs:/certificates
|
|
|
- command:
|
|
|
- # Require a "traefik.enable=true" label
|
|
|
- - --providers.docker.exposedbydefault=false
|
|
|
-
|
|
|
- - --providers.docker.swarmmode=true
|
|
|
-
|
|
|
- # HTTP redirects to HTTPS
|
|
|
- - --entrypoints.web.address=:80
|
|
|
- - --entrypoints.web.http.redirections.entrypoint.permanent=false
|
|
|
- - --entrypoints.web.http.redirections.entryPoint.to=websecure
|
|
|
- - --entrypoints.web.http.redirections.entryPoint.scheme=https
|
|
|
-
|
|
|
- - --entrypoints.websecure.address=:443
|
|
|
-
|
|
|
- # Auto cert renewal via cloudflare
|
|
|
- - --certificatesresolvers.le.acme.email=${LETSENCRYPT_EMAIL}
|
|
|
- - --certificatesresolvers.le.acme.storage=/certificates/acme.json
|
|
|
- - --certificatesresolvers.le.acme.dnschallenge.provider=cloudflare
|
|
|
- - --certificatesresolvers.le.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53
|
|
|
- # debug, uncomment for testing
|
|
|
- #- --certificatesresolvers.le.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory
|
|
|
- #- --log.level=DEBUG
|
|
|
-
|
|
|
- - --accesslog=true
|
|
|
- - --log=true
|
|
|
-
|
|
|
- # Enable the traefik dashboard
|
|
|
- - --api=true
|
|
|
-
|
|
|
- - --providers.file.filename=/static.toml
|
|
|
- environment:
|
|
|
- - CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL}
|
|
|
- - CLOUDFLARE_API_KEY=${CLOUDFLARE_API_KEY}
|
|
|
-
|
|
|
- #jekyll:
|
|
|
- # image: jibby0/docker-jekyll-webhook:test
|
|
|
- # deploy:
|
|
|
- # placement:
|
|
|
- # # TODO I don't know why the 2nd replica 502s all the time if I don't do this
|
|
|
- # constraints:
|
|
|
- # - node.labels.cpu-intensive == true
|
|
|
- # replicas: 2
|
|
|
- # labels:
|
|
|
- # - traefik.enable=true
|
|
|
- # - traefik.http.routers.jekyll.tls=true
|
|
|
- # - traefik.http.routers.jekyll.rule=Host(`${DOMAIN}`)
|
|
|
- # - traefik.http.services.jekyll.loadbalancer.server.port=80
|
|
|
- # environment:
|
|
|
- # - TZ=America/New_York
|
|
|
- # - WEBHOOK_SECRET=${WEBHOOK_SECRET}
|
|
|
- # - REPO=https://github.com/jibby0/blog.git
|
|
|
- # restart: always
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/jekyll/vendor_cache:/vendor
|
|
|
-
|
|
|
- # postgres:
|
|
|
- # image: postgres:13.2
|
|
|
- # deploy:
|
|
|
- # placement:
|
|
|
- # constraints:
|
|
|
- # - node.labels.cpu-intensive == true
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/postgres/data:/var/lib/postgresql/data
|
|
|
- # - ${CONTAINERS_DIR}/postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
|
|
|
- # environment:
|
|
|
- # - POSTGRES_USER=${POSTGRES_USER}
|
|
|
- # - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
|
- # restart: always
|
|
|
-
|
|
|
- #nextcloud:
|
|
|
- # image: nextcloud:23.0.0
|
|
|
- # deploy:
|
|
|
- # placement:
|
|
|
- # constraints:
|
|
|
- # - node.labels.cpu-intensive == true
|
|
|
- # labels:
|
|
|
- # - traefik.enable=true
|
|
|
- # - traefik.http.routers.nextcloud.tls=true
|
|
|
- # - traefik.http.routers.nextcloud.rule=Host(`nextcloud.${DOMAIN}`)
|
|
|
- # - traefik.http.services.nextcloud.loadbalancer.server.port=80
|
|
|
- # expose:
|
|
|
- # - "80"
|
|
|
- # links:
|
|
|
- # - postgres
|
|
|
- # - redis
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/nextcloud:/var/www/html
|
|
|
- # environment:
|
|
|
- # - REDIS_HOST=redis
|
|
|
- # restart: always
|
|
|
-
|
|
|
- #redis:
|
|
|
- # image: redis:6.2.6
|
|
|
- # deploy:
|
|
|
- # placement:
|
|
|
- # constraints:
|
|
|
- # - node.labels.cpu-intensive == true
|
|
|
- # command: redis-server --save 60 1 --loglevel warning
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/redis:/data
|
|
|
- # restart: always
|
|
|
-
|
|
|
- # gogs:
|
|
|
- # image: gogs/gogs:0.12.0
|
|
|
- # deploy:
|
|
|
- # labels:
|
|
|
- # - traefik.enable=true
|
|
|
- # - traefik.http.routers.gogs.tls=true
|
|
|
- # - traefik.http.routers.gogs.rule=Host(`gogs.${DOMAIN}`)
|
|
|
- # - traefik.http.services.gogs.loadbalancer.server.port=3000
|
|
|
- # expose:
|
|
|
- # - "3000"
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/gogs:/data
|
|
|
- # # NOTE: My gogs instance isn't happy with postgres. For now, it's a small server
|
|
|
- # # and sqlite is fine, but I should fix this eventually.
|
|
|
- # #links:
|
|
|
- # # - postgres
|
|
|
- # restart: always
|
|
|
-
|
|
|
- # matrix:
|
|
|
- # image: matrixdotorg/synapse:v1.55.2
|
|
|
- # deploy:
|
|
|
- # placement:
|
|
|
- # constraints:
|
|
|
- # - node.labels.cpu-intensive == true
|
|
|
- # labels:
|
|
|
- # - traefik.enable=true
|
|
|
- # - traefik.http.routers.matrix.tls=true
|
|
|
- # - traefik.http.routers.matrix.rule=Host(`matrix.${DOMAIN}`)
|
|
|
- # - traefik.http.services.matrix.loadbalancer.server.port=8008
|
|
|
- # expose:
|
|
|
- # - "8008"
|
|
|
- # links:
|
|
|
- # - postgres
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/matrix:/data
|
|
|
- # restart: always
|
|
|
-
|
|
|
- # matrix_wellknown:
|
|
|
- # image: adrianrudnik/matrix-wellknown-server:1.0.1
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/matrix/wellknown:/var/schema
|
|
|
- # deploy:
|
|
|
- # labels:
|
|
|
- # - traefik.enable=true
|
|
|
- # - traefik.http.routers.matrix-wellknown.tls=true
|
|
|
- # - traefik.http.routers.matrix-wellknown.rule=Host(`matrix.${DOMAIN}`) && PathPrefix(`/.well-known/matrix/`)
|
|
|
- # - traefik.http.services.matrix-wellknown.loadbalancer.server.port=8080
|
|
|
- # expose:
|
|
|
- # - "8080"
|
|
|
-
|
|
|
- # selfoss:
|
|
|
- # image: jibby0/selfoss:2.18
|
|
|
- # deploy:
|
|
|
- # # TODO `postgres` is only accesssible on the same node ????
|
|
|
- # placement:
|
|
|
- # constraints:
|
|
|
- # - node.labels.media-encoding == true
|
|
|
- # labels:
|
|
|
- # - traefik.enable=true
|
|
|
- # - traefik.http.routers.selfoss.tls=true
|
|
|
- # - traefik.http.routers.selfoss.rule=Host(`selfoss.${DOMAIN}`)
|
|
|
- # - traefik.http.services.selfoss.loadbalancer.server.port=8888
|
|
|
- # expose:
|
|
|
- # - "8888"
|
|
|
- # links:
|
|
|
- # - postgres
|
|
|
- # volumes:
|
|
|
- # - ${CONTAINERS_DIR}/selfoss:/selfoss/data
|
|
|
- # environment:
|
|
|
- # - CRON_PERIOD=5m
|
|
|
- # restart: always
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|