Auf demselben Server
Die gebündelte Installation bedeutet, dass Sie die Abonnementseite auf demselben Server wie das Remnawave Panel installieren.
Schritt 1 - .env-Datei vorbereiten
Bearbeiten Sie die Datei /opt/remnawave/.env und ändern Sie SUB_PUBLIC_DOMAIN auf den Domainnamen Ihrer Abonnementseite.
cd /opt/remnawave && nano .env
Ändern Sie SUB_PUBLIC_DOMAIN auf den Domainnamen der Abonnementseite. Der Domainname muss ohne http oder https angegeben werden.
SUB_PUBLIC_DOMAIN=subscription.domain.com
Vergessen Sie nicht, den Remnawave Panel-Container neu zu starten:
cd /opt/remnawave && docker compose down remnawave && docker compose up -d && docker compose logs -f
Schritt 2 - docker-compose.yml-Datei erstellen
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
Erstellen Sie nun die .env-Datei:
mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano .env
Erstellen Sie einen API-Token im Remnawave-Dashboard. Remnawave Einstellungen → API-Tokens.
Fügen Sie folgenden Inhalt in die .env-Datei ein:
APP_PORT=3010
REMNAWAVE_PANEL_URL=http://remnawave:3000
REMNAWAVE_API_TOKEN=API_TOKEN_FROM_REMNAWAVE
Vollständige .env-Datei-Referenz
APP_PORT=3010
### Remnawave Panel URL, kann http://remnawave:3000 oder https://panel.example.com sein
REMNAWAVE_PANEL_URL=http://remnawave:3000
REMNAWAVE_API_TOKEN=API_TOKEN_FROM_REMNAWAVE
# Unter benutzerdefiniertem Stammpfad bereitstellen, z.B. CUSTOM_SUB_PREFIX=sub
# Kein / am Anfang/Ende
CUSTOM_SUB_PREFIX=
# Marzban-Links unterstützen
MARZBAN_LEGACY_LINK_ENABLED=false
MARZBAN_LEGACY_SECRET_KEY=
# Wenn Sie das "Caddy with security"-Addon verwenden, können Sie hier den X-Api-Key angeben.
CADDY_AUTH_API_TOKEN=
Schritt 3 - Container starten
docker compose up -d && docker compose logs -f
Schritt 4 - Reverse Proxy konfigurieren
Remnawave und seine Komponenten unterstützen keine Bereitstellung auf einem Unterpfad. (z.B. location /subscription {)
Es muss auf dem Stammpfad einer Domain oder Subdomain bereitgestellt werden.
Für benutzerdefinierten Pfad können Sie den Parameter CUSTOM_SUB_PREFIX verwenden.
Caddy
Caddy-Konfiguration
Wenn Sie Caddy bereits konfiguriert haben, müssen Sie nur einen neuen Site-Block zur Caddyfile hinzufügen.
cd /opt/remnawave/caddy && nano Caddyfile
Bitte ersetzen Sie SUBSCRIPTION_PAGE_DOMAIN durch Ihren Domainnamen.
Ersetzen Sie nicht die gesamte bestehende Konfiguration, fügen Sie nur einen neuen Site-Block hinzu.
https://REPLACE_WITH_YOUR_DOMAIN {
reverse_proxy * http://remnawave:3000
}
https://SUBSCRIPTION_PAGE_DOMAIN {
reverse_proxy * http://remnawave-subscription-page:3010
}
Starten Sie nun den Caddy-Container neu.
docker compose down && docker compose up -d && docker compose logs -f
Nginx
Nginx-Konfiguration
Stellen Sie ein Zertifikat für den Domainnamen der Abonnementseite aus:
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"
Öffnen Sie die Nginx-Konfigurationsdatei:
cd /opt/remnawave/nginx && nano nginx.conf
Bitte ersetzen Sie SUBSCRIPTION_PAGE_DOMAIN durch den Domainnamen Ihrer Abonnementseite.
upstream remnawave {
server remnawave:3000;
}
upstream remnawave-subscription-page {
server remnawave-subscription-page:3010;
}
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;
}
Ändern Sie docker-compose.yml für Nginx, um die neuen Zertifikatsdateien einzubinden.
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
docker compose down && docker compose up -d && docker compose logs -f
Traefik
Traefik-Konfiguration
Erstellen Sie eine neue dynamische Konfigurationsdatei remnawave-sub-page.yml im Verzeichnis /opt/remnawave/traefik/config.
cd /opt/remnawave/traefik/config && nano remnawave-sub-page.yml
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"
Schritt 5 - Verwendung
Die Abonnementseite ist unter https://subdomain.panel.com/<shortUuid> erreichbar.
Abonnementseite konfigurieren (optional)
Sie können die Abonnementseite im Subpage Builder im Remnawave-Dashboard anpassen. Damit können Sie:
- Unterstützung für verschiedene VPN-Apps hinzufügen
- Texte und Anweisungen in mehreren Sprachen anpassen
- Eigenes Branding hinzufügen (Logo, Firmenname, Support-Links)
- Konfigurieren, welche Apps als „empfohlen" angezeigt werden