version: '3' services: db: restart: always image: postgres:14-alpine shm_size: 256mb networks: - internal_network volumes: - /srv/mastodon/postgres14:/var/lib/postgresql/data # added from the default, otherwise you'll need to manually create a `mastodon` db and user/role # env_file: db.env env_file: - .env - .env.production - db.env environment: - 'POSTGRES_HOST_AUTH_METHOD=trust' - 'POSTGRES_USER=postgres' redis: restart: always image: redis:7-alpine networks: - internal_network env_file: db.env healthcheck: test: ['CMD', 'redis-cli', 'ping'] # environment: # - 'REDIS_URL=redis://redis:6379' volumes: - /srv/mastodon/redis:/data web: image: ghcr.io/mastodon/mastodon:v4.3.3 restart: always # env_file: # - .env # - db.env env_file: - .env - .env.production - db.env ports: - 3000:3000 command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000" networks: - traefik - internal_network healthcheck: # prettier-ignore test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1'] depends_on: - db - redis volumes: - /srv/mastodon/web:/mastodon/public/system labels: - traefik.enable=true - traefik.http.routers.mastodonweb.rule=Host(`kvist.knast.cc`) - traefik.http.routers.mastodonweb.entrypoints=websecure - traefik.http.routers.mastodonweb.tls.certresolver=letsencr - traefik.http.services.mastodonweb.loadbalancer.server.port=3000 # labels: # - "traefik.enable=true" # # Main Web Router # - "traefik.http.routers.mstdn-web-rtr.entrypoints=websecure" # - "traefik.http.routers.mstdn-web-rtr.rule=Host(`kvist.knast.cc`)" # - "traefik.http.routers.mstdn-web-rtr.tls=true" # - "traefik.http.routers.mstdn-web-rtr.tls.certResolver=letsencr" # # Media Router # - "traefik.http.routers.mstdn-media-rtr.entrypoints=websecure" # - "traefik.http.routers.mstdn-media-rtr.rule=(Host(`kvist.knast.cc`) && PathPrefix(`/system/media_attachments/`))" # - "traefik.http.routers.mstdn-media-rtr.tls=true" # - "traefik.http.routers.mstdn-media-rtr.tls.certResolver=letsencr" # - "traefik.http.routers.mstdn-media-rtr.middlewares=mstdn-cors-media" # # CORS Middleware # - "traefik.http.middlewares.mstdn-cors-media.headers.contentSecurityPolicy=img-src *; media-src *;" # - "traefik.http.middlewares.mstdn-cors-media.headers.accesscontrolallowheaders=*" # - "traefik.http.middlewares.mstdn-cors-media.headers.accessControlAllowOriginList=*" # # Service # - "traefik.http.services.mstdn-web-svc.loadbalancer.server.port=3344" streaming: image: ghcr.io/mastodon/mastodon-streaming:v4.3.3 restart: always # env_file: # - .env # - db.env env_file: - .env - .env.production - db.env command: node ./streaming environment: - 'REDIS_URL=redis://redis:6379' ports: - 4000:4000 networks: - traefik - internal_network healthcheck: # prettier-ignore test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1'] depends_on: - db - redis labels: - traefik.enable=true - traefik.http.routers.mastodonstreaming.rule=(Host(`kvist.knast.cc`) && PathPrefix(`/api/v1/streaming`)) - traefik.http.routers.mastodonstreaming.entrypoints=websecure - traefik.http.routers.mastodonstreaming.tls.certresolver=letsencr - traefik.http.services.mastodonstreaming.loadbalancer.server.port=4433 # labels: # - "traefik.enable=true" # - "traefik.http.routers.mstdn-streamer-rtr.entrypoints=websecure" # - "traefik.http.routers.mstdn-streamer-rtr.rule=(Host(`kvist.knast.cc`) && PathPrefix(`/api/v1/streaming`))" # - "traefik.http.routers.mstdn-streamer-rtr.tls=true" # - "traefik.http.routers.mstdn-streamer-rtr.tls.certResolver=letsencr" # - "traefik.http.services.mstdn-streamer-svc.loadbalancer.server.port=4000" sidekiq: image: ghcr.io/mastodon/mastodon:v4.3.3 restart: always env_file: - .env - .env.production - db.env command: bundle exec sidekiq depends_on: - db - redis networks: - traefik - internal_network volumes: - /srv/mastodon/sidekiq:/mastodon/public/system healthcheck: test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"] networks: traefik: external: true internal_network: internal: true # This file is designed for production server deployment, not local development work # For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/docs/DEVELOPMENT.md#docker # services: # db: # restart: always # image: postgres:14-alpine # shm_size: 256mb # networks: # - internal_network # healthcheck: # test: ['CMD', 'pg_isready', '-U', 'postgres'] # volumes: # - ./postgres14:/var/lib/postgresql/data # environment: # - 'POSTGRES_HOST_AUTH_METHOD=trust' # redis: # restart: always # image: redis:7-alpine # networks: # - internal_network # healthcheck: # test: ['CMD', 'redis-cli', 'ping'] # volumes: # - ./redis:/data # # es: # # restart: always # # image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4 # # environment: # # - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true" # # - "xpack.license.self_generated.type=basic" # # - "xpack.security.enabled=false" # # - "xpack.watcher.enabled=false" # # - "xpack.graph.enabled=false" # # - "xpack.ml.enabled=false" # # - "bootstrap.memory_lock=true" # # - "cluster.name=es-mastodon" # # - "discovery.type=single-node" # # - "thread_pool.write.queue_size=1000" # # networks: # # - traefik # # - internal_network # # healthcheck: # # test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"] # # volumes: # # - ./elasticsearch:/usr/share/elasticsearch/data # # ulimits: # # memlock: # # soft: -1 # # hard: -1 # # nofile: # # soft: 65536 # # hard: 65536 # # ports: # # - '127.0.0.1:9200:9200' # web: # # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # # build: . # image: ghcr.io/mastodon/mastodon:v4.3.3 # restart: always # env_file: # - .env # - .env.production # - db.env # command: bundle exec puma -C config/puma.rb # networks: # - traefik # - internal_network # healthcheck: # # prettier-ignore # test: ['CMD-SHELL',"curl -s --noproxy localhost localhost:3000/health | grep -q 'OK' || exit 1"] # ports: # - '127.0.0.1:3000:3000' # depends_on: # - db # - redis # # - es # volumes: # - ./public/system:/mastodon/public/system # streaming: # # You can uncomment the following lines if you want to not use the prebuilt image, for example if you have local code changes # # build: # # dockerfile: ./streaming/Dockerfile # # context: . # image: ghcr.io/mastodon/mastodon-streaming:v4.3.3 # restart: always # # env_file: # - .env # - .env.production # - db.env # command: node ./streaming/index.js # networks: # - traefik # - internal_network # healthcheck: # # prettier-ignore # test: ['CMD-SHELL', "curl -s --noproxy localhost localhost:4000/api/v1/streaming/health | grep -q 'OK' || exit 1"] # ports: # - '127.0.0.1:4000:4000' # depends_on: # - db # - redis # sidekiq: # # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # # build: . # image: ghcr.io/mastodon/mastodon:v4.3.3 # restart: always # # env_file: # - .env # - .env.production # - db.env # command: bundle exec sidekiq # depends_on: # - db # - redis # networks: # - traefik # - internal_network # volumes: # - ./public/system:/mastodon/public/system # healthcheck: # test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"] # ## Uncomment to enable federation with tor instances along with adding the following ENV variables # ## http_hidden_proxy=http://privoxy:8118 # ## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true # # tor: # # image: sirboops/tor # # networks: # # - traefik # # - internal_network # # # # privoxy: # # image: sirboops/privoxy # # volumes: # # - ./priv-config:/opt/config # # networks: # # - traefik # # - internal_network # networks: # # traefik: # traefik: # external: true # internal_network: # internal: true # # networks: # # traefik: # # external: true