Hey everyone ![]()
I’ve been working on something that I think a lot of Frappe/ERPNext developers will relate to.
The problem we all know too well:
Every time you start a new project or onboard a team member, it’s the same 30-minute ritual — install bench CLI, MariaDB, Redis, Node.js, wkhtmltopdf, and a dozen other dependencies. Different projects need different Frappe versions and your OS gets polluted. One broken bench can affect everything on your machine. And there’s no easy way for team members to SSH into each other’s dev environments.
So I built BenchPress.
BenchPress is a Frappe app (built on Frappe v16, Python 3.14+) that acts as a self-hosted Frappe Cloud alternative. The idea is simple:
- Create a Lab — A reusable template where you define which apps you need (Frappe, ERPNext, HRMS, CRM, LMS, Helpdesk, Wiki, Webshop, or any custom app), the Frappe version (v14/v15/v16/develop), and resource limits (CPU/memory)
- Build once — A 5-layer cached Dockerfile builds the image with all apps baked in. Only changed layers rebuild, so iterative builds are fast
- Deploy in clicks — Each bench spins up in its own Docker container on a shared infrastructure — a single
benchpress-mariadbandbenchpress-rediscontainer (managed via docker-compose) serve all benches - SSH via WireGuard — Each container runs its own
wg0WireGuard interface with a dedicated VPN IP (10.10.0.X). No iptables DNAT hassles — you SSH directly to the container’s VPN IP - Real-time logs — Watch Docker image builds and container deployments stream live in the browser via
frappe.publish_realtimeWebSocket, GitHub Actions-style with collapsible steps and status indicators - Manage everything — Start, stop, restart, redeploy, delete benches. Create multiple Frappe sites per bench. Monitor CPU and memory usage.
The frontend is a full Vue 3 SPA built with Vite, TailwindCSS, and frappe-ui — not just a Desk UI. It includes:
- Searchable/filterable Labs list with status badges
- Tabbed Lab Detail page (Dashboard, Sites, Build Log)
- Connection info panel with VPN IP, SSH command, password (copy-to-clipboard)
- Bench Instances table with live CPU/memory progress bars
- Collapsible log viewers for both build and deploy logs
- VPN Device Management — register persistent devices (Laptop, Mobile, etc.) and download WireGuard configs
- Dark mode toggle
Tech stack:
- Backend: Python 3.14 + Frappe v16
- Frontend: Vue 3 + Vite + TailwindCSS + frappe-ui
- Containers: Docker Engine (Python SDK)
- VPN: WireGuard (inside-container, kernel-level)
- Database: Shared MariaDB 10.6 container (docker-compose)
- Cache/Queue: Shared Redis 7 container + RQ for background jobs
- Real-time: Socket.io via Frappe
Data model: 11 DocTypes — Lab, Lab App, Bench Instance, Bench App, Bench Site, Site App, Database Server, BenchPress Settings, Bench Device, Deploy Log, Build Log
Scheduler jobs:
- Stats collection every 1 minute (Docker + WireGuard metrics)
- MariaDB health check every 5 minutes (auto-restart if down)
- Daily backup at 2 AM with 7-day retention
Quick setup:
bench get-app https://github.com/Venkateshvenki404224/benchpress --branch develop
bench pip install docker
bench --site your-site install-app benchpress
bench --site your-site migrate
bash apps/benchpress/setup.sh your-site
cd apps/benchpress/frontend && yarn install && yarn build
bench start
The setup.sh script is idempotent and handles Docker group, shared MariaDB/Redis, IP forwarding, sudoers, WireGuard tools, and WireGuard server setup in one go.
I also made a video explaining what BenchPress is and why I built it:
https://www.youtube.com/watch?v=DzTNwA39PqA
GitHub repo (8
, 5 forks so far):
GitHub - Venkateshvenki404224/benchpress: Press a button. Get a Frappe bench. Self-hosted, Docker-powered, VPN-secured. · GitHub
Detailed docs including Getting Started, Creating Labs, Connecting to Benches, Logs & Monitoring, Device Management, and WireGuard Setup are all in the /docs/ folder.
This was built for FOSS Hack 2026 and is MIT licensed.
Phase 1 is complete. Phase 2 will bring more MariaDB management features, backup scheduling improvements, and more.
I’d love to hear your feedback, suggestions, and ideas. PRs and issues are very welcome!
Cheers ![]()