Domain, HTTPS at reverse proxies
Ilagay ang Antimatter sa isang domain name gamit ang HTTPS, gamit ang Caddy profile ng compose file o ang sarili mong reverse proxy, at itama ang site URL at mga client address.
Ang site URL
Ang site URL (ServiceSettings.SiteURL) ay ang address na ginagamit ng mga tao upang maabot ang Antimatter, tulad ng https://chat.example.com. Ginagamit nito ng server ang mga link sa mga email at notisikasyon, sa mga sign-in redirect (OAuth, OpenID Connect, SAML), para sa mga mobile at desktop apps, at upang suriin mula saan ang mga request. I-set ito sa eksaktong address sa address bar ng browser: scheme, domain at port kung hindi default, na walang trailing slash.
- Sa compose file ng site:
SITE_URLsa.env. - Sa ibang lugar:
AM_SERVICESETTINGS_SITEURL, o System Console › Environment › Web Server › Site URL.
Kung mali ang site URL, mababagsak ang sign-in gamit ang identity provider, ang mga link sa email ay tumutukoy sa maling lugar, at maaaring hindi makakonekta ang mga app. Pagkatapos magbago ng domain, i-update ito dito at sa mga redirect URL ng bawat identity provider.
HTTPS gamit ang kasamang Caddy profile
Nakapalitan ang compose.yaml ng site ng isang Caddy service sa https profile. Kinukuha nito ang certificate mula sa Let's Encrypt, inu-update ito nang awtomatiko, in-redirect ang HTTP patungo sa HTTPS, at ipinasa ang lahat, kasama ang websockets, sa Antimatter.
- Ituro ang DNS record (A, at AAAA para sa IPv6) ng iyong domain sa server.
- Buksan ang mga port 80/tcp, 443/tcp at 443/udp (HTTP/3) sa firewall. Kailangang maabot ng Let's Encrypt ang port 80 o 443 mula sa Internet.
- Idagdag ang domain sa
.envat i-set ang site URL:echo "DOMAIN=chat.example.com" >> .env sed -i 's|^SITE_URL=.*|SITE_URL=https://chat.example.com|' .env - Simulan gamit ang profile:
docker compose --profile https up -d
Idagdag ang --profile https sa bawat susunod na docker compose up, o ilagay ang COMPOSE_PROFILES=https sa .env upang kasama ito sa simpleng docker compose up -d. Pinapanatili ng Caddy ang mga certificate nito sa https volume.
Ang sariling port ng Antimatter ay mananatiling published sa host (HTTP_PORT, 8065 ang default). Kasama ang Caddy sa harap, ito ay para sa server mismo lamang:
echo "HTTP_PORT=127.0.0.1:8065" >> .env
docker compose --profile https up -d
Aabot ang Caddy sa Antimatter sa pamamagitan ng internal na edge network, hindi sa pamamagitan ng port na iyon, kaya't hindi ito magbabago para sa iyong mga user.
Gamit ang sarili mong reverse proxy (nginx)
Kung ang server ay gumagamita na ng nginx o ibang proxy, huwag i-on ang https profile at ipuntahan ang proxy sa port 8065 ng Antimatter. Dapat ng proxy:
- ipasa ang websocket upgrades (ang web app at mga mobile app ay may bukas na websocket sa
/api/v4/websocket, at may mga app na may sarili nilang bukas na websocket); - tanggapin ang mga request body na hindi bababa sa laki ng pinakamalaking upload (Pinakamataas na Laki ng File, 100 MB ang default);
- panatilihing bukas ang mga long-lived connections (websockets, malalaking uploads at downloads);
- ipasa ang
Hostheader at address ng client.
Isang kumpletong server block, na na-adopt mula sa production template sa antimatter-docker. Palitan ang domain at mga certificate paths:
upstream antimatter {
server 127.0.0.1:8065;
keepalive 64;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' '';
}
proxy_cache_path /var/cache/nginx/antimatter levels=1:2 keys_zone=antimatter_cache:10m
max_size=3g inactive=120m use_temp_path=off;
server {
listen 80;
listen [::]:80;
server_name chat.example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name chat.example.com;
ssl_certificate /etc/ssl/chat.example.com/fullchain.pem;
ssl_certificate_key /etc/ssl/chat.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_timeout 1d;
ssl_session_cache shared:AntimatterSSL:10m;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=31536000" always;
# At least FileSettings.MaxFileSize (100 MB by default).
client_max_body_size 100M;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
location ~ ^/api/v[0-9]+/(users/)?websocket$ {
client_body_timeout 60s;
send_timeout 300s;
lingering_timeout 5s;
proxy_connect_timeout 90s;
proxy_send_timeout 300s;
proxy_read_timeout 90s;
proxy_pass http://antimatter;
}
location / {
proxy_read_timeout 600s;
proxy_cache antimatter_cache;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale timeout;
proxy_cache_lock on;
proxy_pass http://antimatter;
}
}
Suriin ang file gamit ang nginx -t at ilapat ito gamit ang systemctl reload nginx. Ang server mismo ang nagpapadala ng X-Content-Type-Options, Referrer-Policy, Permissions-Policy, at X-Frame-Options; ang HSTS lang ang up to the proxy. I-raise ang max-age nito kapag gumana na ang HTTPS, at magdagdag ng includeSubDomains lamang kung ang lahat ng subdomain ay gumagamit ng HTTPS.
Sa Docker Compose at nginx sa host, ang upstream sa itaas ay tumutukoy sa published port 8065. I-publish ito sa 127.0.0.1 lamang (HTTP_PORT=127.0.0.1:8065), para hindi ma-bypass ang proxy.
May kumpletong setup sa antimatter-docker repository na may nginx sa container at Let's Encrypt gamit ang certbot, sa deploy/compose.
Iba pang proxy
Gumagana ang anumang proxy kung nakatutugon sa apat na punto sa itaas. Ang audio at video calls ay hindi pumapasa sa proxy: gumagamit ito ng sariling port, tingnan ang Calls and voice.
Mga address ng client sa likod ng proxy
Sa likod ng proxy, tila mula sa proxy ang lahat ng request. Para ma-log ang tunay na address ng client, sabihin sa server kung aling header ang nagdadala ng address, at kung aling proxy ang maaasahan. Walang field sa System Console para sa mga setting na ito: ilagay sa config.json o gamit ang mga variable.
| Key at variable | Default | Ginagawa nito |
|---|---|---|
ServiceSettings.TrustedProxyIPHeader, AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER | walang laman: gumagamit ang server ng address ng connection | Mga header na nagdadala ng address ng client, halimbawa X-Forwarded-For. Ang unang nasa request ang gagamitin. |
ServiceSettings.TrustedProxyIPs, AM_SERVICESETTINGS_TRUSTEDPROXYIPS | walang laman | Mga address o CIDR ranges ng mga proxy, halimbawa 172.29.71.0/28. Ang mga header lang ang magiging valid para sa mga request na galing sa isa sa mga ito. |
Sa isang variable, hiwalayin ang ilang halaga gamit ang spaces: AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER="X-Forwarded-For X-Real-IP". Tatalo ng server ang configuration na may entry sa TrustedProxyIPs na hindi naman IP address o CIDR range.
Paano nakikita ng server ang address ng client
Bawat proxy ay idinadagdag ang address kung saan nakuha nito ang request sa kanan ng X-Forwarded-For. Ang anuman na ipinadala ng client sa header mismo ay mananatili sa kaliwa. Kaya binabasa ng server ang header mula sa kanan, tinatawid ang mga address ng mga trusted proxy mo, at kinukuha ang unang ibang address bilang address ng client. Hindi makapili ng address ang client sa pamamagitan ng pagpapadala ng sariling header.
- Sa likod ng isang proxy, sapat na ang
TrustedProxyIPHeaderpara makakuha ng tamang address: kinukuha ng server ang pinakakanang address ng header. Naglala ng warning sa startup hangga't hindi mo rin itinatag angTrustedProxyIPs. Kung wala ito, ang sinumang makakapag-access sa port 8065 nang direkta ay maaaring mag-set ng header, kaya ipublish ang port na iyon sa127.0.0.1o sa private network lamang. - Sa likod ng maraming proxy, halimbawa ng CDN o load balancer sa harap ng sarili mong proxy, i-list ang lahat sa
TrustedProxyIPs. Kung hindi, kinukuha ng server ang address ng outer proxy bilang address ng client. - Maaaring palitan ng proxy ang header gamit ang address na nakikita nito, gaya ng ginagawa ng halimbawa ng nginx sa itaas (
X-Forwarded-For $remote_addr), o idagdag nito ($proxy_add_x_forwarded_forng nginx). Pareho silang gumagana.
Anong mga address ang ililista
I-list ang address kung saan nagmumula ang mga request ng proxy, ayon sa nakikita ng Antimatter.
- Sa compose file ng site at Caddy, ito ay naitatag na na: umaabot ang Caddy sa Antimatter sa pamamagitan ng
edgenetwork, at inilalagay ng compose file angTrustedProxyIPHeadersaX-Forwarded-Forat angTrustedProxyIPssa range ng network na iyon,EDGE_SUBNET(172.29.71.0/28maliban kung binago mo ito sa.env). Baguhin angEDGE_SUBNETkung magkakasabay ito sa isa sa mga network mo. - Ginagawa rin ng production setup sa antimatter-docker ang pareho para sa nginx container nito, gamit ang
FRONTEND_SUBNET. - Sa nginx sa host at Antimatter sa Docker, umaabot ang mga request sa Antimatter sa pamamagitan ng published port, karaniwan mula sa gateway address ng network ng compose project (ipinapakita nito ng
docker network inspect). Itag angAM_SERVICESETTINGS_TRUSTEDPROXYIPSsa address na iyon sacompose.override.yaml. - Kung walang Docker, at ang nginx ay nasa parehong host, ito ay
127.0.0.1(at::1kung ang nginx ay nagkonekta sa pamamagitan ng IPv6).
TLS nang walang proxy
Maaari ring mag-serve ng HTTPS ang server mismo, sa System Console › Environment › Web Server: itakda ang Seguridad ng Koneksyon sa TLS (ServiceSettings.ConnectionSecurity), kasama ang TLS Certificate File at TLS Key File (ServiceSettings.TLSCertFile, ServiceSettings.TLSKeyFile), o Gumamit ng Let's Encrypt (ServiceSettings.UseLetsEncrypt). Kailangan ng server na makinig sa port 443 (Listen Address, ServiceSettings.ListenAddress, :8065 ang default), at ang ServiceSettings.Forward80To443 ang nagre-redirect ng port 80. Mas madali ang reverse proxy na patakbuhin at pa-update, at ito ang tinutukoy ng gabay na ito.
Server timeouts at laki ng request
Mga setting ng sariling web server ng server, sa System Console › Environment › Web Server:
| Setting | Susi | Default |
|---|---|---|
| Listen Address | ServiceSettings.ListenAddress | :8065 |
| Read Timeout | ServiceSettings.ReadTimeout | 300 segundo |
| Write Timeout | ServiceSettings.WriteTimeout | 300 segundo |
| Idle timeout (walang field sa System Console) | ServiceSettings.IdleTimeout | 60 segundo |
| Maximum Payload Size (Bytes) | ServiceSettings.MaximumPayloadSizeBytes | tingnan ang Security |
Panatilihing hindi mas maikli ang sariling timeouts ng proxy kaysa sa mga ito para sa karaniwang request, at ang laki ng body nito ay hindi bababa sa Pinakamataas na Laki ng File.