Private control panel and deployment bundle for vpn.lshang.top.
- A lightweight Node admin panel for:
- login
- server and proxy settings
- family client management
- Clash Verge subscription generation
- Shadowrocket import generation
- sing-box deploy/restart actions
- A file-backed JSON data layer in
runtime/data/state.json - A
deploy/folder withdocker-composeandsing-boxassets
cp .env.example .env
npm install
npm run db:push
npm run devThe panel runs at http://localhost:3000.
Default credentials come from .env:
- username:
ADMIN_USERNAME - password:
ADMIN_PASSWORD
For servers with slow access to the default npm registry, set:
NPM_REGISTRY=https://registry.npmmirror.comExpected runtime directories on the server:
runtime/dataruntime/generatedruntime/acme-webrootruntime/letsencrypt
The main deployment files are in deploy/:
deploy/docker-compose.ymldeploy/scripts/init-letsencrypt.shdeploy/scripts/renew-certs.sh
- Point
vpn.lshang.topto43.108.35.79. - Copy
.env.exampleto.envand replace secrets. - Create runtime folders:
bash deploy/scripts/bootstrap-runtime.sh- Make sure
CERTIFICATE_PATHandPRIVATE_KEY_PATHpoint to a certificate already available on the server.
If you are keeping an existing Caddy instance, reuse its vpn.lshang.top certificate files here.
- Start the stack:
docker compose -f deploy/docker-compose.yml up -d --build- Configure your existing reverse proxy to forward
vpn.lshang.toptohttp://SERVER_IP:3001.
For Caddy, the route shape is:
vpn.lshang.top {
reverse_proxy 127.0.0.1:3001
}-
Open
https://vpn.lshang.top. -
Sign in with the admin credentials from
.env, then use Deploy config once to replace the bootstrapsing-boxconfig.
Run this on a cron timer if you still use the bundled Let's Encrypt scripts:
bash deploy/scripts/renew-certs.sh2443/udpis reserved for Hysteria2 in coexistence mode.3001/tcpserves the admin panel for your existing reverse proxy.8443/tcpis the Trojan fallback port.- The panel controls Docker through
/var/run/docker.sock. - The new panel removes the heavy
Next.js + Prismabuild step to keep server deployment fast. - This coexistence setup does not start its own
nginx, so it can live alongside your currentcaddy.