A Node.js web app served over a Tailscale network, exposed to the public internet via Tailscale Funnel, with nginx as a local reverse proxy.
| Access | URL |
|---|---|
| Public internet | https://nbg3pc.taileeca1e.ts.net |
| Tailscale network | http://100.126.33.100 |
| Local only | http://127.0.0.1:3000 |
Internet
│ HTTPS (Tailscale Funnel)
▼
Tailscale → Node.js :3000
▲
│
Tailscale network → nginx :80 → Node.js :3000
Tailscale Funnel handles TLS termination and routes directly to Node.js on port 3000. nginx sits in front for Tailscale-network access on port 80.
| Component | Version | Role |
|---|---|---|
| Node.js | v24.15.0 | Web application server |
| nginx | 1.30.0 | Reverse proxy (port 80) |
| Tailscale Funnel | — | Public HTTPS exposure |
| Python | 3.13.3 | Earlier prototype (app.py, unused) |
tswebclaude1/
├── server.js # Node.js web app (port 3000)
├── app.py # Python/Flask prototype (unused)
├── nginx-1.30.0/
│ └── conf/
│ └── nginx.conf # nginx reverse proxy config
├── README.md # This file
├── INFRASTRUCTURE.md # What was set up and why
└── HOWTO.md # Step-by-step replication guide
# 1. Start Node app
cd C:\Users\An.G3\Documents\GitHub\tswebclaude1
node server.js
# 2. Start nginx
cd nginx-1.30.0
nginx.exe
# Tailscale Funnel persists automatically — no action needed
# Stop nginx
cd nginx-1.30.0 && nginx.exe -s stop
# Stop Node (find PID and kill)
netstat -ano | findstr :3000
taskkill /PID <pid> /F