INSTALLATION · OVERVIEW

Install overview

What install.sh does, what you need before running it, and how to get from a fresh Debian box to a working portal in ~10 minutes.

Supported OS

TargetDebian versionStack summary
PrimaryDebian 13 (Trixie)PostgreSQL 17 · Python 3.13 · Valkey 7.2 · BIND 9.20 · nginx 1.26 · kernel 6.12 · systemd 256+
FallbackDebian 12 (Bookworm)PostgreSQL 15 · Python 3.11 · Redis 7.0.15 (pre-RSAL) · BIND 9.18 · nginx 1.24 · kernel 6.1 · systemd 252

The installer detects the OS at runtime and picks the right package set. Any other Debian major is rejected outright.

Prerequisites

What the installer does

  1. Pre-flight. OS + arch check, disk + RAM floors, apt sources probe, port conflicts, existing install detection.
  2. Interactive config. Portal name, FQDN, first admin, DB name/role, timezone, TLS method, scope (internal/external/both), SSH port, optional LUKS encryption. Every prompt has a multi-paragraph explanation before the input.
  3. System prep. Creates meridian service user, ddi-ssh group, directory tree under /opt/meridian, /etc/meridian, /var/lib/meridian, /var/log/meridian.
  4. Package install. Installs the OS-matched package set. Versions resolve to distro defaults; exact versions are recorded into the version_manifest table for drift detection.
  5. Master key generation. Creates two 32-byte keys at /etc/meridian/secrets/ (0400 owned by meridian): the AES-GCM master for the vault and the HMAC-SHA-256 key for the tamper-evidence hash chain.
  6. Package staging. Copies app/, db/, scripts/, config/ into /opt/meridian/; symlinks /usr/local/bin/meridian-nip.
  7. System hardening. Applies sysctl policy, logrotate rules, UFW firewall, AppArmor profiles.
  8. Postgres setup. Creates the DB + role, loads schema.sql, locks pg_hba.conf to localhost + the meridian role only, applies the tuning overlay.
  9. Cache setup. Starts Valkey (Debian 13) or Redis (Debian 12), localhost-bound, password-protected.
  10. BIND9 setup. Recursive resolver on 127.0.0.1 only, used by the dig sandbox.
  11. App install. Creates the Python venv, pip-installs from pinned requirements.txt, writes meridian.conf, renders + enables the three systemd units (meridian-app, meridian-celery, meridian-beat).
  12. Nginx + TLS. Based on the chosen method: Let's Encrypt (certbot + HTTP-01), Cloudflare origin cert, self-signed, or HTTP-only dev mode.
  13. SSH hardening. Custom port, AllowGroups ddi-ssh, modern KEX/ciphers/MACs only, legal MOTD banner — all via a sshd_config.d/10-meridian.conf drop-in.
  14. fail2ban. sshd, nginx-bad-request, nginx-req-limit, and a Meridian-login jail that reads the audit log.
  15. First admin seed. Creates the super-admin account with an auto-generated temp password.
  16. Start services and smoke-test. Hits /healthz.
  17. Summary. Prints every credential on-screen and to /root/meridian-install.log with an offer to shred -u once you've saved them.

Dependency sources

Meridian pulls dependencies from two places at install time:

LayerSourceWhy
OS packages (nginx, bind9, postgresql, valkey, etc.)apt from DebianSecurity patches land within hours of release; signed Release files verified by apt.
Python dependencies (~30 packages)Pinned requirements.txt against PyPIHashes pinned per --require-hashes for reproducibility. Pip resolves them at install time.
NO PHONE-HOME
The only outbound calls install.sh makes are to apt and (optionally) Let's Encrypt. There is no license server, no telemetry, no vendor check-in — Apache 2.0, source on GitHub, you read the code. The --airgapped flag skips even apt/Let's Encrypt if you're staging onto an isolated network with a local mirror.

Getting the source

Two ways to get a working tree of the same release:

  1. Tag download from GitHub — visit releases/tag/v1.0.0, download "Source code (tar.gz)" or use git clone --branch v1.0.0 https://github.com/MeridianNIP/meridian.git
  2. Latest maingit clone https://github.com/MeridianNIP/meridian.git for the rolling tip; tagged releases are the stable cut.

For Hyper-V / VMware / VirtualBox installs there's also a prebuilt Debian-13.4 ISO attached to the release page (940 MB, UEFI-bootable, preseed-injected). Install instructions on the site walk you through which path to pick.

Running the installer

# From the source directory:
sudo ./install.sh

# Upgrade an existing install:
sudo ./install.sh --upgrade

# Pre-flight only (no changes):
sudo ./install.sh --dry-run

# Unattended (every prompt comes from an answers file):
sudo ./install.sh --unattended --config /opt/meridian/answers.local.env

# No internet access available:
sudo ./install.sh --airgapped   # no outbound calls; apt pointed at a local mirror

After install

  1. Browse to https://<your-domain>/
  2. Sign in with the admin username and temp password from the summary
  3. Accept the AUP (prompted automatically)
  4. Enroll MFA
  5. Admin → Branding — upload logo, set AUP text, set the logo click-through URL
  6. Admin → Scope Manager — enable only the features your team uses
  7. Admin → Integrations — connect AD, Infoblox, Slack, etc.
  8. Back up the master keys at /etc/meridian/secrets/ to secure offline storage
CRITICAL
The master keys at /etc/meridian/secrets/ cannot be regenerated. If you lose them, the database (and every backup that doesn't include them) is permanently unreadable. Back them up immediately after first install.

Troubleshooting

MERIDIAN 1.0.0 · DOCUMENTATION
meridiannip.com ↗