Install · Verified

# Nginx (VPS) — keep Nginx (sidecar)

static shell · sidecar

Have an established Nginx config (TLS, rate limits, multi‑vhost) you don't want to redo? Run Node on :3000 and proxy from Nginx — let the snippet handle static‑vs‑HTML routing.

**Start here first.** Every platform recipe below assumes the canonical Express + Docker install at [/install/express-docker](/install/express-docker). The snippets on this page are the platform‑specific deltas on top of that baseline.

You have an established Nginx config (TLS, rate limits, multi‑vhost) you don't want to throw away. Run the Node server on `127.0.0.1:3000` and proxy every request from Nginx to it — let the snippet handle static‑vs‑HTML routing on the Node side.

/etc/systemd/system/yoursite-agentsite.servicecopy

```ini
# /etc/systemd/system/yoursite-agentsite.service
[Unit]
Description=yoursite agentsite sidecar
After=network.target

[Service]
WorkingDirectory=/srv/yoursite/agentsite
ExecStart=/usr/bin/node /srv/yoursite/agentsite/server.mjs
Restart=always
User=www-data
Environment=NODE_ENV=production
Environment=PORT=3000
Environment=DIST_DIR=/srv/yoursite/dist
Environment=AGENTSITE_SITE=https://yoursite.com
EnvironmentFile=/etc/yoursite/agentsite.env   # AGENTSITE_TOKEN=asit_…

[Install]
WantedBy=multi-user.target
```

/etc/nginx/sites-available/yoursitecopy

```nginx
# /etc/nginx/sites-available/yoursite
server {
  listen 443 ssl http2;
  server_name yoursite.com;

  # TLS, rate limits, basic auth, etc. all stay in Nginx.

  # Hand every request to the Node sidecar — let agentsite decide
  # what is a static asset vs an HTML route. Don't try_files {} here;
  # the sidecar's express.static will serve dist/ directly.
  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host              $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_read_timeout 30s;
  }
}
```

**Don't keep `try_files` in the vhost.** The snippet's `express.static` already serves `dist/`; if Nginx also tries to serve it from disk you'll get inconsistent caching and `/llms.txt` / `/.well-known/*` routes won't resolve.