services: empostor: build: context: . dockerfile: Dockerfile container_name: empostor-server restart: unless-stopped ports: # HTTP API / Admin panel (TCP) - "22023:22023/tcp" # Game / Matchmaker UDP — REQUIRED. The matchmaker always binds this UDP # port (Server.ListenPort) so players can connect; without it the server # is unreachable even in delta mode. - "22023:22023/udp" # Delta UDP port pool. With DeltaPortStart/End enabled, each player is # assigned a unique UDP port from this range (Server.DeltaPortStart/End). # Must stay in sync with config.json. - "22024-42024:22024-42024/udp" # Uncomment to expose admin HTTP panel: # - "80:80/tcp" volumes: # Server config. NOTE: if ./config.json does NOT exist on the host, Docker # creates an EMPTY DIRECTORY at that path and mounts it over the baked-in # /app/config.json, which breaks startup. Create the file first (or remove # this line to use the image's default config) before running. - ./config.json:/app/config.json:ro # Writable runtime data - empostor_plugins:/app/plugins - empostor_libraries:/app/libraries - empostor_languages:/app/Languages - ./Log:/app/Log - ./Data:/app/Data - ./marketplace:/app/marketplace # Per-component configs (writable from admin panel) - ./discord_webhook.json:/app/discord_webhook.json environment: - DOTNET_RUNNING_IN_CONTAINER=1 - ASPNETCORE_URLS=http://0.0.0.0:80 # PublicIp MUST be your real public IP / domain, or remote players can't # connect. 0.0.0.0 / 127.0.0.1 will NOT work for anyone but localhost. - EMPOSTOR_Server__PublicIp=0.0.0.0 - EMPOSTOR_Server__ListenIp=0.0.0.0 volumes: empostor_plugins: empostor_libraries: empostor_languages: