1. What you need before starting
Ensure your server host meets the following baseline hardware and software prerequisites:
| Requirement | Details |
|---|---|
| Operating system | Windows 10/11 (Pro or Home), Windows Server 2019+, or any modern Linux distribution |
| Docker | Docker Desktop (Windows/Mac) or Docker Engine (Linux) - free download |
| Memory | 8 GB RAM minimum, 16 GB recommended |
| Disk space | 20 GB free storage space |
| Internet | Needed for the first install only. After that Terra runs 100% offline. |
| Free ports | 3000 (the application web UI) and 8000 (data API service) |
Installing Docker
- Windows / Mac: Download Docker Desktop from docker.com/products/docker-desktop, run the installer, restart when prompted, and launch Docker Desktop until it displays Engine running.
- Linux: Follow the official guide at docs.docker.com/engine/install for your distribution.
To verify Docker is ready, open PowerShell or terminal and execute:
docker --version
2. Copy package folder to your server
Place the extracted deployment folder in a permanent directory, for example C:\Terra on Windows or /opt/terra on Linux. All setup commands below are run from inside that directory.
Open a command shell inside the directory:
- Windows: Open C:\Terra in File Explorer, click the address bar, type powershell, and press Enter.
- Linux: Run cd /opt/terra in your terminal console.
3. Load the Terra software images
The .tar files in the images/ folder contain the pre-packaged application, background worker, and database migration container images. Import them into Docker:
docker load -i images/absterra-app.tar
docker load -i images/absterra-worker.tar
docker load -i images/absterra-migrate.tar
Each command finishes with Loaded image: .... This only has to be executed once per server.
4. Generate unique security keys
Terra requires a unique set of database passwords and JWT signing keys. These are generated on your server and are known only to you — Amvelt never sees them.
If Node.js is installed locally, execute:
node scripts/gen-supabase-keys.mjs
If Node.js is not installed, run the generator through Docker without installing anything:
docker run --rm -v "${PWD}:/w" -w /w node:20-alpine node scripts/gen-supabase-keys.mjs
.env.docker. Back up this file somewhere safe off the server. If lost, your encrypted database records cannot be restored or read.
DEPLOYMENT_SALT — a random value unique to this installation that is folded into the deployment fingerprint used for licence binding. Never edit it, and never copy .env.docker from one installation to another — doing so would make two installations share one identity, which breaks licence validation on one of them.
5. Start the Terra Container Stack
Launch the containers in detached background mode:
docker compose --env-file .env.docker up -d
The first startup downloads supporting containers and takes 5–15 minutes depending on your internet connection speed. Subsequent restarts take under 30 seconds.
Check that all container services are running properly:
docker compose --env-file .env.docker ps
All core services should display status Up. The database migration worker migrate is expected to display status Exited (0) — it executes once to set up the database schema and then exits safely.
6. Create your first Managing Director account
A fresh installation has zero user accounts, and public self-registration is disabled for security. Create the initial administrator account with this command:
node scripts/bootstrap-admin.mjs "md@yourcompany.com" "ChooseAStrongPassword"
Or via Docker if Node.js is not installed:
docker run --rm --network host -v "${PWD}:/w" -w /w node:20-alpine node scripts/bootstrap-admin.mjs "md@yourcompany.com" "ChooseAStrongPassword"
You can now open a browser and sign in at http://localhost:3000.
7. Activate your licence key
Terra operates in a limited demo mode until licensed.
- Sign in as Admin and navigate to Admin → Settings → Licence.
- Copy the Deployment fingerprint string (e.g.
00C6-87FA-7BA2-639A-4576-DC8B). - Email the fingerprint to Amvelt sales/support at the email address on your invoice.
- Amvelt returns a signed licence string.
- Open
.env.dockerin Notepad / text editor and paste the string:ABS_TERRA_LICENSE=<the string sent to you> - Restart the app service:
docker compose --env-file .env.docker up -d app
Licensed modules unlock instantly upon restart.
8. Everyday Operations & Data Backups
Stop Terra
docker compose --env-file .env.docker stopStart Terra
docker compose --env-file .env.docker up -dAutomatic Server Boot Restart
Docker automatically starts Terra on system boot as long as Docker Desktop or Docker Engine service is configured to auto-start with Windows/Linux.
Automated Database & File Backups
Execute this command to export a compressed archive of your entire database and document storage:
docker run --rm -v abs-terra_db-data:/data -v "${PWD}:/backup" alpine tar czf /backup/terra-backup.tar.gz /data
Copy terra-backup.tar.gz and .env.docker to offsite backup storage weekly. Together they form a 100% complete restore point.
9. Optional Environment Settings
Edit .env.docker to customize ports or configure corporate SMTP email for notifications:
| Setting | Description |
|---|---|
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS | Outgoing mail server details for approval notifications and one-time codes. The sender is always "ABS Terra" <SMTP_USER>; there is no separate "from" setting. |
APP_PORT | Change default web UI port 3000 if port 3000 is occupied. |
SITE_URL, SUPABASE_URL | The addresses staff type in their browser. Set these if people reach Terra by a server name rather than localhost — see below. |
TURNSTILE_SITE_KEY, TURNSTILE_SECRET_KEY | Optional bot protection on the sign-in page — see below. |
If staff will use Terra from their own computers
By default Terra expects to be used on the server itself. If people will open it from their own machines, set the address they will type. The simplest way is to let the key generator do it:
docker run --rm -v "${PWD}:/w" -w /w node:20-alpine node scripts/gen-supabase-keys.mjs --force --host terra.yourcompany.localThen start Terra again:
docker compose --env-file .env.docker up -d appYou can also just edit SITE_URL and SUPABASE_URL in .env.docker by hand. Either way a restart is enough — no new software is needed from ABS.
Getting this wrong is the most common first-day problem: Terra works on the server and nowhere else, and password-reset emails point people at their own computer instead of the server.
Changed in v1.2.0. On earlier versions these addresses were fixed when the software was built, so correcting them meant asking ABS for a rebuilt package. They are now read when Terra starts. For putting Terra on the open internet with HTTPS rather than an office network, contact ABS.
Bot protection (optional)
Terra can put a Cloudflare Turnstile challenge on the sign-in page.
To leave it off, do nothing. Both settings stay empty and sign-in works normally. This is the right choice if the server has no internet access — Turnstile cannot work without reaching Cloudflare.
To turn it on, create a widget at dash.cloudflare.com → Turnstile, add the address your staff use to its allowed domains, then put both keys in .env.docker and restart.
Set both, or neither. If only one is filled in, Terra blocks sign-in on purpose and tells you which one is missing — a half-configured challenge cannot actually check anything. Admin → Settings → System Status always shows the current state.
10. Troubleshooting & Support
View live container diagnostics:
docker compose --env-file .env.docker logs app| Symptom | Cause & Solution |
|---|---|
port is already allocated | Port 3000 or 8000 is occupied. Set APP_PORT=3100 (or SUPABASE_PORT=8100) in .env.docker and restart. If you change SUPABASE_PORT, also update SUPABASE_URL to match the new port — the browser reads that value, so sign-in will fail with a JWT error until both agree. |
| Browser: "can't reach this page" | Container startup in progress. Wait 60 seconds, then run docker compose ps to confirm Up. |
service "migrate" didn't complete | Database worker timed out. Simply re-run docker compose --env-file .env.docker up -d. |
| Licence says "wrong deployment" | Fingerprint changed — usually DEPLOYMENT_ID or DEPLOYMENT_SALT in .env.docker was edited, .env.docker was copied from another installation, or the machine was rebuilt. Send ABS the new fingerprint. |
