Runtime setup is a nightmare
Go, Java, Kotlin, Node, Python, Rust, React — each runtime has its own version manager, dependencies, and conflicts. Brewnet solves it all in one click with full isolation.
Interactive 7-step CLI wizard and Web Dashboard for setting up and managing personal servers with 17 Docker-based services. Build your own home server, skip the hosting fees, and own your data. From zero to a fully configured server in minutes — no cloud subscription required.
Web server, Git, DB, Media & File server — all included. Cost: $0. Simple setup wizard, domain in 1 minute! No data collected.
Go, Java, Kotlin, Node, Python, Rust, React — each runtime has its own version manager, dependencies, and conflicts. Brewnet solves it all in one click with full isolation.
SSH hardening, firewall rules, SSL certificates, credential management — most cloud setups are complex. Brewnet solves all security concerns at once with Cloudflare Tunnel.
Most cloud platforms are hard to clean up even after multiple deletion steps. Brewnet removes everything with a single brewnet uninstall. No leftover configs, containers, or volumes.
Stop paying for cloud hosting. Deploy with one command.
Domain, build, deploy — all in one step.
Go, Java, Kotlin, Node, Python, Rust, React — pick your runtime and launch a production-ready web server in one command. No manual dependency setup, no version conflicts.
SSH key-only auth, root login disabled, auto-firewall configuration, and encrypted credential propagation across all services.
Every change is tracked. Preview removals with --dry-run before executing. Full backup & restore, one-command rollback, and zero leftover containers, volumes, or configs after uninstall.
No port forwarding needed. Works behind NAT/CGNAT with automatic HTTPS and DDoS protection. Paste one Cloudflare token and tunnel, ingress rules, and DNS are configured automatically.
Auto-generates docker-compose.yml for up to 17 services with full container isolation. Each service runs in its own network sandbox with dependency ordering, health checks, and secure credential propagation.
Get real-time alerts on service status, deployments, and errors — directly to Slack or Telegram. No database required. Just paste your webhook URL or bot token and start receiving notifications.
Server setup is just the start. Run your apps, connect custom domains, automate builds, deploy in one command, and monitor everything — the full DevOps lifecycle without the DevOps team.
macOS 12+ and Ubuntu 20.04+ officially supported. Brewnet auto-detects your OS, adjusts package managers, and handles platform-specific differences so you don’t have to.
Browser-based setup wizard, real-time service monitoring, web terminal, and a visual interface for managing your entire server stack.
Install to running server — the CLI wizard handles it all.
Install via curl (recommended) or npm. Requires Node.js 20+ and Docker 27+. Supports macOS 12+ and Ubuntu 20.04+.
curl -fsSL https://raw.githubusercontent.com/claude-code-expert/brewnet/main/install.sh | bashThe interactive 7-step wizard walks you through: system check, project setup, admin account & server components, dev stack & runtime, domain & network, review, and generation & deployment.
brewnet initAdd, remove, start, stop, and monitor services with simple commands. Check logs, manage domains, deploy apps.
brewnet statusbrewnet initInteractive setup wizardbrewnet add <service>Add a servicebrewnet remove <service>Remove a servicebrewnet up / downStart / Stop all servicesbrewnet statusShow service statusbrewnet logs [service]View logsbrewnet adminOpen web dashboardbrewnet domain connectConnect custom domainbrewnet domain tunnelManage Cloudflare Tunnelbrewnet backupCreate backupbrewnet restore <id>Restore from backupbrewnet create-app <name>Scaffold a new appbrewnet shutdownGraceful shutdown all servicesbrewnet uninstallRemove all services & data17 Docker services ready to deploy.
Traefik, Nginx, Caddy
Gitea with SSH access (port 3022)
PostgreSQL, MySQL, SQLite
Redis, Valkey
Nextcloud, MinIO (S3)
Jellyfin streaming
OpenSSH, key-based auth, SFTP
docker-mailserver (SMTP/IMAP)
Automatic HTTPS, DDoS protection
Web-based file management UI
Go, Java, Kotlin, Node, Python, Rust, React — 16 framework boilerplates
One-command setup, custom domain & Cloudflare integration
From install to production — 3 minutes is all you need.
| Requirement | Minimum | Recommended |
|---|---|---|
| OS | macOS 12+ / Ubuntu 20.04+ | Latest stable |
| Node.js | 20+ | 22 LTS |
| Docker | 27+ | Latest (auto-installed if missing) |
| RAM | 2 GB | 4 GB+ |
| Disk | 20 GB | 50 GB+ (for media usage) |
Docker is not required before installation — brewnet init auto-detects and installs it.
Install globally via npm package manager.
Step 1
npm install -g @brewnet/cliStep 2
brewnet initOne-line install script that handles everything.
Step 1
curl -fsSL https://raw.githubusercontent.com/claude-code-expert/brewnet/main/install.sh | bashStep 2
brewnet initThere are two methods:
# Method 1: npm (recommended) npm install -g @brewnet/cli # Method 2: Build from source curl -fsSL https://raw.githubusercontent.com/claude-code-expert/brewnet/main/install.sh | bash
After installation, run brewnet init to start server setup.
# If installed via npm npm update -g @brewnet/cli # If installed via curl (re-run the same command) curl -fsSL https://raw.githubusercontent.com/claude-code-expert/brewnet/main/install.sh | bash
brewnet uninstall # Interactive uninstall brewnet uninstall --force # Uninstall without confirmation brewnet uninstall --keep-data # Preserve Docker volumes (DB, etc.) brewnet uninstall --keep-config # Keep config files, remove containers only
Removed items: Docker containers, networks, project directories, ~/.brewnet/projects/ metadata
To remove the CLI binary itself:
# If installed via npm npm uninstall -g @brewnet/cli # If installed via curl sudo rm /usr/local/bin/brewnet rm -rf ~/.brewnet/source
brewnet up # Start all services brewnet down # Stop all services brewnet down --volumes # Stop + delete data brewnet status # Check overall status brewnet logs [service] # View service logs
You can also use brewnet status --json for JSON-formatted output.
brewnet admin # Automatically opens http://localhost:8088
Use --port 9090 to change the port. Use --foreground for debug mode.
brewnet create-app my-app # Interactive selection brewnet create-app my-app --stack go-gin # Specify stack brewnet create-app my-app --database postgres # Specify database
16 stacks supported: Node.js (Express, NestJS, Next.js), Python (FastAPI, Flask, Django), Go (Gin, Echo, Fiber), Rust (Actix-web, Axum), Java (Spring), Kotlin (Spring Boot, Ktor)
brewnet domain connect my-app --domain api.example.com brewnet domain tunnel status # Check tunnel status brewnet domain tunnel restart # Restart tunnel
A Cloudflare API Token with Zone:Read, DNS:Edit, and Tunnel:Edit permissions is required.
No. All containers are configured with the restart: unless-stopped policy, so they automatically recover once Docker starts after a reboot.
However, if you manually stopped services with brewnet down, they remain stopped after a reboot. On Docker Desktop (macOS), check Settings → General → "Start Docker Desktop when you sign in".
brewnet backup # Create a backup brewnet backup --list # List backups brewnet restore <backup-id> # Restore brewnet restore <backup-id> --force # Restore without confirmation
Backup location: ~/.brewnet/backups/ (.tar.gz format)
All config and metadata are stored in ~/.brewnet/. Project directories (docker-compose.yml, app source, etc.) are located at ~/brewnet/<project-name>/.
Brewnet automatically attempts to install Docker if it's not found. If auto-installation fails, install manually:
curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER
Log out and back in after installation to apply docker group membership.
Another program is using that port.
# Check which process is using the port on macOS/Linux lsof -i :80 lsof -i :8088 # Either stop that process or configure Brewnet to use a different port
Common conflicting services: Apache, Nginx, other Docker containers
Check the following in order:
1. Verify services are running:
brewnet status
2. Check if port 8088 is open:
curl http://localhost:8088
3. Check Docker container status:
docker ps -a | grep brewnet
4. Restart services:
brewnet down && brewnet up
Quick Tunnel URLs are temporary and change when you restart the server. This is normal behavior. If you need a permanent URL, switch to Named Tunnel:
brewnet domain connect
Check the following:
1. DNS propagation: DNS records can take up to several minutes to propagate.
dig my-app.example.com CNAME
2. Cloudflare domain status: Verify the domain is Active (if Pending, nameserver propagation is still in progress).
3. Tunnel status:
brewnet domain tunnel status
4. Restart cloudflared container:
brewnet domain tunnel restart
This occurs when the current access URL is not registered in Nextcloud's trusted domains. Brewnet automatically adds *.trycloudflare.com to trusted domains, but additional configuration may be needed when using a custom domain.
The Jellyfin initial setup URL must use the following format:
http://<host>:8096/web/#/wizard/start
Using the /web/#/home path will not show the setup wizard.
Common causes of deployment failure:
brewnet logs <app-name>
/health endpoint is not respondingDocker images and containers can consume significant disk space.
# Check Docker disk usage docker system df # Clean up unused images (caution: may remove images you need) docker image prune
docker system prune deletes all unused resources — use with caution. Never delete volumes containing important data.
Behind Traefik strip-prefix, Gitea may return URLs without the subpath based on X-Forwarded-Host (e.g., missing /git path). Within Brewnet, authedCloneUrl() automatically generates the correct URL — do not use the clone_url returned directly from the Gitea API.
Have a specific inquiry? Send us a message directly. We’ll respond via email or Telegram.