Files
microdao-daarion/site/BACKUP_SETUP/index.html
Apple fb4f4a16d5 🔧 Fix GitHub Actions docs workflow
- Update mkdocs dependencies to latest versions
- Add permissions for GitHub Pages deployment
- Add workflow_dispatch for manual trigger
- Fix build command with fallback
2026-01-10 07:57:36 -08:00

973 lines
31 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">
<link rel="canonical" href="https://IvanTytar.github.io/microdao-daarion/BACKUP_SETUP/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>Налаштування автоматичних бекапів PostgreSQL - DAARION Documentation</title>
<link rel="stylesheet" href="../assets/stylesheets/main.66ac8b77.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">
<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="#postgresql" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="DAARION Documentation" class="md-header__button md-logo" aria-label="DAARION Documentation" 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.54Z"/></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 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></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">
DAARION Documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Налаштування автоматичних бекапів PostgreSQL
</span>
</div>
</div>
</div>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(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([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.516 6.516 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 5Z"/></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.516 6.516 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 5Z"/></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 11h12Z"/></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 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" 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">
<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" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="DAARION Documentation" class="md-nav__button md-logo" aria-label="DAARION Documentation" 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.54Z"/></svg>
</a>
DAARION Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../public/" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../public/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../public/architecture-overview/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../public/daiS_daos_overview/" class="md-nav__link">
<span class="md-ellipsis">
DAIS & DAOS
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Internal
</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>
Internal
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_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="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<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="../internal/infra/INFRA_AUTOMATION_PACK_V1/" class="md-nav__link">
<span class="md-ellipsis">
Infra Automation Pack v1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/infra/monitoring_overview/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/infra/nodes_registry_v0/" class="md-nav__link">
<span class="md-ellipsis">
Nodes Registry v0
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
<span class="md-ellipsis">
Specs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Specs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../internal/specs/matrix_presence_aggregator/" class="md-nav__link">
<span class="md-ellipsis">
Matrix Presence Aggregator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/specs/city_map_spec/" class="md-nav__link">
<span class="md-ellipsis">
City Map Spec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../internal/specs/node_join_protocol_draft/" class="md-nav__link">
<span class="md-ellipsis">
Node Join Protocol (Draft)
</span>
</a>
</li>
</ul>
</nav>
</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="#_1" class="md-nav__link">
<span class="md-ellipsis">
Огляд
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Вимоги
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Встановлення
</span>
</a>
<nav class="md-nav" aria-label="Встановлення">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1" class="md-nav__link">
<span class="md-ellipsis">
1. Створити директорію для бекапів
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2" class="md-nav__link">
<span class="md-ellipsis">
2. Скопіювати скрипт бекапу
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3" class="md-nav__link">
<span class="md-ellipsis">
3. Налаштувати змінні оточення (опціонально)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#4-cron" class="md-nav__link">
<span class="md-ellipsis">
4. Налаштувати cron
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#5" class="md-nav__link">
<span class="md-ellipsis">
5. Перевірити роботу
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
Відновлення з бекапу
</span>
</a>
<nav class="md-nav" aria-label="Відновлення з бекапу">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#dump-custom-format" class="md-nav__link">
<span class="md-ellipsis">
З файлу .dump (custom format)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sql-fp" class="md-nav__link">
<span class="md-ellipsis">
З SQL файлу (якщо використовується -Fp)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
Завантаження в хмару (опціонально)
</span>
</a>
<nav class="md-nav" aria-label="Завантаження в хмару (опціонально)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cloudflare-r2" class="md-nav__link">
<span class="md-ellipsis">
Cloudflare R2
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#aws-s3" class="md-nav__link">
<span class="md-ellipsis">
AWS S3
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
Моніторинг
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
Ротація бекапів
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
Розмір бекапів
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_9" class="md-nav__link">
<span class="md-ellipsis">
Безпека
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#permission-denied" class="md-nav__link">
<span class="md-ellipsis">
Помилка "permission denied"
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pg_dump-command-not-found" class="md-nav__link">
<span class="md-ellipsis">
Помилка "pg_dump: command not found"
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_10" class="md-nav__link">
<span class="md-ellipsis">
Недостатньо місця на диску
</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="postgresql">Налаштування автоматичних бекапів PostgreSQL<a class="headerlink" href="#postgresql" title="Permanent link">&para;</a></h1>
<h2 id="_1">Огляд<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<p>Цей документ описує налаштування автоматичних бекапів бази даних PostgreSQL для DAARION.</p>
<h2 id="_2">Вимоги<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h2>
<ul>
<li>PostgreSQL 12+</li>
<li>Доступ до бази даних з правами <code>pg_dump</code></li>
<li>Достатньо місця на диску для зберігання бекапів</li>
</ul>
<h2 id="_3">Встановлення<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h2>
<h3 id="1">1. Створити директорію для бекапів<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>sudo<span class="w"> </span>mkdir<span class="w"> </span>-p<span class="w"> </span>/var/backups/daarion
sudo<span class="w"> </span>chown<span class="w"> </span><span class="nv">$USER</span>:<span class="nv">$USER</span><span class="w"> </span>/var/backups/daarion
</code></pre></div>
<h3 id="2">2. Скопіювати скрипт бекапу<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>sudo<span class="w"> </span>cp<span class="w"> </span>scripts/backup_postgres.sh<span class="w"> </span>/usr/local/bin/backup_daarion.sh
sudo<span class="w"> </span>chmod<span class="w"> </span>+x<span class="w"> </span>/usr/local/bin/backup_daarion.sh
</code></pre></div>
<h3 id="3">3. Налаштувати змінні оточення (опціонально)<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
<p>Якщо потрібно змінити параметри за замовчуванням, створіть файл <code>/etc/daarion-backup.conf</code>:</p>
<div class="codehilite"><pre><span></span><code><span class="nv">DB_USER</span><span class="o">=</span>daarion
<span class="nv">DB_NAME</span><span class="o">=</span>daarion
<span class="nv">BACKUP_DIR</span><span class="o">=</span>/var/backups/daarion
<span class="nv">RETENTION_DAYS</span><span class="o">=</span><span class="m">7</span>
</code></pre></div>
<p>І додайте в скрипт:</p>
<div class="codehilite"><pre><span></span><code><span class="nb">source</span><span class="w"> </span>/etc/daarion-backup.conf
</code></pre></div>
<h3 id="4-cron">4. Налаштувати cron<a class="headerlink" href="#4-cron" title="Permanent link">&para;</a></h3>
<p>Додати в crontab (запуск щогодини):</p>
<div class="codehilite"><pre><span></span><code>crontab<span class="w"> </span>-e
</code></pre></div>
<p>Додати рядок:</p>
<div class="codehilite"><pre><span></span><code><span class="mf">0</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">/</span><span class="nb">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">backup_daarion</span><span class="mf">.</span><span class="n">sh</span><span class="w"> </span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="nb">log</span><span class="o">/</span><span class="n">daarion</span><span class="o">-</span><span class="n">backup</span><span class="mf">.</span><span class="nb">log</span><span class="w"> </span><span class="mf">2</span><span class="o">&gt;</span><span class="err">&amp;</span><span class="mf">1</span>
</code></pre></div>
<p>Або для запуску щодня о 2:00 ночі:</p>
<div class="codehilite"><pre><span></span><code><span class="mf">0</span><span class="w"> </span><span class="mf">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">/</span><span class="nb">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">backup_daarion</span><span class="mf">.</span><span class="n">sh</span><span class="w"> </span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="nb">log</span><span class="o">/</span><span class="n">daarion</span><span class="o">-</span><span class="n">backup</span><span class="mf">.</span><span class="nb">log</span><span class="w"> </span><span class="mf">2</span><span class="o">&gt;</span><span class="err">&amp;</span><span class="mf">1</span>
</code></pre></div>
<h3 id="5">5. Перевірити роботу<a class="headerlink" href="#5" title="Permanent link">&para;</a></h3>
<p>Запустити вручну:</p>
<div class="codehilite"><pre><span></span><code>/usr/local/bin/backup_daarion.sh
</code></pre></div>
<p>Перевірити, що файл створився:</p>
<div class="codehilite"><pre><span></span><code>ls<span class="w"> </span>-lh<span class="w"> </span>/var/backups/daarion/
</code></pre></div>
<h2 id="_4">Відновлення з бекапу<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h2>
<h3 id="dump-custom-format">З файлу .dump (custom format)<a class="headerlink" href="#dump-custom-format" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>pg_restore<span class="w"> </span>-U<span class="w"> </span>daarion<span class="w"> </span>-d<span class="w"> </span>daarion<span class="w"> </span>-c<span class="w"> </span>/var/backups/daarion/daarion_2024-01-01_12-00.dump
</code></pre></div>
<h3 id="sql-fp">З SQL файлу (якщо використовується -Fp)<a class="headerlink" href="#sql-fp" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>psql<span class="w"> </span>-U<span class="w"> </span>daarion<span class="w"> </span>-d<span class="w"> </span>daarion<span class="w"> </span>&lt;<span class="w"> </span>/var/backups/daarion/daarion_2024-01-01_12-00.sql
</code></pre></div>
<h2 id="_5">Завантаження в хмару (опціонально)<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h2>
<h3 id="cloudflare-r2">Cloudflare R2<a class="headerlink" href="#cloudflare-r2" title="Permanent link">&para;</a></h3>
<ol>
<li>Встановити rclone:</li>
</ol>
<div class="codehilite"><pre><span></span><code>curl<span class="w"> </span>https://rclone.org/install.sh<span class="w"> </span><span class="p">|</span><span class="w"> </span>sudo<span class="w"> </span>bash
</code></pre></div>
<ol>
<li>Налаштувати R2:</li>
</ol>
<div class="codehilite"><pre><span></span><code>rclone<span class="w"> </span>config
</code></pre></div>
<ol>
<li>Додати в скрипт бекапу:</li>
</ol>
<div class="codehilite"><pre><span></span><code><span class="c1"># Upload to R2</span>
rclone<span class="w"> </span>copy<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$BACKUP_FILE</span><span class="s2">&quot;</span><span class="w"> </span><span class="s2">&quot;r2:daarion-backups/&quot;</span><span class="w"> </span>--config<span class="w"> </span>/etc/rclone.conf
</code></pre></div>
<h3 id="aws-s3">AWS S3<a class="headerlink" href="#aws-s3" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>aws<span class="w"> </span>s3<span class="w"> </span>cp<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$BACKUP_FILE</span><span class="s2">&quot;</span><span class="w"> </span>s3://daarion-backups/
</code></pre></div>
<h2 id="_6">Моніторинг<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h2>
<p>Перевіряти логи:</p>
<div class="codehilite"><pre><span></span><code>tail<span class="w"> </span>-f<span class="w"> </span>/var/log/daarion-backup.log
</code></pre></div>
<p>Налаштувати алерти при помилках (наприклад, через email або Telegram bot).</p>
<h2 id="_7">Ротація бекапів<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h2>
<p>Скрипт автоматично видаляє бекапи старіше 7 днів (за замовчуванням).</p>
<p>Щоб змінити період зберігання, встановіть змінну <code>RETENTION_DAYS</code>:</p>
<div class="codehilite"><pre><span></span><code><span class="nb">export</span><span class="w"> </span><span class="nv">RETENTION_DAYS</span><span class="o">=</span><span class="m">30</span><span class="w"> </span><span class="c1"># Зберігати 30 днів</span>
</code></pre></div>
<h2 id="_8">Розмір бекапів<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h2>
<p>Типовий розмір бекапу для DAARION MVP: 10-50 MB (залежить від кількості даних).</p>
<p>Для бази з 1000 агентів та 10000 повідомлень: ~20-30 MB.</p>
<h2 id="_9">Безпека<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h2>
<ul>
<li>Бекапи містять чутливі дані</li>
<li>Обмежити доступ до директорії бекапів: <code>chmod 700 /var/backups/daarion</code></li>
<li>Шифрувати бекапи перед завантаженням в хмару</li>
<li>Не зберігати бекапи в публічних місцях</li>
</ul>
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<h3 id="permission-denied">Помилка "permission denied"<a class="headerlink" href="#permission-denied" title="Permanent link">&para;</a></h3>
<p>Перевірити права доступу до директорії:</p>
<div class="codehilite"><pre><span></span><code>ls<span class="w"> </span>-ld<span class="w"> </span>/var/backups/daarion
</code></pre></div>
<h3 id="pg_dump-command-not-found">Помилка "pg_dump: command not found"<a class="headerlink" href="#pg_dump-command-not-found" title="Permanent link">&para;</a></h3>
<p>Додати PostgreSQL bin до PATH або використати повний шлях:</p>
<div class="codehilite"><pre><span></span><code>/usr/bin/pg_dump<span class="w"> </span>-U<span class="w"> </span>daarion<span class="w"> </span>-Fc<span class="w"> </span>daarion<span class="w"> </span>&gt;<span class="w"> </span>...
</code></pre></div>
<h3 id="_10">Недостатньо місця на диску<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h3>
<p>Перевірити вільне місце:</p>
<div class="codehilite"><pre><span></span><code>df<span class="w"> </span>-h<span class="w"> </span>/var/backups
</code></pre></div>
<p>Очистити старі бекапи вручну:</p>
<div class="codehilite"><pre><span></span><code>find<span class="w"> </span>/var/backups/daarion<span class="w"> </span>-type<span class="w"> </span>f<span class="w"> </span>-mtime<span class="w"> </span>+7<span class="w"> </span>-delete
</code></pre></div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</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">{"base": "..", "features": ["navigation.sections", "navigation.instant", "content.code.copy"], "search": "../assets/javascripts/workers/search.b8dbb3d2.min.js", "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"}}</script>
<script src="../assets/javascripts/bundle.3220b9d7.min.js"></script>
</body>
</html>