OpenSign logo

OpenSign

Free and open source DocuSign alternative for digital document signing

Alternative to: docusign, pandadoc, hellosign, signnow


OpenSign is a secure platform for digitally signing documents, letting you request signatures, build reusable templates, and track signing activity end to end. It supports multi-signer workflows, email verification, audit trails, and API integration, giving you a self-hosted replacement for commercial e-signature services with full control over your document data.

OpenSign Docker Compose example

Self-host OpenSign on your own server, homelab, or VPS starting from this Docker Compose example. It runs OpenSign in Docker containers using the official opensign/opensignserver:main, mongo:latest, opensign/opensign:main, caddy:latest images, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  # --- OpenSign API server (Parse Server backend). Requests, templates and
  # signed documents live here; files are stored on the local `files` volume.
  server:
    image: opensign/opensignserver:main
    restart: unless-stopped
    depends_on:
      - mongo
    volumes:
      - opensign-files:/usr/src/app/files
    environment:
      NODE_ENV: production
      # 12-character app identifier. MUST match the value the client image was
      # built with ("opensign"); changing it desyncs the frontend from the API.
      APP_ID: opensign
      # Name shown as the sender in verification / signing emails.
      appName: OpenSign
      # Master key granting full access to all data (Parse dashboard / admin).
      # Change it to a long random string.
      MASTER_KEY: changeme
      # MongoDB connection string — internal service, not exposed outside the stack.
      MONGODB_URI: mongodb://mongo:27017/OpenSignDB
      # Path the Parse API is mounted on. Do not change.
      PARSE_MOUNT: /app
      # Public URL the API is reachable at (external origin + /api/app).
      SERVER_URL: http://localhost/api/app
      # Public URL the app is reachable at.
      PUBLIC_URL: http://localhost
      # Use the local `files` volume for document storage instead of S3.
      USE_LOCAL: "TRUE"

  # --- MongoDB (documents, templates, users, audit trail). Internal only.
  mongo:
    image: mongo:latest
    restart: unless-stopped
    volumes:
      - data-volume:/data/db

  # --- OpenSign web client (React SPA). Reaches the API through
  # REACT_APP_SERVERURL, which its entrypoint injects at container start.
  client:
    image: opensign/opensign:main
    restart: unless-stopped
    depends_on:
      - server
    environment:
      # URL the browser uses to reach the API (external origin + /api/app).
      REACT_APP_SERVERURL: http://localhost/api/app

  # --- Ingress (Caddy). Single entrypoint: serves the client and routes /api/*
  # to the API server. WinterFlow's reverse proxy sits in front and terminates TLS.
  ingress:
    image: caddy:latest
    restart: unless-stopped
    depends_on:
      - client
      - server
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile

volumes:
  opensign-files:
  data-volume:

Values set to changeme are required — replace them with your own values before starting OpenSign.

Extra files

The Docker Compose configuration above bind-mounts the following file. Save it next to your compose.yml, keeping the same relative path.

Caddyfile

# Internal router for the OpenSign stack. Serves the React client and routes
# /api/* to the Parse API server. Listens on plain HTTP :80 because
# WinterFlow's reverse proxy terminates TLS in front of it.
:80 {
	reverse_proxy client:3000
	handle_path /api/* {
		reverse_proxy server:8080
		rewrite * {uri}
	}
}

Prefer a managed setup? WinterFlow installs, configures, and updates OpenSign for you using this same Docker Compose configuration.