Deployment

Deploy Signa on-premise

Install Signa with Docker Compose, create the first owner, and configure durable storage, mail delivery, HTTPS, backups, and upgrades.

Self-hosted operators15 minutes

Before you begin

  • A Linux server with Docker Engine and the Docker Compose plugin
  • Access to the Signa source repository
  • Port 3000 available for local evaluation, or a domain and HTTPS reverse proxy for production

What you will complete

  • A running Signa installation on port 3000
  • A persistent owner account and document store
  • A deployment you can verify, back up, and upgrade

Install with Docker Compose

Clone Signa, create the small environment file below, and start the stack. This default installation keeps SQLite, uploaded files, completed documents, the generated application secret, and private Redis data in the signa-data Docker volume.

Terminal
git clone https://github.com/codeignite-labs/signa.git
cd signa
printf 'APP_URL=http://localhost:3000\nREGISTRATION_MODE=initial_only\n' > .env
docker compose up -d --build

Do not run docker compose down -v unless you intend to permanently delete the named data volume.

Verify the installation

Wait for the image build and application startup to finish, then inspect the container and call the health endpoint. The health response should report a successful status before you create an account.

  • Application: http://localhost:3000
  • API documentation: http://localhost:3000/api/docs
  • Health endpoint: http://localhost:3000/api/health
Health checks
docker compose ps
curl -fsS http://localhost:3000/api/health
docker compose logs --tail=100 signa

Create the first owner

  1. 1Open registrationVisit http://localhost:3000/auth/register, enter the owner details, and create the first account.
  2. 2Sign in to the workspaceAfter registration, Signa opens the product workspace. Confirm that Templates, Submissions, and Settings are available.
  3. 3Keep registration restrictedREGISTRATION_MODE=initial_only automatically blocks later self-service registrations after the first user exists. Add other users through workspace invitations.

Run without Docker Compose

If you prefer a single Docker command, build the same image from the repository and mount /data as a named volume.

Docker
docker build -t signa:local .
docker run -d \
  --name signa \
  --restart unless-stopped \
  -p 3000:3000 \
  -e APP_URL=http://localhost:3000 \
  -e REGISTRATION_MODE=initial_only \
  -v signa-data:/data \
  signa:local

Set the production URL

Point your domain to the server, terminate HTTPS with a reverse proxy or load balancer, and set APP_URL to the public HTTPS origin. Signa derives frontend, API, signing, storage, and email links from this one value.

.env
APP_URL=https://sign.example.com
REGISTRATION_MODE=initial_only

After changing .env, apply it with docker compose up -d. Keep port 3000 behind the HTTPS proxy instead of exposing it directly to the public internet.

Choose database and document storage

The default SQLite database and local document storage are appropriate for a single-node installation when the signa-data volume is backed up. Set DATABASE_URL for PostgreSQL and S3_ATTACHMENTS_BUCKET for private object storage when your recovery or scaling requirements call for external persistence.

Optional production persistence
DATABASE_URL=postgresql://signa:replace-me@postgres.example.com:5432/signa
DATABASE_SSL=true

S3_ATTACHMENTS_BUCKET=signa-documents
AWS_REGION=eu-west-1

On AWS, prefer an instance or workload role. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY only when the runtime cannot receive credentials from its platform. Set S3_ENDPOINT only for a non-AWS S3-compatible provider.

Enable email delivery

SMTP_ADDRESS enables email. Add the provider settings to .env, recreate the container, then send a test signature request to an address you control.

SMTP settings
SMTP_ADDRESS=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=signa-smtp-user
SMTP_PASSWORD=replace-me
SMTP_AUTHENTICATION=plain
SMTP_FROM=Signa <signing@example.com>
SMTP_REPLY_TO=support@example.com
SMTP_ENABLE_STARTTLS=true
SMTP_SSL_VERIFY=true

Do not disable certificate verification in production. If delivery fails, inspect the submission activity and docker compose logs before retrying.

Apply and test the production configuration

  • Create a template and wait for every page preview to render.
  • Send a request and confirm the invitation email arrives.
  • Complete the request and download the completed PDF.
  • Restart the container and confirm the template and completed document still exist.
Restart and verify
docker compose config
docker compose up -d --build
docker compose ps
curl -fsS https://sign.example.com/api/health

Back up and upgrade

For the default single-node installation, archive /data before an upgrade. External PostgreSQL databases and S3 buckets must be backed up with their provider-native tools as part of the same recovery point.

Backup and upgrade
docker compose exec -T signa tar -C /data -czf - . > signa-data-$(date +%F-%H%M%S).tar.gz

git pull --ff-only
docker compose up -d --build
docker compose ps

Test restoration on a separate server. A backup is not complete until the database and document objects can be restored together.

Production checklist

  • The public APP_URL uses HTTPS and resolves to the deployment.
  • The health endpoint returns success through the public proxy.
  • The first owner exists and public registration is closed.
  • Database records and document objects share a tested backup schedule.
  • Pin a Git release or commit and test upgrades in a staging environment.
  • Monitor health, storage failures, queue failures, and email delivery errors.
  • Keep secrets out of Compose files and source control.

Continue with