Sign inSign up

vyomi/portal

By vyomi

•Updated about 1 month ago

CloudLearn web portal — auth, licensing, payments, dashboard, docs

Image
0

1.0K

vyomi/portal repository overview

⁠Vyomi Portal

The Vyomi web portal — runs the marketing site, sign-in / OAuth, pricing & checkout (Razorpay + Stripe), license issuance & dashboard, and bundled API docs for the Vyomi appliance.

Docker Image Version Docker Pulls Image Size

⁠Tags

TagWhat it isWhen to use
latestMost recent stable release (pointer)Quick docker run; don't use in production
<X.Y.Z>Pinned, immutable stable releaseProduction — always pin a version
<X.Y.Z>-rc1, <X.Y.Z>-beta.2, …Pre-release (RC, beta)Staging / pre-release validation
edge / sha-<abc1234>Manual sanity builds (workflow_dispatch only)Staging / debugging a specific commit

Pre-release rule: any tag with a SemVer pre-release suffix (v1.2.0-rc1, v1.2.0-beta.3) publishes the version tag only — it never moves :latest. Users pinned to :latest won't silently land on an RC.

Release-driven CI: images are only built when a v*.*.* git tag is pushed. Daily commits to main do NOT produce new images — pin to a version when you deploy.

All tags are multi-arch: linux/amd64 + linux/arm64.

⁠Quick start

docker run -d --name cloudlearn-portal \
  -p 8001:8000 \
  -e DATABASE_URL='postgresql+psycopg://user:[email protected]:5432/cloudlearn' \
  -e SESSION_SECRET="$(openssl rand -hex 32)" \
  -e ADMIN_TOKEN="$(openssl rand -hex 32)" \
  -e LICENSE_ISSUER='https://portal.your-domain.io' \
  -v portal-keys:/app/keys \
  vyomi/portal:latest

open http://localhost:8001

⁠Compose

services:
  cloudlearn-portal:
    image: vyomi/portal:latest
    ports: ["8001:8000"]
    environment:
      DATABASE_URL: postgresql+psycopg://user:[email protected]:5432/cloudlearn
      SESSION_SECRET: ${SESSION_SECRET}
      ADMIN_TOKEN: ${ADMIN_TOKEN}
      LICENSE_ISSUER: https://portal.your-domain.io
      PAYMENT_PROVIDER: razorpay
      RAZORPAY_KEY_ID:     ${RAZORPAY_KEY_ID}
      RAZORPAY_KEY_SECRET: ${RAZORPAY_KEY_SECRET}
    volumes:
      - portal-keys:/app/keys
    restart: unless-stopped
volumes:
  portal-keys:

⁠Required environment

VariableRequiredDescription
DATABASE_URLyesManaged Postgres URL — Neon / Render / Supabase / RDS. postgresql:// and postgres:// aliases are auto-rewritten to use the psycopg v3 driver.
SESSION_SECRETyesCookie signing key. Generate: openssl rand -hex 32
ADMIN_TOKENyesBearer token for /api/license/issue admin endpoint.
LICENSE_ISSUERyesPublic URL of THIS portal — used as the JWT iss claim and in /.well-known/jwks.json.

⁠Optional environment

VariableDescription
PAYMENT_PROVIDERrazorpay (INR), stripe (USD), or demo (no-money local dev)
RAZORPAY_KEY_ID / RAZORPAY_KEY_SECRET / RAZORPAY_WEBHOOK_SECRETRazorpay credentials
STRIPE_SECRET_KEY / STRIPE_WEBHOOK_SECRETStripe credentials
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETGoogle OAuth
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRETGitHub OAuth
LINKEDIN_CLIENT_ID / LINKEDIN_CLIENT_SECRETLinkedIn OAuth
SMTP_HOST / SMTP_PORT / SMTP_USER / SMTP_PASSWORD / SMTP_FROMOutbound email (Resend / Postmark / SES). Unset = log-to-stdout dev mode.
PORTAL_ADMIN_EMAILSComma-separated emails auto-promoted to admin on startup.
CLOUDLEARN_APPLIANCE_URLPublic URL the user's appliance is reachable from for the /docs chooser cards.

Full env reference in .env.example⁠.

⁠Volumes

MountWhy
/app/keysJWT signing keys (generated on first boot). Must persist — losing this invalidates every issued license.
/app/dataOptional, only used when DATABASE_URL=sqlite:///... (dev fallback).

⁠Health

curl http://localhost:8001/healthz
# → {"status":"ok"}

The image declares a HEALTHCHECK so orchestrators (Docker Swarm, ECS, Kubernetes via liveness probes) can observe readiness directly.

⁠Source

  • Repo: github.com/vyomi-cloud/portal⁠
  • License: MIT
  • Built and published by GitHub Actions on every push to main (→ :edge) and every v*.*.* tag (→ :<version> + :latest).

⁠Companion images

Tag summary

Content type

Image

Digest

sha256:409944ddb…

Size

92.8 MB

Last updated

about 1 month ago

docker pull vyomi/portal