Files
docs/services/backrest/index.html
T

3062 lines
74 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Single source of truth for the homelab">
<link rel="canonical" href="http://192.168.1.8:13080/services/backrest/">
<link rel="prev" href="../pocket-id/">
<link rel="next" href="../databases/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Backrest (backups) - nuclide.systems docs</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#backup-strategy" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="nuclide.systems docs" class="md-header__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
nuclide.systems docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Backrest (backups)
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_1">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../CHANGELOG/" class="md-tabs__link">
Changelog
</a>
</li>
<li class="md-tabs__item">
<a href="../../RESUME/" class="md-tabs__link">
Resume
</a>
</li>
<li class="md-tabs__item">
<a href="../../ct-inventory/" class="md-tabs__link">
CT inventory
</a>
</li>
<li class="md-tabs__item">
<a href="../../infra/proxmox-state/" class="md-tabs__link">
Infra
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../homelab-architecture/" class="md-tabs__link">
Services
</a>
</li>
<li class="md-tabs__item">
<a href="../../security/data-leak-audit-comparison/" class="md-tabs__link">
Security & audits
</a>
</li>
<li class="md-tabs__item">
<a href="../../ideas/stack-ideas/" class="md-tabs__link">
Ideas
</a>
</li>
<li class="md-tabs__item">
<a href="../../history/traefik-migration/" class="md-tabs__link">
History
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="nuclide.systems docs" class="md-nav__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
nuclide.systems docs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../CHANGELOG/" class="md-nav__link">
<span class="md-ellipsis">
Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../RESUME/" class="md-nav__link">
<span class="md-ellipsis">
Resume
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ct-inventory/" class="md-nav__link">
<span class="md-ellipsis">
CT inventory
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../infra/proxmox-state/" class="md-nav__link">
<span class="md-ellipsis">
Proxmox state
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/portmap/" class="md-nav__link">
<span class="md-ellipsis">
Port map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/storage/" class="md-nav__link">
<span class="md-ellipsis">
Storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/volumes/" class="md-nav__link">
<span class="md-ellipsis">
Volumes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/docker-networks/" class="md-nav__link">
<span class="md-ellipsis">
Docker networks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/connection-hosts/" class="md-nav__link">
<span class="md-ellipsis">
Connection hosts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/proxmox-memory-audit/" class="md-nav__link">
<span class="md-ellipsis">
Memory audit
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../homelab-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Homelab architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dev-environment/" class="md-nav__link">
<span class="md-ellipsis">
Dev environment (Coder + Gitea)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mcp-gateway/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mcp-servers/" class="md-nav__link">
<span class="md-ellipsis">
MCP servers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pocket-id/" class="md-nav__link">
<span class="md-ellipsis">
Pocket-ID (OIDC)
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Backrest (backups)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Backrest (backups)
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#current-state" class="md-nav__link">
<span class="md-ellipsis">
Current state
</span>
</a>
<nav class="md-nav" aria-label="Current state">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#backrest-ct-103-phase-1b-live-since-2026-05-21" class="md-nav__link">
<span class="md-ellipsis">
Backrest (CT 103) — Phase 1b live since 2026-05-21
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#postgres-ct-113-phase-2-live-since-2026-05-21" class="md-nav__link">
<span class="md-ellipsis">
Postgres (CT 113) — Phase 2 live since 2026-05-21
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#coverage-map" class="md-nav__link">
<span class="md-ellipsis">
Coverage map
</span>
</a>
<nav class="md-nav" aria-label="Coverage map">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#intentionally-not-backed-up" class="md-nav__link">
<span class="md-ellipsis">
Intentionally not backed up
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deferred-include-if-needed" class="md-nav__link">
<span class="md-ellipsis">
Deferred — include if needed
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#open-work" class="md-nav__link">
<span class="md-ellipsis">
Open work
</span>
</a>
<nav class="md-nav" aria-label="Open work">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#phase-1a-rclone-sync-for-unas-personal-data" class="md-nav__link">
<span class="md-ellipsis">
Phase 1a — rclone sync for UNAS personal data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-3-config-to-git-for-infrastructure" class="md-nav__link">
<span class="md-ellipsis">
Phase 3 — Config-to-git for infrastructure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#blind-spots" class="md-nav__link">
<span class="md-ellipsis">
Blind spots
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#operations" class="md-nav__link">
<span class="md-ellipsis">
Operations
</span>
</a>
<nav class="md-nav" aria-label="Operations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#restore" class="md-nav__link">
<span class="md-ellipsis">
Restore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#monitoring-planned" class="md-nav__link">
<span class="md-ellipsis">
Monitoring (planned)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#applying-a-new-config" class="md-nav__link">
<span class="md-ellipsis">
Applying a new config
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#history" class="md-nav__link">
<span class="md-ellipsis">
History
</span>
</a>
<nav class="md-nav" aria-label="History">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#provider-comparison" class="md-nav__link">
<span class="md-ellipsis">
Provider comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-2-postgres-consolidation-onto-ct-113-done-2026-05-21" class="md-nav__link">
<span class="md-ellipsis">
Phase 2 — postgres consolidation onto CT 113 (✅ done 2026-05-21)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-1a-rclone-sync-script" class="md-nav__link">
<span class="md-ellipsis">
Phase 1a rclone sync script
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-3-config-to-git-scripts" class="md-nav__link">
<span class="md-ellipsis">
Phase 3 config-to-git scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-wasabi-was-rejected" class="md-nav__link">
<span class="md-ellipsis">
Why Wasabi was rejected
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-lobe-postgres-stays-on-ct-104" class="md-nav__link">
<span class="md-ellipsis">
Why lobe-postgres stays on CT 104
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unas-data-inventory-basis-for-phase-1a-sizing" class="md-nav__link">
<span class="md-ellipsis">
UNAS data inventory (basis for Phase 1a sizing)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../databases/" class="md-nav__link">
<span class="md-ellipsis">
Databases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../secrets-manager/" class="md-nav__link">
<span class="md-ellipsis">
Secrets manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../comfyui/" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../zoraxy/" class="md-nav__link">
<span class="md-ellipsis">
Zoraxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../adguard-dns/" class="md-nav__link">
<span class="md-ellipsis">
AdGuard DNS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cloud-gpu/" class="md-nav__link">
<span class="md-ellipsis">
Cloud GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../arcane/" class="md-nav__link">
<span class="md-ellipsis">
Arcane
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../doc-ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Doc ingestion pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../llm-benchmark/" class="md-nav__link">
<span class="md-ellipsis">
LLM benchmark
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Security & audits
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Security & audits
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-comparison/" class="md-nav__link">
<span class="md-ellipsis">
Comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-2026-05-20-tr004-cloud-sandbox/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-20 · cloud-sandbox breach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-2026-05-21-tr004-artifacts/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-21 · artifacts (clean)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/audit-claude-code-meta/" class="md-nav__link">
<span class="md-ellipsis">
Self-audit (Claude Code)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/transcripts/audit-chat-2026-05-21/" class="md-nav__link">
<span class="md-ellipsis">
Transcript (audit session)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Ideas
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Ideas
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ideas/stack-ideas/" class="md-nav__link">
<span class="md-ellipsis">
Stack ideas
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
History
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
History
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../history/traefik-migration/" class="md-nav__link">
<span class="md-ellipsis">
Traefik (abandoned 2026-05-16)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/traefik-migration-docker-labels/" class="md-nav__link">
<span class="md-ellipsis">
Traefik labels (abandoned)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/mcp-gateway-requirements/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway requirements (superseded)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/scrubbing-list-2026-05-17/" class="md-nav__link">
<span class="md-ellipsis">
Scrubbing list (2026-05-17)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/case-study/" class="md-nav__link">
<span class="md-ellipsis">
Case study
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#current-state" class="md-nav__link">
<span class="md-ellipsis">
Current state
</span>
</a>
<nav class="md-nav" aria-label="Current state">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#backrest-ct-103-phase-1b-live-since-2026-05-21" class="md-nav__link">
<span class="md-ellipsis">
Backrest (CT 103) — Phase 1b live since 2026-05-21
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#postgres-ct-113-phase-2-live-since-2026-05-21" class="md-nav__link">
<span class="md-ellipsis">
Postgres (CT 113) — Phase 2 live since 2026-05-21
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#coverage-map" class="md-nav__link">
<span class="md-ellipsis">
Coverage map
</span>
</a>
<nav class="md-nav" aria-label="Coverage map">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#intentionally-not-backed-up" class="md-nav__link">
<span class="md-ellipsis">
Intentionally not backed up
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deferred-include-if-needed" class="md-nav__link">
<span class="md-ellipsis">
Deferred — include if needed
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#open-work" class="md-nav__link">
<span class="md-ellipsis">
Open work
</span>
</a>
<nav class="md-nav" aria-label="Open work">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#phase-1a-rclone-sync-for-unas-personal-data" class="md-nav__link">
<span class="md-ellipsis">
Phase 1a — rclone sync for UNAS personal data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-3-config-to-git-for-infrastructure" class="md-nav__link">
<span class="md-ellipsis">
Phase 3 — Config-to-git for infrastructure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#blind-spots" class="md-nav__link">
<span class="md-ellipsis">
Blind spots
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#operations" class="md-nav__link">
<span class="md-ellipsis">
Operations
</span>
</a>
<nav class="md-nav" aria-label="Operations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#restore" class="md-nav__link">
<span class="md-ellipsis">
Restore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#monitoring-planned" class="md-nav__link">
<span class="md-ellipsis">
Monitoring (planned)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#applying-a-new-config" class="md-nav__link">
<span class="md-ellipsis">
Applying a new config
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#history" class="md-nav__link">
<span class="md-ellipsis">
History
</span>
</a>
<nav class="md-nav" aria-label="History">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#provider-comparison" class="md-nav__link">
<span class="md-ellipsis">
Provider comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-2-postgres-consolidation-onto-ct-113-done-2026-05-21" class="md-nav__link">
<span class="md-ellipsis">
Phase 2 — postgres consolidation onto CT 113 (✅ done 2026-05-21)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-1a-rclone-sync-script" class="md-nav__link">
<span class="md-ellipsis">
Phase 1a rclone sync script
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#phase-3-config-to-git-scripts" class="md-nav__link">
<span class="md-ellipsis">
Phase 3 config-to-git scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-wasabi-was-rejected" class="md-nav__link">
<span class="md-ellipsis">
Why Wasabi was rejected
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-lobe-postgres-stays-on-ct-104" class="md-nav__link">
<span class="md-ellipsis">
Why lobe-postgres stays on CT 104
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unas-data-inventory-basis-for-phase-1a-sizing" class="md-nav__link">
<span class="md-ellipsis">
UNAS data inventory (basis for Phase 1a sizing)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="backup-strategy">Backup Strategy<a class="headerlink" href="#backup-strategy" title="Permanent link">&para;</a></h1>
<blockquote>
<p>Single Backrest instance on <strong>CT 103</strong> (192.168.1.3:9898) backing up offsite to JottaCloud via rclone. CT 103 has UNAS NFS mounted at <code>/mnt/pve/unas</code>, so it can read all service data without SSH-ing other hosts.</p>
</blockquote>
<p><strong>Goal</strong>: every piece of critical state has an offsite copy. CT 104 loss is recoverable within hours; UNAS loss is recoverable (slower) from JottaCloud.</p>
<hr />
<h2 id="current-state">Current state<a class="headerlink" href="#current-state" title="Permanent link">&para;</a></h2>
<h3 id="backrest-ct-103-phase-1b-live-since-2026-05-21">Backrest (CT 103) — Phase 1b live since 2026-05-21<a class="headerlink" href="#backrest-ct-103-phase-1b-live-since-2026-05-21" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Item</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>UI</td>
<td><code>http://192.168.1.3:9898</code> (LAN-only, auth disabled)</td>
</tr>
<tr>
<td>Config</td>
<td><code>/opt/backrest/config/config.json</code> (timestamped <code>.bak</code> files on every edit)</td>
</tr>
<tr>
<td>rclone remote</td>
<td><code>jottacloud:</code> Archive section (default device/mountpoint); token at <code>/root/.config/rclone/rclone.conf</code></td>
</tr>
<tr>
<td>Offsite plan</td>
<td>JottaCloud Unlimited €9.91/mo (Norway, EEA) — see <a href="#provider-comparison">provider comparison</a></td>
</tr>
<tr>
<td>BW throttle</td>
<td><code>RCLONE_BWLIMIT=05:30,7.5M 01:00,20M</code> (20 MB/s overnight, 7.5 MB/s daytime)</td>
</tr>
</tbody>
</table>
<p><strong>Repos</strong> (both <code>autoInitialize: true</code>; passwords currently <code>tapirnase</code> — see blind spot #5):</p>
<table>
<thead>
<tr>
<th>Repo</th>
<th>Target</th>
<th>Prune</th>
<th>Check</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>services-repo</code></td>
<td><code>rclone:jottacloud:services</code></td>
<td>weekly Sun 05:00, ≤10 % unused</td>
<td>monthly, 10 % subset</td>
</tr>
<tr>
<td><code>media-repo</code></td>
<td><code>rclone:jottacloud:media</code></td>
<td>monthly, ≤10 % unused</td>
<td>monthly, 10 % subset</td>
</tr>
</tbody>
</table>
<p><strong>Plans</strong>:</p>
<table>
<thead>
<tr>
<th>Plan</th>
<th>Repo</th>
<th>Schedule</th>
<th>Retention</th>
<th>Paths</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>services-backup-plan</code></td>
<td><code>services-repo</code></td>
<td><code>0 1 * * 1-5</code> weekdays 01:00</td>
<td>7d · 4w · 6m · 1y</td>
<td>15 paths (below)</td>
</tr>
<tr>
<td><code>media-backup-plan</code></td>
<td><code>media-repo</code></td>
<td><code>30 1 * * 1-5</code> weekdays 01:30</td>
<td>4w · 6m · 1y</td>
<td><code>/mnt/pve/unas/media/images/library</code></td>
</tr>
<tr>
<td><code>video-projects-plan</code></td>
<td><code>media-repo</code></td>
<td>nightly 02:00</td>
<td>per config</td>
<td><code>/mnt/pve/unas/media/video-projects</code></td>
</tr>
</tbody>
</table>
<p><strong>Services plan paths</strong> (all under <code>/mnt/pve/unas/</code>):</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>services/vaultwarden services/n8n services/memos
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>services/karakeep services/traccar services/gitea
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>services/coder services/nextcloud
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>services/arr-stack services/gluetun
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>backup/home-assistant backup/immich backup/nextcloud
</code></pre></div>
<p><code>services/shared-db</code> was removed when CT 113 came online — postgres is now WAL-G → Garage S3 → JottaCloud.
<code>services/arcane</code> removed 2026-05-26 — Arcane decommissioned, replaced by Portainer.
<code>services/pocketid</code> removed 2026-05-26 — Pocket-ID moved to CT 109 local FS (not UNAS); now covered by <code>ops-backup.timer</code> → Garage S3.</p>
<blockquote>
<p><strong>JottaCloud web UI tip</strong>: rclone writes to the <strong>Archive</strong> section. The default landing page shows only Sync + Backup. Browse to <code>https://www.jottacloud.com/web/archive</code> to see the restic repos.</p>
</blockquote>
<h3 id="postgres-ct-113-phase-2-live-since-2026-05-21">Postgres (CT 113) — Phase 2 live since 2026-05-21<a class="headerlink" href="#postgres-ct-113-phase-2-live-since-2026-05-21" title="Permanent link">&para;</a></h3>
<p>Dedicated <code>db</code> LXC at <code>192.168.1.6:5432</code> running <code>postgres:17</code> in Docker, pgAdmin on <code>:5050</code>. WAL-G archives continuously to Garage S3 (<code>ct113-pg-backup</code> on CT 104):</p>
<ul>
<li><code>archive_mode = on</code>, <code>archive_command = 'wal-g wal-push %p'</code></li>
<li>Daily <code>wal-g backup-push</code> cron at 02:00</li>
<li>DBs hosted: <code>vaultwarden</code>, <code>paperless</code>, <code>litellm</code>, <code>memos</code>, <code>n8n</code>, <code>gitea</code>, <code>coder</code></li>
</ul>
<p>Garage → JottaCloud offsite sync runs daily 02:30 on CT 103 via <code>/usr/local/sbin/walg-offsite-sync.sh</code> (read-only Garage key <code>GKef577420aadd26d667f2ca4f</code>; mirrors <code>ct113-pg-backup</code>, <code>lobe-pg-backup</code>, <code>immich-pg-backup</code><code>jottacloud:WAL-G/</code>).</p>
<p><strong>Exceptions</strong> (stay on original hosts):</p>
<table>
<thead>
<tr>
<th>DB</th>
<th>Host</th>
<th>Why</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>lobe-postgres</code> (paradedb pg17)</td>
<td>CT 104</td>
<td>Uses <code>pg_search</code> <code>USING bm25</code> indexes; stock postgres 17 can't host. WAL-G → <code>lobe-pg-backup</code> + Backrest secondary on data dir.</td>
</tr>
<tr>
<td>Nextcloud AIO postgres</td>
<td>CT 105</td>
<td>AIO manages it; Borg archives the whole stack to UNAS.</td>
</tr>
<tr>
<td>Immich postgres</td>
<td>CT 104</td>
<td>Version-pinned by Immich. WAL-G → <code>immich-pg-backup</code>.</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="coverage-map">Coverage map<a class="headerlink" href="#coverage-map" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Host / data</th>
<th>Method</th>
<th>Offsite</th>
</tr>
</thead>
<tbody>
<tr>
<td>CT 103 Backrest binary + config</td>
<td>Manual (small)</td>
<td>On-CT only</td>
</tr>
<tr>
<td>CT 104 Docker app state on UNAS</td>
<td><code>services-backup-plan</code></td>
<td>✓ JottaCloud</td>
</tr>
<tr>
<td>CT 104 <code>lobe-postgres</code> (paradedb)</td>
<td>WAL-G → Garage → JottaCloud sync</td>
<td></td>
</tr>
<tr>
<td>CT 104 Immich postgres</td>
<td>WAL-G → <code>immich-pg-backup</code> → sync</td>
<td></td>
</tr>
<tr>
<td>CT 113 postgres (7 DBs)</td>
<td>WAL-G → <code>ct113-pg-backup</code> → sync</td>
<td></td>
</tr>
<tr>
<td>CT 101 Shepard</td>
<td>Source in Gitea (gitea path covers it)</td>
<td></td>
</tr>
<tr>
<td>CT 102 AdGuard</td>
<td>Phase 3 git push → <code>fkrebs/adguard-conf</code></td>
<td>✗ not deployed</td>
</tr>
<tr>
<td>CT 104 Gitea + Coder</td>
<td><code>services/{gitea,coder}</code> (UNAS; moved from CT 111 2026-05-26)</td>
<td></td>
</tr>
<tr>
<td>CT 105 Nextcloud user files</td>
<td><code>services/nextcloud</code></td>
<td></td>
</tr>
<tr>
<td>CT 105 Nextcloud AIO volumes</td>
<td>AIO Borg → <code>/mnt/pve/unas/backup/nextcloud/</code> → Backrest</td>
<td></td>
</tr>
<tr>
<td>CT 108 Zoraxy</td>
<td>Phase 3 git push → <code>fkrebs/zoraxy-conf</code></td>
<td>✗ not deployed</td>
</tr>
<tr>
<td>CT 109 Portainer config</td>
<td>Daily tar → Garage S3 <code>ct109-portainer-backup</code> → JottaCloud sync</td>
<td></td>
</tr>
<tr>
<td>CT 109 Pocket-ID</td>
<td>Daily tar → Garage S3 <code>ct109-portainer-backup</code> (key <code>ops-*.tar.gz</code>) → JottaCloud sync via <code>ops-backup.timer</code></td>
<td></td>
</tr>
<tr>
<td>CT 109 Infisical</td>
<td>pg_dump in <code>ops-*.tar.gz</code> (same as above)</td>
<td></td>
</tr>
<tr>
<td>~~CT 110 Pocket-ID~~</td>
<td><strong>CT 110 destroyed 2026-05-26 — see CT 109 row above</strong></td>
<td></td>
</tr>
<tr>
<td>~~CT 111 Gitea + Coder~~</td>
<td><strong>CT 111 destroyed 2026-05-26 — see CT 104 row above</strong></td>
<td></td>
</tr>
<tr>
<td>~~CT 112 Infisical~~</td>
<td><strong>CT 112 destroyed 2026-05-26 — see CT 109 row above</strong></td>
<td></td>
</tr>
<tr>
<td>VM 100 HAOS config</td>
<td>Phase 3 git addon → <code>fkrebs/ha-config</code></td>
<td>✗ not deployed</td>
</tr>
<tr>
<td>VM 100 HAOS daily tar</td>
<td>HA → UNAS → Backrest</td>
<td></td>
</tr>
<tr>
<td>PVE host <code>/etc/pve/</code></td>
<td>Phase 3 git push → <code>fkrebs/pve-conf</code></td>
<td>✗ not deployed</td>
</tr>
<tr>
<td>UNAS <code>media/images/library</code></td>
<td>Phase 1a <code>rclone sync</code><code>jottacloud:Photos/</code></td>
<td>✗ not deployed</td>
</tr>
<tr>
<td>UNAS personal data (<code>documents</code>, <code>_sortMe</code>, <code>video-projects</code>, …)</td>
<td>Phase 1a <code>rclone sync</code><code>jottacloud:UNAS/</code></td>
<td>✗ not deployed</td>
</tr>
</tbody>
</table>
<h3 id="intentionally-not-backed-up">Intentionally not backed up<a class="headerlink" href="#intentionally-not-backed-up" title="Permanent link">&para;</a></h3>
<p>Immich thumbnails / encoded video, ComfyUI / Speaches models, arr-stack metadata, Redis / Meili / Elastic caches, CT 101 dev volumes — all regenerable or re-downloadable.</p>
<h3 id="deferred-include-if-needed">Deferred — include if needed<a class="headerlink" href="#deferred-include-if-needed" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Host</th>
<th>Data</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>CT 109 Prometheus TSDB, Grafana dashboards</td>
<td>Low priority — metrics are ephemeral; dashboards re-exportable from Grafana; add to services plan if needed</td>
<td></td>
</tr>
<tr>
<td>CT 109 Portainer data</td>
<td>WAL-Gstyle daily tar → <code>ct109-portainer-backup</code> Garage S3 → JottaCloud offsite sync</td>
<td>✓ (via walg-offsite-sync.sh)</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="open-work">Open work<a class="headerlink" href="#open-work" title="Permanent link">&para;</a></h2>
<h3 id="phase-1a-rclone-sync-for-unas-personal-data">Phase 1a — rclone sync for UNAS personal data<a class="headerlink" href="#phase-1a-rclone-sync-for-unas-personal-data" title="Permanent link">&para;</a></h3>
<p>Two sync jobs on CT 103, Saturday 01:00:</p>
<ul>
<li><strong>Job 1</strong>: <code>media/images/library/</code><code>jottacloud:Photos/</code> (Immich originals, visible at <code>jottacloud.com/photo</code>).</li>
<li><strong>Job 2</strong>: <code>/mnt/pve/unas/</code><code>jottacloud:UNAS/</code> (documents, video-projects, _sortMe, musical-sheets, audiobooks, ebooks, code; excludes Immich-generated, re-streamable media, torrents, <code>services/</code> already in Backrest).</li>
</ul>
<p>Initial upload ≈ 820 GB personal + 822 GB Immich (days). Script target <code>/usr/local/sbin/unas-sync.sh</code>. Full script in <a href="#phase-1a-rclone-sync-script">appendix</a>.</p>
<p>Tradeoff vs Restic: no point-in-time versions; deletions propagate. Acceptable for personal media.</p>
<h3 id="phase-3-config-to-git-for-infrastructure">Phase 3 — Config-to-git for infrastructure<a class="headerlink" href="#phase-3-config-to-git-for-infrastructure" title="Permanent link">&para;</a></h3>
<p>Daily 03:00 cron on each host pushes config to a private Gitea repo. Repos already exist:</p>
<ul>
<li><code>fkrebs/zoraxy-conf</code> (CT 108 — <code>/opt/zoraxy/conf/</code>)</li>
<li><code>fkrebs/adguard-conf</code> (CT 102 — <code>AdGuardHome.yaml</code>)</li>
<li><code>fkrebs/pve-conf</code> (PVE — <code>/etc/pve/</code>, excludes <code>priv/</code>, <code>*.key</code>, <code>authkey.pub*</code>)</li>
<li><code>fkrebs/ha-config</code> (VM 100 — <code>/config/</code>, excludes <code>secrets.yaml</code>, <code>.storage/</code>)</li>
</ul>
<p>Script template in <a href="#phase-3-config-to-git-scripts">appendix</a>.</p>
<h3 id="blind-spots">Blind spots<a class="headerlink" href="#blind-spots" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>#</th>
<th>Severity</th>
<th>Issue</th>
<th>Fix</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>MEDIUM</td>
<td>n8n encryption key in <code>/opt/stacks/n8n/data/</code> on CT 104 local FS — not in any plan. If CT 104 dies, DB restore is unusable.</td>
<td>Move n8n data volume to <code>/mnt/pve/unas/services/n8n/</code> (already in plan).</td>
</tr>
<tr>
<td>4b</td>
<td>MEDIUM</td>
<td>Nextcloud AIO Borg passphrase only in container env. Borg repo encrypted — without it, restore impossible.</td>
<td>Store <code>BORG_PASSWORD</code> in Vaultwarden.</td>
</tr>
<tr>
<td>5</td>
<td>MEDIUM</td>
<td>Both Backrest repo passwords are <code>tapirnase</code>.</td>
<td>Rotate before first scheduled run completes; <code>restic key passwd</code> re-encrypts in place. Store in Vaultwarden.</td>
</tr>
<tr>
<td>6</td>
<td>LOW</td>
<td><code>litellm</code> DB password is the placeholder literal <code>litellm_password_here</code>.</td>
<td>Generate real password; update <code>ai/.env</code>, <code>litellm-config/config.yaml</code>, CT 113 user.</td>
</tr>
<tr>
<td>7</td>
<td>LOW</td>
<td>Migration dumps at <code>/mnt/pve/unas/dump/*-migration-20260521.sql</code> not in any plan.</td>
<td>Decide: keep as manual archive or delete now that WAL-G is archiving.</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="operations">Operations<a class="headerlink" href="#operations" title="Permanent link">&para;</a></h2>
<h3 id="restore">Restore<a class="headerlink" href="#restore" title="Permanent link">&para;</a></h3>
<p>UI: <strong>Repos → snapshots → Browse → file → Restore</strong>.</p>
<p>CLI on CT 103:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>restic<span class="w"> </span>-r<span class="w"> </span>rclone:jottacloud:services<span class="w"> </span>snapshots
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>restic<span class="w"> </span>-r<span class="w"> </span>rclone:jottacloud:services<span class="w"> </span>restore<span class="w"> </span>latest<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span>--target<span class="w"> </span>/restore<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span>--include<span class="w"> </span>/mnt/pve/unas/services/vaultwarden
</code></pre></div>
<h3 id="monitoring-planned">Monitoring (planned)<a class="headerlink" href="#monitoring-planned" title="Permanent link">&para;</a></h3>
<p>In Backrest UI → each repo → Hooks:</p>
<ul>
<li><code>CONDITION_BACKUP_ERROR</code> / <code>CONDITION_CHECK_ERROR</code> → POST Gotify priority 8</li>
<li><code>CONDITION_BACKUP_SUCCESS</code> → POST Gotify priority 3</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>curl -s -X POST &#39;http://gotify:80/message?token=TOKEN&#39; \
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> -H &#39;Content-Type: application/json&#39; \
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> -d &#39;{&quot;title&quot;:&quot;Backrest: {{.Plan}}&quot;,&quot;message&quot;:&quot;{{.Summary}}&quot;,&quot;priority&quot;:3}&#39;
</code></pre></div>
<h3 id="applying-a-new-config">Applying a new config<a class="headerlink" href="#applying-a-new-config" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># on CT 103</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>systemctl<span class="w"> </span>stop<span class="w"> </span>backrest
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>cp<span class="w"> </span>/opt/backrest/config/config.json<span class="w"> </span>/opt/backrest/config/config.json.bak.<span class="k">$(</span>date<span class="w"> </span>+%Y%m%d-%H%M%S<span class="k">)</span>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="c1"># paste new config.json</span>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>systemctl<span class="w"> </span>start<span class="w"> </span>backrest
</code></pre></div>
<hr />
<h2 id="history">History<a class="headerlink" href="#history" title="Permanent link">&para;</a></h2>
<h3 id="provider-comparison">Provider comparison<a class="headerlink" href="#provider-comparison" title="Permanent link">&para;</a></h3>
<p>Researched 2026-05-21. Sized for ~3 TB/mo.</p>
<table>
<thead>
<tr>
<th>Provider</th>
<th>~3 TB/mo</th>
<th>Backend</th>
<th>EU DC</th>
<th>Egress</th>
<th>Verdict</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>JottaCloud Unlimited</strong></td>
<td>€9.91 flat (unlimited)</td>
<td>rclone native</td>
<td>Norway (EEA)</td>
<td>Free</td>
<td>✅ Chosen</td>
</tr>
<tr>
<td>Hetzner BX31</td>
<td>€20.80 flat (10 TB)</td>
<td>SFTP/WebDAV</td>
<td>DE, FI</td>
<td>Free</td>
<td>2.5× the price, capped</td>
</tr>
<tr>
<td>Backblaze B2</td>
<td>~$18 pay-per-GB</td>
<td>S3</td>
<td>Frankfurt</td>
<td>Free (≤3× stored)</td>
<td>US CLOUD Act risk</td>
</tr>
<tr>
<td>Cloudflare R2</td>
<td>~$45 pay-per-GB</td>
<td>S3</td>
<td>EU auto</td>
<td>Zero</td>
<td>Expensive at scale; no EU residency lock</td>
</tr>
<tr>
<td>Wasabi</td>
<td>~$2124</td>
<td>S3</td>
<td>FRA/AMS</td>
<td>Free (≤ stored)</td>
<td>❌ 90-day min billing per object → Restic prune disaster</td>
</tr>
<tr>
<td>Storj DCS</td>
<td>~$30</td>
<td>S3</td>
<td>EU-geofenced</td>
<td>1× free</td>
<td>Complex, $5 minimum</td>
</tr>
<tr>
<td>pCloud</td>
<td>€399 one-time / 2 TB</td>
<td>WebDAV</td>
<td>Luxembourg</td>
<td>Free</td>
<td>WebDAV too slow</td>
</tr>
<tr>
<td>Infomaniak kDrive</td>
<td>~€36+ / 3 TB</td>
<td>WebDAV</td>
<td>Switzerland</td>
<td>Free</td>
<td>WebDAV only; non-EU</td>
</tr>
<tr>
<td>Proton Drive</td>
<td></td>
<td>rclone beta</td>
<td>Switzerland</td>
<td>Free</td>
<td>rclone backend broken since late 2025</td>
</tr>
</tbody>
</table>
<h3 id="phase-2-postgres-consolidation-onto-ct-113-done-2026-05-21">Phase 2 — postgres consolidation onto CT 113 (✅ done 2026-05-21)<a class="headerlink" href="#phase-2-postgres-consolidation-onto-ct-113-done-2026-05-21" title="Permanent link">&para;</a></h3>
<p><strong>Decision</strong>: provision a dedicated <code>db</code> LXC (CT 113, 192.168.1.6) running postgres in Docker rather than reuse <code>shared-postgres</code> on CT 104. Direct-to-target avoided migrating twice (CT 111 → CT 104 → CT 113).</p>
<p>Specs: Debian 12 unprivileged, 2 GB RAM, 2 cores, 20 GB local-zfs, <code>mp0=/mnt/pve/unas</code>. Stack in Gitea <code>fkrebs/stacks-db</code>. pgAdmin pre-registers postgres via <code>pgadmin-servers.json</code>.</p>
<p><strong>Migration order</strong>: vaultwarden → paperless → litellm → memos → n8n → gitea → coder. Procedure per DB:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>&lt;container&gt;<span class="w"> </span>pg_dump<span class="w"> </span>-U<span class="w"> </span>&lt;user&gt;<span class="w"> </span>&lt;db&gt;<span class="w"> </span>&gt;<span class="w"> </span>/mnt/pve/unas/dump/&lt;db&gt;-migration.sql
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>psql<span class="w"> </span>-U<span class="w"> </span>postgres<span class="w"> </span>-c<span class="w"> </span><span class="s2">&quot;CREATE USER &lt;user&gt; WITH PASSWORD &#39;...&#39;; CREATE DATABASE &lt;db&gt; OWNER &lt;user&gt;;&quot;</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>psql<span class="w"> </span>-U<span class="w"> </span>&lt;user&gt;<span class="w"> </span>&lt;db&gt;<span class="w"> </span>&lt;<span class="w"> </span>/mnt/pve/unas/dump/&lt;db&gt;-migration.sql
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="c1"># Update connection strings → 192.168.1.6:5432, restart service, verify, remove old PG container + volume</span>
</code></pre></div>
<p>Stale DBs dropped from <code>shared-postgres</code> post-migration: <code>daytona</code>, <code>lobechat</code> (duplicate), <code>paradedb</code> (duplicate).</p>
<p>WAL-G enabled 2026-05-21: <code>archive_mode = on</code>, <code>archive_command = 'wal-g wal-push %p'</code> via <code>ALTER SYSTEM</code>; first base backup verified (<code>base_000000010000000000000012</code>). Daily <code>wal-g backup-push</code> cron at 02:00. Garage → JottaCloud offsite sync added at 02:30.</p>
<h3 id="phase-1a-rclone-sync-script">Phase 1a rclone sync script<a class="headerlink" href="#phase-1a-rclone-sync-script" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="ch">#!/bin/bash</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="nb">set</span><span class="w"> </span>-e
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="nv">LOG</span><span class="o">=</span>/var/log/rclone-unas-sync.log
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="c1"># Job 1: Immich originals → JottaCloud gallery</span>
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>rclone<span class="w"> </span>sync<span class="w"> </span>/mnt/pve/unas/media/images/library/<span class="w"> </span>jottacloud:Photos/<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="w"> </span>--transfers<span class="o">=</span><span class="m">4</span><span class="w"> </span>--checkers<span class="o">=</span><span class="m">8</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="w"> </span>--log-file<span class="o">=</span><span class="nv">$LOG</span><span class="w"> </span>--log-level<span class="w"> </span>INFO
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a>
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="c1"># Job 2: all other irreplaceable personal data</span>
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a>rclone<span class="w"> </span>sync<span class="w"> </span>/mnt/pve/unas/<span class="w"> </span>jottacloud:UNAS/<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a><span class="w"> </span>--transfers<span class="o">=</span><span class="m">4</span><span class="w"> </span>--checkers<span class="o">=</span><span class="m">8</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/images/library/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/images/upload/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/images/thumbs/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/images/encoded-video/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-17" name="__codelineno-5-17" href="#__codelineno-5-17"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/images/profile/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-18" name="__codelineno-5-18" href="#__codelineno-5-18"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/images/backups/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-19" name="__codelineno-5-19" href="#__codelineno-5-19"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/movies/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-20" name="__codelineno-5-20" href="#__codelineno-5-20"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/emulation/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-21" name="__codelineno-5-21" href="#__codelineno-5-21"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/Torrents/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-22" name="__codelineno-5-22" href="#__codelineno-5-22"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/music/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-23" name="__codelineno-5-23" href="#__codelineno-5-23"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;media/podcasts/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-24" name="__codelineno-5-24" href="#__codelineno-5-24"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;services/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-25" name="__codelineno-5-25" href="#__codelineno-5-25"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;backup/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-26" name="__codelineno-5-26" href="#__codelineno-5-26"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;backup-staging/**&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-27" name="__codelineno-5-27" href="#__codelineno-5-27"></a><span class="w"> </span>--exclude<span class="w"> </span><span class="s2">&quot;test_perm&quot;</span><span class="w"> </span><span class="se">\</span>
<a id="__codelineno-5-28" name="__codelineno-5-28" href="#__codelineno-5-28"></a><span class="w"> </span>--log-file<span class="o">=</span><span class="nv">$LOG</span><span class="w"> </span>--log-level<span class="w"> </span>INFO
</code></pre></div>
<p>Cron (Saturday 01:00): <code>0 1 * * 6 /usr/local/sbin/unas-sync.sh</code></p>
<h3 id="phase-3-config-to-git-scripts">Phase 3 config-to-git scripts<a class="headerlink" href="#phase-3-config-to-git-scripts" title="Permanent link">&para;</a></h3>
<p>Same pattern on each host. Replace <code>GITEA_TOKEN</code> with the value from <code>/opt/stacks/ai/.env</code> or a dedicated scoped Gitea token.</p>
<p><strong>CT 108 — Zoraxy</strong> (<code>/usr/local/sbin/zoraxy-conf-backup.sh</code>):</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="ch">#!/bin/bash</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="nb">set</span><span class="w"> </span>-e
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="nv">REPO_URL</span><span class="o">=</span><span class="s2">&quot;https://fkrebs:GITEA_TOKEN@git.nuclide.systems/fkrebs/zoraxy-conf.git&quot;</span>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="nv">WORK</span><span class="o">=</span><span class="s2">&quot;/opt/zoraxy/conf&quot;</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>git<span class="w"> </span>-C<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$WORK</span><span class="s2">&quot;</span><span class="w"> </span>init<span class="w"> </span>-b<span class="w"> </span>main<span class="w"> </span>-q<span class="w"> </span><span class="m">2</span>&gt;/dev/null<span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nb">true</span>
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>git<span class="w"> </span>-C<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$WORK</span><span class="s2">&quot;</span><span class="w"> </span>remote<span class="w"> </span>set-url<span class="w"> </span>origin<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$REPO_URL</span><span class="s2">&quot;</span><span class="w"> </span><span class="m">2</span>&gt;/dev/null<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="w"> </span><span class="o">||</span><span class="w"> </span>git<span class="w"> </span>-C<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$WORK</span><span class="s2">&quot;</span><span class="w"> </span>remote<span class="w"> </span>add<span class="w"> </span>origin<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$REPO_URL</span><span class="s2">&quot;</span>
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a>git<span class="w"> </span>-C<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$WORK</span><span class="s2">&quot;</span><span class="w"> </span>add<span class="w"> </span>-A
<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a>git<span class="w"> </span>-C<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$WORK</span><span class="s2">&quot;</span><span class="w"> </span>commit<span class="w"> </span>-q<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;auto: </span><span class="k">$(</span>date<span class="w"> </span>-u<span class="w"> </span>+%Y-%m-%dT%H:%M:%SZ<span class="k">)</span><span class="s2">&quot;</span><span class="w"> </span><span class="m">2</span>&gt;/dev/null<span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nb">true</span>
<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>git<span class="w"> </span>-C<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$WORK</span><span class="s2">&quot;</span><span class="w"> </span>push<span class="w"> </span>-q<span class="w"> </span>origin<span class="w"> </span>main<span class="w"> </span><span class="m">2</span>&gt;<span class="p">&amp;</span><span class="m">1</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-v<span class="w"> </span><span class="s2">&quot;Everything up-to-date&quot;</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nb">true</span>
</code></pre></div>
<p><strong>CT 102 — AdGuard</strong> — same template, copy <code>/opt/AdGuardHome/AdGuardHome.yaml</code> into <code>/tmp/adguard-conf-work</code> checkout first.</p>
<p><strong>PVE host</strong> — same template, <code>rsync -a --exclude='priv/' --exclude='*.key' --exclude='authkey.pub*' /etc/pve/ /tmp/pve-conf-work/</code> then commit.</p>
<p><strong>VM 100 — HA</strong> — native <a href="https://github.com/home-assistant/addons/tree/master/git_pull">Git Pull addon</a> pushing <code>/config/</code> (exclude <code>secrets.yaml</code>, <code>.storage/</code>) to <code>fkrebs/ha-config</code>. HA daily tars already covered by <code>services-backup-plan</code> via <code>/mnt/pve/unas/backup/home-assistant/</code>.</p>
<p>Cron on each host: <code>0 3 * * * /usr/local/sbin/&lt;host&gt;-conf-backup.sh</code></p>
<h3 id="why-wasabi-was-rejected">Why Wasabi was rejected<a class="headerlink" href="#why-wasabi-was-rejected" title="Permanent link">&para;</a></h3>
<p>Restic creates many small pack files during normal operation. Wasabi charges 90 days of storage per object regardless of deletion — every <code>restic forget --prune</code> generates surprise costs. Well-documented Restic-on-Wasabi trap.</p>
<h3 id="why-lobe-postgres-stays-on-ct-104">Why lobe-postgres stays on CT 104<a class="headerlink" href="#why-lobe-postgres-stays-on-ct-104" title="Permanent link">&para;</a></h3>
<p>Migration <code>0093_add_bm25_indexes_with_icu.sql</code> creates <code>USING bm25</code> indexes on 7 tables (<code>agents</code>, <code>topics</code>, <code>files</code>, <code>knowledge_bases</code>, <code>user_memories</code>, <code>chat_groups</code>, <code>user_memories_contexts</code>). <code>bm25</code> is paradedb-only (<code>pg_search</code> extension); stock postgres 17 has no such index access method and the migration fails. Container stays <code>paradedb/paradedb:latest-pg17</code>. WAL-G archives to <code>lobe-pg-backup</code>; Backrest secondary copies the data dir.</p>
<h3 id="unas-data-inventory-basis-for-phase-1a-sizing">UNAS data inventory (basis for Phase 1a sizing)<a class="headerlink" href="#unas-data-inventory-basis-for-phase-1a-sizing" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Path</th>
<th>Size</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>media/documents/</code></td>
<td>9.5 G</td>
<td>Personal documents</td>
</tr>
<tr>
<td><code>media/video-projects/</code></td>
<td>425 G</td>
<td>Creative work, irreplaceable</td>
</tr>
<tr>
<td><code>media/musical-sheets/</code></td>
<td>23 G</td>
<td></td>
</tr>
<tr>
<td><code>media/audiobooks/</code></td>
<td>23 G</td>
<td></td>
</tr>
<tr>
<td><code>media/ebooks/</code></td>
<td>6.8 G</td>
<td></td>
</tr>
<tr>
<td><code>media/3d-prints/</code></td>
<td>65 M</td>
<td></td>
</tr>
<tr>
<td><code>media/Recipes/</code></td>
<td>113 M</td>
<td></td>
</tr>
<tr>
<td><code>_sortMe/</code></td>
<td>335 G</td>
<td><code>images/</code> 171 G, <code>work Flo/</code> 147 G, <code>Anne/</code> 17 G</td>
</tr>
<tr>
<td><code>code/</code></td>
<td>6.7 M</td>
<td></td>
</tr>
<tr>
<td>Excluded <code>media/movies/</code></td>
<td>118 G</td>
<td>re-streamable</td>
</tr>
<tr>
<td>Excluded <code>media/emulation/</code></td>
<td>57 G</td>
<td>re-downloadable</td>
</tr>
<tr>
<td>Excluded <code>media/Torrents/</code></td>
<td>19 G</td>
<td>temporary</td>
</tr>
<tr>
<td>Excluded <code>media/music/</code>, <code>media/podcasts/</code></td>
<td></td>
<td>re-streamable</td>
</tr>
</tbody>
</table>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight", "search.suggest", "content.code.copy"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>