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.