Skip to content

1.14 Step | SetupSystemd

Omisen edited this page Jul 26, 2026 · 4 revisions

Installa e attiva il servizio systemd di Odoo: rendering dell'unit dal template, installazione in /etc/systemd/system/, daemon-reload, enable, start. Vive in src/steps/setup_systemd.rs. Port di lib/systemd.sh + templates/odoo.service.tpl.

Fase di consolidamento: riusa due pattern già validati — i tre PreState indipendenti di 1.6 SetupPostgres e il template embedded di 1.12 GenerateConfig.


Tre PreState indipendenti (D4)

struct SystemdSnapshot {
    unit_file: PreState,  // /etc/systemd/system/odoo<N>.service esiste già?
    enabled:   PreState,  // il servizio era già enabled?
    active:    PreState,  // il servizio era già attivo?
}
Fase Comportamento
snapshot per ogni asse: già vero prima di noi → Preexisting; altrimenti Untracked
run installa l'unit (idempotente), daemon-reload, enable (se non già), start/restart, verifica is-active
undo ripristina ogni asse CreatedByUs, in ordine stop → disable → rm → reload

Regola D4: un servizio già attivo/abilitato prima di noi viene lasciato com'era; un unit file preesistente non viene rimosso.


L'ordine dell'undo (la cura specifica)

stop      (se active == CreatedByUs)
  └─ disable   (se enabled == CreatedByUs)
       └─ rm unit file   (se unit_file == CreatedByUs)
            └─ daemon-reload      ← systemd dimentica l'unit rimossa

Fermare e disabilitare prima di rimuovere il file evita che systemd resti con riferimenti a un'unit sparita. Il daemon-reload finale chiude il ciclo. Ogni passo è best-effort e idempotente.


Rendering + hardening preservato

L'unit è renderizzato dal template embedded sostituendo i {{VAR}} (versione, utente, install_dir, repo/venv). Validazione: nessun placeholder {{...}} residuo.

L'hardening del template è preservato — non va impoverito:

Direttiva Valore
User / Group odoo (servizio non root)
NoNewPrivileges true
PrivateTmp true
RuntimeDirectory / RuntimeDirectoryMode odoo / 0750
Requires postgresql.service
Restart on-failure
StartLimitIntervalSec / StartLimitBurst burst protection

Installazione del file: temp privato → movechmod 644chown root:root. Verifica finale is-active con hint journalctl -u odoo<N> in caso di mancato avvio.


Note architetturali

  • Nessuno stato condiviso: i tre PreState sono locali allo step. A differenza di 1.13 InitializeOdooDatabase, qui non serve alcun canale step→step — nessun nuovo Arc<Atomic…> nel Context. Tenere lo stato condiviso sotto controllo è ciò che mantiene il rollback tracciabile.
  • render_unit e validate_unit sono funzioni pure, testate a parte.
  • Test: tutto-assente (installa; undo nell'ordine stop→disable→rm→reload verificato), D4 su active (già attivo → restart in run, nessuno stop in undo), D4 su enabled (già enabled → nessun disable), start fallito → errore, rendering (nessun residuo, hardening presente).

Clone this wiki locally