version: '3.7' services: mastodon: image: lscr.io/linuxserver/mastodon:latest container_name: mastodon environment: - PUID=1000 - PGID=1000 - TZ=Etc/UTC - LOCAL_DOMAIN=knast.cc - REDIS_HOST=redis - REDIS_PORT=6379 - DB_HOST=db - DB_USER=mastodon - DB_NAME=mastodon - DB_PASS=mastodon - DB_PORT=5432 - ES_ENABLED=false - ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=48cb26b4254c56457e9279b877a11d9e43f9e8e4b63875f80390bfe132597bb61ea405c040a4ff1b16736290c40a9efc166986eb2502c00f77527c6ff22f5b9f - ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=4da48ca5d54eb6222db3971d446dc9ad5d372ae6555c85b5221ceb56a88248f10977a1c00809a101d1bfcd6cb34aedaeee6fb471deb78912327c143f108f38d2 - ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=24923f2e2296745137e79deb1bdaecf221406278ae7ebebd1c5d583cacb2455a5713c726dbdd107ef4b4c0ab52040b0d9c08af69cc5f75391b0cac49ea313b40 - SECRET_KEY_BASE=29e52e5bd23fdeab4676ef27eafcac36b3db9a5842ec9e50910f78c350ac4c1d3d722003ab473936d67d68bc6c5702174effda71d94e27cdaea049d4c6958eb8 - OTP_SECRET=48cb26b4254c56457e9279b877a11d9e43f9e8e4b63875f80390bfe132597bb61ea405c040a4ff1b16736290c40a9efc166986eb2502c00f77527c6ff22f5b9f - VAPID_PRIVATE_KEY=4da48ca5d54eb6222db3971d446dc9ad5d372ae6555c85b5221ceb56a88248f10977a1c00809a101d1bfcd6cb34aedaeee6fb471deb78912327c143f108f38d2 - VAPID_PUBLIC_KEY=24923f2e2296745137e79deb1bdaecf221406278ae7ebebd1c5d583cacb2455a5713c726dbdd107ef4b4c0ab52040b0d9c08af69cc5f75391b0cac49ea313b40 - SMTP_SERVER=mail.example.com - SMTP_PORT=25 - SMTP_LOGIN= - SMTP_PASSWORD= - SMTP_FROM_ADDRESS=mastodon@kvist.knast.cc - S3_ENABLED=false - WEB_DOMAIN=kvist.knast.cc #optional # - ES_HOST=es #optional # - ES_PORT=9200 #optional # - ES_USER=elastic #optional # - ES_PASS=elastic #optional # - S3_BUCKET= #optional # - AWS_ACCESS_KEY_ID= #optional # - AWS_SECRET_ACCESS_KEY= #optional # - S3_ALIAS_HOST= #optional # - SIDEKIQ_ONLY=false #optional # - SIDEKIQ_QUEUE= #optional # - SIDEKIQ_DEFAULT=false #optional # - SIDEKIQ_THREADS=5 #optional # - DB_POOL=5 #optional - NO_CHOWN= #optional volumes: - /srv/mastodon:/config ports: - 8008:80 - 4433:443 restart: unless-stopped labels: - traefik.enable=true - traefik.http.routers.mastodon.rule=Host(`kvist.knast.cc`) - traefik.http.routers.mastodon.entrypoints=websecure - traefik.http.routers.mastodon.tls.certresolver=letsencr - traefik.http.services.mastodon.loadbalancer.server.port=8008 - traefik.http.services.mastodon.loadbalancer.server.port=4433 # 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 # # - db.env # - .env.production # 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/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