Domain, HTTPS dan proksi terbalik

Letakkan Antimatter pada nama domain dengan HTTPS, menggunakan profil Caddy dalam fail compose atau proksi terbalik anda sendiri, dan pastikan URL laman serta alamat klien betul.

URL laman

URL laman (ServiceSettings.SiteURL) ialah alamat yang digunakan oleh pengguna untuk mengakses Antimatter, seperti https://chat.example.com. Pelayan menggunakannya dalam pautan dalam e-mel dan pemberitahuan, dalam alih arah masuk (OAuth, OpenID Connect, SAML), untuk aplikasi mudah alih dan desktop, dan untuk memeriksa asal permintaan. Tetapkannya kepada alamat yang tepat dalam bar alamat pelayar: skema, domain dan port jika bukan lalai, tanpa garis miring akhir.

  • Dengan fail compose laman: SITE_URL dalam .env.
  • Di mana-mana tempat lain: AM_SERVICESETTINGS_SITEURL, atau Konsol Sistem › Persekitaran › Pelayan Web › URL Laman.

Jika URL laman salah, masuk menggunakan pembekal identiti akan gagal, pautan dalam e-mel akan menunjuk ke tempat yang salah, dan aplikasi mungkin tidak dapat menyambung. Setelah mengubah domain, kemas kini di sini dan dalam URL alih arah setiap pembekal identiti.

HTTPS dengan profil Caddy terikat

Fail compose.yaml laman termasuk perkhidmatan Caddy dalam profil https. Ia memperoleh sijil dari Let's Encrypt, memperbaruinya secara automatik, mengalih arah HTTP ke HTTPS dan meneruskan semuanya, termasuk websocket, ke Antimatter.

  1. Tunjuk rekod DNS (A, dan AAAA untuk IPv6) domain anda ke pelayan.
  2. Buka port 80/tcp, 443/tcp dan 443/udp (HTTP/3) dalam tembok api. Let's Encrypt mesti dapat mencapai port 80 atau 443 dari Internet.
  3. Tambah domain ke .env dan tetapkan URL laman:
    echo "DOMAIN=chat.example.com" >> .env
    sed -i 's|^SITE_URL=.*|SITE_URL=https://chat.example.com|' .env
  4. Mula dengan profil:
    docker compose --profile https up -d

Tambah --profile https ke setiap docker compose up kemudian, atau letakkan COMPOSE_PROFILES=https dalam .env supaya docker compose up -d biasa menyertainya. Caddy menyimpan sijilnya dalam volume https.

Port sendiri Antimatter kekal diterbitkan pada hos (HTTP_PORT, 8065 secara lalai). Dengan Caddy di hadapan, simpannya untuk pelayan itu sendiri sahaja:

echo "HTTP_PORT=127.0.0.1:8065" >> .env
docker compose --profile https up -d

Caddy mencapai Antimatter melalui rangkaian dalaman edge, bukan melalui port itu, jadi ini tidak mengubah apa-apa untuk pengguna anda.

Dengan proksi terbalik anda sendiri (nginx)

Jika pelayan sudah menjalankan nginx atau proksi lain, matikan profil https dan arahkan proksi ke port 8065 Antimatter. Proksi mesti:

  • melewati peningkatan websocket (ap web dan ap mudah alih mengekalkan websocket terbuka pada /api/v4/websocket, dan beberapa ap membuka websocket mereka sendiri);
  • menerima badan permintaan sekurang-kurangnya sebesar muat naik terbesar (Saiz Fail Maksimum, 100 MB secara lalai);
  • mengekalkan sambungan jangka panjang terbuka (websocket, muat naik dan muat turun besar);
  • melewati pengepala Host dan alamat klien.

Blok pelayan lengkap, disesuaikan dari templat pengeluaran dalam antimatter-docker. Gantikan domain dan laluan sijil:

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;
    }
}

Semak fail dengan nginx -t dan terapkannya dengan systemctl reload nginx. Pelayan menghantar X-Content-Type-Options, Referrer-Policy, Permissions-Policy dan X-Frame-Options sendiri; hanya HSTS yang bergantung pada proksi. Naikkan max-age anda apabila HTTPS berfungsi, dan tambah includeSubDomains hanya jika setiap subdomain menggunakan HTTPS.

Dengan Docker Compose dan nginx pada hos, upstream di atas menunjuk ke port 8065 yang diterbitkan. Terbitkannya pada 127.0.0.1 sahaja (HTTP_PORT=127.0.0.1:8065), supaya tiada siapa yang dapat memintas proksi.

Repositori antimatter-docker mempunyai setup lengkap dengan nginx dalam kontena dan Let's Encrypt melalui certbot, dalam deploy/compose.

Proksi lain

Mana-mana proksi berfungsi jika ia memenuhi empat perkara di atas. Panggilan audio dan video tidak pernah melalui proksi: mereka menggunakan port mereka sendiri, lihat Panggilan dan suara.

Alamat klien di belakang proksi

Di belakang proksi, setiap permintaan kelihatan datang dari proksi. Untuk merekodkan alamat klien sebenar, terapkan had kadar per klien dan gunakan penapisan IP, beritahu pelayan pengepala mana yang membawa alamat, dan proksi mana yang boleh dipercayai. Tiada tetapan ini mempunyai medan Konsol Sistem: tetapkan dalam config.json atau dengan pemboleh ubah.

Kunci dan pemboleh ubahLalaiFungsinya
ServiceSettings.TrustedProxyIPHeader, AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADERkosong: pelayan menggunakan alamat sambunganPengepala yang membawa alamat klien, contohnya X-Forwarded-For. Yang pertama hadir dalam permintaan akan digunakan.
ServiceSettings.TrustedProxyIPs, AM_SERVICESETTINGS_TRUSTEDPROXYIPSkosongAlamat atau julat CIDR proksi anda, contohnya 172.29.71.0/28. Pengepala hanya dikira untuk permintaan yang datang daripada salah satunya.

Dalam pemboleh ubah, pisahkan beberapa nilai dengan ruang: AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER="X-Forwarded-For X-Real-IP". Pelayan akan menolak konfigurasi yang mempunyai entri dalam TrustedProxyIPs yang bukan alamat IP atau julat CIDR.

Bagaimana pelayan mencari alamat klien

Setiap proksi menambah alamat yang daripadanya ia menerima permintaan ke sebelah kanan X-Forwarded-For. Apa jua yang dihantar oleh klien dalam pengepal itu sendiri kekal di sebelah kiri. Oleh itu, pelayan membaca pengepal dari kanan, melangkau alamat proksi dipercayai anda, dan mengambil alamat lain pertama sebagai alamat klien. Klien tidak boleh memilih alamatnya sendiri dengan menghantar pengepal miliknya.

  • Di belakang satu proksi, TrustedProxyIPHeader sahaja memberikan alamat yang betul: pelayan mengambil alamat paling kanan dalam pengepal. Ia akan merekod amaran semasa permulaan sehingga anda juga menetapkan TrustedProxyIPs. Tanpanya, sesiapa sahaja yang mencapai port 8065 secara langsung boleh menetapkan pengepal, jadi terbitkan port itu pada 127.0.0.1 atau pada rangkaian peribadi sahaja.
  • Di belakang beberapa proksi, contohnya CDN atau penyeimbang beban di hadapan proksi anda sendiri, senaraikan kesemuanya dalam TrustedProxyIPs. Jika tidak, pelayan akan mengambil alamat proksi luar sebagai alamat klien.
  • Proksi boleh menggantikan pengepal dengan alamat yang dilihatnya, seperti yang dilakukan oleh contoh nginx di atas (X-Forwarded-For $remote_addr), atau menambahnya (nginx's $proxy_add_x_forwarded_for). Kedua-duanya berfungsi.

Alamat mana yang perlu disenaraikan

Senaraikan alamat yang daripadanya permintaan proksi datang, seperti yang dilihat oleh Antimatter.

  • Dengan fail compose laman web dan Caddy, ini sudah dilakukan: Caddy mencapai Antimatter melalui rangkaian edge, dan fail compose menetapkan TrustedProxyIPHeader kepada X-Forwarded-For dan TrustedProxyIPs kepada julat rangkaian tersebut, EDGE_SUBNET (172.29.71.0/28 melainkan anda mengubahnya dalam .env). Ubah EDGE_SUBNET jika ia bertindih dengan salah satu rangkaian anda.
  • Penetapan pengeluaran dalam antimatter-docker melakukan perkara yang sama untuk kontena nginxnya, dengan FRONTEND_SUBNET.
  • Dengan nginx pada hos dan Antimatter dalam Docker, permintaan mencapai Antimatter melalui port yang diterbitkan, biasanya dari alamat gateway rangkaian projek compose (docker network inspect memaparkannya). Tetapkan AM_SERVICESETTINGS_TRUSTEDPROXYIPS kepada alamat tersebut dalam compose.override.yaml.
  • Tanpa Docker, dengan nginx pada hos yang sama, ia ialah 127.0.0.1 (dan ::1 jika nginx menyambung melalui IPv6).

TLS tanpa proksi

Pelayan juga boleh menyediakan HTTPS sendiri, dalam Konsol Sistem › Persekitaran › Pelayan Web: Keselamatan Sambungan ditetapkan kepada TLS (ServiceSettings.ConnectionSecurity), dengan Fail Sijil TLS dan Fail Kunci TLS (ServiceSettings.TLSCertFile, ServiceSettings.TLSKeyFile), atau Gunakan Let's Encrypt (ServiceSettings.UseLetsEncrypt). Pelayan mesti kemudian mendengar pada port 443 (Alamat Dengar, ServiceSettings.ListenAddress, :8065 secara lalai), dan ServiceSettings.Forward80To443 mengalihkan port 80. Proksi songsang lebih mudah untuk dijalankan dan diperbaharui, dan inilah yang andaikan panduan ini.

Had masa pelayan dan saiz permintaan

Tetapan pelayan web pelayan itu sendiri, dalam Konsol Sistem › Persekitaran › Pelayan Web:

TetapanKunciLalai
Alamat DengarServiceSettings.ListenAddress:8065
Had Masa BacaServiceSettings.ReadTimeout300 saat
Had Masa TulisanServiceSettings.WriteTimeout300 saat
Had masa rehat (tiada medan Konsol Sistem)ServiceSettings.IdleTimeout60 saat
Saiz Beban Maksimum (Bait)ServiceSettings.MaximumPayloadSizeByteslihat Keselamatan

Simpan had masa proksi sendiri sekurang-kurangnya sama panjang dengan ini untuk permintaan biasa, dan saiz badannya sekurang-kurangnya Saiz Fail Maksimum.