{% extends "pobsync_backend/base.html" %} {% block title %}{{ host.host }} | pobsync{% endblock %} {% block content %} {% if retention_warning.has_warning %}

Retention Warnings

{% if retention_warning.prune_exceeded %}
Scheduled pruning would delete {{ retention_warning.delete_count }} snapshot(s), above max delete {{ retention_warning.max_delete }}. Scheduled pruning will refuse this plan until the limit or retention selection is adjusted.
{% endif %} {% if retention_warning.incomplete_count %}
{{ retention_warning.incomplete_count }} incomplete snapshot(s) exist. Retention does not delete incomplete snapshots automatically; inspect them before cleanup.
{% csrf_token %}
{% endif %} {% if retention_warning.error %}
{{ retention_warning.error }}
{% endif %}
{% endif %}

Host Status

{% if host.enabled %} enabled {% else %} disabled {% endif %} {{ host.address }}
{% if active_run %} {{ active_run.status }} Run {{ active_run.id }} is active. {% elif counts.failed_runs %} failed {{ counts.failed_runs }} failed run{{ counts.failed_runs|pluralize }} need review. {% elif retention_warning.has_warning %} warning Retention needs attention. {% else %} ok No active blockers for this host. {% endif %}
Snapshots{{ counts.snapshots }}
Runs{{ counts.runs }}
Incomplete{{ counts.incomplete_snapshots }}

Backup Control

{% if active_run %} {{ active_run.status }} Run {{ active_run.id }} {% elif has_global_config and host.enabled %} {{ backup_gate.state }} {{ backup_gate.message }} {% elif not host.enabled %} disabled {% elif not has_global_config %} missing global config {% endif %}
{% csrf_token %}
{% csrf_token %}
{% if active_run %}

Wait for the active run to finish, or cancel it from the run detail page.

{% elif not can_queue_dry_run or not can_queue_real_backup %} {% if not has_global_config %}

Create the default global config before queueing backups.

{% elif not host.enabled %}

Enable this host before queueing backups.

{% elif backup_gate.real_blockers %}

Real backups are blocked by failed preflight checks. Dry-runs may still be available when storage-only checks fail.

{% endif %} {% endif %}

Schedule Edit schedule

{% if schedule %}
Schedule expression{{ schedule.cron_expr }}
Next run{% if next_run_at %}{{ next_run_at|date:"Y-m-d H:i T" }}{% else %}none{% endif %}
Timezone{{ scheduler_timezone }}
Prune{{ schedule.prune|yesno:"yes,no" }}
Last status{{ schedule.last_status|default:"none" }}

Evaluated by the pobsync scheduler service.

{% else %}

No schedule configured.

Add schedule {% endif %}

Current Activity

{% if latest_runs %} {% with run=latest_runs.0 %} {{ run.status }} Run {{ run.id }} {{ run.run_type }} · {{ run.started_at|default:run.created_at }} {% endwith %} {% else %}

No backup runs recorded for this host.

{% endif %} {% if stats_summary.latest_run.duration_seconds is not None %}
Latest duration{{ stats_summary.latest_run.duration_seconds }}s
New data{{ stats_summary.latest_run.rsync.literal_data_bytes|filesizeformat }}
{% endif %}
Snapshots
{{ counts.snapshots }}
Runs
{{ counts.runs }}
Queued
{{ counts.queued_runs }}
Running
{{ counts.running_runs }}
Failed Runs
{{ counts.failed_runs }}
Incomplete
{{ counts.incomplete_snapshots }}
{% if stats_summary.runs %}

Backup Trends

Avg New Data
{{ stats_summary.avg_literal_data_bytes|filesizeformat }}
Avg Daily New
{{ stats_summary.avg_daily_literal_data_bytes|filesizeformat }}
Total New Data
{{ stats_summary.total_literal_data_bytes|filesizeformat }}
Matched Data
{{ stats_summary.total_matched_data_bytes|filesizeformat }}
Latest Duration
{{ stats_summary.latest_run.duration_seconds|default:"" }}{% if stats_summary.latest_run.duration_seconds is not None %}s{% endif %}
{% for run in stats_summary.runs %} {% endfor %}
Run Type Started Duration Files New Data Matched Trend Snapshot
Run {{ run.id }} {{ run.run_type }} {{ run.started_at|default:"" }} {{ run.duration_seconds|default:"" }}{% if run.duration_seconds is not None %}s{% endif %} {{ run.rsync.files_total|default:"" }} {{ run.rsync.literal_data_bytes|filesizeformat }} {{ run.rsync.matched_data_bytes|filesizeformat }}
newmatched
{% if run.snapshot %}{{ run.snapshot.dirname }}{% else %}{{ run.snapshot_path }}{% endif %}
{% endif %}

Host Check

OK
{{ host_check_summary.ok }}
Warnings
{{ host_check_summary.warning }}
Failed
{{ host_check_summary.failed }}
Skipped
{{ host_check_summary.skipped }}
{% for check in host_checks %}
{{ check.name }} {{ check.message }}
{{ check.status }}
{% if check.detail %}
Detail {{ check.detail }}
{% endif %}
{% endfor %}

Configuration

Address{{ host.address }}
SSH key{{ host.ssh_credential|default:"global default" }}
SSH{{ host.ssh_user|default:"global" }}{% if host.ssh_port %}:{{ host.ssh_port }}{% endif %}
Backup source{{ host.source_root|default:"global default" }}
Retentiond{{ host.retention_daily }} w{{ host.retention_weekly }} m{{ host.retention_monthly }} y{{ host.retention_yearly }}

Connection Preflight & SSH

{% if last_preflight %}
Preflight {% if last_preflight.ok %}ok{% else %}failed{% endif %}
Target{{ last_preflight.target }}
Backup source{{ last_preflight.source_root }}
Remote rsync{{ last_preflight.rsync_binary }}
{% else %}

No connection preflight recorded yet.

{% endif %}
{% csrf_token %}
{% csrf_token %}
{% if last_preflight.checks %}
{% for check in last_preflight.checks %}
{% if check.ok %}ok{% else %}failed{% endif %} {{ check.name }} {{ check.message }}{% if check.detail %} · {{ check.detail }}{% endif %}
{% endfor %}
{% endif %}

Snapshot Storage

Backup root{{ discovery.backup_root|default:"" }}
Host root{{ discovery.host_root|default:"" }}
Status{{ discovery.message }}
{% if discovery.kind_counts %}
On disk scheduled {{ discovery.kind_counts.scheduled|default:0 }}, manual {{ discovery.kind_counts.manual|default:0 }}, incomplete {{ discovery.kind_counts.incomplete|default:0 }}
{% endif %}
{% csrf_token %}
{% csrf_token %}
{% if effective_config %}

Effective Config

Runtime settings after global defaults and host overrides are combined.

Backup target Source and destination used by rsync.
Backup source:{{ effective_config.source_root }}
Destination subdir:{{ effective_config.destination_subdir|default:"none" }}
Connection SSH and rsync execution settings.
SSH:{{ effective_config.ssh.user }}@{{ host.address }}:{{ effective_config.ssh.port }}
SSH key:{{ effective_config.ssh.credential|default:"none selected" }}
SSH options:{{ effective_config.ssh.options|join:" " }}
Rsync binary:{{ effective_config.rsync.binary }}
Rsync args:{{ effective_config.rsync.args|join:" " }}
Timeout:{{ effective_config.rsync.timeout_seconds }}s
Bandwidth limit:{{ effective_config.rsync.bwlimit_kbps }} KB/s
Selection & retention Include/exclude rules and retention counts.
Retention: d{{ effective_config.retention.daily }} w{{ effective_config.retention.weekly }} m{{ effective_config.retention.monthly }} y{{ effective_config.retention.yearly }}
Includes:{{ effective_config.includes|length }}
Excludes:{{ effective_config.excludes|length }}
{% if effective_config.includes %}
{{ effective_config.includes|join:"
" }}
{% else %}
No include rules configured.
{% endif %}
{% if effective_config.excludes %}
{{ effective_config.excludes|join:"
" }}
{% else %}
No exclude rules configured.
{% endif %}
{% endif %}

Backup Options

Use this when the quick actions above need a custom label, include/exclude override, or prune limit.

{% csrf_token %} {{ manual_backup_form.non_field_errors }} {% for field in manual_backup_form %}
{{ field.errors }} {{ field }} {% if field.help_text %}
{{ field.help_text }}
{% endif %}
{% endfor %}

Latest Runs View all

{% for run in latest_runs %}
Run {{ run.id }} {{ run.run_type }}{% if run.result.duration_seconds %} · {{ run.result.duration_seconds }}s{% endif %}
{{ run.status }}
Started {{ run.started_at|default:run.created_at }}
Ended {{ run.ended_at|default:"running or queued" }}
Snapshot {% if run.snapshot %} {{ run.snapshot.dirname }} {% elif run.snapshot_path %} {{ run.snapshot_path }} {% else %} none {% endif %}
Base {{ run.base_path|default:"none" }}
{% empty %}

No backup runs recorded for this host.

{% endfor %}

Snapshots View all

{% for snapshot in snapshots %}
{{ snapshot.dirname }} {{ snapshot.kind }}
{{ snapshot.status }}
Started {{ snapshot.started_at|default:"unknown" }}
Ended {{ snapshot.ended_at|default:"unknown" }}
Base {% if snapshot.base %} {{ snapshot.base.dirname }} {% elif snapshot.base_dirname %} {{ snapshot.base_dirname }} {% else %} none {% endif %}
Path {{ snapshot.path|default:"not recorded" }}
{% empty %}

No snapshots discovered for this host.

{% endfor %}
{% endblock %}