Server
Specifications
| Property | Value |
|---|---|
| Provider | Hetzner Cloud |
| Plan | CPX31 |
| vCPUs | 4 (AMD EPYC) |
| RAM | 8 GB |
| Disk | 160 GB NVMe SSD |
| OS | Ubuntu 24.04 LTS |
| IP | 5.78.46.18 |
| Location | Falkenstein, DE |
SSH Access
The camlab alias is configured in the admin's ~/.ssh/config. Key-only authentication — password login is disabled.
Swap
4 GB swap file configured:
Firewall (UFW)
| Port | Protocol | Rule |
|---|---|---|
| 22 | TCP | ALLOW (SSH) |
| 80 | TCP | ALLOW (HTTP / ACME challenges) |
| 443 | TCP | ALLOW (HTTPS) |
All other ports are denied by default. Docker containers bind to 127.0.0.1 only.
Software Versions
| Software | Version | Install Method |
|---|---|---|
| Docker | 29.2.1 | Official apt repo |
| Docker Compose | v2 (plugin) | Bundled with Docker |
| Caddy | 2.11.1 | Official apt repo (system-level) |
| Node.js | 20.x | Inside containers only |
Directory Layout
/opt/camlab/ # Main project directory
├── docker-compose.yml # All services defined here
├── .env # Secrets (chmod 600)
├── caddy/Caddyfile # Reference copy (system Caddy at /etc/caddy/Caddyfile)
├── ghost/ # Ghost content volumes
│ ├── cam4/
│ ├── cam4models/
│ └── cam4pays/
├── ghost-mcp/ # Ghost MCP server source
├── mysql/ # MySQL data + init scripts
│ ├── data/
│ └── init/
├── n8n/ # n8n Dockerfile + workflow exports
│ └── data/ # n8n persistent data (DB, credentials)
├── runners/ # Claude Code runner configs
│ ├── Dockerfile
│ ├── cam4/
│ ├── cam4models/
│ └── cam4pays/
├── mcp-servers/ # MCP server sources
│ ├── reddit/
│ └── runware/
├── backups/ # Backup output directory
├── docs/ # This documentation
└── logs/ # Deployment changelog