# This is a sample file demonstrating how to set up reverse-proxy for matrix.DOMAIN

<VirtualHost *:80>
	ServerName matrix.DOMAIN

	ProxyVia On

	# Map /.well-known/acme-challenge to the certbot server
	# If you manage SSL certificates by yourself, this will differ.
	<Location /.well-known/acme-challenge>
		ProxyPreserveHost On
		ProxyPass http://127.0.0.1:2402/.well-known/acme-challenge
	</Location>

	Redirect permanent / https://matrix.DOMAIN/
</VirtualHost>

# Client-Server API
<VirtualHost *:443>
	ServerName matrix.DOMAIN

	SSLEngine On

	# If you manage SSL certificates by yourself, these paths will differ.
	SSLCertificateFile /matrix/ssl/config/live/matrix.DOMAIN/fullchain.pem
	SSLCertificateKeyFile /matrix/ssl/config/live/matrix.DOMAIN/privkey.pem

	SSLProxyEngine on
	SSLProxyProtocol +TLSv1.2 +TLSv1.3
	SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH

	ProxyPreserveHost On
	ProxyRequests Off
	ProxyVia On
	RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}

	# Keep some URIs free for different proxy/location
	ProxyPassMatch ^/.well-known/matrix/client !
	ProxyPassMatch ^/.well-known/matrix/server !
	ProxyPassMatch ^/_matrix/identity !
	ProxyPassMatch ^/_matrix/client/r0/user_directory/search !

	# Proxy all remaining traffic to Synapse
	AllowEncodedSlashes NoDecode
	ProxyPass /_matrix http://127.0.0.1:8008/_matrix retry=0 nocanon
	ProxyPassReverse /_matrix http://127.0.0.1:8008/_matrix
	ProxyPass /_synapse/client http://127.0.0.1:8008/_synapse/client retry=0 nocanon
	ProxyPassReverse /_synapse/client http://127.0.0.1:8008/_synapse/client
	
	# Proxy Admin API (necessary for Synapse-Admin)
	# ProxyPass /_synapse/admin http://127.0.0.1:8008/_synapse/admin retry=0 nocanon
	# ProxyPassReverse /_synapse/admin http://127.0.0.1:8008/_synapse/admin
	
	# Proxy Synapse-Admin
	# ProxyPass /synapse-admin http://127.0.0.1:8766 retry=0 nocanon
	# ProxyPassReverse /synapse-admin http://127.0.0.1:8766

	# Map /.well-known/matrix/client for client discovery
	Alias /.well-known/matrix/client /matrix/static-files/.well-known/matrix/client
	<Files "/matrix/static-files/.well-known/matrix/client">
		Require all granted
	</Files>
	<Location "/.well-known/matrix/client">
		Header always set Content-Type "application/json"
		Header always set Access-Control-Allow-Origin "*"
	</Location>
	# Map /.well-known/matrix/server for server discovery
	Alias /.well-known/matrix/server /matrix/static-files/.well-known/matrix/server
	<Files "/matrix/static-files/.well-known/matrix/server">
		Require all granted
	</Files>
	<Location "/.well-known/matrix/server">
		Header always set Content-Type "application/json"
	</Location>
	<Directory /matrix/static-files/.well-known/matrix/>
		AllowOverride All
		# Apache 2.4:
		Require all granted
		# Or for Apache 2.2:
		#order allow,deny
	</Directory>

	# Map /_matrix/identity to the identity server
	<Location /_matrix/identity>
		ProxyPass http://127.0.0.1:8090/_matrix/identity nocanon
	</Location>

	# Map /_matrix/client/r0/user_directory/search to the identity server
	<Location /_matrix/client/r0/user_directory/search>
		ProxyPass http://127.0.0.1:8090/_matrix/client/r0/user_directory/search nocanon
	</Location>

	ErrorLog ${APACHE_LOG_DIR}/matrix.DOMAIN-error.log
	CustomLog ${APACHE_LOG_DIR}/matrix.DOMAIN-access.log combined
</VirtualHost>

# Server-Server (federation) API
# Use this apache reverse proxy template to enable matrix server-to-server federation traffic
# Be sure that network traffic on port 8448 is possible
#
# You can check your federation config at https://federationtester.matrix.org/
# Enter there your base DOMAIN address, NOT your matrix.DOMAIN address, ex. https://DOMAIN
#
# In this example we use all services on the same machine (127.0.0.1) but you can do this with different machines.
# If you do so be sure to reach the destinated IPADRESS and the correspondending port. Check this with netstat, nmap or your favourite tool.
Listen 8448
<VirtualHost *:8448>
	ServerName matrix.DOMAIN

	SSLEngine On

	# If you manage SSL certificates by yourself, these paths will differ.
	SSLCertificateFile /matrix/ssl/config/live/matrix.DOMAIN/fullchain.pem
	SSLCertificateKeyFile /matrix/ssl/config/live/matrix.DOMAIN/privkey.pem

	SSLProxyEngine on
	SSLProxyProtocol +TLSv1.2 +TLSv1.3
	SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH

	ProxyPreserveHost On
	ProxyRequests Off
	ProxyVia On
	RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}

	# Proxy all remaining traffic to the Synapse port
	# Beware: In this example the local traffic goes to the local synapse server at 127.0.0.1
	# Of course you can use another IPADRESS in case of using other synapse servers in your network
	AllowEncodedSlashes NoDecode
	ProxyPass /_matrix http://127.0.0.1:8048/_matrix retry=0 nocanon
	ProxyPassReverse /_matrix http://127.0.0.1:8048/_matrix

	ErrorLog ${APACHE_LOG_DIR}/matrix.DOMAIN-error.log
	CustomLog ${APACHE_LOG_DIR}/matrix.DOMAIN-access.log combined
</VirtualHost>
