Project
Declare your whole database environment in dbpod.yaml and bring it up with one command — team-reproducible by default.
The idea
A hand-run instance is fine for scratch work, but real projects need an environment the whole team reproduces identically. dbpod projects do with one file what docker-compose did for services: declare it, bring it up, share it.
dbpod.yaml
Commit a dbpod.yaml to your repository root:
instances:
- name: main
engine: mysql@8.0
port: 3306
databases:
- app
- name: cache-db
engine: postgres@17
port: 5432
databases:
- app
The file declares engine series, instance names, ports, and the databases to create. Versions
resolve through the normal series rules, so mysql@8.0 reproducibly maps to a concrete patch
on every machine.
init and up
dbpod project init # scaffold a dbpod.yaml from your current instances
dbpod project up # create every instance declared in dbpod.yaml
project init is the fast path for existing work: it snapshots your running instances into a
dbpod.yaml you can commit.
project up is idempotent for teammates: instances that already exist are left alone,
missing ones are created. Anyone cloning the repo gets the full environment with one command.
Init SQL
Declare init SQL files and they are imported automatically the first time an instance is
created:
instances:
- name: main
engine: mysql@8.0
databases:
- app
init:
- ./schema/01_tables.sql
- ./seed/dev_seed.sql
Schema and seed data become part of the repo — new contributors get a working database with realistic data, not an empty shell.
Instance operations through the project
dbpod project exec main # SQL shell on the "main" instance
dbpod project logs main # tail its logs
Where the data lives
Exactly where single instances keep it: ./.dbpod/ in the project. Add the directory to
.gitignore (dbpod never commits data), and the environment is fully described by
dbpod.yaml + init SQL alone.