PROXC is a lightweight tunneling solution built on top of FRP (Fast Reverse Proxy) that exposes local services with subdomain routing and HTTPS.
This project provides:
- A server installer under
server/forfrps, Nginx, and Certbot - A local registration API that issues certificates on demand per subdomain
- An npm client package with a simple
proxc <port> <subdomain>command
- Base domain certificate is issued for
yourdomain.comduring server install. - Each new subdomain (for example
app.yourdomain.com) is issued automatically when a client startsproxc. - Certificate validation uses HTTP-01 (
/.well-known/acme-challenge/...) via Nginx webroot. - No Cloudflare token or DNS API plugin is required.
Local App (localhost:3000)
|
v
frpc
|
v
frps (Server)
|
v
Nginx + Certbot + Register API
|
v
https://app.yourdomain.com
- FRP handles tunneling
- Nginx handles HTTP/HTTPS
- Register API provisions per-subdomain certificates before tunnel start
server/contains the server installer, uninstall script, templates, and registration assetsclient/contains the npm package for the client CLI
- Ubuntu 20.04+
- Public IP / VM
- Domain configured so both records point to server IP:
yourdomain.com*.yourdomain.com
- Open ports:
7000(or your chosen FRP bind port)80443
- Node.js 18+
- npm
- Linux or macOS
- Local app running on
localhost:<port>
curl -o- https://raw.githubusercontent.com/midlajc/proxc/refs/heads/master/server/install.sh | sudo bashserver/install.sh downloads helper assets from the server/ directory in this repo during install.
Prompts:
- Server address (base domain, example:
yourdomain.com) - Server port (default
7000) - Auth token
- Certbot email
Server setup installs and configures:
/opt/frp/frpsfrps.serviceproxc-register.service- Nginx site config and ACME webroot
- Certbot renew hook that reloads Nginx
npm install -g @midlajc/proxcThen configure the client:
proxc configClient setup installs:
- The global
proxcCLI ~/.proxc/config.json~/.proxc/frpc
proxc config downloads frpc for the current platform and stores client config locally.
Optional installer overrides:
PROXC_ASSET_BASE_URLto download server assets from a custom raw URL root. This should normally point to the reposerver/directory.PROXC_LOCAL_ASSET_DIRto use local files instead of downloading during server install. This can point to either the repo root orserver/.
Start a tunnel:
proxc config
proxc <local_port> <subdomain>Example:
proxc config
proxc 3000 appThis flow now does:
- Calls registration API:
POST /_proxc/register - Issues/ensures cert for
app.<base-domain> - Starts FRP tunnel
Output URL:
https://app.yourdomain.com
- Single DNS label only
- Lowercase letters, numbers, hyphens
- No dots
- No leading/trailing hyphen
- Confirm DNS for both
yourdomain.comand*.yourdomain.compoints to server IP. - Confirm port
80is publicly reachable. - Check logs:
journalctl -u proxc-register.service -f- Confirm FRP service:
systemctl status frps- Confirm Nginx config:
nginx -twhich proxcIf installed with npm, ensure your npm global bin directory is in PATH.
Server:
curl -o- https://raw.githubusercontent.com/midlajc/proxc/refs/heads/master/server/uninstall.sh | sudo bashClient:
npm uninstall -g @midlajc/proxc
rm -rf ~/.proxc ~/.cache/proxc