# version: '3.7' # 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: # - .env.production # 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 # environment: # - PUID=1000 # - PGID=1000 # 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 # 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