Skip to content

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
ProtocolHTTPS (Let's Encrypt)HTTP only (simple!)
Auto domain*.lndo.site*.tavp.my.id
Mail per-projectmail.*.lndo.sitemailpit.*.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)
TimezoneUTC✓ Asia/Jakarta default
Web Panel✓ (built-in)

Apa itu TAVPBox?

TAVPBox adalah CLI tool yang bisa:

  1. Manage local development containers — create, start, stop, destroy
  2. Auto-routing domain*.tavp.my.id → container
  3. HTTP only — tanpa HTTPS complexity, langsung jalan
  4. Migrasi dari Lando — parse .lando.yml otomatis
  5. Auto-detect recipe — dari composer.json, package.json, go.mod, requirements.txt
  6. Events auto-executionevents.post-start jalan otomatis saat create
  7. Timezone defaultAsia/Jakarta untuk semua container
  8. Web panel — manage semua project dari browser
  9. Dynamic toolingtavpbox artisan migrate, tavpbox composer install

Arsitektur

tavpbox (Go binary)
├── CLI (cobra)
│   ├── init, create, start, stop, restart, destroy, rebuild
│   ├── ssh, list, info, logs, expose
│   ├── tooling (dynamic subcommands)
│   ├── panel (web UI)
│   ├── proxy (reverse proxy management)
│   └── config (configuration)
├── Podman client (exec wrapper)
├── Embedded Go proxy
│   ├── HTTP :80 (HTTP only, no HTTPS)
│   ├── 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

1. Install

Download dari GitHub Releases:

PlatformFile
Windowstavpbox-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:

powershell
# Windows
move tavpbox.exe C:\Users\<you>\AppData\Local\tavpbox\

# macOS/Linux
sudo mv tavpbox /usr/local/bin/

Option 2: Build from Source

bash
git clone https://github.com/tavp-stack/tavpbox.git
cd tavpbox
go build -o tavpbox .

Option 3: Go Install

bash
go install github.com/tavp-stack/tavpbox@latest

2. Setelah Host Restart / Shutdown

Setelah komputer restart, jalankan satu command:

powershell
tavpbox start --all

Output:

Starting all TAVPBox containers...
  ✓ tavp-web-id → http://tavp-web-id.tavp.my.id
  ✓ lula → http://lula.tavp.my.id

Starting proxy...

✓ 2 containers started + proxy running

Atau start per-folder:

powershell
cd ~/projects/my-app
tavpbox start

3. Project Baru (tavpbox init)

powershell
cd ~/projects/my-app
tavpbox init

TAVPBox auto-detect recipe dari codebase:

  • composer.json dengan laravel/frameworklaravel
  • composer.json dengan phalcon/cphalcontavp
  • composer.json (PHP biasa) → php
  • package.jsonnode
  • go.modgo
  • requirements.txt / pyproject.tomlpython

TUI akan muncul dengan recipe yang sudah ter-deteksi:

Project name [my-app]:
Recipe:
    [1] tavp
  > [2] laravel (detected)
    [3] php
    [4] node
    [5] go
    [6] python
    [7] blank
Select [2]:
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:

yaml
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: 1

4. Create Container (tavpbox create)

powershell
tavpbox create

Yang dilakukan:

  1. Pull image (Ubuntu 24.04, Node 20, dll)
  2. Create container dengan volume mount
  3. Start container
  4. Install recipe (nginx + PHP + composer, dll)
  5. Install services (mariadb, redis, mailpit)
  6. Run events.post-start commands (otomatis!)
  7. Configure reverse proxy

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...
  Running post-start events...

✓ 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 ssh

Auto-create on Start

tavpbox start otomatis create container jika belum ada:

powershell
cd ~/projects/my-app
tavpbox start
# Container not found. Creating...
# ✓ Box 'my-app' created and running!

Jadi cukup tavpbox start — gak perlu init + create secara terpisah.


5. Akses Project

URLs

ServiceURL
Apphttp://my-app.tavp.my.id
Mailpithttp://mailpit.my-app.tavp.my.id
phpMyAdminhttp://phpmyadmin.my-app.tavp.my.id
Directhttp://localhost:<port>
LANhttp://<host-ip>:<lan-port>

Database Credentials

powershell
tavpbox info
 Database:
   Host:     localhost
   User:     app
   Password: app
   Database: app

6. Perintah Harian

Lifecycle

powershell
tavpbox start --all       # Start semua containers + proxy (setelah restart)
tavpbox start              # Start container di folder ini
tavpbox stop               # Stop container (RAM balik 0)
tavpbox restart            # Restart container
tavpbox destroy            # Hapus container permanen
tavpbox rebuild            # Recreate container (data tetap)

Monitoring

powershell
tavpbox list               # Semua container + status
tavpbox info               # Detail project (URLs, DB creds)
tavpbox logs               # Lihat logs container

SSH

powershell
tavpbox ssh                # Masuk terminal container
tavpbox ssh php artisan    # Jalankan command di container

Tooling

powershell
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 --version

7. 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:

powershell
# 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

LandoTAVPBox
*.lndo.site*.tavp.my.id
mail.*.lndo.sitemailpit.*.tavp.my.id
pma.*.lndo.sitephpmyadmin.*.tavp.my.id
services.appserver.type: php:8.4recipe: laravel
services.database.type: mariadb:11.6services.mariadb.enabled: true
services.redisservices.redis.enabled: true
services.mailpitservices.mailpit.enabled: true
tooling.artisantooling.artisan.cmd: php artisan
services.*.credsenv.DB_*

8. Database Persistence

Database data otomatis persist di host. Gak hilang saat rebuild.

~/.tavpbox/volumes/<project>/mysql/     → MariaDB/MySQL data
~/.tavpbox/volumes/<project>/postgres/  → PostgreSQL data

Backup

powershell
podman exec tavp-<project> mysqldump -u root <database> > backup.sql

Restore

powershell
cat backup.sql | tavpbox ssh mysql -u root

9. Recipes

RecipeDescriptionImageDefault Services
tavpTAVP Stack (PHP 8.3 + Nginx + Node 20)ubuntu:24.04mariadb, redis, mailpit
laravelLaravelubuntu:24.04mariadb, redis, mailpit
phpGeneric PHPubuntu:24.04mariadb, redis
nodeNode.jsnode:20-alpineredis
goGogolang:1.22-alpine
pythonPythonpython:3.12-slimredis
blankEmpty containerubuntu: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

ServiceCategoryDescriptionPort
mariadbdatabaseMySQL-compatible RDBMS3306
mysqldatabaseMySQL3306
postgresdatabasePostgreSQL5432
mongodbdatabaseNoSQL document DB27017
rediscacheIn-memory cache6379
memcachedcacheDistributed cache11211
mailpitmailEmail testing (SMTP + web UI)8025, 1025
mailhogmailEmail testing8025, 1025
phpmyadminadminDatabase admin UI8080
admineradminLightweight DB manager8080
elasticsearchsearchSearch engine9200
rabbitmqqueueMessage broker5672, 15672
beanstalkdqueueWork queue11300
apachewebserverApache HTTP server80
varnishcacheHTTP reverse proxy cache80

Service Detail

MariaDB (mariadb)

yaml
services:
  mariadb:
    enabled: true
  • Default DB: app
  • Default User: app
  • Default Password: app

Redis (redis)

yaml
services:
  redis:
    enabled: true
  • Default Port: 6379

Mailpit (mailpit)

yaml
services:
  mailpit:
    enabled: true
  • Web UI: https://mailpit.<project>.tavp.my.id
  • SMTP: port 1025

phpMyAdmin (phpmyadmin)

yaml
services:
  phpmyadmin:
    enabled: true
  • Web UI: https://phpmyadmin.<project>.tavp.my.id

10. Tooling

Tooling commands run inside the container. Define them in .tavpbox.yml:

yaml
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 app

Use them directly:

powershell
tavpbox artisan migrate
tavpbox composer install
tavpbox npm run dev
tavpbox test
tavpbox php --version
tavpbox mysql -u app -papp app

Default Tooling per Recipe

RecipeTooling
tavp/laravelartisan, composer, npm, npx, php, test
phpcomposer, php, test
nodenpm, npx, yarn, pnpm, node
gogo
pythonpython, pip, pytest

11. HTTP Only (Kenapa bukan HTTPS?)

TAVPBox menggunakan HTTP saja — tanpa HTTPS, tanpa certificate, tanpa complexity.

Kenapa HTTP?

AlasanPenjelasan
SimpelGak perlu setup certificate, gak perlu domain asli
Local devTraffic lokal, gak lewat internet — HTTP aman
Zero configtavpbox start → langsung jalan
Lando-compatibleSama seperti Lando — HTTP untuk local dev

Akses

powershell
tavpbox create
# http://myproject.tavp.my.id → langsung jalan

DNS *.tavp.my.id diarahkan ke 127.0.0.1 (localhost). Semua request ke *.tavp.my.id langsung ke proxy TAVPBox di port 80.


12. LAN Access

Akses project dari device lain di jaringan yang sama. Tanpa HTTPS, tanpa DNS — cukup http://[IP]:[port].

How it works

  • Setiap project dapat fixed LAN port (8081, 8082, 8083, ...)
  • Port di-assign otomatis saat tavpbox create
  • Port mapping disimpan di ~/.tavpbox/lan-ports.json
  • Container publish port sebagai -p 8081:80 (bukan random)

Show LAN URLs

powershell
tavpbox expose

Output:

🌐 LAN Access

┌─────────────────────┬──────────────────────────────────────┬───────┐
│ Project             │ URL                                  │ Port  │
├─────────────────────┼──────────────────────────────────────┼───────┤
│ tavp-web-id         │ http://192.168.18.160:8081           │ 8081  │
│ lula                │ http://192.168.18.160:8082           │ 8082  │
│ koskosan            │ http://192.168.18.160:8083           │ 8083  │
└─────────────────────┴──────────────────────────────────────┴───────┘

📋 Tambahkan ke hosts device lain (opsional):
   192.168.18.160 tavp-web-id.tavp.my.id lula.tavp.my.id koskosan.tavp.my.id

Akses dari device lain

  1. Buka browser di device lain
  2. Ketik: http://192.168.18.160:8081
  3. (Opsional) Tambah hosts entry untuk domain access

Kenapa HTTP, bukan HTTPS?

MasalahPenjelasan
SimpelGak perlu setup certificate, gak perlu domain asli
Local devTraffic lokal, gak lewat internet — HTTP aman
Zero configtavpbox start → langsung jalan

Port assignment

ProjectLAN Port
Pertama8081
Kedua8082
Ketiga8083
......
Terakhir8999

Port tersimpan di ~/.tavpbox/lan-ports.json dan stable (tetap sama meski restart).


13. Pre-built Images

TAVPBox pakai pre-built images untuk performa terbaik. Semua service udah terinstall di image, jadi tavpbox create instant.

Official Images

ImageRecipeServices
ghcr.io/tavp-stack/tavpbox-phptavp, laravel, phpNginx, PHP 8.2, MariaDB, Redis, Mailpit, Node.js, Composer, Phalcon
ghcr.io/tavp-stack/tavpbox-nodenodeNginx, Node.js 20
ghcr.io/tavp-stack/tavpbox-gogoNginx, Go 1.22
ghcr.io/tavp-stack/tavpbox-pythonpythonNginx, Python 3.12

Custom Images

Developer bisa build custom image dari container yang lagi jalan:

powershell
# Install custom packages di container
tavpbox ssh
apt-get install -y php-imagick ffmpeg
exit

# Build image
tavpbox image build --name my-php-custom

# Push ke registry
tavpbox image push ghcr.io/myuser/my-php-custom:latest

# Pakai di .tavpbox.yml
echo "image: ghcr.io/myuser/my-php-custom:latest" >> .tavpbox.yml
tavpbox create  # instant!

Image Commands

CommandDescription
tavpbox image buildBuild custom image dari container
tavpbox image push <image>Push image ke registry
tavpbox image pull <image>Pull image dari registry
tavpbox image listList local images

14. Web Panel

powershell
tavpbox panel
# Opens http://localhost:8080

Features

  • 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

powershell
tavpbox panel -p 3000

Stop Panel

powershell
tavpbox panel:stop

15. Proxy

TAVPBox punya embedded reverse proxy (HTTP :80 saja).

Commands

powershell
tavpbox proxy:start     # Start proxy
tavpbox proxy:stop      # Stop proxy
tavpbox proxy:status    # Status + routes

Auto-start

Proxy auto-start saat tavpbox create.

Routes

Proxy routes di ~/.tavpbox/proxy/routes.json:

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
  }
]

16. Config

Global Config (~/.tavpbox/config.yml)

powershell
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
  default_tz:        Asia/Jakarta

Set Config

powershell
tavpbox config set domain_suffix tavp.my.id
tavpbox config set default_ram 1024MB
tavpbox config set default_tz Asia/Jakarta

Get Config

powershell
tavpbox config get domain_suffix

Timezone

Default timezone untuk semua container adalah Asia/Jakarta. Bisa di-change via config:

powershell
tavpbox config set default_tz Asia/Makassar

Events

Events auto-dijalankan saat container create/start. Support post-start:

yaml
events:
  post-start:
    - mkdir -p storage/app/framework/cache
    - mkdir -p storage/logs
    - mkdir -p storage/framework/{sessions,views,cache}
    - chown -R www-data:www-data storage bootstrap/cache

17. Multi-Platform

PlatformArchitectureBinary
Windowsamd64tavpbox-windows-amd64.exe
macOSamd64tavpbox-darwin-amd64
macOSarm64 (M1/M2)tavpbox-darwin-arm64
Linuxamd64tavpbox-linux-amd64
Linuxarm64tavpbox-linux-arm64

Cross-compile

bash
make cross
# Output: dist/tavpbox-{os}-{arch}

18. Architecture

tavpbox (Go binary)
├── CLI (cobra)
│   ├── init, create, start, stop, restart, destroy, rebuild
│   ├── ssh, list, info, logs, expose
│   ├── tooling (dynamic subcommands)
│   ├── panel (web UI)
│   ├── proxy (reverse proxy management)
│   └── 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)
│   ├── Auto-assign (8081-8999)
│   ├── Port mapping (lan-ports.json)
│   └── Release on destroy
├── 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
│   ├── Events mapper (post-start)
│   ├── Proxy mapper
│   └── Build/run executor
├── Auto-detect recipe (composer.json/package.json/go.mod/requirements.txt)
├── Nginx config writer (via podman cp — avoids $ escaping)
├── 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/services

19. Troubleshooting

Podman not found

Install Podman Desktop: https://podman-desktop.io

powershell
# Windows
winget install RedHat.PodmanDesktop

# macOS
brew install podman

# Linux
sudo apt install podman

Container already exists

powershell
tavpbox destroy
tavpbox create

Port already in use

powershell
tavpbox proxy:stop
tavpbox proxy:start

Domain not resolving / "No project configured"

powershell
# Cek proxy routes
tavpbox proxy:status

# Jika routes kosong, rebuild dari semua container
tavpbox start --all

# Atau start dari masing-masing project folder
cd ~/projects/my-app
tavpbox start

Note: Pastikan menggunakan TAVPBox ≥ v0.12.1 yang memperbaiki bug start --all tidak registrasi routes (#10).

Container won't start

powershell
tavpbox logs
# Cek error di logs

Lando migration issues

powershell
# Cek config
tavpbox info

# Rebuild
tavpbox rebuild

20. 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:

powershell
tavpbox config set domain_suffix mydomain.com


License

MIT

Released under the MIT License.