ISC Learn → managed hosting
Date: August 2026 · Status: proposal — nothing executed. The one decision already
executed, the hub at the root of isc.hevs.ch, adds a requirement to the target.
Scope: move the Moodle instance (the filière's most critical service) off the self-managed
hannibal VPS onto Infomaniak Serveur Cloud managé,
so that OS, PHP, MySQL, TLS and base backups become the provider's job.
1. Why
Hannibal is an unmanaged Infomaniak VPS: every patch (OS, PHP, MySQL, certbot), the host firewall, fail2ban and the backup chain are ours — and the August 2026 audit found most of that chain under-maintained, with a bus factor of zero on the backup script (much of it fixed since — hannibal — but still ours to keep fixed). On a managed server the environment is patched and backed up by Infomaniak; what remains ours is Moodle itself (upgrades via the web/CLI installer) and the content.
Keeping learn off the rack is deliberate: it must survive a room-23N307 loss. The
target-architecture idea of a srv-moodle VM on rumba is
superseded by this proposal.
2. Current state
The facts of the production instance — Moodle version, stack, sizes, authentication, names, execution servers — are kept once, on the ISC Learn page, the server on hannibal. Two of them shape this plan:
- The VPL jail and the CodeRunner Jobe server already run off-box, on Infomaniak Jelastic. So the managed server never needs to run a daemon, and the migration must verify the Jelastic product's future with Infomaniak — both code-execution backends live there.
isc.hevs.ch(vsnet zone) andlearn.isc-vs.chare both CNAMEs tohannibal.isc-vs.ch: the flip at cutover is one CNAME, once SInf has retargetedisc.hevs.chtolearn.isc-vs.ch(phase 0).
3. Target
One Serveur Cloud managé, sized ~8 CPU / 24 GB / 500 GB (exact tier from the
pricing page; the 100 GB
base config does not fit). Moodle installed under /learn so $CFG->wwwroot — which lives in
the DB — never changes. The same server can absorb the WordPress co-tenants (ingegamez,
in-egalite.ch); the Docker co-tenants cannot (no root) and go to the rack.
The root of isc.hevs.ch is the hub
Decided 2026-08-11, executed 2026-08-21 as a 301 to hub.isc-vs.ch, revised 2026-08-22 so that
hannibal serves the isc-hub build at the root and the
address bar keeps the institutional name (how it is wired,
execution log). isc.hevs.ch/learn did not change, so
every bookmark works and Moodle's $CFG->wwwroot is untouched.
Two consequences for the migration:
- The managed server has to serve the hub as well as
/learn: thedeployed-branch pull (provisioning/web/hannibal-hub/install.sh) has to work there, and the vhost needs an SPA fallback, since the hub routes on real paths. Falling back to a redirect tohub.isc-vs.chis no longer equivalent — GitHub Pages answers deep paths with a 404 status, and the fleet links point atisc.hevs.ch. - Serving rather than redirecting cost the host-independence the decision was made for: the hub is
only as available as its host, and a move is a link sweep again rather than one CNAME.
hub.isc-vs.chstays live on GitHub Pages from the same build, which is what makes that sweep optional rather than urgent.
4. The two blockers, and how they resolve
- Shibboleth.
mod_shibcannot be installed on managed hosting. Login must move to OIDC before the migration, on today's prod, where it is reversible. Two routes:- direct OIDC registration at SWITCH edu-ID — no new infrastructure, and learn's login stays independent of the rack (consistent with the survive-room-loss goal); or
- via the
sso.isc-vs.chKeycloak broker (the fleet-wide plan) — one registration for everything, but couples learn's login to the rack's availability. Recommendation: direct registration for this one service; the broker remains the plan for rack services.
- 303 GB moodledata vs. hosting quota — resolved 2026-09-05: the course-backup retention was fixed and the excess purged (history), so the payload is ~130 GB logical, comfortable in 500 GB with years of growth. Note that a managed host without btrfs block sharing pays for the two copies of each backup.
5. Phases
Each phase is independently useful and reversible; only phase 5 touches availability.
- Decisions & prerequisites
- Confirm the Jelastic product's future with Infomaniak — blocker if the answer is "sunset" (fallback: rebuild the VPL jail and Jobe on Public Cloud instances; they cannot run on the managed server).
- Ask SInf to retarget the
isc.hevs.chCNAME fromhannibal.isc-vs.chtolearn.isc-vs.ch— a no-op today (same A record), and it puts every future flip in our own zone. Lower thelearn.isc-vs.chTTL. - Decide co-tenant destinations: Snipe-IT → ISC³ VM (already on the todo), marks_crawler →
rack CT,
files.isc-vs.ch→srv-web01static (carrieshesso.xml— Gradescope SSO breaks if forgotten), WordPress sites → the managed server. - Pick the window from the academic calendar (nothing is documented; inter-semester is the obvious candidate).
- Auth switch on current prod: enable OIDC (edu-ID), run it alongside Shibboleth, then
disable
mod_shib. Rollback = re-enable the plugin. - Trim moodledata: done 2026-09-05 (retention + purge); empty
trashdirbefore the rsync. - Provision & restore: order the managed server, then replay the
tested restore runbook against it — rsync
~170 GB (hannibal→Infomaniak stays inside their network; the DR exercise sustained
20–25 MB/s through a laptop, so expect ≤ 2 h), import the dump (~15 min), adjust
config.php(managed DB host/port, dataroot path). Setmax_input_vars = 5000in the hosting's PHP settings. MUC/Redis: use the hosting's cache service if offered, else default file cache. - Rehearse: hosts-file override of
isc.hevs.ch→ new server; smoke-test login (OIDC), VPL + CodeRunner round-trip, byte-exactpluginfile.phpdownload as in the DR exercise; confirm outbound mail (mailer@isc-vs.ch— settings live inmdl_config, notconfig.php). - Cutover (≤ 1 h downtime): Moodle maintenance mode on hannibal → final delta rsync +
fresh dump/import → repoint
learn.isc-vs.chto the managed server → Infomaniak issues theisc.hevs.chcertificate once traffic arrives (verify immediately; the window is TTL-sized) → maintenance off, smoke tests. Rollback: repoint the CNAME back — hannibal is left untouched and running. - After: keep hannibal until every co-tenant has landed, then decommission (ends the
shared-certificate-lineage maintenance); re-target the DS923 backup pull at the managed host
(SSH per-hosting exists) on top of Infomaniak's built-in daily backups; update the DR-mirror
runbook paths; close the monitoring question with the hosting's built-in tools +
srv-status.
6. Open questions
Tracked on the ops todo — Jelastic pérennité, tier/cost quote (the current VPS cost is undocumented, so the comparison baseline is missing), OIDC route confirmation with SWITCH, cutover window.