Self-host setup
Install the self-hosted edition on your infrastructure — same dashboard and API as Cloud, your servers and data.
What you get
- Full product: logs, alerts, analytics, teams, SDK ingest
- Root URL opens
/dashboard(no marketing pages) - Admin bootstrapped from env; teammates join via invite + password
- Convex Cloud by default (self-hosted Convex also supported)
Tech stack
| Layer | Technology |
|---|---|
| UI + API | Next.js, React, Tailwind |
| Database / realtime | Convex |
| Auth | Local email + password, session cookie, RS256 JWT for Convex |
| Ingest | REST API + @marvink02/loggerman-sdk |
| Deploy | Docker Compose (optional), Node 22 + pnpm |
Prerequisites
- Node.js 20+ and pnpm
- Convex project (Convex Cloud recommended for v1)
- Docker (optional, for container deploy)
- A public HTTPS URL in production (for
NEXT_PUBLIC_APP_URLand JWT issuer)
Clone and configure
Initial setupgit clone <your-self-hosted-repo-url> loggerman_selfhosted cd loggerman_selfhosted cp .env.self-hosted.example .env.local chmod +x scripts/setup.sh scripts/sync-upstream.sh ./scripts/setup.shEdit
.env.local:Variable Required Notes NEXT_PUBLIC_APP_URLYes Public origin, e.g. https://logs.company.comNEXT_PUBLIC_CONVEX_URLYes From Convex dashboard CONVEX_DEPLOYMENTDev From npx convex devCONVEX_SERVER_SECRETYes Same on Next.js and Convex LOGGERMAN_SESSION_SECRETYes Min 32 chars LOGGERMAN_JWT_PRIVATE_KEYYes RS256 PEM — setup.shgeneratesAUTH_JWT_ISSUERYes Match NEXT_PUBLIC_APP_URLLOGGERMAN_ADMIN_EMAILSeed First admin only LOGGERMAN_ADMIN_PASSWORDSeed Min 12 characters Deploy Convex
Convex deploypnpm install npx convex deploy npx convex env set CONVEX_SERVER_SECRET "<your-secret>" npx convex env set AUTH_JWT_ISSUER "<your-app-url>" # Do NOT set BILLING_ENFORCEDSeed admin
Admin bootstrappnpm seed:adminCreates one admin with
unlimitedtier if no users exist.Run the app
Development:
Dev serverpnpm devDocker:
Docker Composedocker compose up --buildFirst use
- Open your app URL → redirects to
/dashboard→/sign-in - Sign in with admin credentials
- New project → create a project
- Settings → Integration → copy token → Send test log
- Open Logs — confirm the entry appears
- Open your app URL → redirects to
Adding teammates
- Settings → Team → invite by email or link
- Invitee opens link → sets password (if new) → joins project
- Existing users sign in first, then reopen the invite link
See also Team access.
Convex self-hosted (advanced)
Use your self-hosted Convex deployment URL as NEXT_PUBLIC_CONVEX_URL. The Next.js app and env flow are unchanged. See Convex self-hosted docs.
Upgrading from Cloud releases
Product fixes ship in the Cloud repo. Sync them into your self-hosted checkout without merging self-hosted-only changes back into Cloud:
Upgrade
git pull
./scripts/sync-upstream.sh ../loggerman <release-tag>
npx convex deploy
pnpm build
docker compose up --build # if using DockerEnvironment on Convex
Required Convex env
npx convex env set CONVEX_SERVER_SECRET "<secret>"
npx convex env set AUTH_JWT_ISSUER "https://logs.company.com"Optional email alerts:
Email alerts (optional)
npx convex env set RESEND_API_KEY "<key>"
npx convex env set ALERT_EMAIL_FROM "alerts@company.com"Troubleshooting
| Symptom | Fix |
|---|---|
| Redirect loop on sign-in | Check AUTH_JWT_ISSUER matches browser URL; verify /.well-known/jwks.json loads |
| Dashboard stuck loading | Session ok but Convex JWT failed — check LOGGERMAN_JWT_PRIVATE_KEY |
| Ingest 401/403 | Token/project mismatch; regenerate token in API keys |
seed:admin"Users already exist" | Normal if admin already seeded |
| CORS from browser ingest | Prefer server-side SDK; ingest API supports CORS for dev |
More help: Troubleshooting.