<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>backup &amp;mdash; Kuba Kodzi</title>
    <link>https://blog.kuba-orlik.name/kodzi/tag:backup</link>
    <description></description>
    <pubDate>Sun, 26 Apr 2026 23:49:25 +0200</pubDate>
    <item>
      <title>Automatyczne, szyfrowane backupy serwera na dysk podpięty do RPI</title>
      <link>https://blog.kuba-orlik.name/kodzi/automatyczne-szyfrowane-backupy-serwera-na-dysk-podpiety-do-rpi</link>
      <description>&lt;![CDATA[Opisuję, jak backupuję różne serwery którymi się opiekuję na dysk podłączony do raspberry pi u mnie w mieszkaniu. Backupy są szyfrowane i przyrostowe - tzn. unikam zapisywania na dysku wielokrotnie takich samych wersji plików.&#xA;&#xA;!--more--&#xA;&#xA;---&#xA;UPDATE: napisałem ansiblowy playbook do stawiania takiego backupu&#xA;---&#xA;&#xA;Ustanowienie połączenia VPN pomiędzy serwerem a RPI&#xA;&#xA;Restic działa na zasadzie &#34;push&#34; - tzn serwer wysyła backupy, a raspberry musi cały czas na nie nasłuchiwać. Komunikacja pomiędzy rpi a serverem będzie odbywać się przez ssh za pośrednictwem OpenVPN.&#xA;&#xA;Najprościej będzie skorzystać z konfiguracji static-key dla OpenVPN. Na stronie OpenVPN znajduje się poręczny tutorial, który dla mojej przyszłej wygody maksymalnie tutaj streszczę.&#xA;&#xA;Na serwerze:&#xA;&#xA;cd /etc/openvpn/server&#xA;openvpn --genkey --secret rpi-to-server.key&#xA;cat rpi-to-server.key&#xA;&#xA;Skopiuj zawartość pliku .key do schowka.&#xA;&#xA;Na rpi:&#xA;&#xA;cd /etc/openvpn/client&#xA;nano rpi-to-server.key&#xA;&#xA;Wklej klucz skopiowany z serwera.&#xA;&#xA;Utwórz plik tekstowy /etc/openvpn/server/rpi-to-server.conf na serwerze:&#xA;&#xA;dev tun&#xA;ifconfig 10.8.5.1 10.8.5.2&#xA;secret rpi-to-server.key&#xA;keepalive 10 60&#xA;ping-timer-rem&#xA;persist-tun&#xA;persist-key&#xA;log-append /var/log/openvpn-rpi.log&#xA;&#xA;Oraz plik tekstowy /etc/openvpn/client/rpi-to-server.conf na rpi (trzeba wstawić tam domenową nazwę serwera):&#xA;&#xA;remote moja.domena.com&#xA;dev tun&#xA;ifconfig 10.8.5.2 10.8.5.1&#xA;secret rpi-to-server.key&#xA;keepalive 10 60&#xA;ping-timer-rem&#xA;persist-tun&#xA;persist-key&#xA;log-append /var/log/openvpn-yuno.log&#xA;&#xA;Otwórz port 1194 na serwerze:&#xA;&#xA;ufw allow 1194&#xA;&#xA;Następnie na serwerze odpal:&#xA;&#xA;systemctl start openvpn-server@rpi-to-server&#xA;systemctl enable openvpn-server@rpi-to-server&#xA;&#xA;Na rpi:&#xA;&#xA;systemctl start openvpn-client@rpi-to-server&#xA;systemctl enable openvpn-client@rpi-to-server&#xA;&#xA;Powinno działać pingowanie 10.8.5.1 z rpi i pingowanie 10.8.5.2 z serwera.&#xA;&#xA;Autoryzacja rpi i serwera&#xA;&#xA;Na rpi utworzymy użytkownika, który będzie miał dostęp tylko do katalogu z backupami:&#xA;&#xA;adduser server-backup # utwórz hasło i zapisz je w menedżerze haseł&#xA;mkdir /mnt/hdd/Backups/server-backup&#xA;cd /mnt/hdd/Backups/server-backup&#xA;chown root: .&#xA;chmod 755 .&#xA;mkdir data&#xA;chmod 755 data&#xA;chown server-backup: data&#xA;&#xA;Uwaga - każdy z przodków wybranego katalogu (w przykładzie powyżej jest to /mnt/hdd/Backups/server-backup) musi należeć do użytkownika root i mieć prawa dostępu 755&#xA;&#xA;Na serwerze dodaj taką linijkę do /etc/hosts:&#xA;&#xA;10.8.5.2    rpi&#xA;&#xA;Na serwerze wygeneruj klucz ssh bez hasła za pomocą:&#xA;&#xA;$ ssh-keygen -t ed25519 -b 4096 -C &#34;rpi-backup&#34; -f /root/.ssh/rpi-backup -N &#34;&#34;&#xA;&#xA;W pliku ~/.ssh/config na serwerze dodaj:&#xA;Host rpi&#xA;    User server-backup&#xA;    IdentityFile /root/.ssh/rpi-backup&#xA;&#xA;Na serwerze wykonaj:&#xA;&#xA;ssh-copy-id -i /root/.ssh/rpi-backup rpi&#xA;&#xA;I wpisz tam zapisane wcześniej hasło do usera server-backup na rpi.&#xA;&#xA;Na rpi dodaj do pliku /etc/ssh/sshdconfig:&#xA;&#xA;Match User server-backup&#xA;&#x9;ForceCommand internal-sftp&#xA;&#x9;PasswordAuthentication yes&#xA;&#x9;ChrootDirectory /mnt/hdd/Backups/server-backup&#xA;&#x9;PermitTunnel no&#xA;&#x9;AllowAgentForwarding no&#xA;&#x9;AllowTcpForwarding no&#xA;&#x9;X11Forwarding no&#xA;&#xA;I zrestartuj sshd na rpi:&#xA;&#xA;systemctl restart sshd&#xA;&#xA;Aby sprawdzić poprawność autoryzacji, wpisz na serwerze:&#xA;&#xA;ssh rpi&#xA;&#xA;Powinno zwrócić This service allows sftp connections only.&#xA;&#xA;Za to sftp rpi powinno pozwolić Ci listować pliki w zadanym katalogu.&#xA;&#xA;(Jeżeli napotykasz &#34;broken pipe&#34;, zakomentuj linijkę UsePAM yes w konfiguracji sshd na rpi).&#xA;&#xA;Powinieneś zalogować się do sftp-owego shella rpi.&#xA;&#xA;Logika backupów&#xA;&#xA;Utwórz na serwerze plik, który będzie hasłem szyfrującym backup:&#xA;&#xA;dd if=/dev/urandom of=/backup-pwd bs=1k count=1&#xA;&#xA;Wyświetl go w base64 i zachowaj w manadżerze haseł:&#xA;&#xA;base64 &lt; /backup-pwd&#xA;&#xA;Zakładam, że na serwerze jest zainstalowany restic w przyzwoicie świeżej wersji.&#xA;&#xA;Zainicjuj repozytorium na rpi:&#xA;&#xA;restic init --password-file=/backup-pwd -r sftp:server-backup@rpi:data&#xA;&#xA;Następnie przygotujemy skrypt, który będzie przygotowywał pliki do zbackupowania. Idea jest taka, że dumpujemy wszystko co chcemy zbackupować do katalogu /backup albo bierzemy prosto z istniejącego katalogu. Ten skrypt będzie za każdym razem usuwał zawartość katalogu /backup.&#xA;&#xA;W katalogu domowym (lub gdziekolwiek chcesz) na serwerze utwórz plik backup.sh:&#xA;&#xA;!/bin/bash&#xA;&#xA;REPO=sftp:server-backup@rpi:data&#xA;PWDFILE=/backup-pwd&#xA;RESTIC=/usr/bin/restic&#xA;&#xA;echo &#34;Removing current backups...&#34;&#xA;rm -fr /backup/&#xA;&#xA;mkdir -p /backup&#xA;&#xA;####### Prepare data&#xA;&#xA;tutaj wpychamy dane do zbackupowania do /backup.&#xA;nie musimy ich tu wpychać, jeżeli po prostu są na dysku - wystarczy podać je jako argument do pierwszej komendy w sekcji &#34;Send Backups&#34;.&#xA;do /backup najlepiej wgrać artefakty, które nie są aktualnie w backupowalnej postaci na dysku, np. dumpy mysql&#xA;&#xA;przykłady skryptów backupujących dodałem na końcu, w sekcji &#34;bonusy&#34;&#xA;&#xA;Send backups&#xA;&#xA;echo &#34;Sending the backup to the destination...&#34;&#xA;&#xA;podaj tutaj listę katalogów do zbackupowania. Warto backupować katalog /etc.&#xA;$RESTIC -r &#34;$REPO&#34;  --password-file=$PWDFILE backup /backup /etc /var/phabricator-files /etc/nginx/sites  # ... + inne pliki / katalogi&#xA;&#xA;echo &#34;Pruning the backup on the destination...&#34;&#xA;poniższa konfiguracja będzie trzymała backupy z każdego z pięciu ostatnich dni, po jednym backupie dla każdego z ostatnich 10 tygodni, po jednym dla ostatnich 12 miesięcy i po jednym dla ostatnich 100 lat.&#xA;&#xA;$RESTIC -r &#34;$REPO&#34;  --password-file=$PWDFILE forget --prune  --keep-daily 5 --keep-weekly 10 --keep-monthly 12 --keep-yearly 100&#xA;&#xA;Protip: używaj ścieżek absolutnych do binarek, aby CRON nie miał z nimi problemów&#xA;&#xA;Cron&#xA;&#xA;Pozostaje tylko zautomatyzować wysyłanie backupu:&#xA;&#xA;Na serwerze:&#xA;&#xA;crontab -e&#xA;&#xA;I dodajemy linijkę:&#xA;&#xA;15 3    /root/backup.sh&#xA;&#xA;TODO: opisać, jak otrzymywać powiadomienia email o każdym backupie&#xA;&#xA;Bonusy&#xA;&#xA;Automatyczne czyszczenie starych zcache&#39;owanych mediów na Mastodonie w wersji yunohost:&#xA;&#xA;RAILSENV=production /opt/rbenv/shims/ruby /var/www/mastodon/live/bin/tootctl media remove-orphans&#xA;RAILSENV=production /opt/rbenv/shims/ruby /var/www/mastodon/live/bin/tootctl media remove --days=2&#xA;&#xA;Mongo backup example&#xA;&#xA;echo &#34;Dumping mongo...&#34;&#xA;mongodump -o /backup/mongo&#xA;&#xA;Yunohost backup example&#xA;&#xA;yunohost backup create --no-compress -o /backup&#xA;&#xA;Phabricator backup example&#xA;&#xA;echo &#34;Moving files from db to local disk...&#34;;&#xA;mysql -e &#34;Use  phabricatorfile; SELECT id FROM file WHERE storageEngine != &#39;local-disk&#39; AND byteSize   2048;&#34; | grep -o -E &#39;[0-9]+&#39; | xargs -P 4 -L 1 -I {} bash -c &#34;/var/www/phabricator/phabricator/bin/files migrate --engine local-disk F{} || exit 0&#34;&#xA;&#xA;echo &#34;Stopping php (and Phabricator...)&#34;&#xA;systemctl stop php7.4-fpm&#xA;&#xA;echo &#34;Dumping mysql databases...&#34;&#xA;mkdir -p /backup/mysql&#xA;mysql -N -e &#39;show databases&#39; | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction &#34;$dbname&#34;   &#34;/backup/mysql/$dbname&#34;.sql; done&#xA;&#xA;echo &#34;Starting php (and Phabricator...)&#34;&#xA;systemctl start php7.4-fpm&#xA;&#xA;Gdy jest podpięty volumen w katalogu /home i tam najlepiej zgrywać backupy yuno: &#xA;&#xA;TARGET=/home/backup-dir&#xA;&#xA;echo &#34;Removing current backups...&#34;&#xA;rm -fr $TARGET*&#xA;&#xA;mkdir -p $TARGET&#xA;mkdir -p $TARGET/data&#xA;touch $TARGET/.nobackup&#xA;&#xA;####### Yunohost backup&#xA;echo &#34;Backing up yunohost...&#34;&#xA;BACKUPCOREONLY=1 yunohost backup create --method copy -o $TARGET/data&#xA;&#xA;---&#xA;&#xA;Backupowanie invidiousa na yunohost jest problematyczne, z uwagi na ten issue. Aby zbackupować wszystkie aplikacje poza invidiousem, można użyć:&#xA;&#xA;APPS=$(yunohost app list | grep -v invidious | grep &#39;id:&#39; | awk &#39;{print $2}&#39; | tr &#39;\n&#39; &#39; &#39; )                                                                                                  &#xA;                                                                                                                                                                                              &#xA;BACKUPCOREONLY=1 yunohost backup create --method copy -o $TARGET/data --apps $APPS                                                                                                          &#xA;                                                                                      &#xA;&#xA;backup&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Opisuję, jak backupuję różne serwery którymi się opiekuję na dysk podłączony do raspberry pi u mnie w mieszkaniu. Backupy są szyfrowane i przyrostowe – tzn. unikam zapisywania na dysku wielokrotnie takich samych wersji plików.</p>



<hr>

<p><strong>UPDATE</strong>: napisałem <a href="https://git.kuba-orlik.name/kuba/backup-playbook" rel="nofollow">ansiblowy playbook do stawiania takiego backupu</a></p>

<hr>

<h2 id="ustanowienie-połączenia-vpn-pomiędzy-serwerem-a-rpi">Ustanowienie połączenia VPN pomiędzy serwerem a RPI</h2>

<p>Restic działa na zasadzie “push” – tzn serwer wysyła backupy, a raspberry musi cały czas na nie nasłuchiwać. Komunikacja pomiędzy rpi a serverem będzie odbywać się przez ssh za pośrednictwem OpenVPN.</p>

<p>Najprościej będzie skorzystać z konfiguracji static-key dla OpenVPN. Na stronie OpenVPN znajduje się <a href="https://openvpn.net/community-resources/static-key-mini-howto/" rel="nofollow">poręczny tutorial</a>, który dla mojej przyszłej wygody maksymalnie tutaj streszczę.</p>

<p>Na serwerze:</p>

<pre><code class="language-bash">cd /etc/openvpn/server
openvpn --genkey --secret rpi-to-server.key
cat rpi-to-server.key
</code></pre>

<p>Skopiuj zawartość pliku <code>.key</code> do schowka.</p>

<p>Na rpi:</p>

<pre><code class="language-bash">cd /etc/openvpn/client
nano rpi-to-server.key
</code></pre>

<p>Wklej klucz skopiowany z serwera.</p>

<p>Utwórz plik tekstowy <code>/etc/openvpn/server/rpi-to-server.conf</code> na serwerze:</p>

<pre><code>dev tun
ifconfig 10.8.5.1 10.8.5.2
secret rpi-to-server.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
log-append /var/log/openvpn-rpi.log
</code></pre>

<p>Oraz plik tekstowy <code>/etc/openvpn/client/rpi-to-server.conf</code> na rpi (trzeba wstawić tam domenową nazwę serwera):</p>

<pre><code>remote moja.domena.com
dev tun
ifconfig 10.8.5.2 10.8.5.1
secret rpi-to-server.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
log-append /var/log/openvpn-yuno.log
</code></pre>

<p>Otwórz port 1194 na serwerze:</p>

<pre><code>ufw allow 1194
</code></pre>

<p>Następnie na serwerze odpal:</p>

<pre><code>systemctl start openvpn-server@rpi-to-server
systemctl enable openvpn-server@rpi-to-server
</code></pre>

<p>Na rpi:</p>

<pre><code>systemctl start openvpn-client@rpi-to-server
systemctl enable openvpn-client@rpi-to-server
</code></pre>

<p>Powinno działać pingowanie <code>10.8.5.1</code> z rpi i pingowanie <code>10.8.5.2</code> z serwera.</p>

<h2 id="autoryzacja-rpi-i-serwera">Autoryzacja rpi i serwera</h2>

<p>Na rpi utworzymy użytkownika, który będzie miał dostęp tylko do katalogu z backupami:</p>

<pre><code class="language-bash">adduser server-backup # utwórz hasło i zapisz je w menedżerze haseł
mkdir /mnt/hdd/Backups/server-backup
cd /mnt/hdd/Backups/server-backup
chown root: .
chmod 755 .
mkdir data
chmod 755 data
chown server-backup: data
</code></pre>

<p>Uwaga – każdy z przodków wybranego katalogu (w przykładzie powyżej jest to <code>/mnt/hdd/Backups/server-backup</code>) musi należeć do użytkownika <code>root</code> i mieć prawa dostępu <code>755</code></p>

<p>Na serwerze dodaj taką linijkę do <code>/etc/hosts</code>:</p>

<pre><code>10.8.5.2    rpi
</code></pre>

<p>Na serwerze wygeneruj klucz ssh bez hasła za pomocą:</p>

<pre><code class="language-bash">$ ssh-keygen -t ed25519 -b 4096 -C &#34;rpi-backup&#34; -f /root/.ssh/rpi-backup -N &#34;&#34;
</code></pre>

<p>W pliku <code>~/.ssh/config</code> na serwerze dodaj:</p>

<pre><code>Host rpi
    User server-backup
    IdentityFile /root/.ssh/rpi-backup
</code></pre>

<p>Na serwerze wykonaj:</p>

<pre><code>ssh-copy-id -i /root/.ssh/rpi-backup rpi
</code></pre>

<p>I wpisz tam zapisane wcześniej hasło do usera <code>server-backup</code> na rpi.</p>

<p>Na rpi dodaj do pliku <code>/etc/ssh/sshd_config</code>:</p>

<pre><code>Match User server-backup
	ForceCommand internal-sftp
	PasswordAuthentication yes
	ChrootDirectory /mnt/hdd/Backups/server-backup
	PermitTunnel no
	AllowAgentForwarding no
	AllowTcpForwarding no
	X11Forwarding no
</code></pre>

<p>I zrestartuj sshd na rpi:</p>

<pre><code>systemctl restart sshd
</code></pre>

<p>Aby sprawdzić poprawność autoryzacji, wpisz na serwerze:</p>

<pre><code>ssh rpi
</code></pre>

<p>Powinno zwrócić <code>This service allows sftp connections only.</code></p>

<p>Za to <code>sftp rpi</code> powinno pozwolić Ci listować pliki w zadanym katalogu.</p>

<p>(Jeżeli napotykasz “broken pipe”, zakomentuj linijkę <code>UsePAM yes</code> w konfiguracji sshd na rpi).</p>

<p>Powinieneś zalogować się do sftp-owego shella rpi.</p>

<h2 id="logika-backupów">Logika backupów</h2>

<p>Utwórz na serwerze plik, który będzie hasłem szyfrującym backup:</p>

<pre><code class="language-bash">dd if=/dev/urandom of=/backup-pwd bs=1k count=1
</code></pre>

<p>Wyświetl go w base64 i zachowaj w manadżerze haseł:</p>

<pre><code>base64 &lt; /backup-pwd
</code></pre>

<p>Zakładam, że na serwerze jest zainstalowany <code>restic</code> w przyzwoicie świeżej wersji.</p>

<p>Zainicjuj repozytorium na rpi:</p>

<pre><code>restic init --password-file=/backup-pwd -r sftp:server-backup@rpi:data
</code></pre>

<p>Następnie przygotujemy skrypt, który będzie przygotowywał pliki do zbackupowania. Idea jest taka, że dumpujemy wszystko co chcemy zbackupować do katalogu <code>/backup</code> albo bierzemy prosto z istniejącego katalogu. Ten skrypt będzie za każdym razem usuwał zawartość katalogu <code>/backup</code>.</p>

<p>W katalogu domowym (lub gdziekolwiek chcesz) na serwerze utwórz plik <code>backup.sh</code>:</p>

<pre><code class="language-bash">#!/bin/bash

REPO=sftp:server-backup@rpi:data
PWD_FILE=/backup-pwd
RESTIC=/usr/bin/restic

echo &#34;Removing current backups...&#34;
rm -fr /backup/*

mkdir -p /backup

####### Prepare data

# tutaj wpychamy dane do zbackupowania do /backup.
# nie musimy ich tu wpychać, jeżeli po prostu są na dysku - wystarczy podać je jako argument do pierwszej komendy w sekcji &#34;Send Backups&#34;.
# do /backup najlepiej wgrać artefakty, które nie są aktualnie w backupowalnej postaci na dysku, np. dumpy mysql

# przykłady skryptów backupujących dodałem na końcu, w sekcji &#34;bonusy&#34;

###### Send backups

echo &#34;Sending the backup to the destination...&#34;

# podaj tutaj listę katalogów do zbackupowania. Warto backupować katalog `/etc`.
$RESTIC -r &#34;$REPO&#34;  --password-file=$PWD_FILE backup /backup /etc /var/phabricator-files /etc/nginx/sites  # ... + inne pliki / katalogi

echo &#34;Pruning the backup on the destination...&#34;
# poniższa konfiguracja będzie trzymała backupy z każdego z pięciu ostatnich dni, po jednym backupie dla każdego z ostatnich 10 tygodni, po jednym dla ostatnich 12 miesięcy i po jednym dla ostatnich 100 lat.

$RESTIC -r &#34;$REPO&#34;  --password-file=$PWD_FILE forget --prune  --keep-daily 5 --keep-weekly 10 --keep-monthly 12 --keep-yearly 100
</code></pre>

<p>Protip: używaj ścieżek absolutnych do binarek, aby CRON nie miał z nimi problemów</p>

<h2 id="cron">Cron</h2>

<p>Pozostaje tylko zautomatyzować wysyłanie backupu:</p>

<p>Na serwerze:</p>

<pre><code>crontab -e
</code></pre>

<p>I dodajemy linijkę:</p>

<pre><code>15 3 * * * /root/backup.sh
</code></pre>

<p>TODO: opisać, jak otrzymywać powiadomienia email o każdym backupie</p>

<h2 id="bonusy">Bonusy</h2>

<h3 id="automatyczne-czyszczenie-starych-zcache-owanych-mediów-na-mastodonie-w-wersji-yunohost">Automatyczne czyszczenie starych zcache&#39;owanych mediów na Mastodonie w wersji yunohost:</h3>

<pre><code class="language-bash">RAILS_ENV=production /opt/rbenv/shims/ruby /var/www/mastodon/live/bin/tootctl media remove-orphans
RAILS_ENV=production /opt/rbenv/shims/ruby /var/www/mastodon/live/bin/tootctl media remove --days=2
</code></pre>

<pre><code>###### Mongo backup example

echo &#34;Dumping mongo...&#34;
mongodump -o /backup/mongo

###### Yunohost backup example

yunohost backup create --no-compress -o /backup


###### Phabricator backup example

echo &#34;Moving files from db to local disk...&#34;;
mysql -e &#34;Use  phabricator_file; SELECT id FROM file WHERE storageEngine != &#39;local-disk&#39; AND byteSize &gt; 2048;&#34; | grep -o -E &#39;[0-9]+&#39; | xargs -P 4 -L 1 -I {} bash -c &#34;/var/www/phabricator/phabricator/bin/files migrate --engine local-disk F{} || exit 0&#34;


echo &#34;Stopping php (and Phabricator...)&#34;
systemctl stop php7.4-fpm

echo &#34;Dumping mysql databases...&#34;
mkdir -p /backup/mysql
mysql -N -e &#39;show databases&#39; | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction &#34;$dbname&#34; &gt; &#34;/backup/mysql/$dbname&#34;.sql; done

echo &#34;Starting php (and Phabricator...)&#34;
systemctl start php7.4-fpm
</code></pre>

<p>Gdy jest podpięty volumen w katalogu <code>/home</code> i tam najlepiej zgrywać backupy yuno:</p>

<pre><code>TARGET=/home/backup-dir

echo &#34;Removing current backups...&#34;
rm -fr $TARGET*

mkdir -p $TARGET
mkdir -p $TARGET/data
touch $TARGET/.nobackup

####### Yunohost backup
echo &#34;Backing up yunohost...&#34;
BACKUP_CORE_ONLY=1 yunohost backup create --method copy -o $TARGET/data

</code></pre>

<hr>

<p>Backupowanie invidiousa na yunohost jest problematyczne, z uwagi na <a href="https://github.com/YunoHost-Apps/invidious_ynh/issues/17" rel="nofollow">ten issue</a>. Aby zbackupować wszystkie aplikacje poza invidiousem, można użyć:</p>

<pre><code class="language-bash">APPS=$(yunohost app list | grep -v invidious | grep &#39;id:&#39; | awk &#39;{print $2}&#39; | tr &#39;\n&#39; &#39; &#39; )                                                                                                  
                                                                                                                                                                                              
BACKUP_CORE_ONLY=1 yunohost backup create --method copy -o $TARGET/data --apps $APPS                                                                                                          
                                                                                      
</code></pre>

<p><a href="/kodzi/tag:backup" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">backup</span></a></p>
]]></content:encoded>
      <guid>https://blog.kuba-orlik.name/kodzi/automatyczne-szyfrowane-backupy-serwera-na-dysk-podpiety-do-rpi</guid>
      <pubDate>Fri, 12 Mar 2021 23:31:06 +0100</pubDate>
    </item>
  </channel>
</rss>