ڈومین، HTTPS اور ریورس پروکسیز

Antimatter کو HTTPS کے ساتھ کسی ڈومین نام پر رکھیں، compose فائل کے Caddy پروفائل یا اپنے کسی ریورس پروکسی کے ذریعے، اور سائٹ URL اور کلائنٹ ایڈریسز کو درست کریں۔

سائٹ URL

سائٹ URL (ServiceSettings.SiteURL) وہ پتہ ہے جس کے ذریعے لوگ Antimatter تک پہنچتے ہیں، جیسے https://chat.example.com۔ سرور اسے ای میلز اور اطلاعات میں لنکس، سائن ان ری ڈائریکٹس (OAuth, OpenID Connect, SAML)، موبائل اور ڈیسک ٹاپ ایپس، اور درخواستوں کے ماخذ کی تصدیق کے لیے استعمال کرتا ہے۔ اسے براہِ راست براؤزر کے ایڈریس بار میں موجود پتے کے مطابق سیٹ کریں: اسکیم، ڈومین اور اگر ڈیفالٹ نہ ہو تو پورٹ، بغیر آخری سلیش کے۔

  • سائٹ کی compose فائل کے ساتھ: .env میں SITE_URL۔
  • ہر جگہ: AM_SERVICESETTINGS_SITEURL، یا سسٹم کنسول › ماحولیات › ویب سرور › سائٹ URL۔

اگر سائٹ URL غلط ہو تو شناختی فراہم کنندہ کے ساتھ سائن ان ناکام ہو جائے گا، ای میلز میں لنکس غلط جگہ کی طرف اشارہ کریں گے، اور ایپس ممکن ہے کہ منسلک نہ ہو سکیں۔ ڈومین تبدیل کرنے کے بعد اسے یہاں اور ہر شناختی فراہم کنندہ کے ری ڈائریکٹ URL میں اپ ڈیٹ کریں۔

شامل شدہ Caddy پروفائل کے ساتھ HTTPS

سائٹ کی compose.yaml میں https پروفائل کے تحت Caddy سروس شامل ہے۔ یہ Let's Encrypt سے سرٹیفکیٹ حاصل کرتا ہے، خود بخود اس کی تجدید کرتا ہے، HTTP کو HTTPS پر ری ڈائریکٹ کرتا ہے، اور ہر چیز، بشمولہ ویب سکیٹس، Antimatter کو فوروارد کرتا ہے۔

  1. اپنے ڈومین کا DNS ریکارڈ (A، اور IPv6 کے لیے AAAA) سرور کی طرف اشارہ کریں۔
  2. فائر وال میں پورٹس 80/tcp، 443/tcp اور 443/udp (HTTP/3) کھولیں۔ Let's Encrypt کو انٹرنیٹ سے پورٹ 80 یا 443 تک رسائی ہونی چاہیے۔
  3. ڈومین کو .env میں شامل کریں اور سائٹ 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

ہر بعد کی docker compose up میں --profile https شامل کریں، یا .env میں COMPOSE_PROFILES=https رکھیں تاکہ سادہ 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 اندرونی edge نیٹ ورک کے ذریعے Antimatter تک پہنچتا ہے، اس پورٹ کے ذریعے نہیں، اس لیے آپ کے صارفین کے لیے اس سے کوئی تبدیلی نہیں آتی۔

اپنے ریورس پروکسی (nginx) کے ساتھ

اگر سرور پر پہلے سے nginx یا کوئی اور پروکسی چل رہا ہو، تو https پروفائل بند رکھیں اور پروکسی کو Antimatter کے پورٹ 8065 کی طرف اشارہ کریں۔ پروکسی کو درج ذیل چیزیں کرنی ہوں گی:

  • websocket اپ گریڈز کو آگے بھجائے (ویب ایپ اور موبائل ایپس /api/v4/websocket پر websocket کھلی رکھتی ہیں، اور کچھ ایپس اپنی الگ websocket کھولتی ہیں);
  • زیادہ سے زیادہ اپ لوڈ (زیادہ سے زیادہ فائل سائز، پہلے سے طے شدہ 100 میگا بائٹ) کے برابر یا اس سے بڑے request bodies کو قبول کریں؛
  • طویل مدتی کنکشنز کو کھلا رکھے (websockets، بڑے اپ لوڈز اور ڈاؤن لوڈز);
  • 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 پروکسی کے اختیار پر ہے۔ جب HTTPS کام کرنا شروع ہو جائے تو اس کا max-age بڑھائیں، اور 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 میں موجود ہے۔

دیگر پروکسیز

کوئی بھی پروکسی کام کر سکتا ہے اگر وہ اوپر دی گئی چار شرائط پوری کرے۔ آڈیو اور ویڈیو کالز کبھی پروکسی کے ذریعے نہیں جاتی ہیں: وہ اپنا الگ پورٹ استعمال کرتی ہیں، مزید تفصیل کے لیے دیکھیں Calls and voice۔

پروکسی کے پیچھے کلائنٹ کے پتے

پروکسی کے پیچھے، ہر درخواست ایسی لگتی ہے جیسے وہ پروکسی سے آ رہی ہو۔ حقیقی کلائنٹ پتے کو لاگ کرنے کے لیے، ہر کلائنٹ کے لیے ریٹ لمٹس لاگو کرنے کے لیے اور IP فلٹرنگ کے لیے، سرور کو بتائیں کہ کون سا ہیڈر پتہ رکھتا ہے، اور کون سی پروکسیز قابلِ اعتماد ہیں۔ ان دونوں ترتیبات کے لیے System Console میں کوئی فیلڈ موجود نہیں ہے: انہیں config.json میں یا متغیرات کے ذریعے سیٹ کریں۔

کلید اور متغیرڈیفالٹیہ کیا کرتا ہے
ServiceSettings.TrustedProxyIPHeader, AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADERخالی: سرور کنکشن کے پتے کا استعمال کرتا ہےکلائنٹ کے پتے کو رکھنے والے ہیڈرز، مثال کے طور پر X-Forwarded-For۔ درخواست میں موجود پہلا ہیڈر استعمال کیا جاتا ہے۔
ServiceSettings.TrustedProxyIPs, AM_SERVICESETTINGS_TRUSTEDPROXYIPSخالیآپ کی پروکسیز کے پتے یا CIDR رینجز، مثال کے طور پر 172.29.71.0/28۔ ہیڈرز صرف ان درخواستوں کے لیے شمار ہوتے ہیں جو ان میں سے کسی ایک سے آتی ہیں۔

ایک متغیر میں کئی اقدار کو خلا (spaces) کے ذریعے الگ کریں: AM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER="X-Forwarded-For X-Real-IP"۔ سرور ایسی ترتیب کو مسترد کر دیتا ہے جس میں TrustedProxyIPs میں کوئی اندراج ہو جو نہ تو IP پتہ ہو اور نہ ہی CIDR رینج۔

سرور کلائنٹ کے پتے کو کیسے تلاش کرتا ہے

ہر پروکسی اس پتے کو X-Forwarded-For کے دائیں جانب شامل کرتا ہے جہاں سے اسے درخواست ملی۔ کلائنٹ نے ہیڈر میں جو بھی بھیجا تھا وہ بائیں جانب رہتا ہے۔ اس لیے سرور ہیڈر کو دائیں سے پڑھتا ہے، اپنے قابلِ اعتماد پروکسیز کے پتے چھوڑ دیتا ہے، اور پہلا دوسرا پتہ کلائنٹ کا پتہ مان لیتا ہے۔ کلائنٹ اپنے ہیڈر بھیج کر اپنا پتہ خود نہیں چن سکتا۔

  • ایک پروکسی کے پیچھے، صرف TrustedProxyIPHeader ہی درست پتہ دیتا ہے: سرور ہیڈر کے سب سے دائیں پتے کو لیتا ہے۔ یہ شروع ہونے پر ایک وارننگ ریکارڈ کرتا ہے جب تک آپ TrustedProxyIPs بھی سیٹ نہ کریں۔ اس کے بغیر، جو بھی براہِ راست پورٹ 8065 تک پہنچ سکتا ہے، وہ ہیڈر سیٹ کر سکتا ہے، اس لیے اس پورٹ کو صرف 127.0.0.1 یا ذاتی نیٹ ورک پر پبلش کریں۔
  • کئی پروکسیز کے پیچھے، مثال کے طور پر آپ کے اپنے پروکسی کے سامنے CDN یا لوڈ بالینسر، ان سب کو TrustedProxyIPs میں درج کریں۔ ورنہ سرور بیرونی پروکسی کے پتے کو کلائنٹ کا پتہ سمجھ لے گا۔
  • پروکسی ہیڈر کو اس پتے سے بدل سکتا ہے جو اسے نظر آتا ہے، جیسا کہ اوپر nginx کی مثال میں ہے (X-Forwarded-For $remote_addr)، یا اس میں شامل کر سکتا ہے (nginx کا $proxy_add_x_forwarded_for)۔ دونوں طریقے کام کرتے ہیں۔

کون سے پتے درج کرنے ہیں

وہ پتہ درج کریں جس سے پروکسی کی درخواستیں آتی ہیں، جیسا کہ Antimatter اسے دیکھتا ہے۔

  • سائٹ کے compose فائل اور Caddy کے ساتھ، یہ پہلے سے ہو چکا ہے: Caddy edge نیٹ ورک کے ذریعے Antimatter تک پہنچتا ہے، اور compose فائل TrustedProxyIPHeader کو X-Forwarded-For اور TrustedProxyIPs کو اس نیٹ ورک کی رینج، EDGE_SUBNET (172.29.71.0/28، جب تک آپ اسے .env میں تبدیل نہ کریں) پر سیٹ کرتی ہے۔ اگر EDGE_SUBNET آپ کے کسی نیٹ ورک سے ملتا ہے تو اسے تبدیل کریں۔
  • antimatter-docker میں پروڈکشن سیٹ اپ اپنے nginx کنٹینر کے لیے FRONTEND_SUBNET کے ساتھ اسی طرح کرتا ہے۔
  • اگر nginx ہوسٹ پر ہے اور Antimatter Docker میں ہے، تو درخواستیں Antimatter تک پبلش شدہ پورٹ کے ذریعے پہنچتی ہیں، عموماً compose پروجیکٹ کے نیٹ ورک کے گیٹ وے پتے سے (docker network inspect اسے دکھاتا ہے)۔ compose.override.yaml میں AM_SERVICESETTINGS_TRUSTEDPROXYIPS کو اس پتے پر سیٹ کریں۔
  • Docker کے بغیر، اسی ہوسٹ پر nginx کے ساتھ یہ 127.0.0.1 ہے (اور اگر nginx IPv6 کے ذریعے رابطہ کرتا ہے تو ::1)۔

پروکسی کے بغیر TLS

سرور خود بھی HTTPS فراہم کر سکتا ہے، سسٹم کنسول › ماحول › ویب سرور میں: کنکشن سیکیورٹی کو TLS پر سیٹ کریں (ServiceSettings.ConnectionSecurity)، ساتھ ہی TLS سرٹیفکیٹ فائل اور TLS پرائیویٹ کی فائل (ServiceSettings.TLSCertFile، ServiceSettings.TLSKeyFile)، یا Let's Encrypt استعمال کریں (ServiceSettings.UseLetsEncrypt)۔ اس صورت میں سرور کو پورٹ 443 پر سننا ہوگا (Listen Address، ServiceSettings.ListenAddress، پہلے سے طے شدہ :8065)، اور ServiceSettings.Forward80To443 پورٹ 80 کو ری ڈائریکٹ کرتا ہے۔ ریورس پروکسی کو چلانے اور تجدید کرنا آسان ہوتا ہے، اور یہ گائیڈ اسی فرض کرتی ہے۔

سرور کے ٹائم آؤٹس اور ریکویسٹ سائز

سرور کے اپنے ویب سرور کی ترتیبات، سسٹم کنسول › ماحولیات › ویب سرور میں:

ترتیبکلیدڈیفالٹ
Listen AddressServiceSettings.ListenAddress:8065
ریڈ ٹائم آؤٹServiceSettings.ReadTimeout300 سیکنڈ
لکھنے کا ٹائم آؤٹServiceSettings.WriteTimeout300 سیکنڈ
آئیڈل ٹائم آؤٹ (سسٹم کنسول میں کوئی فیلڈ نہیں)ServiceSettings.IdleTimeout60 سیکنڈ
Maximum Payload Size (Bytes)ServiceSettings.MaximumPayloadSizeBytesسیکیورٹی دیکھیں

عام requests کے لیے پروکسی کے اپنے timeouts کو ان کے برابر یا اس سے طویل رکھیں، اور اس کے body size کو کم از کم زیادہ سے زیادہ فائل سائز رکھیں۔