A 7-step walkthrough that takes you from a fresh Linux box with Docker to a fully activated SealRoute instance. Every step has the exact command or screenshot you need.
docker --version
docker compose version
docker-compose.yml ships a Caddy reverse proxy that handles HTTPS automatically when you set HOST=your.domain.Create a working directory and grab the production compose file from the repo. It already wires up SealRoute, Postgres, and Caddy.
mkdir sealroute && cd sealroute
curl -L https://raw.githubusercontent.com/buyungbahari/sealroute/master/docker-compose.yml -o docker-compose.yml
If you prefer to clone the whole repository: git clone https://github.com/buyungbahari/sealroute.git && cd sealroute. Either way, the next steps are the same.
SealRoute reads its configuration from environment variables. Create a .env file next to your compose file. The minimum you need:
# Where the app is reachable from a browser. Use https://your.domain in
# production or http://localhost:3000 for a local trial.
APP_URL=https://your.domain
HOST=your.domain
# Generate with `openssl rand -hex 64` and keep it secret.
SECRET_KEY_BASE=replace-me-with-a-long-random-string
# --- Aplindo licensing ------------------------------------------------------
APLINDO_LICENSE_API_URL=https://license.aplindo.com
APLINDO_LICENSE_PRODUCT_SLUG=SealRoute
APLINDO_LICENSE_DEFAULT_AMOUNT_IDR=5000000.00
APLINDO_LICENSE_HEARTBEAT_SECONDS=3600
A more complete example with optional knobs lives in .env.local.example.
Bring up SealRoute, Postgres, and the reverse proxy in the background:
docker compose up -d
Watch the boot logs until you see Puma listening on tcp://0.0.0.0:3000:
docker compose logs -f app
First boot also runs the database migrations. On a 2 GB host this typically completes in under a minute.
Open the app in your browser. Since there are no users yet, SealRoute redirects you to the /setup page. This is where you create the first admin account and your account’s metadata.
Fill in:
APP_URL in your .env. Used to generate signing links in emails.
Click Submit. SealRoute creates the account, signs you in, and redirects you to the /license page.
A self-hosted SealRoute instance needs an active license to leave signed-in screens unblocked. The /license page has two cards: Buy license on top and Activate license below.
In the Buy license card, set the number of Seats you need. The total recalculates automatically as you change the seat count.
Click Buy license. SealRoute opens a modal with the Aplindo checkout iframe. Complete the payment there. Once the transaction succeeds, Aplindo emails the license key to the address you entered, and the same key is also displayed on the checkout success page.
Copy the license key from the success page or your email, then paste it into the Activate license card on /license:
Click Activate. SealRoute calls the Aplindo license server, ties the key to this machine, and reloads. You will see the Current license card at the top with status active, the product slug, license ID, machine ID, expiry date, and last heartbeat timestamp.
SealRoute schedules a heartbeat job that re-checks the license with Aplindo every APLINDO_LICENSE_HEARTBEAT_SECONDS seconds (default: hourly). If the license is revoked or expires, the next heartbeat will reflect it.
SealRoute is now fully operational. Visit / and you will land on the empty Document Templates dashboard, ready for your first upload.
Click Upload on the dashboard, drop a PDF or DOCX, then drag fields onto it - signature, date, text, checkbox, etc.
SealRoute is a REST API first. Generate an API token in Settings → API, then head to the API documentation for end-to-end examples in 10 languages.