Skip to content

Self-host HeyForm

updated Sep 2026prices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →

An open-source conversational form builder for surveys, quizzes and polls, with conditional logic, file uploads and webhooks. It runs as a Node.js app backed by MongoDB and a Redis-compatible store.

Key facts

CategoryForms & surveys
LicenseAGPL-3.0
StackTypeScript, NestJS, React, MongoDB
Min RAM1024 MB
Official imageyes
Measured idle RAM239 MB
Difficulty

What you need

  • Any VPS with at least 1024 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid link — we earn a commission if you shop through it.

Install

Run these commands on your server:

# HeyForm + MongoDB + KeyDB — based on the official self-hosting compose
cat > .env <<EOF
SESSION_KEY=$(openssl rand -hex 32)
FORM_ENCRYPTION_KEY=$(openssl rand -hex 32)
EOF
cat > docker-compose.yml <<'EOF'
services:
  heyform:
    image: heyform/community-edition:v3.0.3
    restart: always
    depends_on: [mongo, keydb]
    ports: ["9157:9157"]
    volumes: ["uploads:/app/packages/server/static/upload"]
    environment:
      APP_HOMEPAGE_URL: http://SERVER_IP:9157
      SESSION_KEY: ${SESSION_KEY}
      FORM_ENCRYPTION_KEY: ${FORM_ENCRYPTION_KEY}
      MONGO_URI: mongodb://mongo:27017/heyform
      REDIS_HOST: keydb
      REDIS_PORT: 6379
  mongo:
    image: percona/percona-server-mongodb:4.4
    restart: always
    volumes: ["mongodb_data:/data/db"]
  keydb:
    image: eqalpha/keydb:latest
    restart: always
    command: keydb-server --appendonly yes --protected-mode no
    volumes: ["keydb:/data"]
volumes: { uploads: {}, mongodb_data: {}, keydb: {} }
EOF
docker compose up -d
# open http://SERVER_IP:9157 and sign up

More self-hosted tools

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.