TAVPBox — Local Development Environment
TAVPBox adalah local development environment seperti Lando, tapi pakai Podman (bukan Docker). Hasilnya: jauh lebih irit RAM, HTTP-only (simple!), dan mendukung migrasi dari Lando.
1 laptop = banyak "VPS mini". Tiap project = 1 container terisolasi.| Lando (Docker) | TAVPBox (Podman) | |
|---|---|---|
| RAM / 20 project | ~3.2 GB | ~1.5 GB |
| Protocol | HTTPS (Let's Encrypt) | HTTP only (simple!) |
| Auto domain | *.lndo.site | *.tavp.my.id |
| Mail per-project | mail.*.lndo.site | mailpit.*.tavp.my.id |
| Multi-stack | ✓ | ✓ (TAVP/Laravel/Python/Node/Go/...) |
| Lando migration | — | ✓ (full .lando.yml support) |
| Auto-detect recipe | — | ✓ (composer.json/package.json/go.mod) |
| Timezone | UTC | ✓ Asia/Jakarta default |
| Web Panel | ✓ | ✓ (built-in) |
Apa itu TAVPBox?
TAVPBox adalah CLI tool yang bisa:
- Manage local development containers — create, start, stop, destroy
- Auto-routing domain —
*.tavp.my.id→ container - HTTP only — tanpa HTTPS complexity, langsung jalan
- Migrasi dari Lando — parse
.lando.ymlotomatis - Auto-detect recipe — dari
composer.json,package.json,go.mod,requirements.txt - Events auto-execution —
events.post-startjalan otomatis saat create - Timezone default —
Asia/Jakartauntuk semua container - Web panel — manage semua project dari browser
- Dynamic tooling —
tavpbox artisan migrate,tavpbox composer install
Arsitektur
tavpbox (Go binary)
├── CLI (cobra)
│ ├── init, create, start, stop, restart, destroy, rebuild
│ ├── ssh, list, info, logs
│ ├── tooling (dynamic subcommands)
│ ├── panel (web UI)
│ ├── proxy (reverse proxy management)
│ ├── config (configuration)
│ └── setup (dependencies + cert)
├── Podman client (exec wrapper)
├── Embedded Go proxy
│ ├── HTTP :80 (HTTP only)
│ ├── LAN ports :8081-8999
│ └── Dynamic routes (routes.json)
├── LAN port manager (fixed ports per project)
├── Service library (15 services)
├── Recipe library (7 recipes)
├── Lando parser (.lando.yml)
└── API server (REST + embedded panel)Prasyarat
- Windows: Windows 10/11 64-bit, Podman Desktop
- macOS: Homebrew, Podman
- Linux: Podman
- Tidak perlu paham nginx/docker/LXC
1. Install
Option 1: Download Binary (Recommended)
Download dari GitHub Releases:
| Platform | File |
|---|---|
| Windows | tavpbox-windows-amd64.exe |
| macOS (Intel) | tavpbox-darwin-amd64 |
| macOS (M1/M2) | tavpbox-darwin-arm64 |
| Linux (x64) | tavpbox-linux-amd64 |
| Linux (ARM) | tavpbox-linux-arm64 |
Add to PATH:
# Windows
move tavpbox.exe C:\Users\<you>\AppData\Local\tavpbox\
# macOS/Linux
sudo mv tavpbox /usr/local/bin/Option 2: Build from Source
git clone https://github.com/tavp-stack/tavpbox.git
cd tavpbox
go build -o tavpbox .Option 3: Go Install
go install github.com/tavp-stack/tavpbox@latest2. Setup
tavpbox setupYang dilakukan:
- ✅ Check/install Podman
- ✅ Generate wildcard cert
*.tavp.my.id(via Let's Encrypt) - ✅ Cert di-embed di binary
Config Cloudflare (sekali aja)
tavpbox config set cloudflare_token <your-token>
tavpbox config set cloudflare_zone <your-zone-id>Buat token di: https://dash.cloudflare.com/profile/api-tokens
- Permission: Zone → DNS → Edit
- Zone:
tavp.my.id
3. Project Baru (tavpbox init)
cd ~/projects/my-app
tavpbox initTUI akan muncul:
Project name [my-app]:
Recipe:
> [1] tavp
[2] laravel
[3] php
[4] node
[5] go
[6] python
[7] blank
Services (comma/space separated):
Available: mariadb, mysql, postgres, mongodb, redis, memcached, mailpit, mailhog, phpmyadmin, adminer, elasticsearch, rabbitmq
Default [mariadb redis mailpit]:
Webroot [public]:
RAM limit [512MB]:
CPU cores [1]:Setelah init, file .tavpbox.yml dibuat:
name: my-app
recipe: tavp
webroot: public
services:
mariadb:
enabled: true
redis:
enabled: true
mailpit:
enabled: true
tooling:
artisan:
cmd: php artisan
composer:
cmd: composer
npm:
cmd: npm
npx:
cmd: npx
php:
cmd: php
test:
cmd: php artisan test
ram: 512MB
cpu: 14. Create Container (tavpbox create)
tavpbox createYang dilakukan:
- Pull image (Ubuntu 24.04, Node 20, dll)
- Create container dengan volume mount
- Start container
- Install recipe (nginx + PHP + composer, dll)
- Install services (mariadb, redis, mailpit)
- Configure reverse proxy
- Run events.post-start commands (otomatis!)
Output:
Creating box 'my-app' (tavp recipe)...
[1/4] Pulling image docker.io/library/ubuntu:24.04...
[2/4] Creating container...
[3/4] Starting container...
[4/4] Installing tavp recipe...
Installing mariadb...
Installing redis...
Installing mailpit...
Creating startup script...
✓ Box 'my-app' created and running!
Direct: http://localhost:35941
HTTP: http://my-app.tavp.my.id
LAN: http://192.168.1.100:8081
IP: 10.89.0.27
SSH: tavpbox ssh5. Akses Project
URLs
| Service | URL |
|---|---|
| App | http://my-app.tavp.my.id |
| Mailpit | http://mailpit.my-app.tavp.my.id |
| phpMyAdmin | http://phpmyadmin.my-app.tavp.my.id |
| Direct | http://localhost:<port> |
Database Credentials
tavpbox info Database:
Host: localhost
User: app
Password: app
Database: app6. Perintah Harian
Lifecycle
tavpbox start # Start container
tavpbox stop # Stop container (RAM balik 0)
tavpbox restart # Restart container
tavpbox destroy # Hapus container permanen
tavpbox rebuild # Recreate container (data tetap)Monitoring
tavpbox list # Semua container + status
tavpbox info # Detail project (URLs, DB creds)
tavpbox logs # Lihat logs containerSSH
tavpbox ssh # Masuk terminal container
tavpbox ssh php artisan # Jalankan command di containerTooling
tavpbox tooling # Lihat semua tooling commands
tavpbox artisan migrate # php artisan migrate
tavpbox composer install # composer install
tavpbox npm run dev # npm run dev
tavpbox test # php artisan test
tavpbox php --version # php --version7. Migrasi dari Lando
TAVPBox mendukung penuh .lando.yml. Cukup jalankan tavpbox create di folder yang ada .lando.yml.
Yang di-support:
- ✅
recipe(lamp, laravel, dll) - ✅
services(mariadb, mysql, redis, mailpit, phpmyadmin, dll) - ✅
tooling(artisan, composer, npm, mysql, dll) - ✅
proxy(*.lndo.site → *.tavp.my.id) - ✅
events.post-start(build/run commands) - ✅
services.*.overrides.environment(env vars) - ✅
services.*.creds(DB credentials)
Contoh migrasi:
# Project Lando
cd ~/kos-kosan.id
cat .lando.yml
# name: koskosan
# recipe: lamp
# services:
# appserver: { type: php:8.4 }
# database: { type: mysql:8.0, creds: { user: koskosan, password: koskosan, database: koskosan } }
# redis: { type: redis:7 }
# mailpit: { type: mailpit }
# proxy:
# appserver: [koskosan.lndo.site]
# koskosan-mailpit: [mailpit.koskosan.lndo.site]
# Migrasi ke TAVPBox
tavpbox info
# Recipe: laravel
# Services: mariadb, redis, mailpit
# Domain: http://koskosan.tavp.my.id
# Database: koskosan/koskosan/koskosan
tavpbox create
# http://koskosan.tavp.my.id → jalan!Mapping Lando → TAVPBox
| Lando | TAVPBox |
|---|---|
*.lndo.site | *.tavp.my.id |
mail.*.lndo.site | mailpit.*.tavp.my.id |
pma.*.lndo.site | phpmyadmin.*.tavp.my.id |
services.appserver.type: php:8.4 | recipe: laravel |
services.database.type: mariadb:11.6 | services.mariadb.enabled: true |
services.redis | services.redis.enabled: true |
services.mailpit | services.mailpit.enabled: true |
tooling.artisan | tooling.artisan.cmd: php artisan |
services.*.creds | env.DB_* |
8. Recipes
| Recipe | Description | Image | Default Services |
|---|---|---|---|
tavp | TAVP Stack (PHP 8.3 + Nginx + Node 20) | ubuntu:24.04 | mariadb, redis, mailpit |
laravel | Laravel | ubuntu:24.04 | mariadb, redis, mailpit |
php | Generic PHP | ubuntu:24.04 | mariadb, redis |
node | Node.js | node:20-alpine | redis |
go | Go | golang:1.22-alpine | — |
python | Python | python:3.12-slim | redis |
blank | Empty container | ubuntu:24.04 | — |
Recipe Detail
TAVP Stack (tavp)
- PHP 8.3 + FPM
- Nginx
- Node.js 20
- Composer
- Phalcon (optional)
- Webroot:
public
Laravel (laravel)
- PHP 8.3 + FPM
- Nginx
- Node.js 20
- Composer
- Webroot:
public
PHP (php)
- PHP 8.3 + FPM
- Nginx
- Composer
- Webroot:
public
Node.js (node)
- Node.js 20
- Nginx (reverse proxy ke port 3000)
- Yarn, pnpm
- Webroot:
.
Go (go)
- Go 1.22
- Nginx (reverse proxy ke port 8080)
- Webroot:
.
Python (python)
- Python 3.12
- Nginx (reverse proxy ke port 8000)
- Webroot:
.
Blank (blank)
- Ubuntu 24.04
- Nginx
- Webroot:
.
9. Services
| Service | Category | Description | Port |
|---|---|---|---|
| mariadb | database | MySQL-compatible RDBMS | 3306 |
| mysql | database | MySQL | 3306 |
| postgres | database | PostgreSQL | 5432 |
| mongodb | database | NoSQL document DB | 27017 |
| redis | cache | In-memory cache | 6379 |
| memcached | cache | Distributed cache | 11211 |
| mailpit | Email testing (SMTP + web UI) | 8025, 1025 | |
| mailhog | Email testing | 8025, 1025 | |
| phpmyadmin | admin | Database admin UI | 8080 |
| adminer | admin | Lightweight DB manager | 8080 |
| elasticsearch | search | Search engine | 9200 |
| rabbitmq | queue | Message broker | 5672, 15672 |
| beanstalkd | queue | Work queue | 11300 |
| apache | webserver | Apache HTTP server | 80 |
| varnish | cache | HTTP reverse proxy cache | 80 |
Service Detail
MariaDB (mariadb)
services:
mariadb:
enabled: true- Default DB:
app - Default User:
app - Default Password:
app
Redis (redis)
services:
redis:
enabled: true- Default Port: 6379
Mailpit (mailpit)
services:
mailpit:
enabled: true- Web UI:
http://mailpit.<project>.tavp.my.id - SMTP: port 1025
phpMyAdmin (phpmyadmin)
services:
phpmyadmin:
enabled: true- Web UI:
http://phpmyadmin.<project>.tavp.my.id
10. Tooling
Tooling commands run inside the container. Define them in .tavpbox.yml:
tooling:
artisan:
cmd: php artisan
composer:
cmd: composer
npm:
cmd: npm
npx:
cmd: npx
php:
cmd: php
test:
cmd: php artisan test
mysql:
cmd: mysql -u app -papp appUse them directly:
tavpbox artisan migrate
tavpbox composer install
tavpbox npm run dev
tavpbox test
tavpbox php --version
tavpbox mysql -u app -papp appDefault Tooling per Recipe
| Recipe | Tooling |
|---|---|
| tavp/laravel | artisan, composer, npm, npx, php, test |
| php | composer, php, test |
| node | npm, npx, yarn, pnpm, node |
| go | go |
| python | python, pip, pytest |
11. HTTP Only
TAVPBox menggunakan HTTP saja — tanpa HTTPS, tanpa certificate, tanpa complexity.
Untuk local development, HTTP sudah cukup aman karena traffic lokal.
tavpbox create
# http://myproject.tavp.my.id → langsung jalanDNS *.tavp.my.id diarahkan ke 127.0.0.1 (localhost). Semua request ke *.tavp.my.id langsung ke proxy TAVPBox di port 80.
12. Web Panel
tavpbox panel
# Opens http://localhost:8080Features
- Dashboard — semua project dengan status
- Create Project — wizard buat project baru
- Project Detail — logs, URLs, DB credentials
- Service Management — start/stop/restart
- Recipe Browser — lihat semua recipes
- Service Browser — lihat semua services
Custom Port
tavpbox panel -p 3000Stop Panel
tavpbox panel:stop13. Proxy
TAVPBox punya embedded reverse proxy (HTTP :80 saja).
Commands
tavpbox proxy:start # Start proxy
tavpbox proxy:stop # Stop proxy
tavpbox proxy:status # Status + routesAuto-start
Proxy auto-start saat tavpbox create.
Routes
Proxy routes di ~/.tavpbox/proxy/routes.json:
[
{
"domain": "my-app.tavp.my.id",
"ip": "127.0.0.1",
"port": 35941
},
{
"domain": "mailpit.my-app.tavp.my.id",
"ip": "127.0.0.1",
"port": 35219
}
]14. Config
Global Config (~/.tavpbox/config.yml)
tavpbox config list domain_suffix: tavp.my.id
default_ram: 512MB
default_cpu: 1
default_image: docker.io/library/ubuntu:24.04
panel_port: 8080
cloudflare_token: cfut_xxx...
cloudflare_zone: 816fd4831683b15ad52b09b963e105e5Set Config
tavpbox config set domain_suffix tavp.my.id
tavpbox config set default_ram 1024MB
tavpbox config set cloudflare_token <token>
tavpbox config set cloudflare_zone <zone_id>Get Config
tavpbox config get domain_suffix
tavpbox config get cloudflare_token15. Multi-Platform
| Platform | Architecture | Binary |
|---|---|---|
| Windows | amd64 | tavpbox-windows-amd64.exe |
| macOS | amd64 | tavpbox-darwin-amd64 |
| macOS | arm64 (M1/M2) | tavpbox-darwin-arm64 |
| Linux | amd64 | tavpbox-linux-amd64 |
| Linux | arm64 | tavpbox-linux-arm64 |
Cross-compile
make cross
# Output: dist/tavpbox-{os}-{arch}16. Architecture
tavpbox (Go binary)
├── CLI (cobra)
│ ├── init, create, start, stop, restart, destroy, rebuild
│ ├── ssh, list, info, logs
│ ├── tooling (dynamic subcommands)
│ ├── panel (web UI)
│ ├── proxy (reverse proxy management)
│ ├── config (configuration)
│ └── config (configuration)
├── Podman client (exec wrapper)
│ ├── Create, Start, Stop, Restart, Remove
│ ├── Exec, ExecInteractive, Copy
│ ├── GetIP, GetHostPort, Exists
│ ├── List, Inspect, Logs
│ └── NetworkCreate, NetworkConnect
├── Embedded Go proxy
│ ├── HTTP :80 (HTTP only, no HTTPS)
│ ├── LAN ports :8081-8999
│ ├── Dynamic routes (routes.json)
│ └── httputil.ReverseProxy
├── LAN port manager (fixed ports per project)
├── Service library (15 services)
│ ├── Database: mariadb, mysql, postgres, mongodb
│ ├── Cache: redis, memcached, varnish
│ ├── Mail: mailpit, mailhog
│ ├── Admin: phpmyadmin, adminer
│ ├── Search: elasticsearch
│ ├── Queue: rabbitmq, beanstalkd
│ └── Webserver: apache
├── Recipe library (7 recipes)
│ ├── tavp, laravel, php
│ ├── node, go, python
│ └── blank
├── Lando parser (.lando.yml)
│ ├── Service mapper
│ ├── Tooling mapper
│ ├── Environment mapper
│ ├── Proxy mapper
│ └── Build/run executor
├── Plugin engine (~/.tavpbox/plugins/)
└── API server (REST + embedded panel)
├── GET /api/health
├── GET /api/projects
├── GET /api/projects/{name}
├── POST /api/projects
├── POST /api/projects/{name}/start
├── POST /api/projects/{name}/stop
├── POST /api/projects/{name}/restart
├── DELETE /api/projects/{name}
├── GET /api/projects/{name}/logs
├── GET /api/recipes
└── GET /api/services17. Troubleshooting
Podman not found
tavpbox setup
# Atau install manual: https://podman-desktop.ioContainer already exists
tavpbox destroy
tavpbox createPort already in use
tavpbox proxy:stop
tavpbox proxy:startPort sudah dipakai
tavpbox proxy:stop
tavpbox proxy:startDomain not resolving / "No project configured"
# Check proxy routes
tavpbox proxy:status
# If routes empty, rebuild from all containers
tavpbox start --all
# Or start from each project folder
cd ~/projects/my-app
tavpbox startNote: Use TAVPBox ≥ v0.12.1 which fixes
start --allnot registering routes (#10).
Container won't start
tavpbox logs
# Cek error di logsLando migration issues
# Cek config
tavpbox info
# Rebuild
tavpbox rebuild18. FAQ
TAVPBox vs Lando?
TAVPBox pakai Podman (bukan Docker), lebih irit RAM, dan punya web panel. Lando pakai Docker.
TAVPBox vs Docker?
TAVPBox pakai Podman (rootless, daemonless), lebih ringan, dan punya auto-domain + auto-detect recipe.
Bisa pakai Docker?
Belum. TAVPBox pakai Podman. Docker support coming soon.
Bisa di Windows?
Ya. Pakai Podman Desktop.
Bisa di macOS?
Ya. Pakai Podman (brew install podman).
Bisa di Linux?
Ya. Pakai Podman (apt install podman).
HTTPS?
TAVPBox menggunakan HTTP saja — tanpa HTTPS complexity. Untuk local development, HTTP sudah cukup aman karena traffic lokal.
Bisa migrasi dari Lando?
Ya. Cukup jalankan tavpbox create di folder yang ada .lando.yml.
Bisa pakai domain sendiri?
Ya. Set domain_suffix di config:
tavpbox config set domain_suffix mydomain.com19. Links
- GitHub: https://github.com/tavp-stack/tavpbox
- Gitea: https://git.glotama.com/tavp-stack/tavp-box
- Issues: https://github.com/tavp-stack/tavpbox/issues
- Docs: https://docs.tavp.web.id/guide/tavpbox
- Releases: https://github.com/tavp-stack/tavpbox/releases
License
MIT
