Skip to content

Administration

Everything an instance admin manages lives under /admin — visible only to accounts with the admin flag. It's a single surface with a sub-nav; this page maps each section and details the two operational ones (settings and background tasks).

Section What it does
Vue d'ensemble (/admin) Instance counters and health at a glance.
Utilisateurs The account register — roles, activity.
Catalogue · figures Moderate the shared figure catalogue.
Catalogue · entités Curate the entity tables behind manufacturer / series / character names.
Types de figurines The runtime-curated figure_types list (replaces a hard-coded enum).
Boutiques The stores registry (slug-deduped rows users create implicitly by typing a store name).
Serveurs Manga The MangaCollector server allow-list — see MangaCollector synergy.
Notifications System-level channel toggles, VAPID keypair generation, test sends — see Notifications.
Workers 360°/gsplat worker fleet: heartbeat status (jade = online, gold = paused, laque = offline), enable/pause.
Tâches Scan queue + server job history (below).
Réglages Instance policies (below).

Réglages (/admin/settings)

Instance-wide policies, stored in the app_settings table (key/value, no restart needed):

3D model creation policy

gsplat.creation_policy — who may launch gsplat (3D Gaussian splat) reconstructions:

  • admins_only (default) — gsplat training is GPU-heavy; new instances keep it admin-gated until the operator decides otherwise.
  • everyone — any signed-in user can create 3D scans.

Classic 360° turntable scans are not gated — only the gsplat pipeline.

Market-price refresh schedule

cote.price_cron — a standard 5-field cron expression (UTC) driving the market-price sweep that auto-prices collections. Empty = disabled (the default). The scheduler re-reads the setting every minute, so changes apply without a restart; the settings page shows a live next run indicator.

MCP endpoint

Whether AI clients may reach the instance at all, over the MCP endpoint. On by default.

Closing it refuses every MCP request instance-wide with 403 feature_disabled and removes the Accès API panel from user settings. Existing keys are not deleted — they work again the moment you reopen it, so this is a kill-switch rather than a purge. Revoking an individual key is the user's own business, from their settings page.

Worth knowing before you reach for it: an MCP key never carries administrative reach in the first place. Instance administration, account and privacy settings, share-link minting and outbound scraping sit outside the endpoint, not behind a scope — and that holds for an administrator's own key. The switch is there for operators who'd rather not expose the surface at all.

Merging a duplicate manufacturer

Manufacturers are created from a free-text name on the figure form, matched by slug — so two spellings of one company become two rows, and every per-maker statistic, facet and completion figure splits between them. Series and characters have had a move/merge path since their screens existed; manufacturers had none, so a duplicate pair could only be looked at.

POST /api/admin/manufacturers/{id}/merge with {"into_id": "<uuid>"} folds {id} into the survivor: every figure is re-pointed and the emptied row is deleted, in one transaction. It answers {"affected": n} with the number of figures moved, 400 if the two ids are the same and 404 if the target doesn't exist.

The MCP endpoint refuses to create a near-identical maker in the first place, so this is for cleaning up pairs that predate that guard.

Tâches (/admin/tasks)

A single task-management console over every background task — server crons, 3D scans, OCR jobs, and search indexing — newest-first.

Filters narrow the table and persist across visits: by state (Toutes / Actives / Réussies / Échouées), source (Serveur / Scans 3D / OCR), type, trigger (planifié / manuel), a free-text search, and a since window (1 h / 24 h / 7 j / tout). A « Masquer les runs sans effet » toggle hides no-op runs (a cron that found nothing to do) so the meaningful ones stand out.

A « Santé des services » strip across the top shows each worker/service at a glance (En marche / Au repos / OK / Erreur / Déconnecté) with a readable tooltip (active jobs, pending, processing, done, failed).

Each row carries per-row actions — cancel a running job, Relancer (relaunch) any job, or delete a run — and shows who triggered manual runs.

Server jobs are historized in server_job_runs and listed in the same table:

Job What it does
price_cron The market-price sweep (admin-scheduled, above).
release_cron Daily pre-order notifications (release today / J-7, delivery today / overdue) + wishlist price alerts piggyback on price runs.
scan_cleanup Prunes orphaned scan files.
manga_sync Refreshes MangaCollector cross-links.

Each run records its trigger (schedule or manual, with the triggering admin on manual runs), state (processing / ready / failed), a result message for every run (e.g. {"processed": 127, "updated": 42}), an error message on failure, and timestamps. The last 30 runs per job are retained.

Crash-safe

A run left processing by a server restart is marked failed (« interrupted by a server restart ») on boot, so the register never shows a phantom forever-running job.

Where do alerts come from?

If a user asks why they got (or didn't get) a price alert or a release reminder, this page is the audit trail: find the corresponding price_cron / release_cron run and read its result summary.