From 7ad9bbcec39404920f3040ce43bc96f801372fd7 Mon Sep 17 00:00:00 2001 From: CroneKorkN Date: Tue, 12 May 2026 10:29:45 +0200 Subject: [PATCH] left4me: schedule daily workshop-refresh via systemd-timers Adds a left4me-workshop-refresh entry to the systemd-timers bundle, firing nightly at 04:00 and invoking the new flask workshop-refresh CLI that enqueues a refresh_workshop_items job. Owner of the job is NULL (system-enqueued). The bw worker picks it up under existing scheduler rules; idempotent against an already-queued/running refresh. Also extends bundles/systemd-timers to accept an optional environment_files key so the new unit can pull DATABASE_URL etc. from /etc/left4me/{host,web}.env. --- bundles/left4me/metadata.py | 23 +++++++++++++++++++++++ bundles/systemd-timers/metadata.py | 2 ++ 2 files changed, 25 insertions(+) diff --git a/bundles/left4me/metadata.py b/bundles/left4me/metadata.py index 1545e81..37bfafd 100644 --- a/bundles/left4me/metadata.py +++ b/bundles/left4me/metadata.py @@ -1,5 +1,6 @@ assert node.has_bundle('nftables') assert node.has_bundle('systemd') +assert node.has_bundle('systemd-timers') defaults = { @@ -76,6 +77,28 @@ defaults = { '/etc/left4me', }, }, + 'systemd-timers': { + # Daily re-fetch of Steam Workshop metadata + .vpk downloads for any + # item whose author published an update. The CLI just inserts a + # `refresh_workshop_items` job; the web worker picks it up next. + # Idempotent — a re-fire while a refresh is already queued/running + # is a no-op (see l4d2web/cli.py:workshop_refresh). + 'left4me-workshop-refresh': { + 'command': '/opt/left4me/.venv/bin/flask --app l4d2web.app:create_app workshop-refresh', + 'when': '*-*-* 04:00:00', + 'persistent': True, + 'user': 'left4me', + 'working_dir': '/opt/left4me/src', + 'environment_files': ( + '/etc/left4me/host.env', + '/etc/left4me/web.env', + ), + 'after': { + 'network-online.target', + 'left4me-web.service', + }, + }, + }, } diff --git a/bundles/systemd-timers/metadata.py b/bundles/systemd-timers/metadata.py index 40b617a..b822680 100644 --- a/bundles/systemd-timers/metadata.py +++ b/bundles/systemd-timers/metadata.py @@ -44,6 +44,8 @@ def systemd(metadata): units[f'{name}.service']['Service']['KillMode'] = config['kill_mode'] if config.get('RuntimeMaxSec'): units[f'{name}.service']['Service']['RuntimeMaxSec'] = config['RuntimeMaxSec'] + if config.get('environment_files'): + units[f'{name}.service']['Service']['EnvironmentFile'] = config['environment_files'] services[f'{name}.timer'] = {}