โดเมน, HTTPS และพร็อกซีย้อนกลับ

นำ Antimatter ไปอยู่บนชื่อโดเมนพร้อม HTTPS โดยใช้โปรไฟล์ Caddy ในไฟล์ compose หรือพร็อกซีย้อนกลับของคุณเอง และตั้งค่า Site URL และที่อยู่ไคลเอนต์ให้ถูกต้อง

Site URL

Site URL (ServiceSettings.SiteURL) คือที่อยู่ที่ใช้เข้าถึง Antimatter เช่น https://chat.example.com เซิร์ฟเวอร์จะใช้ที่อยู่นี้ในลิงก์ในอีเมลและการแจ้งเตือน ในการเปลี่ยนเส้นทางเข้าสู่ระบบ (OAuth, OpenID Connect, SAML) สำหรับแอปมือถือและเดสก์ท็อป และเพื่อตรวจสอบว่าคำขอมาจากที่ใด ตั้งค่าให้เป็นที่อยู่เดียวกับที่อยู่ในแถบที่อยู่ของเบราว์เซอร์: โปรโตคอล โดเมน และพอร์ต (ถ้าไม่ใช่ค่าเริ่มต้น) โดยไม่มีเครื่องหมาย / ต่อท้าย

  • ในไฟล์ compose ของไซต์: SITE_URL ใน .env.
  • ที่อื่น: AM_SERVICESETTINGS_SITEURL หรือ คอนโซลระบบ › สภาพแวดล้อม › เซิร์ฟเวอร์เว็บ › Site URL.

หาก Site URL ผิดพลาด การเข้าสู่ระบบด้วยผู้ให้บริการตัวตนจะล้มเหลว ลิงก์ในอีเมลจะชี้ไปยังที่ผิด และแอปอาจเชื่อมต่อไม่ได้ หลังจากเปลี่ยนโดเมนแล้ว ให้อัปเดตที่นี่และใน URL เปลี่ยนเส้นทางของผู้ให้บริการตัวตนทุกเจ้า

HTTPS ด้วยโปรไฟล์ Caddy ที่มากับระบบ

ไฟล์ compose.yaml ของไซต์มีบริการ Caddy ในโปรไฟล์ https ซึ่งจะได้รับใบรับรองจาก Let's Encrypt ต่ออายุเอง เปลี่ยนเส้นทางจาก HTTP ไป HTTPS และส่งต่อทุกอย่าง รวมถึง websocket ไปยัง Antimatter

  1. ตั้ง DNS record (A และ AAAA สำหรับ IPv6) ของโดเมนของคุณให้ชี้ไปยังเซิร์ฟเวอร์
  2. เปิดพอร์ต 80/tcp, 443/tcp และ 443/udp (HTTP/3) ในไฟร์วอลล์ Let's Encrypt ต้องเข้าถึงพอร์ต 80 หรือ 443 จากอินเทอร์เน็ตได้
  3. เพิ่มโดเมนใน .env และตั้งค่า Site URL:
    echo "DOMAIN=chat.example.com" >> .env
    sed -i 's|^SITE_URL=.*|SITE_URL=https://chat.example.com|' .env
  4. เริ่มด้วยโปรไฟล์:
    docker compose --profile https up -d

เพิ่ม --profile https ในคำสั่ง docker compose up ทุกครั้งต่อจากนี้ หรือใส่ COMPOSE_PROFILES=https ใน .env เพื่อให้ docker compose up -d ธรรมดาครอบคลุมโปรไฟล์นี้ด้วย Caddy จะเก็บใบรับรองในโวลุ่ม https

พอร์ตของ Antimatter เองยังคงเปิดอยู่บนโฮสต์ (HTTP_PORT ค่าเริ่มต้นคือ 8065) เมื่อมี Caddy อยู่ด้านหน้า ให้ใช้พอร์ตนี้สำหรับเซิร์ฟเวอร์เองเท่านั้น:

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

Caddy จะเข้าถึง Antimatter ผ่านเครือข่ายภายใน edge ไม่ใช่ผ่านพอร์ตนั้น ดังนั้นการตั้งค่านี้จึงไม่ส่งผลกระทบต่อผู้ใช้ของคุณ

ด้วยพร็อกซีย้อนกลับของคุณเอง (nginx)

หากเซิร์ฟเวอร์กำลังรัน nginx หรือพร็อกซีอื่นอยู่แล้ว ให้ปิดโปรไฟล์ https และชี้พร็อกซีไปยังพอร์ต 8065 ของ Antimatter พร็อกซีต้อง:

  • ส่งต่อการอัปเกรด websocket (เว็บแอปและแอปมือถือจะเปิด websocket ไว้ที่ /api/v4/websocket และบางแอปจะเปิด websocket ของตัวเอง);
  • ยอมรับ body ของคำขอที่มีขนาดอย่างน้อยเท่ากับขนาดอัปโหลดที่ใหญ่ที่สุด (ขนาดไฟล์สุงสุด ซึ่งค่าเริ่มต้นคือ 100 MB);
  • รักษาการเชื่อมต่อระยะยาวไว้ (websocket, การอัปโหลดและดาวน์โหลดขนาดใหญ่);
  • ส่งต่อ header Host และที่อยู่ของไคลเอนต์

บล็อกเซิร์ฟเวอร์ที่สมบูรณ์ ซึ่งปรับแก้จากเทมเพลตสำหรับใช้งานจริงใน antimatter-docker แทนที่โดเมนและเส้นทางของใบรับรอง:

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

ตรวจสอบไฟล์ด้วย nginx -t และนำไปใช้ด้วย systemctl reload nginx เซิร์ฟเวอร์จะส่ง X-Content-Type-Options, Referrer-Policy, Permissions-Policy และ X-Frame-Options เอง; มีเพียง HSTS ที่ขึ้นกับพร็อกซี เพิ่มค่า max-age เมื่อ HTTPS ทำงานได้แล้ว และเพิ่ม includeSubDomains เฉพาะเมื่อทุกซับโดเมนใช้ HTTPS

เมื่อใช้ Docker Compose และ nginx บนโฮสต์ upstream ด้านบนจะชี้ไปยังพอร์ต 8065 ที่เผยแพร่ไว้ เผยแพร่บน 127.0.0.1 เท่านั้น (HTTP_PORT=127.0.0.1:8065) เพื่อไม่ให้ใครอ้อมพร็อกซีได้

รีพอสิทอรี antimatter-docker มีชุดติดตั้งที่สมบูรณ์พร้อม nginx ในคอนเทนเนอร์ และ Let's Encrypt ผ่าน certbot ใน deploy/compose

พร็อกซีอื่นๆ

พร็อกซีใดๆ ก็ใช้ได้หากตรงตาม 4 ข้อด้านบน เสียงและวิดีโอจะไม่ผ่านพร็อกซี: พวกเขาใช้พอร์ตของตัวเอง ดู การโทรและเสียง

ที่อยู่ของไคลเอนต์ที่อยู่หลังพร็อกซี

เมื่ออยู่หลังพร็อกซี คำขอทุกคำขอจะดูเหมือนมาจากพร็อกซี เพื่อที่จะบันทึกที่อยู่จริงของไคลเอนต์ ใช้ขีดจำกัดอัตราต่อไคลเอนต์ และใช้การกรอง IP บอกเซิร์ฟเวอร์ว่า header ไหนที่นำที่อยู่ และพร็อกซีตัวไหนที่เชื่อถือได้ การตั้งค่าทั้งสองไม่มีฟิลด์ในคอนโซลระบบ: ตั้งค่าใน config.json หรือด้วยตัวแปร

คีย์และตัวแปรค่าเริ่มต้นสิ่งที่ทำ
ServiceSettings.TrustedProxyIPHeader, AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADERว่าง: เซิร์ฟเวอร์จะใช้ที่อยู่ของการเชื่อมต่อheader ที่นำที่อยู่ของไคลเอนต์ ตัวอย่างเช่น X-Forwarded-For ตัวแรกที่มีอยู่ในคำขอจะถูกใช้
ServiceSettings.TrustedProxyIPs, AM_SERVICESETTINGS_TRUSTEDPROXYIPSว่างที่อยู่หรือช่วง CIDR ของพร็อกซีของคุณ ตัวอย่างเช่น 172.29.71.0/28 header จะถูกนับเฉพาะสำหรับคำขอที่มาจากหนึ่งในนั้น

ในตัวแปร ให้คั่นค่าหลายค่าด้วยช่องว่าง: AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER="X-Forwarded-For X-Real-IP" เซิร์ฟเวอร์จะปฏิเสธการตั้งค่าที่มีรายการใน TrustedProxyIPs ซึ่งไม่ใช่ทั้งที่อยู่ IP หรือช่วง CIDR

วิธีที่เซิร์ฟเวอร์ค้นหาที่อยู่ของไคลเอนต์

แต่ละพร็อกซีจะเพิ่มที่อยู่ที่ได้รับคำขอมาจากไปไว้ทางขวาของ X-Forwarded-For ส่วนข้อมูลที่ไคลเอนต์ส่งมาในเฮดเดอร์เองจะยังคงอยู่ทางซ้าย ดังนั้นเซิร์ฟเวอร์จึงอ่านเฮดเดอร์จากขวาไปซ้าย ข้ามที่อยู่ของพร็อกซีที่เชื่อถือได้ และนำที่อยู่อื่นที่อยู่แรกสุดมาเป็นของไคลเอนต์ ไคลเอนต์ไม่สามารถเลือกที่อยู่ของตัวเองได้ด้วยการส่งเฮดเดอร์ของตัวเอง

  • เมื่ออยู่หลังพร็อกซีเดียว TrustedProxyIPHeader เพียงอย่างเดียวจะให้ที่อยู่ที่ถูกต้อง: เซิร์ฟเวอร์จะนำที่อยู่ที่อยู่ขวาสุดของเฮดเดอร์ มันจะบันทึกคำเตือนเมื่อเริ่มทำงานจนกว่าคุณจะตั้งค่า TrustedProxyIPs ด้วยเช่นกัน หากไม่มีค่านี้ ผู้ใดก็ตามที่เข้าถึงพอร์ต 8065 โดยตรงสามารถตั้งค่าเฮดเดอร์ได้ ดังนั้นจึงควรเผยแพร่พอร์ตนั้นบน 127.0.0.1 หรือบนเครือข่ายส่วนตัวเท่านั้น
  • เมื่ออยู่หลังพร็อกซีหลายตัว เช่น CDN หรือ load balancer อยู่หน้าพร็อกซีของคุณเอง ให้ระบุรายการทั้งหมดใน TrustedProxyIPs มิฉะนั้นเซิร์ฟเวอร์จะนำที่อยู่ของพร็อกซีชั้นนอกมาเป็นของไคลเอนต์
  • พร็อกซีสามารถแทนที่เฮดเดอร์ด้วยที่อยู่ตามที่มันเห็นได้ ดังตัวอย่าง nginx ด้านบน (X-Forwarded-For $remote_addr) หรือเพิ่มต่อท้าย (nginx's $proxy_add_x_forwarded_for) ทั้งสองวิธีใช้ได้ผล

ที่อยู่ใดบ้างที่ควรระบุ

ระบุที่อยู่ที่มาของคำขอจากพร็อกซี ตามที่ Antimatter เห็น

  • เมื่อใช้ไฟล์ compose ของไซต์และ Caddy สิ่งนี้เสร็จสิ้นแล้ว: Caddy เข้าถึง Antimatter ผ่านเครือข่าย edge และไฟล์ compose ตั้งค่า TrustedProxyIPHeader เป็น X-Forwarded-For และ TrustedProxyIPs เป็นช่วงของเครือข่ายนั้น EDGE_SUBNET (172.29.71.0/28 เว้นแต่คุณจะเปลี่ยนมันใน .env) เปลี่ยน EDGE_SUBNET หากมันทับซ้อนกับเครือข่ายใดของคุณ
  • การตั้งค่า production ใน antimatter-docker ทำเช่นเดียวกันสำหรับคอนเทนเนอร์ nginx ของมัน โดยใช้ FRONTEND_SUBNET
  • เมื่อใช้ nginx บนโฮสต์และ Antimatter ใน Docker คำขอจะมาถึง Antimatter ผ่านพอร์ตที่เผยแพร่ โดยปกติมาจากที่อยู่ gateway ของเครือข่ายของโปรเจกต์ compose (docker network inspect จะแสดงมัน) ตั้งค่า AM_SERVICESETTINGS_TRUSTEDPROXYIPS เป็นที่อยู่นั้นใน compose.override.yaml
  • หากไม่ใช้ Docker และใช้ nginx บนโฮสต์เดียวกัน ให้ใช้ 127.0.0.1 (หรือ ::1 หาก nginx เชื่อมต่อผ่าน IPv6)

TLS โดยไม่มีพร็อกซี

เซิร์ฟเวอร์สามารถให้บริการ HTTPS เองได้ ใน คอนโซลระบบ › สภาพแวดล้อม › เซิร์ฟเวอร์เว็บ: ตั้งค่า ความปลอดภัยของการเชื่อมต่อ เป็น TLS (ServiceSettings.ConnectionSecurity) พร้อม ไฟล์ใบรับรอง TLS และ ไฟล์คีย์ส่วนตัว TLS (ServiceSettings.TLSCertFile, ServiceSettings.TLSKeyFile) หรือ ใช้ Let’s Encrypt (ServiceSettings.UseLetsEncrypt) จากนั้นเซิร์ฟเวอร์ต้องฟังบนพอร์ต 443 (ที่อยู่ที่จะฟัง, ServiceSettings.ListenAddress, ค่าเริ่มต้นคือ :8065) และ ServiceSettings.Forward80To443 จะเปลี่ยนเส้นทางพอร์ต 80 การใช้พร็อกซีแบบย้อนกลับนั้นง่ายกว่าในการดำเนินการและต่ออายุ และนี่คือสิ่งที่คู่มือนี้ตั้งสมมติฐานไว้

Timeout ของเซิร์ฟเวอร์และขนาดคำขอ

การตั้งค่าของเซิร์ฟเวอร์เว็บของเซิร์ฟเวอร์เอง ใน คอนโซลระบบ › สภาพแวดล้อม › เซิร์ฟเวอร์เว็บ:

การตั้งค่าคีย์ค่าเริ่มต้น
ที่อยู่ที่จะฟังServiceSettings.ListenAddress:8065
Read TimeoutServiceSettings.ReadTimeout300 วินาที
Write TimeoutServiceSettings.WriteTimeout300 วินาที
Idle timeout (ไม่มีฟิลด์ในคอนโซลระบบ)ServiceSettings.IdleTimeout60 วินาที
ขนาด Payload ที่มากที่สุด (ไบต์)ServiceSettings.MaximumPayloadSizeBytesดู ความปลอดภัย

ให้ Timeout ของพร็อกซีเองมีค่าอย่างน้อยเท่ากับค่าเหล่านี้สำหรับคำขอปกติ และขนาด body อย่างน้อย ขนาดไฟล์สูงสุด