تثبيت على نفس الخادم
التثبيت المجمّع يعني أنك ستثبت صفحة الاشتراك على نفس الخادم الذي يعمل عليه لوحة Remnawave.
الخطوة 1 - تحضير ملف .env
عدّل ملف /opt/remnawave/.env وغيّر SUB_PUBLIC_DOMAIN إلى اسم نطاق صفحة الاشتراك الخاصة بك.
cd /opt/remnawave && nano .env
غيّر SUB_PUBLIC_DOMAIN إلى اسم نطاق صفحة الاشتراك. يجب أن يكون اسم النطاق بدون http أو https.
SUB_PUBLIC_DOMAIN=subscription.domain.com
لا تنسَ إعادة تشغيل حاوية لوحة Remnawave:
cd /opt/remnawave && docker compose down remnawave && docker compose up -d && docker compose logs -f
الخطوة 2 - إنشاء ملف docker-compose.yml
mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano docker-compose.yml
services:
remnawave-subscription-page:
image: remnawave/subscription-page:latest
container_name: remnawave-subscription-page
hostname: remnawave-subscription-page
restart: always
env_file:
- .env
ports:
- '127.0.0.1:3010:3010'
networks:
- remnawave-network
networks:
remnawave-network:
driver: bridge
external: true
الآن أنشئ ملف .env:
mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano .env
أنشئ رمز API في لوحة Remnawave. الإعدادات → رموز API.
الصق المحتوى التالي في ملف .env:
APP_PORT=3010
REMNAWAVE_PANEL_URL=http://remnawave:3000
REMNAWAVE_API_TOKEN=API_TOKEN_FROM_REMNAWAVE
المرجع الكامل لملف .env
APP_PORT=3010
### عنوان URL للوحة Remnawave، يمكن أن يكون http://remnawave:3000 أو https://panel.example.com
REMNAWAVE_PANEL_URL=http://remnawave:3000
REMNAWAVE_API_TOKEN=API_TOKEN_FROM_REMNAWAVE
# الخدمة في مسار جذر مخصص، مثلاً: CUSTOM_SUB_PREFIX=sub
# لا تضع / في البداية/النهاية
CUSTOM_SUB_PREFIX=
# دعم روابط Marzban
MARZBAN_LEGACY_LINK_ENABLED=false
MARZBAN_LEGACY_SECRET_KEY=
# إذا كنت تستخدم إضافة "Caddy with security"، يمكنك وضع X-Api-Key هنا ليُطبَّق على الطلبات لـ Remnawave Panel.
CADDY_AUTH_API_TOKEN=
الخطوة 3 - تشغيل الحاوية
docker compose up -d && docker compose logs -f
الخطوة 4 - تكوين الوكيل العكسي
Remnawave ومكوناته لا تدعم الخدمة على مسار فرعي. (مثلاً location /subscription {)
يجب تقديم الخدمة على المسار الجذر للنطاق أو النطاق الفرعي.
للمسار المخصص، يمكنك استخدام معامل CUSTOM_SUB_PREFIX.
Caddy
تكوين Caddy
إذا كنت قد كوّنت Caddy بالفعل، فكل ما تحتاج إليه هو إضافة كتلة موقع جديدة إلى Caddyfile.
cd /opt/remnawave/caddy && nano Caddyfile
يرجى استبدال SUBSCRIPTION_PAGE_DOMAIN باسم نطاقك.
راجع التكوين أدناه، وانظر إلى الأسطر المميزة باللون الأخضر.
لا تستبدل التكوين الحالي بالكامل، فقط أضف كتلة موقع جديدة إلى Caddyfile الموجود.
أضف كتلة موقع جديدة في نهاية ملف التكوين.
https://REPLACE_WITH_YOUR_DOMAIN {
reverse_proxy * http://remnawave:3000
}
https://SUBSCRIPTION_PAGE_DOMAIN {
reverse_proxy * http://remnawave-subscription-page:3010
}
الآن تحتاج إلى إعادة تشغيل حاوية Caddy.
docker compose down && docker compose up -d && docker compose logs -f
Nginx
تكوين Nginx
إذا كنت قد كوّنت Nginx بالفعل، فكل ما تحتاج إليه هو إضافة كتلة location جديدة إلى ملف التكوين.
أصدر شهادة لاسم نطاق صفحة الاشتراك:
acme.sh --issue --standalone -d 'SUBSCRIPTION_PAGE_DOMAIN' --key-file /opt/remnawave/nginx/subdomain_privkey.key --fullchain-file /opt/remnawave/nginx/subdomain_fullchain.pem --alpn --tlsport 8443 --reloadcmd "docker exec remnawave-nginx nginx -s reload"
افتح ملف تكوين Nginx:
cd /opt/remnawave/nginx && nano nginx.conf
يرجى استبدال SUBSCRIPTION_PAGE_DOMAIN باسم نطاق صفحة الاشتراك.
لا تستبدل التكوين الحالي بالكامل، فقط أضف كتلة location جديدة إلى ملف التكوين الموجود.
أضف كتلة upstream جديدة في أعلى ملف التكوين.
upstream remnawave {
server remnawave:3000;
}
upstream remnawave-subscription-page {
server remnawave-subscription-page:3010;
}
الآن أضف كتلة server جديدة في أسفل ملف التكوين.
server {
server_name SUBSCRIPTION_PAGE_DOMAIN;
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
location / {
proxy_http_version 1.1;
proxy_pass http://remnawave-subscription-page;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_certificate "/etc/nginx/ssl/subdomain_fullchain.pem";
ssl_certificate_key "/etc/nginx/ssl/subdomain_privkey.key";
ssl_trusted_certificate "/etc/nginx/ssl/subdomain_fullchain.pem";
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
resolver_timeout 2s;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
}
الآن دعنا نعدّل docker-compose.yml لـ Nginx لتثبيت ملفات الشهادة الجديدة.
cd /opt/remnawave/nginx && nano docker-compose.yml
services:
remnawave-nginx:
image: nginx:1.28
container_name: remnawave-nginx
hostname: remnawave-nginx
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./fullchain.pem:/etc/nginx/ssl/fullchain.pem:ro
- ./privkey.key:/etc/nginx/ssl/privkey.key:ro
- ./subdomain_fullchain.pem:/etc/nginx/ssl/subdomain_fullchain.pem:ro
- ./subdomain_privkey.key:/etc/nginx/ssl/subdomain_privkey.key:ro
restart: always
ports:
- '0.0.0.0:443:443'
networks:
- remnawave-network
networks:
remnawave-network:
name: remnawave-network
driver: bridge
external: true
الآن تحتاج إلى إعادة تشغيل حاوية Nginx.
docker compose down && docker compose up -d && docker compose logs -f
Traefik
تكوين Traefik
إذا كنت قد كوّنت Traefik بالفعل، تحتاج إلى إنشاء ملف تكوين ديناميكي جديد باسم remnawave-sub-page.yml في مجلد /opt/remnawave/traefik/config.
cd /opt/remnawave/traefik/config && nano remnawave-sub-page.yml
الصق التكوين التالي.
يرجى استبدال SUBSCRIPTION_PAGE_DOMAIN باسم نطاق صفحة الاشتراك.
راجع التكوين أدناه، وانظر إلى الأسطر المميزة باللون الأصفر.
http:
routers:
remnawave-sub-page:
rule: "Host(`SUBSCRIPTION_PAGE_DOMAIN`)"
entrypoints:
- https
tls:
certResolver: letsencrypt
middlewares:
- remnawave-sub-page-https-redirect
service: remnawave-sub-page
middlewares:
remnawave-sub-page-https-redirect:
redirectScheme:
scheme: https
services:
remnawave-sub-page:
loadBalancer:
servers:
- url: "http://remnawave-subscription-page:3010"
الخطوة 5 - الاستخدام
ستكون صفحة الاشتراك متاحة على https://subdomain.panel.com/<shortUuid>.
تكوين صفحة الاشتراك (اختياري)
يمكنك تخصيص صفحة الاشتراك في Subpage Builder في لوحة Remnawave. يتيح لك هذا:
- إضافة دعم لتطبيقات VPN المختلفة
- تخصيص النصوص والتعليمات بلغات متعددة
- إضافة علامتك التجارية الخاصة (الشعار، اسم الشركة، روابط الدعم)
- تكوين التطبيقات التي تظهر كـ"مميزة"