DocuSeal
Web app to create, fill and sign digital documents.
- Replaces
-
Paid electronic signature services, such as DocuSign.
All open-source alternatives to DocuSign
- Difficulty
-
Difficulty: Medium
3 services (1 database or broker: postgres), 3 volume mounts, 1 env value to set, no elevated host access. Heuristic score 4 of 11: medium.
- Stack
Ruby (language), PostgreSQL (database)
- Deployment
docker_compose
- Requirements
Not stated.
- License
-
AGPL-3.0(OSI-approved open source)Read from github.com/docusealco/docuseal/blob/8f8f69f/LICENSE
- Business model
-
Unknown
The README at the pinned commit does not state a business model, so it stays unknown.
Source: github.com/docusealco/docuseal/blob/8f8f69f/README.md, read on .
- Repository
GitHub stats
- Stars
- 18,770
- Forks
- 1,897
- Open issues and pull requests
- 128
- Last push
- 2026-10-19
- Latest release
- 3.3.3
- Released
- 2026-10-19
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as AGPL-3.0.
Compose file
services:
app:
depends_on:
postgres:
condition: service_healthy
image: docuseal/docuseal:latest
ports:
- 3000:3000
volumes:
- ./docuseal:/data/docuseal
environment:
- FORCE_SSL=${HOST}
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/docuseal
postgres:
image: postgres:18
volumes:
- './pg_data:/var/lib/postgresql/18/docker'
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: docuseal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
caddy:
image: caddy:latest
command: caddy reverse-proxy --from $HOST --to app:3000
ports:
- 80:80
- 443:443
- 443:443/udp
volumes:
- ./caddy:/data/caddy
environment:
- HOST=${HOST}
From the app's own repository: github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml.
Compose file from the app repository.
Install
- Docker with the Compose plugin (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml)
A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
- Save the compose file as docker-compose.yml (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml)
Use the compose file shown above.
- Set the values the compose file needs (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml)
These variables have no default in the compose file: HOST. Compose reads them from the shell or from a .env file next to the compose file.
- Start it (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml)
docker compose up -d - Open the app (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml)
Open http://localhost:3000. The compose file publishes host port 3000 for the app service.
Compose file check: config_ok on 2026-10-22.
Gotchas and maintenance
Gotchas
- Some images use the latest tag or no tag. Images without a pinned version: app: docuseal/docuseal:latest, caddy: caddy:latest. A later pull can get a different version. (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml, checked 2026-10-22)
- The compose file publishes host ports. Host ports: 3000 (app), 80 (caddy), 443 (caddy), 443/udp (caddy). A port without a host address listens on all host network interfaces. (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml, checked 2026-10-22)
- The compose file mounts host folders. Host paths mounted into containers: ./docuseal at /data/docuseal (app), ./pg_data at /var/lib/postgresql/18/docker (postgres), ./caddy at /data/caddy (caddy). (github.com/docusealco/docuseal/blob/8f8f69f/docker-compose.yml, checked 2026-10-22)
Signals
- Open issues and pull requests: 128
- Last push: 2026-10-19 (2 days before this page was built)
- Latest release: 3.3.3 on 2026-10-19 (2 days before this page was built)