Scope
This skill covers the software layer — what runs inside a machine.
For infrastructure (provisioning VMs, SSH hardening, firewalls, backups), use the vps skill.
When to Use
- Configuring nginx, Caddy, or Apache
- Deploying Node.js, Python, Go, or other apps
- Docker and Docker Compose setups
- SSL/TLS certificates with Let's Encrypt
- Reverse proxy and load balancing
- Process management (pm2, systemd services)
- Troubleshooting port conflicts, CORS, connection errors
- Self-hosting (Plex, Nextcloud, game servers)
- Local development servers (Vite, webpack-dev-server)
Common Pitfalls
- Port already in use — Check with
lsof -i :PORT or ss -tlnp | grep PORT, kill stale processes
- CORS in development — Proxy through your dev server or configure backend headers, don't disable in production
- SSL certificate issues — Certbot needs port 80/443 open, use
--standalone or --webroot mode appropriately
- nginx config not loading — Always run
nginx -t before systemctl reload nginx
- Docker container can't reach host — Use
host.docker.internal (Docker Desktop) or 172.17.0.1 (Linux)
- Process dies after SSH disconnect — Use systemd, pm2, or run inside tmux/screen
- Wrong permissions on mounted volumes — Match container user UID with host file ownership
Patterns by Use Case
| Use Case |
Recommended Stack |
| Static site |
Caddy (auto-SSL, zero config) |
| Node.js app |
PM2 + nginx reverse proxy |
| Python (Django/FastAPI) |
Gunicorn + nginx |
| Multiple services |
Docker Compose + Traefik |
| Game server |
Dedicated container + port mapping |
For framework-specific configs, see configs.md.
For Docker Compose patterns, see docker.md.
Debugging Checklist
- Is the process running?
systemctl status or docker ps
- Is it listening?
ss -tlnp | grep PORT
- Can you reach it locally?
curl localhost:PORT
- Firewall blocking? Check
ufw status or cloud security groups
- Reverse proxy misconfigured? Check nginx logs:
/var/log/nginx/error.log
- DNS pointing correctly?
dig domain.com or nslookup
1---2name: server3description: Configure, deploy, and troubleshoot web servers, application servers, and containerized services.4---5
6## Scope
7
8This skill covers the **software layer** — what runs inside a machine.
9For infrastructure (provisioning VMs, SSH hardening, firewalls, backups), use the `vps` skill.
10
11## When to Use
12
13- Configuring nginx, Caddy, or Apache
14- Deploying Node.js, Python, Go, or other apps
15- Docker and Docker Compose setups
16- SSL/TLS certificates with Let's Encrypt
17- Reverse proxy and load balancing
18- Process management (pm2, systemd services)
19- Troubleshooting port conflicts, CORS, connection errors
20- Self-hosting (Plex, Nextcloud, game servers)
21- Local development servers (Vite, webpack-dev-server)
22
23## Common Pitfalls
24
25- **Port already in use** — Check with `lsof -i :PORT` or `ss -tlnp | grep PORT`, kill stale processes
26- **CORS in development** — Proxy through your dev server or configure backend headers, don't disable in production
27- **SSL certificate issues** — Certbot needs port 80/443 open, use `--standalone` or `--webroot` mode appropriately
28- **nginx config not loading** — Always run `nginx -t` before `systemctl reload nginx`
29- **Docker container can't reach host** — Use `host.docker.internal` (Docker Desktop) or `172.17.0.1` (Linux)
30- **Process dies after SSH disconnect** — Use systemd, pm2, or run inside tmux/screen
31- **Wrong permissions on mounted volumes** — Match container user UID with host file ownership
32
33## Patterns by Use Case
34
35| Use Case | Recommended Stack |
36|----------|-------------------|
37| Static site | Caddy (auto-SSL, zero config) |
38| Node.js app | PM2 + nginx reverse proxy |
39| Python (Django/FastAPI) | Gunicorn + nginx |
40| Multiple services | Docker Compose + Traefik |
41| Game server | Dedicated container + port mapping |
42
43For framework-specific configs, see `configs.md`.
44For Docker Compose patterns, see `docker.md`.
45
46## Debugging Checklist
47
481. **Is the process running?** `systemctl status` or `docker ps`
492. **Is it listening?** `ss -tlnp | grep PORT`
503. **Can you reach it locally?** `curl localhost:PORT`
514. **Firewall blocking?** Check `ufw status` or cloud security groups
525. **Reverse proxy misconfigured?** Check nginx logs: `/var/log/nginx/error.log`
536. **DNS pointing correctly?** `dig domain.com` or `nslookup`