{
	email {$ACME_EMAIL}
	log {
		format filter {
			request>headers>X-Session-Token delete
		}
	}
}

{$SITE_ADDRESS}, http://caddy {
	encode zstd gzip

	# Vite emits content-hashed files below each frontend's assets directory.
	# Defer this header so it replaces vite preview's default no-cache value.
	@immutableFrontendAssets path_regexp immutableFrontendAssets ^/(gateway|che|kwe|pwe|twe|nya|pya|hwe)/assets/.+-[A-Za-z0-9_-]{8}\.[^/]+$
	header @immutableFrontendAssets >Cache-Control "public, max-age=31536000, immutable"
	@immutableSharedProfileAssets path_regexp immutableSharedProfileAssets ^/gateway/profile-assets/[0-9a-f]{40,64}-[0-9a-f]{16}/assets/.+-[A-Za-z0-9_-]{8}\.[^/]+$
	header @immutableSharedProfileAssets >Cache-Control "public, max-age=31536000, immutable"
	@frontendRequests path /gateway/* /che/* /kwe/* /pwe/* /twe/* /nya/* /pya/* /hwe/*
	header @frontendRequests Cache-Control "no-cache"

	redir /gateway /gateway/ 308
	redir /che /che/ 308
	redir /kwe /kwe/ 308
	redir /pwe /pwe/ 308
	redir /twe /twe/ 308
	redir /nya /nya/ 308
	redir /pya /pya/ 308
	redir /hwe /hwe/ 308

	handle_path /image/* {
		root * /srv/image
		file_server
	}

	handle /gateway/api/trpc* {
		reverse_proxy runtime:15001
	}
	handle /gateway/api/user-icons/* {
		uri strip_prefix /gateway/api
		reverse_proxy runtime:15001
	}
	handle /gateway/api/* {
		uri strip_prefix /gateway/api
		reverse_proxy runtime:15001
	}
	@sharedProfileAsset path_regexp sharedProfileAsset ^/gateway/profile-assets/[0-9a-f]{40,64}-[0-9a-f]{16}/assets/.+$
	handle @sharedProfileAsset {
		uri strip_prefix /gateway/profile-assets
		root * /srv/frontend-artifacts/game-assets/releases
		file_server
	}
	handle /gateway/* {
		@gatewayPublished file {
			root /srv/frontend-artifacts/gateway/current
			try_files /index.html
		}
		handle @gatewayPublished {
			route {
				uri strip_prefix /gateway
				root * /srv/frontend-artifacts/gateway/current
				@gatewayAsset path /assets/*
				handle @gatewayAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15000
	}

	handle /che/api/* {
		reverse_proxy runtime:15003
	}
	handle /che/* {
		@chePublished file {
			root /srv/frontend-artifacts/che/current
			try_files /index.html
		}
		handle @chePublished {
			route {
				uri strip_prefix /che
				root * /srv/frontend-artifacts/che/current
				@cheAsset path /assets/*
				handle @cheAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15002
	}
	handle /kwe/api/* {
		reverse_proxy runtime:15005
	}
	handle /kwe/* {
		@kwePublished file {
			root /srv/frontend-artifacts/kwe/current
			try_files /index.html
		}
		handle @kwePublished {
			route {
				uri strip_prefix /kwe
				root * /srv/frontend-artifacts/kwe/current
				@kweAsset path /assets/*
				handle @kweAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15004
	}
	handle /pwe/api/* {
		reverse_proxy runtime:15007
	}
	handle /pwe/* {
		@pwePublished file {
			root /srv/frontend-artifacts/pwe/current
			try_files /index.html
		}
		handle @pwePublished {
			route {
				uri strip_prefix /pwe
				root * /srv/frontend-artifacts/pwe/current
				@pweAsset path /assets/*
				handle @pweAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15006
	}
	handle /twe/api/* {
		reverse_proxy runtime:15009
	}
	handle /twe/* {
		@twePublished file {
			root /srv/frontend-artifacts/twe/current
			try_files /index.html
		}
		handle @twePublished {
			route {
				uri strip_prefix /twe
				root * /srv/frontend-artifacts/twe/current
				@tweAsset path /assets/*
				handle @tweAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15008
	}
	handle /nya/api/* {
		reverse_proxy runtime:15011
	}
	handle /nya/* {
		@nyaPublished file {
			root /srv/frontend-artifacts/nya/current
			try_files /index.html
		}
		handle @nyaPublished {
			route {
				uri strip_prefix /nya
				root * /srv/frontend-artifacts/nya/current
				@nyaAsset path /assets/*
				handle @nyaAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15010
	}
	handle /pya/api/* {
		reverse_proxy runtime:15013
	}
	handle /pya/* {
		@pyaPublished file {
			root /srv/frontend-artifacts/pya/current
			try_files /index.html
		}
		handle @pyaPublished {
			route {
				uri strip_prefix /pya
				root * /srv/frontend-artifacts/pya/current
				@pyaAsset path /assets/*
				handle @pyaAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15012
	}
	handle /hwe/api/* {
		reverse_proxy runtime:15015
	}
	handle /hwe/* {
		@hwePublished file {
			root /srv/frontend-artifacts/hwe/current
			try_files /index.html
		}
		handle @hwePublished {
			route {
				uri strip_prefix /hwe
				root * /srv/frontend-artifacts/hwe/current
				@hweAsset path /assets/*
				handle @hweAsset {
					file_server
				}
				handle {
					try_files {path} /index.html
					file_server
				}
			}
		}
		reverse_proxy runtime:15014
	}

	respond /healthz 200
	redir / /gateway/ 302
}
