Self-Hosting the Team Server
Deploy the Vrge collaboration server on your own infrastructure. This guide is for Team license customers who need real-time collaboration across their organization.
What the server does
The server is the sync layer for shared entities — clients, projects, tasks, invoices, comments, attachments. The AI observer pipeline (email, calendar, files, bank) runs locally on each teammate's machine and keeps their proposal queue private. When a teammate accepts a proposal, the resulting entity syncs to every other client over WebSockets. AI keys, source credentials, and raw observer content never touch the server.
One license for your whole organization
Your Team license activates once on the server— not on each employee's machine. Your team joins by email invite and never enters a license key. No per-seat activation, no license management overhead, no SaaS-style gotchas.
1. How activation works
Five steps, end to end. The admin does the first three. Everyone else just opens an email.
- Admin deploys the team server (Docker or Node — covered below).
- Admin activates the org license on the server, once, using the Lemon Squeezy key from their purchase email.
- Admin invites employees by email from the admin panel.
- Employees click the invite link in their email and set a password in the browser. No install required.
- Optional: any employee can download the desktop app and point it at the team server URL for offline access and native integrations.
2. Prerequisites
- Docker and Docker Compose installed on your server
- Alternatively, Node.js 18+ if running without Docker
- A Team license key — purchase at getvrge.com/pricing
- A server with at least 1 GB RAM and 1 CPU core (any Linux VPS, on-premises machine, or cloud instance)
3. Quick Start with Docker
Self-hosting is in private beta
The Vrge team server Docker image and supporting repository are distributed directly to verified Team-license customers — they are not yet on Docker Hub or a public Git registry. This is a deliberate supply-chain decision: published install instructions referencing yet-to-be-claimed namespaces are an attack surface we'd rather not ship.
To request access: email hello@getvrge.com with your Team license key. You'll receive: (a) signed Docker image pull instructions, (b) a sample docker-compose.yml matching the env-var contract on this page, and (c) verified image hashes you can pin in your deployment.
The rest of this page documents the configuration contract — env vars, persistence, security — so you can plan your deployment ahead of access. Once you have the image, the only flow-specific steps are docker compose up -d and verifying via http://localhost:8080; the first user to register becomes the org admin.
Generating your secrets now
The server refuses to boot without two secrets. You can generate them today and have them ready for when you receive the image:
echo "JWT_SECRET=$(openssl rand -hex 32)" >> .env
echo "SERVER_TOKEN_ENCRYPTION_KEY=$(openssl rand -hex 32)" >> .envEach is a 64-character hex string (256 bits of entropy). Keep both backed up somewhere safe — see the Environment Variables section for what they do and the consequences of losing them.
4. Environment Variables
| Variable | Default | Description |
|---|---|---|
API_PORT | 3001 | Server API port |
WEB_PORT | 8080 | Web UI port |
JWT_SECRET | (required) | Signs login tokens (JWTs) and the CSRF tokens that pair with them. Minimum 32 characters; 64 hex chars recommended |
SERVER_TOKEN_ENCRYPTION_KEY | (required) | AES-256-GCM key for encrypting OAuth tokens (Gmail, Outlook, Calendar) at rest. Must be exactly 64 hex characters |
DATABASE_PATH | /app/data/vrge.db | SQLite database file path |
Consequences of losing these secrets
- JWT_SECRET — if you rotate it, every active session is invalidated and users must sign back in. No data loss.
- SERVER_TOKEN_ENCRYPTION_KEY — if you rotate or lose this key, every employee's stored Gmail/Outlook/Calendar OAuth grants become unreadable. Employees re-authenticate via Settings → Sources to restore access — no CRM data is lost, but mailbox connections need to be redone.
- Back up both keys alongside your database backup. The encrypted OAuth rows in your SQLite file are useless without the matching key.
5. Database & Data Persistence
- Vrge uses SQLite — no external database server required
- Data is stored in a Docker volume called
vrge-dataat the path specified byDATABASE_PATH - The volume persists across container restarts and updates
Backing up your database
docker cp vrge-server-1:/app/data/vrge.db ./backup.dbWe recommend scheduling regular backups (e.g., via cron) to protect against data loss.
6. Activate the Org License
Once the server is running and you've registered as the first admin, activate your Team license on the server— not on anyone's laptop.
- Open the server at your URL (e.g.,
https://vrge.yourcompany.com) - Sign in as the admin and go to Settings → Organization → License
- Paste the license key from your purchase email (format:
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX— a UUID from Lemon Squeezy) - Click Activate
That's it. Your whole organization is now licensed. Nobody else on your team will ever see or enter a license key.
7. Invite Your Team
Once the org license is active, send email invites from the admin panel.
- Go to Settings → Team → Invite
- Enter the employee's email and role (admin or member)
- Click Send invite — they get an email with a signed, single-use join link
Invite links expire after 7 days. Revoke or resend any invite from the same panel.
8. How Employees Join
Employees need nothing but their invite email to get working.
- Open the invite email and click Join your team
- The link opens the team server in a browser — set a password, you're in
- Work from the browser on any device — no install, no license key
Optional: desktop app for offline + native integrations
Any employee can also download the Vrge desktop app, enter the team server URL and their email + password, and unlock offline support, local AI (Ollama), and native OS integrations. The org license already covers them — the desktop app never prompts for a key.
9. Permissions & Audit Log
Two team-mode behaviours worth knowing about as an admin — both designed to make multi-user collaboration safer without putting you in the middle of every change.
Owner-or-admin edits
When a team member creates a client, project, task, note, invoice, or expense, they become its owner. By default:
- Everyone can read every shared entity (the team is small enough that segmentation adds friction without much benefit)
- Only the creator (or an admin) can edit a given entity — preventing well-meaning teammates from accidentally overwriting each other's work
- Only admins can delete shared entities — the destructive path stays narrow on purpose. Members can still delete their own comments and uploads.
Rows that pre-date the upgrade have no recorded creator and stay editable by any member, so legacy data isn't locked behind the new gate.
Activity log (Settings → Activity)
Every create, edit, and delete is recorded with the actor, entity, action, and timestamp. Filter by user, entity type, action, or date range. Useful for:
- Investigating "who changed this client on Tuesday?"
- Compliance evidence in regulated verticals (legal, medical, financial)
- Recovering after an accidental edit — the audit row points at the entity even if it's since been deleted
Logs are retained for the life of the database — there's no automatic pruning. Capture them in your regular SQLite backups.
Sessions & sign-in
Vrge uses short-lived (15 minute) access tokens that silently refresh from a 7-day rotating cookie. End-users see this as "stays signed in" — they don't hit a re-login screen unless they've been away for more than a week. If a refresh token is ever reused after rotation, the entire session family is revoked automatically and that user is forced to sign in again on all devices — Vrge's built-in defence against stolen-cookie replay attacks.
10. Updating
To update the Vrge server to the latest version:
docker compose pull
docker compose up -dYour data volume is preserved across updates. We recommend backing up your database before updating.
11. Security Recommendations
- Use HTTPS— place Vrge behind a reverse proxy (e.g., Nginx, Caddy, or Traefik) with TLS certificates
- Use 256-bit secrets for both keys — generate with
openssl rand -hex 32. The encryption key requires exactly 64 hex characters; the JWT secret requires at least 32. - Rotate JWT_SECRET annually — or after any suspected compromise. Rotation invalidates every active session, so users will need to log back in. Do this during a low-traffic window.
- Rotate SERVER_TOKEN_ENCRYPTION_KEY with care — rotation makes existing OAuth ciphertext unreadable. Employees will be prompted to reconnect their Gmail/Outlook/ Calendar grants. No CRM data is affected. Annual rotation is a reasonable default.
- Restrict network access — only expose the server on your internal network or behind a VPN if possible
- Keep Docker updated — regularly update Docker and your host OS to patch security vulnerabilities
- Back up regularly — schedule automated backups of the SQLite database file
- Monitor logs— check container logs with
docker compose logs -ffor any issues