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

{{ host.host }}

Edit config
{% csrf_token %}
Plan retention Edit schedule
{% csrf_token %}
{% csrf_token %}
{% csrf_token %}
Snapshots
{{ counts.snapshots }}
Runs
{{ counts.runs }}
Queued
{{ counts.queued_runs }}
Running
{{ counts.running_runs }}
Failed Runs
{{ counts.failed_runs }}
Incomplete
{{ counts.incomplete_snapshots }}

Config

Address: {{ host.address }}
Enabled: {{ host.enabled|yesno:"yes,no" }}
SSH key: {{ host.ssh_credential|default:"global default" }}
SSH: {{ host.ssh_user|default:"global" }}{% if host.ssh_port %}:{{ host.ssh_port }}{% endif %}
Source: {{ host.source_root|default:"global default" }}
Retention: daily {{ host.retention_daily }}, weekly {{ host.retention_weekly }}, monthly {{ host.retention_monthly }}, yearly {{ host.retention_yearly }}

Schedule

{% if schedule %}
Schedule expression: {{ schedule.cron_expr }}
Evaluated by the pobsync scheduler service.
Enabled: {{ schedule.enabled|yesno:"yes,no" }}
Next run: {% if next_run_at %}{{ next_run_at|date:"Y-m-d H:i T" }} {{ scheduler_timezone }}{% endif %}
Prune: {{ schedule.prune|yesno:"yes,no" }}
Last status: {{ schedule.last_status|default:"" }}
Last started: {{ schedule.last_started_at|default:"" }}
Last finished: {{ schedule.last_finished_at|default:"" }}
{% else %}

No schedule configured.

{% endif %}
{% 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 %} {% if effective_config %}

Effective Config

Source root: {{ effective_config.source_root }}
Destination subdir: {{ effective_config.destination_subdir|default:"none" }}
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
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 }}
{% if effective_config.includes %}
{{ effective_config.includes|join:"
" }}
{% else %}
No include rules configured.
{% endif %}
Excludes: {{ effective_config.excludes|length }}
{% if effective_config.excludes %}
{{ effective_config.excludes|join:"
" }}
{% else %}
No exclude rules configured.
{% endif %}
{% endif %}

Snapshot Discovery

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 %}
{% 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 %} {% endfor %}
Status Check Message Detail
{{ check.status }} {{ check.name }} {{ check.message }} {{ check.detail }}
{% if last_preflight %}

Connection Preflight

Status: {% if last_preflight.ok %}ok{% else %}failed{% endif %}
Target: {{ last_preflight.target }}
Source root: {{ last_preflight.source_root }}
Remote rsync: {{ last_preflight.rsync_binary }}
{% for check in last_preflight.checks %} {% endfor %}
Status Check Message Detail
{% if check.ok %}ok{% else %}failed{% endif %} {{ check.name }} {{ check.message }} {{ check.detail }}
{% endif %}

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 %}

Advanced Options

{% 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

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

Snapshots

{% for snapshot in snapshots %} {% empty %} {% endfor %}
Kind Status Started Dirname Base
{{ snapshot.kind }} {{ snapshot.status }} {{ snapshot.started_at|default:"" }} {{ snapshot.dirname }} {% if snapshot.base %}{{ snapshot.base.dirname }}{% else %}{{ snapshot.base_dirname }}{% endif %}
No snapshots discovered for this host.
{% endblock %}