{% extends "pobsync_backend/base.html" %} {% block title %}pobsync dashboard{% endblock %} {% block content %}

Dashboard

New host {% if global_config %}Edit global config{% else %}Create global config{% endif %}
{% if not global_config or not counts.hosts %}

Setup

{% if not global_config %}

No default global config exists yet. Create it first so discovery, backups, and retention know where pobsync stores snapshots.

Create global config
{% elif not counts.hosts %}

Global config is ready. Add the first host to make this dashboard useful.

Add first host
{% endif %}
{% endif %}
Hosts
{{ counts.enabled_hosts }}/{{ counts.hosts }}
Schedules
{{ counts.enabled_schedules }}/{{ counts.schedules }}
Snapshots
{{ counts.snapshots }}
Runs
{{ counts.runs }}
Queued
{{ counts.queued_runs }}
Running
{{ counts.running_runs }}
Warnings
{{ counts.warning_runs }}
Failed
{{ counts.failed_runs }}

Operational Status

{% if counts.failed_runs or counts.warning_runs or counts.running_runs or counts.queued_runs %}
{% if counts.failed_runs %}
failed {{ counts.failed_runs }} failed run{{ counts.failed_runs|pluralize }} need{{ counts.failed_runs|pluralize:"s," }} review.
{% endif %} {% if counts.warning_runs %}
warning {{ counts.warning_runs }} run{{ counts.warning_runs|pluralize }} completed with warnings.
{% endif %} {% if counts.running_runs %}
running {{ counts.running_runs }} backup run{{ counts.running_runs|pluralize }} in progress.
{% endif %} {% if counts.queued_runs %}
queued {{ counts.queued_runs }} backup run{{ counts.queued_runs|pluralize }} waiting for the worker.
{% endif %}
{% elif counts.hosts %}

ok No queued, running, or unreviewed warning/failed runs.

{% else %}

Add a host to start tracking backup status here.

{% endif %}

Backup Trends

{% if stats_summary.runs_sampled %}
Storage Used
{% if stats_summary.capacity.used_percent is not None %} {{ stats_summary.capacity.used_percent|floatformat:1 }}% {% else %} unknown {% endif %}
{% if stats_summary.capacity.used_percent is not None %}
{% endif %}
{{ stats_summary.capacity.available_bytes|filesizeformat }} available from the backup root.
Runway
{% if stats_summary.estimated_days_until_full %} {{ stats_summary.estimated_days_until_full }} days {% elif stats_summary.estimated_runs_until_full %} {{ stats_summary.estimated_runs_until_full }} runs {% else %} unknown {% endif %}
Estimated from average new data per day.
New Data
{{ stats_summary.avg_daily_literal_data_bytes|filesizeformat }}/day
{{ stats_summary.avg_literal_data_bytes|filesizeformat }} per backup on average.
Link-Dest Savings
{% if stats_summary.link_dest_savings_percent is not None %} {{ stats_summary.link_dest_savings_percent|floatformat:1 }}% {% else %} unknown {% endif %}
{{ stats_summary.total_matched_data_bytes|filesizeformat }} reused across sampled runs.
Average Duration
{{ stats_summary.avg_duration_seconds|default:"unknown" }}{% if stats_summary.avg_duration_seconds is not None %}s{% endif %}
Based on {{ stats_summary.runs_sampled }} completed backup run{{ stats_summary.runs_sampled|pluralize }} with stats.
{% else %}

No completed backup runs with stats yet. This section will show disk usage, growth estimates, and link-dest savings after the first real backup finishes.

{% endif %}

Hosts

{% for host in hosts %}
{{ host.host }} {{ host.address }}
{{ host.enabled|yesno:"enabled,disabled" }} {% if host.queued_run_count %} queued {{ host.queued_run_count }} {% endif %} {% if host.running_run_count %} running {{ host.running_run_count }} {% endif %} {% if host.warning_run_count %} warning {{ host.warning_run_count }} {% endif %} {% if host.failed_run_count %} failed {{ host.failed_run_count }} {% endif %}
Backup activity
Latest Snapshot
{% if host.latest_snapshot %} {{ host.latest_snapshot.dirname }}
{{ host.latest_snapshot.kind }} {{ host.latest_snapshot.status }}
{% else %} none {% endif %}
Last Good Backup
{% if host.stats_summary.latest_good_run.id %} Run {{ host.stats_summary.latest_good_run.id }}
{{ host.stats_summary.latest_good_run.run_type }} {{ host.stats_summary.latest_good_run.duration_seconds|default:"" }}{% if host.stats_summary.latest_good_run.duration_seconds is not None %}s{% endif %}
{% else %} none {% endif %}
Latest Issue
{% if host.stats_summary.latest_problem_run.id %} Run {{ host.stats_summary.latest_problem_run.id }}
{{ host.stats_summary.latest_problem_run.status }}
{{ host.stats_summary.latest_problem_run.run_type }} {{ host.stats_summary.latest_problem_run.duration_seconds|default:"" }}{% if host.stats_summary.latest_problem_run.duration_seconds is not None %}s{% endif %}
{% else %} none {% endif %}
Next Run
{% if host.next_run_at %} {{ host.next_run_at|date:"Y-m-d H:i T" }}
{{ scheduler_timezone }}
{% else %} none {% endif %}
Snapshot health
Snapshots
{{ host.snapshot_count }}
Runs
{{ host.run_count }}
New Data
{{ host.stats_summary.latest_run.rsync.literal_data_bytes|filesizeformat }}
Retention
d{{ host.retention_daily }} w{{ host.retention_weekly }} m{{ host.retention_monthly }} y{{ host.retention_yearly }}
{% if host.retention_warning.has_warning %}
retention {% if host.retention_warning.prune_exceeded %} Scheduled prune would delete {{ host.retention_warning.delete_count }} snapshot(s), above max {{ host.retention_warning.max_delete }}. {% endif %} {% if host.retention_warning.incomplete_count %} {{ host.retention_warning.incomplete_count }} incomplete snapshot(s) need review.
{% csrf_token %}
{% endif %} {% if host.retention_warning.error %} {{ host.retention_warning.error }} {% endif %}
{% endif %}
{% empty %}

No hosts configured yet.

{% endfor %}

Latest Runs

{% for run in latest_runs %} {% empty %} {% endfor %}
Host Status Started Ended Snapshot
{{ run.host.host }} {{ run.status }} {{ run.started_at|default:"" }} {{ run.ended_at|default:"" }} {% if run.snapshot %}{{ run.snapshot.dirname }}{% else %}{{ run.snapshot_path }}{% endif %}
No backup runs recorded yet.
{% endblock %}