Architecture overview & BOA fork model

A BOA host runs an omega8cc fork of the Aegir hosting stack on Devuan, Nginx-only, Percona-only, with a Master/Satellite multi-instance layout that upstream Aegir does not have. This page fixes the mental model in place — what the layers are, where they live on disk, and exactly where BOA's fork diverges from upstream — so the rest of this section can stay concrete.

Layered view

┌──────────────────────────────────────────────────────────────┐
│ Operator (root)            Tenant (o1, o2, … via o1.ftp lshell)│
│   barracuda / boa /          Aegir UI (Satellite frontend)    │
│   octopus CLI                Restricted SFTP (o1.ftp)         │
├──────────────────────────────────────────────────────────────┤
│ Aegir Master (Barracuda)                                     │
│   /var/aegir/  aegir/distro/NNN  (one frontend per host)     │
│   central Nginx config + master/db server nodes              │
├──────────────────────────────────────────────────────────────┤
│ Aegir Satellite (Octopus)    Aegir Satellite    …            │
│   /data/disk/o1/            /data/disk/o2/                   │
│     aegir/distro/NNN          aegir/distro/NNN               │
│     platforms/  static/       platforms/  static/           │
│     sites under each platform                                │
├──────────────────────────────────────────────────────────────┤
│ Provision (Drush backend)   .drush/sys/provision             │
│   hostmaster-install / provision-verify / -install /         │
│   -migrate / -backup / -clone                                │
├──────────────────────────────────────────────────────────────┤
│ Services (host-side, managed by Barracuda)                   │
│   Nginx · PHP-FPM (multi-version) · Percona MySQL ·          │
│   Redis/Valkey · Solr (opt.) · CSF · AppArmor · Postfix      │
├──────────────────────────────────────────────────────────────┤
│ OS: Devuan (no systemd)                                      │
└──────────────────────────────────────────────────────────────┘

Two halves of Aegir: front-end and back-end

Hostmaster (front-end) is a Drupal 7 install profile (the omega8cc fork of upstream Aegir Hostmaster). Operators and tenants drive it as a web UI. Every UI action — creating a site, migrating a platform, scheduling a backup — generates a task node.

Provision (back-end) is a Drush extension that turns those task nodes into server-side actions: creating databases, writing Nginx vhosts, running drush site-install, taking dumps, copying files. Provision is installed under .drush/sys/provision/var/aegir/.drush/sys/provision on the Master and /data/disk/<user>/.drush/sys/provision for each Octopus instance. BOA actively removes the bare upstream .drush/provision path on both Master and every Octopus user (master.sh.inc and satellite.sh.inc rm -rf .../.drush/{provision,drush_make}), so the legacy .drush/provision location never persists.

Hosting (Drupal modules) is the suite of sub-modules that provide the Drupal node types (site, platform, server, client, task, alias, package, …) and the admin UI for them. The entity model is in Entity & service model; the task plumbing is in Task queue engine.

Master + Satellite

The Master/Satellite split is a BOA-specific layering upstream Aegir does not have. Both halves are full Aegir frontends; they differ in who owns them and what they host.

Layer Owner Lives at Purpose
Master aegir system user, run by Barracuda /var/aegir/ One per host. Holds the central Nginx vhost set + the master/db server nodes that Satellites attach to. Not used to host tenant sites.
Satellite o1, o2, … system users, run by Octopus /data/disk/o1/, /data/disk/o2/, … One per tenant. Hosts the tenant's Drupal sites; has its own Aegir UI, its own Drush, its own platforms, its own DB user namespace.

A fresh BOA install creates one Master plus one Satellite (o1). More Satellites are added with boa in-octopus my@email o2 lts. The full multi-instance model — instance roots, the o1 instance-owner vs the o1.ftp lshell account, and the isolation boundary — is detailed in Multi-Octopus model.

File-system layout

The canonical paths an operator works with. The Master's instance root is /var/aegir; an Octopus instance's root is /data/disk/<user> (_ROOT="/data/disk/${_USER}", set in both OCTOPUS.sh.txt and satellite.sh.inc). The Hostmaster codebase for either root lives under <root>/aegir/distro/NNN, where NNN is a zero-padded numeric counter (_nextnum), not an upstream-style hostmaster-7.x-3.x directory.

Path What lives here
/var/aegir/ Master Aegir frontend root
/var/aegir/aegir/distro/NNN/ Master Hostmaster Drupal codebase (numeric counter, e.g. 001)
/var/aegir/config/server_master/nginx/ Generated master Nginx vhost set (vhost.d/, post.d/)
/var/aegir/.drush/ Master Drush aliases — master alias is hm.alias.drushrc.php; server_master.alias.drushrc.php / server_localhost.alias.drushrc.php are the server contexts
/var/aegir/.drush/sys/provision/ Master Provision backend
/data/disk/o1/ Octopus instance o1 root (one of N)
/data/disk/o1/aegir/distro/NNN/ Satellite Hostmaster codebase (hostmaster.alias.drushrc.php points here)
/data/disk/o1/static/ Per-instance control / static tree — .cnf overrides, platform list, fpm.info
/data/disk/o1/platforms/ Drupal platforms (codebases) for this instance
/data/disk/o1/.drush/ Per-instance Drush aliases + .drush/sys/provision
/home/o1.ftp/ Separate lshell SFTP home for the o1.ftp sub-user (static/ symlinks back to the instance root)
/root/.barracuda.cnf Host-level control file (reference)
/root/.${USER}.octopus.cnf Per-Octopus control file, e.g. /root/.o1.octopus.cnf
/opt/etc/fpm/ Common FPM pool config (fpm-pool-common.conf, -legacy, -modern); per-version pools live under /opt/php<v>/etc/pool.d/
/var/log/boa/ BOA operational logs (install, upgrade, load incidents, monitor checks)

The o1 instance owner owns /data/disk/o1/; the lshell-restricted SFTP account is the separate o1.ftp user homed at /home/o1.ftp/ (there is a matching o1.web web-runtime user). Do not conflate the instance owner with the .ftp shell account — they are distinct identities with distinct homes.

What runs continuously after install

Cadence Script Purpose
every minute (self-loops ×10, ~5 s apart) aegir/tools/system/second.sh Own cron entry (not launched from minute.sh): load sampling + auto-pause + the hackcheck/hackftp/escapecheck scanners and process guards
every minute (self-loops, box-class cadence) aegir/tools/system/minute.sh Own cron entry: fans out the per-service auto-healing watchdogs (nginx, php, mysql, redis/valkey, unbound, java, …) in _ITER passes
daily (15 4) aegir/tools/system/owl.sh Nightly maintenance orchestrator (installed as /var/xdrago/owl.sh): log rotation, control-file conversion, night/ workers
every minute (niced + ioniced) aegir/tools/system/runner.sh Aegir task-queue runner → hosting-dispatch
ad-hoc by CPU tier aegir/tools/bin/loadguard CPU-load-tier action hooks (pause/stop web on overload)
per service aegir/tools/system/monitor/check/*.sh (27 check scripts on disk; ~25 launched) nginx, mysql, php, redis/valkey, unbound, java, system, hackcheck, escapecheck, …

second.sh and minute.sh are each their own per-minute cron entry (neither is launched from the other); each self-loops with sleep between passes to cover the whole minute at roughly 5-second granularity, so the effective cadence is ~5 s, not literal one-second. second.sh loops a fixed 10 passes × 5 s. minute.sh fans out the per-service auto-healing watchdogs in _ITER passes spaced _SLEEP seconds apart, box-class dependent (NORMAL = 9 × 5 s; CI = 1 × 5 s; SLOW = 3 × 18 s; overridable via _MONITOR_FANOUT_ITER / _MONITOR_FANOUT_SLEEP). The nightly owl.sh is the former daily.sh, reworked into an orchestrator that runs per-account, per-site, and global workers under aegir/tools/system/night/ (shared library night.inc.sh; workers 10-account.sh, 20-sites.sh, 90-global-post.sh); log archiving/rotation and the INI control-file conversion remain, while the old daily Drupalgeddon hacked-core check is retired post-5.10.3 — its control files /root/.force.drupalgeddon.cnf and static/control/drupalgeddon.info are auto-purged fleet-wide by BOA self-update, and the drush extension remains a manual user-space tool. The Aegir task queue is processed from cron by runner.sh — there is no resident queue daemon (see Task queue engine). The monitor stack is documented in Monitoring; the full nightly run is covered in Nightly owl.

Install & upgrade flow (high level)

A fresh install from a vanilla Devuan/Debian VPS chains, from one operator command:

  1. autoinit — on a Debian base, removes systemd and migrates to the matching Devuan release. The target is version-aware, not a single universal release: trixie → excalibur, bookworm → daedalus, chimaera → daedalus, bullseye → chimaera, buster → beowulf. Skipped if already on the current Devuan. Logs to /root/.autoinit.log and /root/.autoinit-verbose.log.
  2. barracuda install / upgrade — installs the host stack (Nginx, Percona, PHP-FPM, Redis/Valkey, CSF, AppArmor, …) and builds the Master Aegir frontend.
  3. octopus install / upgrade — creates the first Octopus instance (o1) with its own Satellite frontend and enables Let's Encrypt.

Upgrades thereafter run via SKYNET (tags on 5.x-pro / 5.x-lts trigger automatic self-upgrade across enrolled hosts) or manually with barracuda up-lts / up-pro (the only accepted upgrade verbs are up-dev / up-pro / up-lts). The Master Hostmaster move during upgrade is handled by AegirUpgrade.sh.txt, which runs a fixed five-function pipeline (_hostmaster_mv_up, _hostmaster_dr_up, _hostmaster_go_up, _hostmaster_dr_tt, _hostmaster_mi_up) inside a settings.php-presence guard — the actual drush hostmaster-migrate runs in _hostmaster_mi_up.

Where this diverges from upstream Aegir

Concern Upstream Aegir BOA
Web server Apache (default) or Nginx Nginx exclusively
OS Debian / Ubuntu Devuan only (Debian accepted only as a migration-in base)
Database MySQL / MariaDB / Percona Percona MySQL only (5.7 / 8.0 / 8.4)
Install apt install aegir3-* barracuda / octopus / boa CLI
Multi-tenancy Single-instance per host; multi-server via remote nodes Master + N Satellites per host via the Octopus model
Hostmaster path hostmaster-7.x-3.x/ <root>/aegir/distro/NNN (numeric counter)
Provision path .drush/provision/ .drush/sys/provision/ (bare path actively removed)
Fork repos aegir-project/* (drupal.org + GitLab) *`omega8cc/` on GitHub**
SSL manual / contrib hosting_le + dehydrated, auto-renewed daily
Release cadence drupal.org release flow continuous, SKYNET-driven

The omega8cc fork is authoritative for BOA behaviour: there is no meaningful upstream to rebase from, and any upstream doc that contradicts the table above is wrong on a BOA host.

Related