# DocuSeal

Web app to create, fill and sign digital documents.

- Replaces: [DocuSign](https://openlogs.fyi/alternatives/docusign)
- Summary: Paid electronic signature services, such as DocuSign.
- Stack: Ruby (language), PostgreSQL (database)
- Deployment: docker_compose
- License: AGPL-3.0 (osi) [source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/README.md), read 2026-10-22)
- 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.
- Requirements: not stated
- Repository: [docusealco/docuseal](https://github.com/docusealco/docuseal)

## Install

1. Docker with the Compose plugin ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml))

   ```text
   A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
   ```

2. Save the compose file as docker-compose.yml ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml))

   ```yaml
   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}
   ```

3. Set the values the compose file needs ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml))

   ```text
   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.
   ```

4. Start it ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml))

   ```bash
   docker compose up -d
   ```

5. Open the app ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml))

   ```text
   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. ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/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. ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/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). ([source](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 128
- Stars: 18770, forks: 1897
- Last push: 2026-10-19 (2 days ago)
- Latest release: 3.3.3 on 2026-10-19 (2 days ago)

## Sources

- [Repository: https://github.com/docusealco/docuseal](https://github.com/docusealco/docuseal)
- [License: https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/LICENSE](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/LICENSE)
- [Business model: https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/README.md](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/README.md)
- [Compose file: https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml](https://github.com/docusealco/docuseal/blob/8f8f69f0bc6ac2e59746cd6efac54a852289bec3/docker-compose.yml)

---
Canonical: https://openlogs.fyi/tools/docuseal  
Last updated: 2026-10-22
