⏱ Safe2Go — Jobs

← back to app

Admin Login

What this page is. Every job that runs by itself for Safe2Go: scheduled jobs on the Hetzner data server, long-running background processes there, operating-system maintenance jobs, and timers inside the Safe2Go app on Railway. For each: what it does, when it runs, what happened on its last run, and every risk found.
First snapshot 2026-09-28 ~10:30 UTC; updated 2026-09-29 ~10:40 UTC (Europe finished, backups & recovery section, Canada/USA started) by reading the server directly (systemctl list-timers --all, /etc/cron*, atq, ps, each job's script and log) and the app code (server/). This page is written by hand; it does not update live. Re-check any line with the command shown next to it.
Times: all in UTC. Germany is UTC+2 until 25 Oct 2026, then UTC+1. Random delay means systemd starts the job at a random moment inside that window.

1. Why this page exists — the 27 Sep incident

27 Sep 2026 06:20:53 UTC: Ubuntu's automatic security-update job (unattended-upgrade) installed a new curl library. Its helper needrestart then ran systemctl restart postgresql@18-main.service. Proof: /var/log/unattended-upgrades/unattended-upgrades-dpkg.log lines 2076–2102. No person or AI session was logged in at that time.
That single restart killed three running jobs at once: Fixes applied 28 Sep are listed in section 8. The Europe import was resumed from where the data shows it stopped, not from zero.

2. Timetable — every scheduled job (UTC)

JobWhereWhenTypical run lengthLast runNext runRisk
gtfs-freshnessHetznerDaily 00:00 + random 0–30 min~6 h (28 Sep: 00:20→06:37)28 Sep 00:2029 Sep 00:29HIGH
gtfs-refreshHetznerMondays 03:00 + random 0–30 min~3.5 h (28 Sep: 03:14→06:46)28 Sep 03:145 Oct 03:04HIGH
gtfs-reingestHetznerSaturdays 04:00 + random 0–30 min> 26 h (never finished last time)26 Sep 04:29 (killed 27 Sep 06:21)3 Oct 04:00HIGH
osm-transit-reimportHetzner5th of every month 05:00 + random 0–30 minhours (8 regions)5 Sep 05:275 Oct 05:06HIGH
fabrication-watchHetzner00:15, 06:15, 12:15, 18:15 + random 0–5 min~2 min28 Sep 06:1628 Sep 12:15MED
valhalla-usa-watchdogHetznerEvery 5 min (from 5 min after boot)~1 scontinuouscontinuousMED
safe2go-backup (added 29 Sep)HetznerDaily 21:00~1 h29 Sep (manual runs)29 Sep 21:00LOW — reads the databases (extra disk load for ~1 h); keeps 3 days of backups on the server
Safe2Go backup pull (added 29 Sep)Owner's PC (Windows Task Scheduler)Daily 07:30 German time, or as soon as the PC is onminutes29 Sep 09:37 UTC, 0 mismatches30 Sep 07:30 localLOW — needs the PC on; log D:\Safe2Go-Backups\pull.log
ops-status (added 28 Sep)HetznerEvery 1 min (from 2 min after boot)~3 scontinuouscontinuousLOW — read-only; writes one row to gtfs.ops_status for the Server Status page, keeps 2 days
apt-daily-upgrade (unattended-upgrades)Hetzner OSDaily ~06:00 + random up to 60 minseconds–minutes28 Sep 06:2429 Sep 06:24FIXED 28 Sep MED
apt-dailyHetzner OSTwice daily, randomseconds28 Sep 09:2228 Sep 22:04LOW
logrotateHetzner OSDaily 00:00 + randomseconds28 Sep 00:4329 Sep 00:34LOW
fstrimHetzner OSWeekly Monday 00:00 + randomminutes28 Sep 00:225 Oct 01:38LOW
e2scrub_all / xfs_scrub_allHetzner OSWeekly Sunday 03:10minutes27 Sep 03:104 Oct 03:10LOW
sysstat-collect / summary / rotateHetzner OSEvery 10 min / daily 00:07 / daily 00:00< 1 scontinuouscontinuousLOW
dpkg-db-backup, man-db, motd-news, update-notifier, systemd-tmpfiles-cleanHetzner OSDaily / weekly housekeepingseconds——LOW
Health monitorRailway appEvery 15 minsecondscontinuouscontinuousMED
Safety check-in sweeperRailway appEvery 5 smscontinuouscontinuousMED
Live-tracking cleanupRailway appEvery 30 minmscontinuouscontinuousMED
Rate-limit / Overpass cache cleanupRailway appEvery rate-limit window / every 10 minmscontinuouscontinuousLOW
No root or postgres crontab, nothing in /etc/cron.d except the OS filesystem scrub, and no one-off at jobs (checked 28 Sep). All Safe2Go server jobs are systemd timers, plus the unscheduled background processes in section 5.

2b. Backups & recovery (added 29 Sep)

Every file below is checked twice: right after it is written (dumps with pg_restore -l, archives with tar -t / gzip -t) and again after it is copied to the owner's PC (md5 must equal the server's). The timetable backup was also checked row by row: all 9 main tables, including 728,115,900 stop times, match the live database exactly.

What is backed up, and where

Backup setContentsSize (29 Sep)ServerOwner's PC (D:)External drive
app_mongoApp user data in MongoDB: Safe2Go (22 users, 297 journeys, 481 credit transactions, safety profiles, GPS pings), Truck Optimizer (641 users), SmartPark, DNW, AllSorter73 MB✅ nightly✅ daily✅ 29 Sep, read back
gtfs_coreAll timetables: 2,934 feeds from 78 countries, stops, trips, stop times, route connections, search index, flights, India addresses9.9 GB✅ nightly✅ daily✅ 29 Sep, read back
osm_core + europe_final + country:<name>All address & locality data (India, Argentina, Mexico, Malaysia/SG/BN, China, Brazil, Japan, Russia, Africa, Europe; Canada & USA added as they finish), transit stops3.7 + 2.9 GB✅ nightly + after each country✅ daily✅ 29 Sep, read back
railway_pgThe Postgres database on Railway152 MB✅ nightly✅ daily✅ 29 Sep, read back
mobility_graphPlace/mobility graph database37 MB✅ nightly✅ daily✅ 29 Sep, read back
configsAll pipeline scripts, job timers, auto-update settings, PostgreSQL and Valhalla configuration2.5 GB✅ nightly✅ daily✅ 29 Sep, read back
Europe OSM source fileThe 35 GB Europe extract - the backup of the removed 253 GB import staging table34.9 GBremoved (on PC)✅ md5 checked✅ 29 Sep, read back
App codeAll source code—GitHub (every change committed)

On the external drive only (too big for the PC) - copied and read back 29 Sep, 0 mismatches

WhatSizeIf lost with no backup
Offline map tiles (pmtiles - the map the app shows)76 GBrebuild from OpenStreetMap: days
Valhalla road routing, 14 regions (Europe 45, USA 38, Australia 14, Canada 11, Germany 11, Africa 8.9, Russia 7.5, India 6.3, China 3.8, Brazil 3.8, Mexico 1.9, Malaysia/SG 0.9, Argentina 0.8 GB)~153 GBrebuild per region: hours to days; that region's routing is down meanwhile
Map catalog (offline-map lookup)3.9 GBrebuild
Building footprints (Google Open Buildings 80 GB + Microsoft 24 GB of data)~40–70 GB as backup (estimate)download again from Google/Microsoft and re-import
Third copy of everything on the PC54 GB, growingprotects against the PC failing

Also on the external drive: the full Safe2Go code working copy (git history, iOS certificates, Android release keystore, local settings files; 4,194 files, 0 mismatches), SmartPark keystores and the Claude history backup. Not backed up anywhere yet: Railway app variables - the owner copies them into a password manager.

Schedule

How to restore

Risks still open

3. Clashes — jobs that overlap each other

WhenJobs running togetherWhat goes wrong
Every Monday ~03:00–06:40gtfs-freshness (daily) + gtfs-refresh (weekly)Both load feeds into the same gtfs database at the same time. Seen 28 Sep: both ran 03:14→06:37. Four large feeds (Warsaw, Lisbon ×2, Budapest) failed with statement timeout during this window and were left empty.
Saturday 04:00 → Sunday (26 h+)gtfs-reingest + Sunday's gtfs-freshness (+ Monday's if it runs that long)Two jobs deleting and reloading the same feeds. A feed can be deleted by one while the other is loading it.
Daily ~06:00–07:00apt-daily-upgrade in the middle of gtfs-freshness (and gtfs-refresh on Mondays)This is what caused the 27 Sep incident. Now blocked from restarting services (section 8).
Monday 5 Oct ~03:00–05:30gtfs-refresh + gtfs-freshness + osm-transit-reimport (monthly), and probably still the Europe address importFour heavy disk jobs at once on a disk that is already 93% busy. osm-transit-reimport also rewrites the osm2pgsql settings table that the Europe import uses. See its card.
Always, while any import runsEurope import / GTFS loads + live user searchesLive timetable lookups have a 6 s limit. When the disk is saturated they time out and users see only taxi/estimated routes.

4. Hetzner scheduled jobs (systemd timers)

gtfs-freshness — daily feed freshness check + auto-refresh HIGH RISK

Units
/etc/systemd/system/gtfs-freshness.timer + .service
Runs
/usr/bin/node /opt/gtfs-pipeline/scripts/gtfs_check_freshness.js
Schedule
OnCalendar=daily (00:00 UTC), random delay up to 30 min, Persistent=true (a missed run is made up at boot)
Log
/var/log/gtfs-freshness.log (906 KB, not rotated)
Last run
28 Sep 00:20 → 06:37 UTC. Refreshed 498 feeds, 111 need a manual URL, 14 still failing.

What it does

  1. For every GTFS feed, reads how long its timetable is valid (latest calendar.end_date, or latest calendar_dates.date for feeds that only use exception dates).
  2. Any feed that has expired or expires within 14 days gets re-downloaded and reloaded, but only if its source_url is a direct file. Landing-page URLs are logged as FEEDS_NEEDING_MANUAL_URL instead of being retried.
  3. Reloading uses the shared loader ingestOne() in gtfs_ingest_batch.js: delete the feed first, insert the feed row, stream stops/trips/stop_times in, then write row_counts.

Risks

gtfs-refresh — weekly catalog status check + new-feed ingestion HIGH RISK

Units
gtfs-refresh.timer + .service
Runs
/usr/bin/node /opt/gtfs-pipeline/scripts/gtfs_refresh.js
Schedule
OnCalendar=Mon *-*-* 03:00:00, random delay up to 30 min, Persistent
Log
/var/log/gtfs-refresh.log
Last run
28 Sep 03:14 → 06:46. Result: ok 6, error 108, skipped_empty 49, download_failed 4, skipped_too_large 1.

What it does

  1. Re-checks each feed's current status (active / inactive / deprecated) against the MobilityDatabase catalog and updates the feeds table. The app only serves status='active' feeds.
  2. Runs the normal ingestion orchestrator to pick up brand-new active feeds. Feeds already present are skipped.
  3. Known gap, stated in the script: it does not notice when a still-active feed republishes a new timetable. That is gtfs-freshness's and gtfs-reingest's job.

Risks

gtfs-reingest — weekly full reload of every feed HIGH RISK

Units
gtfs-reingest.timer + .service
Runs
/usr/bin/node /opt/gtfs-pipeline/scripts/gtfs_reingest_active.js
Schedule
OnCalendar=Sat *-*-* 04:00:00, random delay up to 30 min, Persistent
Log
/var/log/gtfs-reingest.log
Last run
Started 26 Sep 04:29. Killed 27 Sep 06:21 by the Postgres restart, after 25 h 52 min. Target was 2,813 feeds (124 excluded local-adapter feeds). Did not finish.

What it does

  1. Downloads and reloads every active and stale feed, whether or not it changed. This catches agencies that republish a new timetable under the same feed ID.
  2. Uses the same delete-then-load ingestOne() for each feed.
  3. Runs VACUUM ANALYZE on the GTFS tables at the end to reclaim the space the deletes free.

Risks

osm-transit-reimport — monthly OSM transit-stop refresh HIGH RISK — next run Mon 5 Oct

Units
osm-transit-reimport.timer + .service
Runs
/opt/osm-pipeline/reimport.sh
Schedule
OnCalendar=*-*-05 05:00:00 (5th of each month), random delay up to 30 min, Persistent
Log
/var/lib/postgresql/18/main/_osm_import/monthly_reimport.log (plus the systemd log /var/log/osm-transit-reimport.log)
Last run
5 Sep 05:27. That was before the 17 Sep rewrite; the current script has never run on schedule.

What it does

For each of 8 regions in order (Germany, India, Malaysia/Singapore/Brunei, Australia-Oceania, France, Canada, Africa, USA): download the Geofabrik extract to /tmp, import its stations/stops/airports into a scratch table with osm2pgsql, then in one transaction delete that region's rows from transit_stops and insert the new ones. A failure leaves that region's old data untouched (this part is safe).

Risks

fabrication-watch — live check for fake routes MED

Units
fabrication-watch.timer + .service
Runs
/opt/osm-pipeline/fabrication_watch.sh
Schedule
00,06,12,18:15 UTC, random delay up to 5 min, Persistent
Log
/var/log/fabrication-watch.log
Last run
28 Sep 06:16. Mannheim→Dijon, Mumbai and São Paulo PASS. Toronto→New York and Paris-local FAIL: "empty/no response from server".

What it does

Calls the live production API (/api/journey/_test_plan) for 5 fixed real trips and checks each answer for the known fake-data signatures: a flight leg that isn't a real scheduled flight, a banned wrong-region booking provider, or a placeholder "X International Airport" name without a real IATA code. Logs PASS or FAIL.

Risks

valhalla-usa-watchdog — routing-server memory guard MED

Units
valhalla-usa-watchdog.timer + .service (KillMode=none)
Runs
/usr/local/bin/restart_valhalla_watchdog.sh
Schedule
5 min after boot, then every 5 min
Log
/var/log/valhalla_usa_autorestart.log (last action 21 Sep: restarted Africa)

What it does

Despite the name, it covers 8 Valhalla routing servers: ports 8002 Germany, 8003 India, 8004 USA, 8005 Malaysia/SG/BN, 8006 Australia, 8007 Canada, 8008 Africa, 8009 Europe. If a port has no process, it starts one. If a process stays over its memory limit for 2 checks in a row (10 min), it kills it with kill -9 and starts it again. Limits: Germany 4.5 GB, India 4 GB, USA 8 GB, Africa 2 GB, Europe 4.5 GB, others 2 GB.

Risks

5. Long-running background processes (not scheduled, started by hand)

These run under nohup, not as systemd services. None of them comes back by itself after a reboot, except that valhalla-usa-watchdog restarts ports 8002–8009.

FINISHED 29 Sep 07:37 UTC: 56,943,359 ways in 21 h 14 m, 0 errors. Verified: 106,747,407 addresses + 10,628,636 localities, no duplicate rows, last way ID present, city checks by name and by location. Backed up (server + PC). The 253 GB staging table, the source file and the partial snapshots were removed after that. The card below is kept as the record of the run.

Europe address import (resumed 28 Sep) DONE

Command
COUNTRY=europe ionice -c2 -n7 nice -n 10 osm2pgsql --slim --append -O flex -S /opt/osm-pipeline/world_address_import.lua -d osm_transit …/extracts/europe-address-ways.osm.pbf
Started
28 Sep 10:23 UTC
Log
/var/log/europe_ways_resume.log
Input
The 56,943,359 Europe ways that carry an address or place tag (1.6 GB), filtered from the full 35 GB Europe file with osmium tags-filter. Node locations come from the planet_osm_nodes table saved by the first run.
Speed
~140–200 ways/s, which works out to about 3.5–4.5 days.

Risks

STOPPED 29 Sep 10:15 UTC after the final Europe backup was verified; its snapshots were removed. Replaced by the nightly backups (section 2b).

europe_periodic_backup.sh — 2-hourly Europe snapshot STOPPED

Process
/opt/osm-pipeline/europe_periodic_backup.sh, a loop running since 26 Sep 04:28
Schedule
Every 2 h (pg_dump, then sleep 7200 s)
Output
/var/lib/postgresql/18/main/_osm_backups/europe_partial_backup_*.dump, the 5 newest kept (~1.6 GB each). Log: /var/log/europe_periodic_backup.log

Risks

Canada & USA address import (started 29 Sep) MED

Command
/opt/osm-pipeline/run_world_import.sh → import_world_addresses.sh (reads the database password from the existing settings file at run time)
Started
29 Sep 10:19 UTC; Canada import 10:24 (6.1 GB extract); USA follows automatically
Priority
Low disk/CPU priority (ionice -c2 -n7, nice 10) so live timetable searches keep working
After each country
views refreshed (the country becomes searchable after the next index rebuild), counts logged, country:<name> backup taken and validated
Log
/var/log/world_address_import.log

Risks

mem_watchdog.sh — emergency RAM guard HIGH — 7 copies running

Process
/opt/map-pipeline-scripts/mem_watchdog.sh. 7 copies, started 12 Sep, 17 Sep, 21 Sep, 22 Sep and 3× on 26 Sep.
Schedule
Checks every 5 s
Log
/tmp/mem_watchdog.log (RAM disk, lost on reboot)

What it does

If available RAM drops below 2,500 MB, it kills the biggest Valhalla routing server with kill -9 and starts it again.

Risks

13 Valhalla routing servers MED

Ports 8002–8009 (see watchdog) plus 8011 Brazil, 8012 Argentina, 8013 Mexico, 8015 China, 8016 Russia. All run under nohup, started between 10 and 26 Sep. They aren't scheduled, but they are the other two jobs' targets and are affected by every memory event. Risk: not systemd services; 8011–8016 have no auto-restart at all.

PostgreSQL autovacuum (inside Postgres) LOW–MED

Postgres cleans up deleted rows in the background. It is switched off on planet_osm_nodes for the Europe import (must be switched back on afterwards; it's on the after-Europe checklist). On the gtfs database an autovacuum worker has been running since 27 Sep 06:21, cleaning up after the killed re-ingest. Risk: extra disk load at the same time as the imports.

6. Operating-system jobs on Hetzner

apt-daily-upgrade / unattended-upgrades — automatic security updates FIXED 28 Sep MED

Schedule
Daily around 06:00 UTC, random delay up to 60 min (apt-daily-upgrade.timer). Enabled in /etc/apt/apt.conf.d/20auto-upgrades.
Logs
/var/log/unattended-upgrades/unattended-upgrades.log, …-dpkg.log, /var/log/apt/history.log

What it does

Installs Ubuntu security updates automatically. Until 28 Sep, its helper needrestart then restarted every service using an updated library, including PostgreSQL. That caused the 27 Sep incident.

Changes made 28 Sep

Remaining risks

Other OS housekeeping LOW

JobScheduleWhat it doesRisk
apt-dailyTwice daily, randomDownloads package lists onlyNone worth noting
logrotateDaily ~00:30Rotates system and Postgres logsThe Safe2Go job logs (/var/log/gtfs-*.log, fabrication-watch.log, world_address_import.log 19 MB) are not in its config, so they grow forever
fstrimWeekly Mon ~01:00Tells the disk which blocks are freeA few minutes of disk activity
e2scrub_all / xfs_scrub_allWeekly Sun 03:10Filesystem consistency check (only on LVM/XFS)Short disk activity
sysstatEvery 10 min; daily summary 00:07Records CPU/disk statistics (sar)None; useful for investigations
dpkg-db-backup, man-db, motd-news, update-notifier, tmpfiles-cleanDaily/weeklyHousekeepingNone

7. Timers inside the Safe2Go app (Railway)

These live inside the Node server process (setInterval). They restart whenever the app is redeployed or restarted, and everything they keep only in memory is lost at that moment.

Health monitor MED

Code
server/lib/healthMonitor.js
Schedule
Every 15 min
Does
Runs a real test place search and checks the daily API quotas. When the set of problems changes it emails HEALTH_ALERT_EMAIL (default vipul.orlando@gmail.com), and it sends "back to normal" when they clear.

Risks

Safety check-in sweeper MED

Code
server/services/safetyEngine.js (startSweeper)
Schedule
Every 5 s
Does
For each open safety session: if the 30 s check-in window has passed, sends the next prompt (up to 3), then escalates to the emergency contacts. Closes sessions with no activity for 12 h.

Risks

Live-tracking session cleanup MED

Code
server/routes/track.js
Schedule
Every 30 min
Does
Deletes live-tracking sessions with no location update for 24 h.

Risks

Small in-memory cleanups LOW

8. Changes made on 28–29 Sep 2026

ChangeWhereWhy
Services are never restarted automatically after updates; PostgreSQL excluded/etc/needrestart/conf.d/90-no-auto-restart.confRoot cause of 27 Sep
PostgreSQL packages held out of automatic updates/etc/apt/apt.conf.d/51-no-auto-postgresIts installer restarts the database
Automatic reboot off/etc/apt/apt.conf.d/99-no-auto-rebootA kernel update is pending
Extracted only the Europe ways the import needs (56.9 M of ~475 M), from the full Europe file…/extracts/europe-address-ways.osm.pbf, log /var/log/europe_ways_filter.logResume Europe instead of restarting from zero
Indexes on (osm_type, osm_id) for both Europe tablesworld_osm_addresses_europe_id_idx, world_osm_localities_europe_id_idxLets the resumed import replace rows instead of duplicating them
Europe import resumed at low disk/CPU prioritysee section 5—
GTFS reloads run in one transaction per feed; a failed reload keeps the old timetablegtfs_ingest_batch.js, gtfs_check_freshness.js11 feeds had been emptied (Paris, Warsaw, Lisbon, Budapest…); all restored 28 Sep
Loader skips only bad rows (trimmed values, schema checks), survives slow finishes, handles feeds over 16.7 M rows, ends abandoned database sessionsgtfs_loader.js, gtfs_ingest_batch.jsMetra, Valencia ×2, Barrie, Sofia, Finland restored; AECFA skipped by the owner (flight data)
Owner-only read-only Server Status page/server-status.html, ops-status.timerCheck jobs from the phone
Address views rebuilt from every country table (Europe was missing); import mode chosen per countryimport_world_addresses.shEurope would otherwise never have reached search
Europe map-location indexes createdworld_osm_*_europe_geom_idxEvery other country had them
Search index now built as a new table and swapped in; never empty during a rebuildbuild_place_search_index.jsSearch stays up during the Europe rebuild
Nightly backups, per-country backups, PC download with md5 checkssection 2bOwner: "make it fully safe and retrievable"
JWT_SECRET set on Railway (by the owner)Railway variablesLogin tokens could be forged with the fallback secret in the code; verified fixed 29 Sep
Removed after verification + backup (owner-approved): 253 GB import staging table, 35 GB Europe source file (copy on PC), ways extract, 5 partial snapshots; stopped the 2-hourly snapshot jobserver data diskFree space 83 GB → 338 GB

Nothing was removed before the data it belonged to was verified and backed up, per the owner's standing rule.

8b. Changes made on 1 Oct 2026

ChangeWhereWhy
Audit of every feed ever seen vs the database: 2,998 seen, 2,934 present, 64 missing (7 lost with real data)Safe2Go-Evidence/2026-10-01_deletion_audit/AUDIT_REPORT.mdDutch trains missing in the owner's Käfertal → Almere test
Restore of the 7 lost feeds, one at a time at low priority. OVapi (Netherlands) restored 05:10 UTC: 20,262,245 stop_timesgtfs_restore_feeds.js (now finds deleted feeds in the catalog, 31a041a), logs /var/log/gtfs-restore-20261001*.logOwner: "reload now, low priority"
Weekly start-up cleanup no longer deletes; it reports unfinished feeds and retries themgtfs_ingest_all.js (backup .bak_20261001_pre_guard)It deleted the records of the lost feeds
Database deletion guard: a feed can't disappear and its timetable can't be emptied unless the owner switches the guard off. Direct deletes and TRUNCATE are rejected. Reloads in one transaction still work. Tested 10/10 on a scratch database.infra/hetzner-gtfs-pipeline/gtfs_guard.sql, test server/scripts/test_gtfs_guard.js, install log /var/log/gtfs_guard_apply.logOwner: nothing deleted without his consent
Daily feed inventory on the owner's PC (Windows task "Safe2Go feed inventory", 07:45): real per-feed trip and stop_times counts, a CHANGES file and the guard's stateD:\Safe2Go-Backups\feed-inventory\, script C:\Users\vipul\Safe2Go-Backups-tools\feed_inventory.shAny lost or shrunk feed shows up on the owner's own disk

Owner switch for the guard (only when a deletion is really wanted): INSERT INTO gtfs_guard_override (until, reason) VALUES (now() + interval '1 hour', 'why');. The row stays as a record. Limit: a database superuser can still switch the triggers off. The daily inventory counts the real rows, so that would still show up.

9. Open items (ordered by urgency)

  1. New 1 Oct: finish restoring the 7 lost feeds and compare their counts with the 3 Sep loads. Then decide (owner) whether to reload the 39 "empty when lost" and 8 active "no record" feeds (Feeds Monitor → Lost feeds).
  2. New 1 Oct: gtfs-reingest.service is in "failed" state since the automatic Postgres restart killed its 26 Sep run. Next run Sat 3 Oct.
  3. Restore the 11 emptied feeds and make reloads keep the old timetable on failure DONE 28 Sep (AECFA left out by the owner).
  4. Connect the external drive and copy the map tiles, routing data, catalog and building footprints plus a third copy of the PC backups (section 2b).
  5. Restore tests of the backups into a scratch database (after the search-index rebuild).
  6. Rotate the credentials that appeared in a Railway screenshot during the 29 Sep backup work (MongoDB password, Stripe secret key, Gmail app password).
  7. Restrict who can connect to the server's database (currently any address on the internet with the password) and change that password.
  8. Before 5 Oct: make osm-transit-reimport download to the data disk instead of /tmp, and keep it from running while the Europe import is active.
  9. Stop the GTFS jobs running on top of each other (freshness + refresh on Mondays, reingest across the weekend). Let only one GTFS writer run at a time.
  10. Reduce mem_watchdog.sh to a single copy (7 running now).
  11. Add auto-restart for Valhalla 8011–8016 (Brazil, Argentina, Mexico, China, Russia).
  12. Send FAIL alerts (fabrication-watch, GTFS errors, import death) by email instead of only writing them to logs.
  13. Add the Safe2Go job logs to logrotate.
  14. Plan a maintenance window for the pending kernel reboot and manual PostgreSQL updates, after Europe finishes.
Snapshot 2026-09-28, updated 2026-09-29 and 2026-10-01 (sections 4 and 8b, open items 1–2), by reading the server and code directly. Re-check any job with systemctl list-timers --all, systemctl cat <name>.timer <name>.service, and its log path above.