synvirt-platform (web ecosystem)
Synced read-only from
/home/synnet/synvirt-platform/README.md. Edit at the source, not here.
SynVirt Platform
Section titled “SynVirt Platform”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/).
Architecture at a glance
Section titled “Architecture at a glance”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 · meilisearchQuick start (devbox)
Section titled “Quick start (devbox)”# 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 :8080task storybook # design-system Storybook on :6006Then open https://auth.synvirt.test (Keycloak), https://api.synvirt.test/health.
Layout
Section titled “Layout”| 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.
Status
Section titled “Status”Phase 0 (devbox) and M0 (foundations: Next.js 16 + design system + i18n +
Storybook) complete. Milestones M1–M8 tracked in
docs-internal/roadmap.md.