Quick Start¶
Get Vectis Commerce running locally in under 5 minutes.
Prerequisites¶
- Docker + Docker Compose v2
- Python 3.12+
- Node.js 22+
- Access to both the core (
vectis-commerce) andenterprise-extensionsrepos
1. Clone Both Repos¶
All extensions live in the separate enterprise-extensions repo. Clone it as a sibling of the core repo, in the same parent directory — docker-compose.yml bind-mounts ../enterprise-extensions read-only into the API container and dev-links it via VECTIS_DEV_EXTENSIONS:
git clone git@github.com:vectiscommerce/vectis-commerce.git vectis
git clone git@github.com:vectiscommerce/enterprise-extensions.git enterprise-extensions
Without the sibling checkout, starting the containers fails (the bind mount is missing) and no extensions are discovered.
2. Start Infrastructure¶
This starts PostgreSQL, Valkey, Redpanda, Temporal, Meilisearch, Typesense, RustFS, and their UIs.
3. Install Dependencies¶
Or manually:
4. Initialize the Database¶
This runs Alembic migrations and seeds the database with a default channel, sample products, exchange rates, and admin user. Then create the Temporal schedules (one-time, after the services are up):
5. Start Dev Servers¶
Run each in a separate terminal:
make api # FastAPI on :8000
make worker # Temporal worker
make admin-dev # Admin on :5173
make storefront-dev # Storefront on :5174
6. Open the Apps¶
Most tool UIs are not published on host localhost ports — the containers only expose: their ports internally and are reached through the shared Caddy dev-proxy at *.vectis.eto (see the dev-proxy reference). Add the *.vectis.eto hosts to /etc/hosts (or run the proxy's setup) before opening these.
| App | URL | Credentials |
|---|---|---|
| Admin Panel | https://admin.vectis.eto | admin@vectis.local / admin |
| Storefront | https://vectis.eto | Guest or create account |
| GraphQL IDE | https://api.vectis.eto/graphql | — |
| Redpanda Console | https://redpanda.vectis.eto | — |
| Temporal UI | https://temporal.vectis.eto | — (internal port 8080) |
| Grafana | https://grafana.vectis.eto | admin / admin |
| Prometheus | https://prometheus.vectis.eto | — |
| Alertmanager | https://alertmanager.vectis.eto | — |
| Mailpit (dev email UI) | https://mail.vectis.eto | — |
The following services are host-mapped and reachable directly on localhost (data/protocol endpoints, not web UIs):
| Service | Host port | Notes |
|---|---|---|
| PostgreSQL | localhost:5432 |
Database connection |
| Valkey | localhost:6379 |
Cache / sessions |
| Redpanda (Kafka API) | localhost:19092 |
Broker (schema-registry 18081, pandaproxy 18082) |
| Temporal (gRPC) | localhost:7233 |
Workflow server |
| Meilisearch | localhost:7700 |
Admin search — key vectis-dev-key |
| Typesense | localhost:8108 |
Storefront search — key vectis-dev-key |
| Mailpit (SMTP) | localhost:1025 |
SMTP only — the web UI is proxy-only (see above) |
| RustFS (S3 API) | localhost:9000 |
S3-compatible object store — rustfsadmin / rustfsadmin |
Environment Variables¶
Copy the example env file and adjust as needed:
Key variables:
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
postgresql+asyncpg://vectis:vectis@localhost:5432/vectis |
PostgreSQL connection |
REDIS_URL |
redis://localhost:6379/0 |
Redis for sessions and cache |
REDPANDA_BROKER |
localhost:19092 |
Redpanda broker address |
TEMPORAL_HOST |
localhost:7233 |
Temporal server |
SECRET_KEY |
(required) | JWT signing key — generate with python -c "import secrets; print(secrets.token_urlsafe(64))" |
MEILISEARCH_URL |
http://localhost:7700 |
Admin search engine (Meilisearch) |
MEILISEARCH_API_KEY |
vectis-dev-key |
Meilisearch admin key |
TYPESENSE_URL |
http://localhost:8108 |
Storefront search engine (Typesense) |
TYPESENSE_API_KEY |
vectis-dev-key |
Typesense admin key |
TYPESENSE_SEARCH_ONLY_KEY |
vectis-search-key |
Typesense search-only key (for scoped key generation) |
S3_ENDPOINT |
http://localhost:9000 |
S3-compatible endpoint — RustFS in dev (compose services use http://rustfs:9000) |
S3_ACCESS_KEY / S3_SECRET_KEY |
rustfsadmin / rustfsadmin |
Object-store credentials |
S3_BUCKET |
vectis-uploads |
Uploads bucket (created by rustfs-setup) |
FILE_STORAGE_PROVIDER |
rustfs |
Active file-storage backend by provider name (rustfs, s3, minio, …) |
Docker Compose Services¶
The full docker-compose.yml includes 21 app services (plus a one-shot rustfs-setup init job). The api service mounts the sibling ../enterprise-extensions checkout read-only and discovers it via VECTIS_DEV_EXTENSIONS:
| Service | Image | Purpose |
|---|---|---|
api |
Custom (backend/) | FastAPI application server |
admin |
Custom (admin/) | SvelteKit admin dashboard |
storefront |
Custom (storefront/) | SvelteKit storefront |
postgres |
postgres:18-alpine | Primary database |
redis |
valkey/valkey:9-alpine | Session store + cache |
redpanda |
redpandadata/redpanda | Event streaming (Kafka-compatible) |
redpanda-console |
redpandadata/console | Redpanda management UI |
temporal |
temporalio/auto-setup | Workflow engine |
temporal-worker |
Custom (backend/) | Temporal activity worker |
temporal-ui |
temporalio/ui | Temporal management UI |
meilisearch |
getmeili/meilisearch | Admin full-text search |
typesense |
typesense/typesense:27.1 | Storefront product search |
rustfs |
rustfs/rustfs | S3-compatible object storage (default local-dev file store) |
rustfs-setup |
minio/mc | One-shot init job that creates the RustFS uploads bucket (mc is used purely as an S3 client) |
mailpit |
axllent/mailpit | Dev SMTP (localhost:1025) + webmail UI at mail.vectis.eto |
event-consumer |
Custom (backend/) | Redpanda event consumer |
postgres-exporter |
prometheuscommunity/postgres-exporter | Prometheus metrics for PostgreSQL |
redis-exporter |
oliver006/redis_exporter | Prometheus metrics for Redis |
prometheus |
prom/prometheus | Metrics scraper (proxy-only UI) |
grafana |
grafana/grafana | Dashboards (proxy-only UI) |
alertmanager |
prom/alertmanager | Prometheus alert routing |
alertmanager-stub |
Custom (backend/) | Local alert webhook sink for dev |
Useful Make Commands¶
make help # List all commands
make up / make down # Start/stop Docker services
make test # Run pytest suite
make lint # Lint with Ruff
make typecheck # Type check with mypy
make check # All quality checks (single source of truth)
make check is the gate. It runs Ruff, mypy, the resolver-duplicate AST guard, the zero-extension-imports AST guard, the extension→core import ratchet, the extension-migration-ownership guard, the model-drift guard, the extensions.lock gate, the schema-drift guard, the extension-UI sync gate, and the ~2,260-test pytest suite. Run it from the repo root on the host — each sub-check docker execs into the API container itself. CI is currently disabled in favour of this local gate; push to main once make check passes:
Prometheus + Grafana (Optional)¶
The monitoring services come up with the default docker-compose.yml. Their UIs are proxy-only (see the app table above):
| Service | URL | Notes |
|---|---|---|
| Prometheus | prometheus.vectis.eto | Scrapes /metrics from the API every 15s |
| Grafana | grafana.vectis.eto | Login admin / admin; seeded dashboards (vectis_api, vectis_cache, vectis_postgres, vectis_redis, vectis_redpanda, vectis_temporal) |