A good development environment makes PostgreSQL, pgvector, migrations, fixtures, and tests repeatable without pretending a laptop is production. Pin image and dependency versions, expose the database only on loopback, use health checks, keep secrets outside Git, run migrations explicitly, and provide one command to start, verify, test, inspect, and remove the stack.
Pin the application base image and lock dependencies. Do not bake .env.local into the image. Use separate commands or profiles for migrations, fixtures, workers, and evaluation.
Seed two tenants, authorized and unauthorized documents, exact identifiers, paraphrases, multilingual text, duplicate chunks, deleted rows, and deterministic small vectors. Fixtures should test behavior rather than imitate model quality. A separate optional integration dataset can use the real embedding provider.
Container process health is insufficient. The API readiness check should confirm database connectivity, required schema migration, vector extension/version compatibility, and critical configuration. It should not call an expensive generation provider on every probe.
On a clean machine or CI runner: copy an example env file, start, wait for health, run migrations, load fixtures, run tests, restart, run tests again, then remove. Confirm extension version and no secret in images or Git history.
The following command also deletes this Compose project's named development volume. Confirm the project before running it:
Review this Docker pgvector development stack [paste]. Check pinned versions, loopback ports, health/readiness, secrets, migration ownership, deterministic fixtures, non-root app user, image contents, resource limits, restart behavior, and scoped cleanup.
Verification contract: Recreate from a clean checkout using documented commands and produce PostgreSQL, pgvector, migration, and test evidence without manual database edits.