about summary refs log tree commit diff
path: root/nixos/modules/services/backup/borgbackup.xml
blob: 2b9e0baa6d09ad714db10a19eb3f57f033210d95 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<!-- Do not edit this file directly, edit its companion .md instead
     and regenerate this file using nixos/doc/manual/md-to-db.sh -->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="module-borgbase">
  <title>BorgBackup</title>
  <para>
    <emphasis>Source:</emphasis>
    <filename>modules/services/backup/borgbackup.nix</filename>
  </para>
  <para>
    <emphasis>Upstream documentation:</emphasis>
    <link xlink:href="https://borgbackup.readthedocs.io/">https://borgbackup.readthedocs.io/</link>
  </para>
  <para>
    <link xlink:href="https://www.borgbackup.org/">BorgBackup</link>
    (short: Borg) is a deduplicating backup program. Optionally, it
    supports compression and authenticated encryption.
  </para>
  <para>
    The main goal of Borg is to provide an efficient and secure way to
    backup data. The data deduplication technique used makes Borg
    suitable for daily backups since only changes are stored. The
    authenticated encryption technique makes it suitable for backups to
    not fully trusted targets.
  </para>
  <section xml:id="module-services-backup-borgbackup-configuring">
    <title>Configuring</title>
    <para>
      A complete list of options for the Borgbase module may be found
      <link linkend="opt-services.borgbackup.jobs">here</link>.
    </para>
  </section>
  <section xml:id="opt-services-backup-borgbackup-local-directory">
    <title>Basic usage for a local backup</title>
    <para>
      A very basic configuration for backing up to a locally accessible
      directory is:
    </para>
    <programlisting>
{
    opt.services.borgbackup.jobs = {
      { rootBackup = {
          paths = &quot;/&quot;;
          exclude = [ &quot;/nix&quot; &quot;/path/to/local/repo&quot; ];
          repo = &quot;/path/to/local/repo&quot;;
          doInit = true;
          encryption = {
            mode = &quot;repokey&quot;;
            passphrase = &quot;secret&quot;;
          };
          compression = &quot;auto,lzma&quot;;
          startAt = &quot;weekly&quot;;
        };
      }
    };
}
</programlisting>
    <warning>
      <para>
        If you do not want the passphrase to be stored in the
        world-readable Nix store, use passCommand. You find an example
        below.
      </para>
    </warning>
  </section>
  <section xml:id="opt-services-backup-create-server">
    <title>Create a borg backup server</title>
    <para>
      You should use a different SSH key for each repository you write
      to, because the specified keys are restricted to running borg
      serve and can only access this single repository. You need the
      output of the generate pub file.
    </para>
    <programlisting>
# sudo ssh-keygen -N '' -t ed25519 -f /run/keys/id_ed25519_my_borg_repo
# cat /run/keys/id_ed25519_my_borg_repo
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID78zmOyA+5uPG4Ot0hfAy+sLDPU1L4AiIoRYEIVbbQ/ root@nixos
</programlisting>
    <para>
      Add the following snippet to your NixOS configuration:
    </para>
    <programlisting>
{
  services.borgbackup.repos = {
    my_borg_repo = {
      authorizedKeys = [
        &quot;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID78zmOyA+5uPG4Ot0hfAy+sLDPU1L4AiIoRYEIVbbQ/ root@nixos&quot;
      ] ;
      path = &quot;/var/lib/my_borg_repo&quot; ;
    };
  };
}
</programlisting>
  </section>
  <section xml:id="opt-services-backup-borgbackup-remote-server">
    <title>Backup to the borg repository server</title>
    <para>
      The following NixOS snippet creates an hourly backup to the
      service (on the host nixos) as created in the section above. We
      assume that you have stored a secret passphrasse in the file
      <filename>/run/keys/borgbackup_passphrase</filename>, which should
      be only accessible by root
    </para>
    <programlisting>
{
  services.borgbackup.jobs = {
    backupToLocalServer = {
      paths = [ &quot;/etc/nixos&quot; ];
      doInit = true;
      repo =  &quot;borg@nixos:.&quot; ;
      encryption = {
        mode = &quot;repokey-blake2&quot;;
        passCommand = &quot;cat /run/keys/borgbackup_passphrase&quot;;
      };
      environment = { BORG_RSH = &quot;ssh -i /run/keys/id_ed25519_my_borg_repo&quot;; };
      compression = &quot;auto,lzma&quot;;
      startAt = &quot;hourly&quot;;
    };
  };
};
</programlisting>
    <para>
      The following few commands (run as root) let you test your backup.
    </para>
    <programlisting>
&gt; nixos-rebuild switch
...restarting the following units: polkit.service
&gt; systemctl restart borgbackup-job-backupToLocalServer
&gt; sleep 10
&gt; systemctl restart borgbackup-job-backupToLocalServer
&gt; export BORG_PASSPHRASE=topSecrect
&gt; borg list --rsh='ssh -i /run/keys/id_ed25519_my_borg_repo' borg@nixos:.
nixos-backupToLocalServer-2020-03-30T21:46:17 Mon, 2020-03-30 21:46:19 [84feb97710954931ca384182f5f3cb90665f35cef214760abd7350fb064786ac]
nixos-backupToLocalServer-2020-03-30T21:46:30 Mon, 2020-03-30 21:46:32 [e77321694ecd160ca2228611747c6ad1be177d6e0d894538898de7a2621b6e68]
</programlisting>
  </section>
  <section xml:id="opt-services-backup-borgbackup-borgbase">
    <title>Backup to a hosting service</title>
    <para>
      Several companies offer
      <link xlink:href="https://www.borgbackup.org/support/commercial.html">(paid)
      hosting services</link> for Borg repositories.
    </para>
    <para>
      To backup your home directory to borgbase you have to:
    </para>
    <itemizedlist>
      <listitem>
        <para>
          Generate a SSH key without a password, to access the remote
          server. E.g.
        </para>
        <programlisting>
sudo ssh-keygen -N '' -t ed25519 -f /run/keys/id_ed25519_borgbase
</programlisting>
      </listitem>
      <listitem>
        <para>
          Create the repository on the server by following the
          instructions for your hosting server.
        </para>
      </listitem>
      <listitem>
        <para>
          Initialize the repository on the server. Eg.
        </para>
        <programlisting>
sudo borg init --encryption=repokey-blake2  \
    -rsh &quot;ssh -i /run/keys/id_ed25519_borgbase&quot; \
    zzz2aaaaa@zzz2aaaaa.repo.borgbase.com:repo
</programlisting>
      </listitem>
      <listitem>
        <para>
          Add it to your NixOS configuration, e.g.
        </para>
        <programlisting>
{
    services.borgbackup.jobs = {
    my_Remote_Backup = {
        paths = [ &quot;/&quot; ];
        exclude = [ &quot;/nix&quot; &quot;'**/.cache'&quot; ];
        repo =  &quot;zzz2aaaaa@zzz2aaaaa.repo.borgbase.com:repo&quot;;
          encryption = {
          mode = &quot;repokey-blake2&quot;;
          passCommand = &quot;cat /run/keys/borgbackup_passphrase&quot;;
        };
        environment = { BORG_RSH = &quot;ssh -i /run/keys/id_ed25519_borgbase&quot;; };
        compression = &quot;auto,lzma&quot;;
        startAt = &quot;daily&quot;;
    };
  };
}}
</programlisting>
      </listitem>
    </itemizedlist>
  </section>
  <section xml:id="opt-services-backup-borgbackup-vorta">
    <title>Vorta backup client for the desktop</title>
    <para>
      Vorta is a backup client for macOS and Linux desktops. It
      integrates the mighty BorgBackup with your desktop environment to
      protect your data from disk failure, ransomware and theft.
    </para>
    <para>
      It can be installed in NixOS e.g. by adding
      <literal>pkgs.vorta</literal> to
      <xref linkend="opt-environment.systemPackages" />.
    </para>
    <para>
      Details about using Vorta can be found under
      <link xlink:href="https://vorta.borgbase.com/usage">https://vorta.borgbase.com</link>
      .
    </para>
  </section>
</chapter>