Skip to main content

Getting Started

muvee is a lightweight self-hosted PaaS that turns any private cloud into a container deployment platform — with built-in data warehouse integration, LRU-cached dataset injection, and flexible identity provider support.

Prerequisites

RequirementNotes
Linux hostsControl plane + agent nodes
Docker + Docker BuildxOn all nodes
NFS shareMounted at the same path on all deploy nodes
PostgreSQL 16+Can run in Docker (included in docker-compose.yml)
Identity providerAt least one of: Google, Feishu/Lark, WeCom, DingTalk

5-Minute Quickstart

1. Clone and configure

git clone https://github.com/hoveychen/muvee.git
cd muvee
cp .env.example .env

Edit .env and configure at least one identity provider. Example with Google:

GOOGLE_CLIENT_ID=your-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-secret
ALLOWED_DOMAINS=your-company.com
ADMIN_EMAILS=admin@your-company.com
BASE_DOMAIN=example.com
JWT_SECRET=your-random-secret
ACME_EMAIL=admin@example.com
REGISTRY_USER=registry-user
REGISTRY_PASSWORD=a-strong-password
AGENT_SECRET=your-agent-secret # shared secret between server and all agents

See the Authentication section for setup guides for each supported provider. Multiple providers can be enabled simultaneously — the login page shows a button for each one.

ADMIN_EMAILS is a comma-separated list of email addresses that receive the admin role on login and can access the Traefik dashboard at https://traefik.BASE_DOMAIN.

AGENT_SECRET protects the /api/agent/* endpoints. Generate with openssl rand -hex 32 and use the same value on the server and all agent nodes.

2. Generate registry credentials

The private Docker registry uses htpasswd Basic Auth. Run once on the control plane host before starting Docker Compose:

docker run --entrypoint htpasswd httpd:2 -Bbn \
"$REGISTRY_USER" "$REGISTRY_PASSWORD" > registry/htpasswd

3. Start

Standalone (everything on one machine — recommended for getting started):

docker compose up -d

This starts all components on a single host:

  • muvee-server — API + embedded web UI at https://BASE_DOMAIN
  • muvee-authservice — Traefik ForwardAuth sidecar (:4181)
  • PostgreSQL — metadata store
  • Traefik — reverse proxy with automatic HTTPS; dashboard at https://traefik.BASE_DOMAIN (admin only)
  • Registry — private Docker image registry at https://registry.BASE_DOMAIN (htpasswd auth)
  • muvee-agent-builder — build agent running on this machine
  • muvee-agent-deploy — deploy agent running on this machine

Multi-node (agents on separate worker machines):

# On the control-plane host — server only
docker compose -f docker-compose.server.yml up -d

Then follow step 4 to register worker nodes.

4. Connect agent nodes (multi-node only — skip if using standalone)

Registry credentials (REGISTRY_ADDR, REGISTRY_USER, REGISTRY_PASSWORD) and BASE_DOMAIN are automatically distributed from the control plane. Agents call GET /api/agent/config on startup and run docker login using the values returned — no per-node credential configuration needed.

Important: CONTROL_PLANE_URL must be the internal network address of the control plane (not the public domain). The agent uses this address to auto-detect which network interface — and IP — Traefik should use to reach deployed containers.

# Builder node
docker run -d --name muvee-agent \
-e NODE_ROLE=builder \
-e CONTROL_PLANE_URL=http://10.0.0.1:8080 \
-e AGENT_SECRET=your-agent-secret \
-v /var/run/docker.sock:/var/run/docker.sock \
ghcr.io/hoveychen/muvee:latest agent

# Deploy node
docker run -d --name muvee-agent \
-e NODE_ROLE=deploy \
-e CONTROL_PLANE_URL=http://10.0.0.1:8080 \
-e AGENT_SECRET=your-agent-secret \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /muvee/data:/muvee/data \
-v /mnt/nfs/volumes:/mnt/nfs/volumes \
-v /mnt/nfs/datasets:/mnt/nfs/datasets \
ghcr.io/hoveychen/muvee:latest agent

5. Create your first project

  1. Open https://example.com and sign in with your configured identity provider
  2. Click New Project
  3. Choose a repository source:
    • External Repo — enter a Git URL and branch (supports public repos, HTTPS tokens, and SSH keys)
    • Hosted Repo — muvee creates a bare git repo for you; after project creation you'll get a push URL
  4. Fill in domain prefix and other settings
  5. Click Create Project, then Deploy — muvee will:
    • Clone your repo on a builder node
    • Build the Dockerfile
    • Push the image to the internal registry
    • Deploy the container on a deploy node
    • Configure Traefik routing to {domain_prefix}.example.com

If you chose Hosted Repo, push your code first:

git remote add muvee https://example.com/git/PROJECT_ID.git
git push muvee main
# username: anything, password: your project token (create one in the Tokens tab)

Download Binaries

Pre-built binaries for Linux and macOS (amd64 + arm64) are available on the Releases page.

# Example: download and run on Linux amd64
curl -L https://github.com/hoveychen/muvee/releases/latest/download/muvee_linux_amd64.tar.gz | tar xz
./muvee_linux_amd64 server

The muvee server subcommand includes the full React web UI — no separate web server needed.