{% extends 'layout.twig' %} {% block title %}Settings — IRDB{% endblock %} {% block content %} {% import 'partials/sort.twig' as sort %}

Settings

Admin only · read-only · masked secrets
{% if project_version %}

About

Project release of the bundled stack. Per-container versions live in api/CHANGELOG.md and ui/CHANGELOG.md.

IRDB version
v{{ project_version }}
{% endif %} {% if error %}
{{ error }}
{% endif %} {# ------------------------- Configuration ------------------------- #} {% if config and config.sections %}

Configuration

Effective values from the api's environment. Secrets are masked (***) or previewed (first 8 chars + …).

{% for section_name, items in config.sections %}
{{ section_name }}
{% for key, value in items %}
{{ key }}
{%- if value is null -%} {%- elseif value is same as(true) -%}true {%- elseif value is same as(false) -%}false {%- else -%}{{ value }}{%- endif -%}
{% endfor %}
{% endfor %}
{% endif %} {# ------------------------- Audit toggles ------------------------- #} {% if app_settings is not null %}

Audit toggles

High-volume public endpoints can be excluded from the audit log to keep the table compact. Each switch is independent; changes take effect immediately.

{% endif %} {# ------------------------------ Jobs ----------------------------- #} {% if jobs and jobs.jobs %}

Jobs

Latest run, lock state, and manual-trigger buttons. Manual triggers run synchronously — wait for the response.

{{ sort.th('Name', 'name') }} {{ sort.th('Last status', 'status') }} {{ sort.th('Last finished', 'last_finished', 'date') }} {{ sort.th('Items', 'items', 'number') }} {% for name, info in jobs.jobs %} {% endfor %}
Trigger
{{ name }} {% if info.overdue %} overdue {% endif %} {% if info.last_run %} {% set s = info.last_run.status %} {% set classes = { 'success': 'bg-emerald-100 text-emerald-900 dark:bg-emerald-900 dark:text-emerald-100', 'failure': 'bg-red-100 text-red-900 dark:bg-red-900 dark:text-red-100', 'skipped_locked': 'bg-amber-100 text-amber-900 dark:bg-amber-900 dark:text-amber-100', 'running': 'bg-blue-100 text-blue-900 dark:bg-blue-900 dark:text-blue-100', } %} {{ s }} {% else %} never run {% endif %} {% if info.last_run.finished_at %}{% else %}—{% endif %} {{ info.last_run.items_processed|default('—') }} {% if name != 'tick' %}
{% else %} scheduled {% endif %}
{% endif %} {# -------------------- Demo & maintenance -------------------- #}

Demo & maintenance

Populate the database with sample data for screenshots and demos, or wipe operational data to start clean. Both actions are admin-only and audited.

Load demo data

Inserts demo reporters, consumers, IPs, reports, manual blocks, allowlist entries, and synthetic GeoIP — then triggers a full score recompute. Returns "already seeded" if demo data is present.

Load demo data?

This will add sample reporters, consumers, IPs, and reports to the database, then run a full recompute. Existing real data is left untouched.

Type SEED to confirm:

Purge operational data

Deletes all reports, scores, manual blocks, allowlist, audit log, reporters, consumers, and non-service tokens. Users, OIDC mappings, and categories are preserved.

Purge operational data?

This will permanently delete reports, scores, blocks, allowlist, audit log, reporters, consumers, and tokens. The service token, your user account, OIDC mappings, and abuse categories are preserved.

Type PURGE to confirm:

{# ------------------------------ GeoIP ----------------------------- #} {% if config and config.sections.geoip %}

GeoIP

Provider, on-disk paths, and credential state. DB freshness comes from healthz; the trigger button on refresh-geoip is in the Jobs section above.

Provider
{{ config.sections.geoip.GEOIP_PROVIDER|default('—') }}
Country DB
{{ config.sections.geoip.GEOIP_COUNTRY_DB|default('—') }}
ASN DB
{{ config.sections.geoip.GEOIP_ASN_DB|default('—') }}
MaxMind key
{{ config.sections.geoip.MAXMIND_LICENSE_KEY ? config.sections.geoip.MAXMIND_LICENSE_KEY : '(unset)' }}
IPinfo token
{{ config.sections.geoip.IPINFO_TOKEN ? config.sections.geoip.IPINFO_TOKEN : '(unset)' }}
{% endif %}
{% endblock %}