Skip to content

synvirt-platform (web ecosystem)

Synced read-only from /home/synnet/synvirt-platform/README.md. Edit at the source, not here.

Marketing site, customer portal, documentation, community and commerce for SynVirt — one server today, migratable to multi-host from day one.

Repo language: code, paths, commands, commits, logs and docs are in English. Planning prose may be in Spanish (see docs-internal/).

A single Docker Compose stack behind one ingress (Caddy). Each service has its own logical database, so any piece can move to its own host later by changing env, not code. Uploads/media live on local disk for now; S3-compatible storage returns at M5 for entitlement-gated downloads (ADR-0003 amendment). See the ADRs in docs-internal/adr/.

Caddy (only ingress, 80/443)
├── synvirt.test / portal / docs → web (Next.js, host in dev)
├── api.synvirt.test → portal-api (Rust/Axum, host in dev)
├── auth.synvirt.test → keycloak
├── community.synvirt.test → discourse (M7, separate install)
└── (internal) postgres · redis · meilisearch
Terminal window
# 1. Install the toolchain (Docker, Node 22, Rust, sops, age, Task).
# Idempotent; safe to re-run. Log out/in afterwards if it added you to docker.
bash infra/scripts/devbox-bootstrap.sh
# 2. Configure environment.
cp .env.example .env # then edit the change_me values
# 3. Bring up backing services (postgres, redis, meili, keycloak, caddy).
task up
# 4. Trust Caddy's internal CA so *.synvirt.test is valid HTTPS locally.
# (The *.synvirt.mx names use real Let's Encrypt certs via Cloudflare
# DNS-01 — CLOUDFLARE_API_TOKEN in .env — nothing to trust manually.)
task trust-ca
# 5. Run database migrations.
task migrate
# 6. Run the apps on the host with hot reload:
task dev:web # Next.js web on :3000 (proxied at https://synvirt.test)
task dev:api # Rust portal-api on :8080
task storybook # design-system Storybook on :6006

Then open https://auth.synvirt.test (Keycloak), https://api.synvirt.test/health.

Path What
apps/web Next.js — marketing + portal UI + Payload CMS + Fumadocs
apps/portal-api Rust + Axum + SQLx portal API
packages/ui Design system — tokens, Tailwind v4 theme, shadcn-style components, Storybook
packages/config Shared tsconfig / tooling config
packages/api-client TS client generated from the API’s OpenAPI
infra/compose compose.yaml + dev/prod overrides
infra/caddy Caddyfiles (dev: tls internal)
infra/postgres/init Multi-database bootstrap
infra/keycloak Realm import
infra/secrets SOPS-encrypted env (*.enc.env)
infra/scripts devbox-bootstrap.sh, seed.sh
docs-internal ADRs, roadmap, runbooks (English)

Run task (no args) to list every available command.

Phase 0 (devbox) and M0 (foundations: Next.js 16 + design system + i18n + Storybook) complete. Milestones M1–M8 tracked in docs-internal/roadmap.md.