Compare commits

..

49 Commits
0.17 ... 0.24

Author SHA1 Message Date
f6860115a3 remove ununsed log 2020-11-14 00:40:16 +01:00
f43e73ce41 process end in exit 2020-11-14 00:33:52 +01:00
6b4277b57b changelog 2020-11-13 21:47:33 +01:00
d4b8a7223f don't require config for update 2020-11-13 16:27:19 +01:00
cfcc010bc5 update some pkgs 2020-11-13 15:48:48 +01:00
1fd009b819 add ci mode 2020-11-13 15:48:40 +01:00
91e902d7ef docs 2020-11-13 15:48:20 +01:00
b690c1c3a9 correct link 2020-11-07 12:55:16 +01:00
b025aeeeab version bump 2020-11-07 12:50:05 +01:00
01cafb9436 Update README.md 2020-11-07 12:47:06 +01:00
6a2c34df48 vercel 2020-11-07 12:41:51 +01:00
88e47efc68 Merge pull request #30 from cupcakearmy/rewrite
Rewrite with commander & docs cleanup
2020-11-06 23:51:57 +01:00
60d7e0b561 rewrite with commander 2020-11-06 23:51:23 +01:00
e9a7e03af7 docs 2020-11-06 22:48:19 +01:00
d959a50b5a docs 2020-11-06 22:42:00 +01:00
b5bc1a4cee Merge pull request #27 from sumnerboy12/patch-1
fix typo on skipping/scheduled log message
2020-07-24 10:38:07 +02:00
Ben Jones
e61c940d23 fix typo on skipping/scheduled log message 2020-07-24 11:53:27 +12:00
7fb0fbd467 new version 2020-07-23 13:34:23 +02:00
cbc1b33750 docs 2020-07-23 13:33:14 +02:00
e7be01da37 Merge pull request #26 from sumnerboy12/patch-1
add support for rest server backends
2020-07-23 13:29:20 +02:00
Ben Jones
309073fe4d Update available.md 2020-07-23 23:26:31 +12:00
Ben Jones
1243721a7e add support for rest server backends
Backend configuration would be;

```
rest_repo:
  type: rest
  path: http://backup:8001/repo_name
```

Would result in the following env var;
```
RESTIC_REPOSITORY=rest:http://backup:8001/repo_name
```
2020-07-23 15:21:55 +12:00
ebb934d1c5 docs 2020-06-28 22:48:00 +02:00
8417a6e0aa update docs version 2020-06-28 22:47:46 +02:00
2b5efd0499 cron docs 2020-06-28 22:36:44 +02:00
af6e715b27 generate docs 2020-06-28 22:33:22 +02:00
9484299cd9 cron working now 2020-06-28 22:33:15 +02:00
ef93fef36a help for releasing 2020-06-25 09:36:17 +02:00
995f2250a1 version bump 2020-06-25 09:36:11 +02:00
3498e6da7b fix check for executable 2020-06-25 09:33:08 +02:00
7128983581 lock file 2020-06-25 09:21:33 +02:00
158407927a Merge branch 'master' of https://github.com/cupcakearmy/autorestic 2020-06-25 09:17:23 +02:00
ea8bf83799 always unlock 2020-06-25 09:17:20 +02:00
e8a8ccccd0 use longer wrap length 2020-06-25 09:17:02 +02:00
b332897713 upgrade packages, included lock file, fixed types 2020-06-25 09:16:53 +02:00
369037ea77 Merge pull request #23 from jin-park-dev/feature/spell-fix
Feature/spell fix
2020-06-25 08:43:59 +02:00
Jin Park
52cd6fe3fd Fix e to E 2020-06-25 01:40:04 +01:00
Jin Park
b6f7ef6577 Minor spell fixes in doc 2020-06-25 01:23:31 +01:00
1a891fffbd funding 2020-05-26 10:31:59 +02:00
ed68160a9a Update README.md 2020-05-20 19:31:59 +02:00
20ecd21928 Update README.md 2020-05-20 19:30:48 +02:00
df6fd75ca4 Update README.md 2020-05-20 19:30:31 +02:00
c918fb6ded Update README.md 2020-05-20 19:30:05 +02:00
2bc8fe4ee7 logo 2020-05-20 19:26:13 +02:00
757a134362 default open 2020-05-17 19:04:44 +02:00
6bb36cbde0 docs 2020-05-17 18:56:14 +02:00
5c0b67b7fb version bump 2020-05-17 18:14:09 +02:00
1520e10a59 do not allow multiple instances 2020-05-17 18:13:50 +02:00
f9c645120b run in shell to set paths and find restic 2020-05-17 18:12:58 +02:00
107 changed files with 7514 additions and 3527 deletions

15
.codedoc/build.ts Normal file
View File

@@ -0,0 +1,15 @@
import { build } from '@codedoc/core';
import { config } from './config';
import { installTheme$ } from './content/theme';
import { content } from './content';
build(config, content, installTheme$, {
resolve: {
modules: ['.codedoc/node_modules']
},
resolveLoader: {
modules: ['.codedoc/node_modules']
}
});

24
.codedoc/config.ts Normal file
View File

@@ -0,0 +1,24 @@
import { configuration } from '@codedoc/core'
export const config = configuration({
src: {
base: 'docs',
},
dest: {
html: './build',
assets: './build',
bundle: './_',
styles: './_',
},
page: {
title: {
base: 'Autorestic',
},
},
misc: {
github: {
user: 'cupcakearmy',
repo: 'autorestic',
},
},
})

View File

@@ -0,0 +1,19 @@
import { CodedocConfig } from '@codedoc/core';
import { Footer as _Footer, GitterToggle$, Watermark} from '@codedoc/core/components';
export function Footer(config: CodedocConfig, renderer: any) {
let github$;
if (config.misc?.github)
github$ = <a href={`https://github.com/${config.misc.github.user}/${config.misc.github.repo}/`}
target="_blank">GitHub</a>;
let community$;
if (config.misc?.gitter)
community$ = <GitterToggle$ room={config.misc.gitter.room}/>
if (github$ && community$) return <_Footer>{github$}<hr/>{community$}</_Footer>;
else if (github$) return <_Footer>{github$}</_Footer>;
else if (community$) return <_Footer>{community$}</_Footer>;
else return <_Footer><Watermark/></_Footer>;
}

View File

@@ -0,0 +1,21 @@
import { CodedocConfig } from '@codedoc/core';
import { Header as _Header, GithubButton, Watermark } from '@codedoc/core/components';
export function Header(config: CodedocConfig, renderer: any) {
return (
<_Header>{config.misc?.github ?
<fragment>
<GithubButton action={config.misc.github.action || 'Star'}
repo={config.misc.github.repo}
user={config.misc.github.user}
large={config.misc.github.large === true}
count={config.misc.github.count !== false}
standardIcon={config.misc.github.standardIcon !== false}/>
<br/><br/>
</fragment>
: ''}
<Watermark/>
</_Header>
)
}

View File

@@ -0,0 +1,57 @@
import { RendererLike } from '@connectv/html'
import { File } from 'rxline/fs'
import {
Page,
Meta,
ContentNav,
Fonts,
ToC,
GithubSearch$,
} from '@codedoc/core/components'
import { config } from '../config'
import { Header } from './header'
import { Footer } from './footer'
export function content(
_content: HTMLElement,
toc: HTMLElement,
renderer: RendererLike<any, any>,
file: File<string>
) {
return (
<Page
title={config.page.title.extractor(_content, config, file)}
favicon={config.page.favicon}
meta={<Meta {...config.page.meta} />}
fonts={<Fonts {...config.page.fonts} />}
scripts={config.page.scripts}
stylesheets={config.page.stylesheets}
header={<Header {...config} />}
footer={<Footer {...config} />}
toc={
<ToC
default={'open'}
search={
config.misc?.github ? (
<GithubSearch$
repo={config.misc.github.repo}
user={config.misc.github.user}
root={config.src.base}
pick={config.src.pick.source}
drop={config.src.drop.source}
/>
) : (
false
)
}
>
{toc}
</ToC>
}
>
{_content}
<ContentNav content={_content} />
</Page>
)
}

View File

@@ -0,0 +1,8 @@
import { funcTransport } from '@connectv/sdh/transport';
import { useTheme } from '@codedoc/core/transport';
import { theme } from '../theme';
export function installTheme() { useTheme(theme); }
export const installTheme$ = /*#__PURE__*/funcTransport(installTheme);

4739
.codedoc/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

5
.codedoc/package.json Normal file
View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"@codedoc/core": "^0.2.15"
}
}

18
.codedoc/serve.ts Normal file
View File

@@ -0,0 +1,18 @@
import { join } from 'path';
import { serve } from '@codedoc/core';
import { config } from './config';
import { content } from './content';
import { installTheme$ } from './content/theme';
const root = join(__dirname, '../');
serve(root, config, content, installTheme$, {
resolve: {
modules: ['.codedoc/node_modules']
},
resolveLoader: {
modules: ['.codedoc/node_modules']
}
});

11
.codedoc/theme.ts Normal file
View File

@@ -0,0 +1,11 @@
import { createTheme } from '@codedoc/core/transport';
export const theme = /*#__PURE__*/createTheme({
light: {
primary: '#1eb2a6'
},
dark: {
primary: '#1eb2a6'
}
});

26
.codedoc/tsconfig.json Normal file
View File

@@ -0,0 +1,26 @@
{
"compilerOptions": {
"target": "es6",
"noImplicitAny": true,
"declaration": false,
"strictNullChecks": true,
"strictFunctionTypes": true,
"noImplicitThis": true,
"alwaysStrict": true,
"sourceMap": true,
"moduleResolution": "node",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"jsx": "react",
"jsxFactory": "renderer.create",
"lib": [
"es2017",
"dom"
]
},
"include": [
"./**/*"
]
}

22
.codedoc/watch.ts Normal file
View File

@@ -0,0 +1,22 @@
import { exec, spawn } from 'child_process';
import { config } from './config';
const cmd = 'ts-node-dev';
const params = `--project .codedoc/tsconfig.json`
+ ` -T --watch ${config.src.base},.codedoc`
+ ` --ignore-watch .codedoc/node_modules`
+ ` .codedoc/serve`;
if (process.platform === 'win32') {
const child = exec(cmd + ' ' + params);
child.stdout?.pipe(process.stdout);
child.stderr?.pipe(process.stderr);
child.on('close', () => {});
}
else {
const child = spawn(cmd, [params], { stdio: 'inherit', shell: 'bash' });
child.on('close', () => {});
}

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
github: cupcakearmy

BIN
.github/logo.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

9
.gitignore vendored
View File

@@ -1,10 +1,9 @@
# Editors
.idea
.vscode
# Node
node_modules/
package-lock.json
yarn.lock
# Build & Runtime
bin
@@ -13,11 +12,9 @@ data
restore
docker
Dockerfile
build
# Config
.autorestic.yml
.autorestic.lock
.docker.yml
# Docs
.codedoc
.docker.yml

View File

@@ -1,3 +1,4 @@
semi: false
singleQuote: true
trailingComma: 'es5'
trailingComma: 'es5'
printWidth: 150

View File

@@ -1,4 +1,3 @@
## 0.17
## 0.24
- new docs
- cron command
- Exit code on failure

View File

@@ -1,6 +1,21 @@
# autorestic
High backup level CLI utility for [restic](https://restic.net/).
<p align="center">
<br>
<br>
<br>
<img align="center" src="https://github.com/cupcakearmy/autorestic/raw/master/.github/logo.png" height="50" alt="autorestic logo">
<br>
<br>
<p align="center">
Config driven, easy backup cli for <a href="https://restic.net/">restic</a>.
<br>
<strong><a href="https://autorestic.vercel.app/">»»» Docs & Getting Started »»»</a></strong>
</p>
</p>
Autorestic is a wrapper around the amazing [restic](https://restic.net/). While being amazing the restic cli can be a bit overwhelming and difficoult to manage if you have many different location that you want to backup to multiple locations. This utility is aimed at making this easier 🙂
<br>
<br>
📒 **[DOCS](https://cupcakearmy.github.io/autorestic/)** 📒
### Why / What?
Autorestic is a wrapper around the amazing [restic](https://restic.net/). While being amazing the restic cli can be a bit overwhelming and difficult to manage if you have many different location that you want to backup to multiple locations. This utility is aimed at making this easier 🙂

9
RELEASE.md Normal file
View File

@@ -0,0 +1,9 @@
# Releasing
Releases are handled by the CD server with includes checksums for each binary.
```bash
git tag 0.x
git push
git push origin --tags
```

View File

@@ -7,7 +7,7 @@
>
> [Overview](/location/overview)
> [Hooks](/location/hooks)
> [Exluding Files](/location/exclude)
> [Excluding Files](/location/exclude)
> [Forget Policy](/location/forget)
> [Cron](/location/cron)
> [Docker Volumes](/location/docker)
@@ -19,6 +19,7 @@
> :Collapse label=CLI
>
> [General](/cli/general)
> [Info](/cli/info)
> [Check](/cli/check)
> [Backup](/cli/backup)

File diff suppressed because one or more lines are too long

View File

@@ -48,4 +48,15 @@ backends:
path: my-host:/remote/path/on/the/server
```
## Rest Server
See [here](https://github.com/restic/rest-server) for how to install a rest server backend and [here](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server) for further documentation.
```yaml
backends:
name-of-backend:
type: rest
path: http://localhost:8000/repo_name
```
> :ToCPrevNext

File diff suppressed because one or more lines are too long

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | Backends</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="backends" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>Backends</h1><div class="contentnav-0-0-14" data-no-search=""><a href="#backends" class="h1" data-content-highlight="backends">Backends</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="GNSXnlBhXj">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("GNSXnlBhXj", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="IalauPyNzn">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("IalauPyNzn", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="oJrBRLjhOg">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("oJrBRLjhOg", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="cZ_oLXMNNy">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("cZ_oLXMNNy", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="cvnSMiFXuL">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("cvnSMiFXuL", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="FlgRfeyFrY">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("FlgRfeyFrY", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="wMLYXDNWjo">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("wMLYXDNWjo", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

File diff suppressed because one or more lines are too long

13
docs/cli/backup.md Normal file
View File

@@ -0,0 +1,13 @@
# Backup
```bash
autorestic backup [-l, --location] [-a, --all]
```
Performs a backup of all locations if the `-a` flag is passed. To only backup some locations pass one or more `-l` or `--location` flags.
```bash
autorestic backup -l my-location
```
> :ToCPrevNext

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
# check
# Check
```bash
autorestic check [-b, --backend] [-a, --all]

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | Cron</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="cron" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>Cron</h1><pre class=""><code class="bash code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span></span></span><div class="line-0-0-5 " data-content="autorestic cron"><span class="lineCounter-0-0-4 prim">1</span>autorestic <span class="token function">cron</span></div><br></code></pre><p>This command is modtly intended to be triggered by an automated system like systemd or crontab.</p><p>It will run cron jobs es <a href="/autorestic/locations/cron">specified in the cron section</a> of a specific location.</p><script id="O_aOdEQuYg">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("O_aOdEQuYg", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#cron" class="h1" data-content-highlight="cron">Cron</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="fcilFUHmkO">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("fcilFUHmkO", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="CnnbQMdrpE">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("CnnbQMdrpE", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="FbPHSDLXcR">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("FbPHSDLXcR", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="isfvbRMpGA">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("isfvbRMpGA", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="TtdtfcifZq">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("TtdtfcifZq", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="QRI_LiMpkt">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("QRI_LiMpkt", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="reFMhIwCOr">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("reFMhIwCOr", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

View File

@@ -4,7 +4,7 @@
autorestic cron
```
This command is modtly intended to be triggered by an automated system like systemd or crontab.
This command is mostly intended to be triggered by an automated system like systemd or crontab.
It will run cron jobs es [specified in the cron section](/locations/cron) of a specific location.

File diff suppressed because one or more lines are too long

View File

@@ -10,6 +10,6 @@ This is avery handy command which enables you to run any native restic command o
autorestic exec -a -- snapshots
```
With `exec` you can basically run every cli command that you would be able to run with the restic cli. It only prefillst path, key, etc.
With `exec` you can basically run every cli command that you would be able to run with the restic cli. It only pre-fills path, key, etc.
> :ToCPrevNext

File diff suppressed because one or more lines are too long

29
docs/cli/general.md Normal file
View File

@@ -0,0 +1,29 @@
# General
## `--version`
Prints the current version
```bash
autorestic --version
```
## `--c, --config`
Specify the config file to be used.
If omitted `autorestic` will search for for a `.autorestic.yml` in the current directory and your home directory.
```bash
autorestic -c /path/to/my/config.yml
```
## `--ci`
> Available since version 0.22
Run the CLI in CI Mode, which means there will be no interactivity.
This can be useful when you want to run cron e.g. as all the output will be saved.
```bash
autorestic --ci
```

View File

@@ -1,57 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | info</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="info" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>info</h1><p>Displays the config file that autorestic is refering to.
Usefull when you want to quickly see what locations are being backuped where.</p><p><strong>Pro tip:</strong> if it gets a bit long you can read it more easily with <code>autorestic info | less</code> 😉</p><pre class=""><code class="bash code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span></span></span><div class="line-0-0-5 " data-content="autorestic info"><span class="lineCounter-0-0-4 prim">1</span>autorestic info</div><br></code></pre><h2 id="with-a-custom-file" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>With a custom file</h2><pre class=""><code class="bash code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span></span></span><div class="line-0-0-5 " data-content="autorestic -c path/to/some/config.yml info"><span class="lineCounter-0-0-4 prim">1</span>autorestic -c path/to/some/config.yml info</div><br></code></pre><script id="GyQprlRakI">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("GyQprlRakI", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#info" class="h1" data-content-highlight="info">info</a><a href="#with-a-custom-file" class="h2" data-content-highlight="with-a-custom-file">With a custom file</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="THkEpAqvtI">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("THkEpAqvtI", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="zGicgWIC_t">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("zGicgWIC_t", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="oPguniuEYv">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("oPguniuEYv", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="BUCBIEDpuS">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("BUCBIEDpuS", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="wJNSKGVSXH">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("wJNSKGVSXH", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="tMcddMGaNJ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("tMcddMGaNJ", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="czotsScjjc">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("czotsScjjc", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

View File

@@ -1,7 +1,7 @@
# info
# Info
Displays the config file that autorestic is refering to.
Usefull when you want to quickly see what locations are being backuped where.
Displays the config file that autorestic is referring to.
Useful when you want to quickly see what locations are being backed-up where.
**Pro tip:** if it gets a bit long you can read it more easily with `autorestic info | less` 😉

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | Install</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/docs/assets/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/docs/assets/codedoc-bundle.js"></script></head><body><div class="header-0-0-5"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-4" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="install" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>Install</h1><p>Installs both restic and autorestic to <code>/usr/local/bin</code>.</p><pre class=""><code class="bash code-0-0-11" tabindex="0"><span class="wmbar-0-0-14"><span></span><span></span><span></span><span></span></span><div class="line-0-0-13 " data-content="autorestic install"><span class="lineCounter-0-0-12 prim">1</span>autorestic <span class="token function">install</span></div><br></code></pre><div class="contentnav-0-0-10" data-no-search=""><a href="#install" class="h1" data-content-highlight="install">Install</a></div></div><div id="-codedoc-toc" class="toc-0-0-7"><div class="content-0-0-8"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-3 "><script id="XRGCUvVncP">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("XRGCUvVncP", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/locations/overview">Overview</a>
<a href="/autorestic/locations/types">Types</a>
<a href="/autorestic/locations/cron">Cron</a>
<a href="/autorestic/locations/hooks">Hooks</a>
<a href="/autorestic/locations/exclude">Exclude</a>
<a href="/autorestic/locations/forget">Forget Policy</a>
<a href="/autorestic/locations/advanced">Advanced Options</a></p></div></div><div class="collapse-0-0-3 "><script id="friLMtMuGC">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("friLMtMuGC", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-3 "><script id="anTYnIWqbu">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("anTYnIWqbu", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-9"><script id="jzgqiz_Esn">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("jzgqiz_Esn", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-6"><div class="left"><script id="asTmHrhSzG">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("asTmHrhSzG", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="LyCwkXYPUl">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("LyCwkXYPUl", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="mhGgCSJbMB">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("mhGgCSJbMB", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | Install</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="install" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>Install</h1><p>Installs both restic and autorestic to <code>/usr/local/bin</code>.</p><pre class=""><code class="bash code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span></span></span><div class="line-0-0-5 " data-content="autorestic install"><span class="lineCounter-0-0-4 prim">1</span>autorestic <span class="token function">install</span></div><br></code></pre><script id="JxghuHZGdc">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("JxghuHZGdc", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#install" class="h1" data-content-highlight="install">Install</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="su_ZjdszSj">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("su_ZjdszSj", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="UdtQri_cEx">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("UdtQri_cEx", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="dopRimicAn">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("dopRimicAn", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="ZkNdsnJYsZ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("ZkNdsnJYsZ", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="aKYAuTsQzZ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("aKYAuTsQzZ", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="zM_iKmUebH">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("zM_iKmUebH", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="eLCMkXzjoj">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("eLCMkXzjoj", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

File diff suppressed because one or more lines are too long

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | Uninstall</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="uninstall" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>Uninstall</h1><p>Installs both restic and autorestic from <code>/usr/local/bin</code>.</p><pre class=""><code class="bash code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span></span></span><div class="line-0-0-5 " data-content="autorestic uninstall"><span class="lineCounter-0-0-4 prim">1</span>autorestic uninstall</div><br></code></pre><script id="LxFGjAGVBx">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("LxFGjAGVBx", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#uninstall" class="h1" data-content-highlight="uninstall">Uninstall</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="HaMjtZoxUL">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("HaMjtZoxUL", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="xUBRW_EMLd">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("xUBRW_EMLd", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="tYYbzxROpQ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("tYYbzxROpQ", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="wIReKlOBOo">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("wIReKlOBOo", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="GeMKjbAicN">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("GeMKjbAicN", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="CtXUhFwJLZ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("CtXUhFwJLZ", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="DcbchwJqbR">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("DcbchwJqbR", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | Update</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="update" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>Update</h1><p>Autorestic can update itself! Super handy right? Simply run autorestic update and we will check for you if there are updates for restic and autorestic and install them if necessary.</p><pre class=""><code class="bash code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span></span></span><div class="line-0-0-5 " data-content="autorestic update"><span class="lineCounter-0-0-4 prim">1</span>autorestic update</div><br></code></pre><p>Updates both restic and autorestic automagically.</p><script id="ZzUFOtdnlJ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("ZzUFOtdnlJ", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#update" class="h1" data-content-highlight="update">Update</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="VlfyQcEBCm">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("VlfyQcEBCm", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="XQJbkSKNAO">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("XQJbkSKNAO", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="HISjWmhnkn">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("HISjWmhnkn", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="oiIRgRmVXQ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("oiIRgRmVXQ", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="todGaBBrdS">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("todGaBBrdS", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="DInTUdmcuq">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("DInTUdmcuq", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="a_gXDtclPw">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("a_gXDtclPw", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

File diff suppressed because one or more lines are too long

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | 🙋‍♀️🙋‍♂️ Contributors</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="🙋♀️🙋♂️-contributors" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>🙋‍♀️🙋‍♂️ Contributors</h1><p>This amazing people helped the project!</p><ul><li>@ChanceM [Docs]</li><li>@EliotBerriot [Docs, Pruning, S3]</li></ul><script id="pPGHMLfBL_">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("pPGHMLfBL_", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#🙋♀️🙋♂️-contributors" class="h1" data-content-highlight="🙋♀️🙋♂️-contributors">🙋‍♀️🙋‍♂️ Contributors</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="fPmwVDeSEj">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("fPmwVDeSEj", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="DplZYNoQGK">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("DplZYNoQGK", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="DgyXyKVnwl">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("DgyXyKVnwl", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="DXrTuFFVsh">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("DXrTuFFVsh", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="bLmHZwaNgB">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("bLmHZwaNgB", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="mXwqejsEnV">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("mXwqejsEnV", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="IZCIDSmAHy">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("IZCIDSmAHy", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

View File

@@ -1,40 +0,0 @@
import { getRenderer } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/renderer.js';
import { initJssCs } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/setup-jss.js';initJssCs();
import { installTheme } from '/Users/nicco/Documents/git/autorestic/.codedoc/content/theme.ts';installTheme();
import { codeSelection } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/selection.js';codeSelection();
import { sameLineLengthInCodes } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/same-line-length.js';sameLineLengthInCodes();
import { initHintBox } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/line-hint/index.js';initHintBox();
import { initCodeLineRef } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/line-ref/index.js';initCodeLineRef();
import { initSmartCopy } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/smart-copy.js';initSmartCopy();
import { copyHeadings } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/heading/copy-headings.js';copyHeadings();
import { contentNavHighlight } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/contentnav/highlight.js';contentNavHighlight();
import { loadDeferredIFrames } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/deferred-iframe.js';loadDeferredIFrames();
import { smoothLoading } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/smooth-loading.js';smoothLoading();
import { tocHighlight } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/toc-highlight.js';tocHighlight();
import { postNavSearch } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/search/post-nav/index.js';postNavSearch();
import { ToCPrevNext } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/prevnext/index.js';
import { CollapseControl } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/collapse/collapse-control.js';
import { GithubSearch } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/misc/github/search.js';
import { ToCToggle } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/toggle/index.js';
import { DarkModeSwitch } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/darkmode/index.js';
import { ConfigTransport } from '/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/config.js';
const components = {
'qcaKEY878Mn2dFQW/lSrDg==': ToCPrevNext,
'fz894w7KG2/tX4kLbbA1Kg==': CollapseControl,
'+SrlfVhZ/PRQ5WhUlZbTaA==': GithubSearch,
'XsNW3ht5ee+RmVUActEo9g==': ToCToggle,
'Y1WWvCKxkgk1yh8xbCfXqw==': DarkModeSwitch,
'v641FmLj+AeGp0uuFTI6ug==': ConfigTransport
};
const renderer = getRenderer();
const ogtransport = window.__sdh_transport;
window.__sdh_transport = function(id, hash, props) {
if (hash in components) {
const target = document.getElementById(id);
renderer.render(renderer.create(components[hash], props)).after(target);
target.remove();
}
else if (ogtransport) ogtransport(id, hash, props);
}

File diff suppressed because one or more lines are too long

View File

@@ -1,106 +0,0 @@
{
"init": [
{
"name": "initJssCs",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/setup-jss.js",
"hash": "c/OJpUDX26Qm4IbMYtLbjg=="
},
{
"name": "installTheme",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/content/theme.ts",
"hash": "obU6UstdkSAvgbysOh3/eg=="
},
{
"name": "codeSelection",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/selection.js",
"hash": "4VXGhMNJRz8Eyjdvm6ntYg=="
},
{
"name": "sameLineLengthInCodes",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/same-line-length.js",
"hash": "nEpV43sODVDt+zjIO7H9+A=="
},
{
"name": "initHintBox",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/line-hint/index.js",
"hash": "9M6+/niHbbHMYKbOF0DTzg=="
},
{
"name": "initCodeLineRef",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/line-ref/index.js",
"hash": "rPwNL8eX+bbHwAgvTQ8Iag=="
},
{
"name": "initSmartCopy",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/code/smart-copy.js",
"hash": "xFnLgdNzBUv9BdaGDgvJDA=="
},
{
"name": "copyHeadings",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/heading/copy-headings.js",
"hash": "i1yTTWSH2AaFOCy2yKgs0Q=="
},
{
"name": "contentNavHighlight",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/contentnav/highlight.js",
"hash": "SpIa+6Gg/KMV7Wb4QvBzcg=="
},
{
"name": "loadDeferredIFrames",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/deferred-iframe.js",
"hash": "naHAbpxvOw4i/sUpn2LnRQ=="
},
{
"name": "smoothLoading",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/smooth-loading.js",
"hash": "vXAT5HUat2IZoc8ZEN/OKA=="
},
{
"name": "tocHighlight",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/toc-highlight.js",
"hash": "suB+mCUXKx/0sad/yURMug=="
},
{
"name": "postNavSearch",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/search/post-nav/index.js",
"hash": "/izvKWQZGCWZbwwWyiivfw=="
}
],
"components": [
{
"name": "ToCPrevNext",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/prevnext/index.js",
"hash": "qcaKEY878Mn2dFQW/lSrDg=="
},
{
"name": "CollapseControl",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/collapse/collapse-control.js",
"hash": "fz894w7KG2/tX4kLbbA1Kg=="
},
{
"name": "GithubSearch",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/misc/github/search.js",
"hash": "+SrlfVhZ/PRQ5WhUlZbTaA=="
},
{
"name": "ToCToggle",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/page/toc/toggle/index.js",
"hash": "XsNW3ht5ee+RmVUActEo9g=="
},
{
"name": "DarkModeSwitch",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/components/darkmode/index.js",
"hash": "Y1WWvCKxkgk1yh8xbCfXqw=="
},
{
"name": "ConfigTransport",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/config.js",
"hash": "v641FmLj+AeGp0uuFTI6ug=="
}
],
"renderer": {
"name": "getRenderer",
"filename": "/Users/nicco/Documents/git/autorestic/.codedoc/node_modules/@codedoc/core/dist/es6/transport/renderer.js",
"hash": "DuikI/Y5reNcodaSzsxs0w=="
}
}

View File

@@ -1,871 +0,0 @@
.heading-0-0-1 {
cursor: pointer;
position: relative;
}
.anchor-0-0-2 {
top: 0;
left: -32px;
bottom: 0;
display: flex;
opacity: 0;
position: absolute;
transform: translateX(-8px);
transition: opacity .1s, transform .1s;
align-items: center;
padding-right: 8px;
}
.heading-0-0-1:hover .anchor-0-0-2 {
opacity: 0.5;
transform: none;
}
.heading-0-0-1:hover .anchor-0-0-2:hover {
opacity: 1;
}
.code-0-0-3 {
color: #e0e0e0;
display: block;
outline: none;
padding: 24px 0;
position: relative;
font-size: 13px;
background: #212121;
box-shadow: 0 6px 12px rgba(0, 0, 0, .25);
overflow-x: auto;
user-select: none;
border-radius: 3px;
-webkit-user-select: none;
}
pre.with-bar .code-0-0-3 {
padding-top: 0;
}
.code-0-0-3 .token.keyword {
color: #7187ff;
}
.code-0-0-3 .token.string {
color: #69f0ae;
}
.code-0-0-3 .token.number {
color: #ffc400;
}
.code-0-0-3 .token.boolean {
color: #ffc400;
}
.code-0-0-3 .token.operator {
color: #18ffff;
}
.code-0-0-3 .token.function {
color: #e0e0e0;
}
.code-0-0-3 .token.parameter {
color: #e0e0e0;
}
.code-0-0-3 .token.comment {
color: #757575;
}
.code-0-0-3 .token.tag {
color: #ffa372;
}
.code-0-0-3 .token.builtin {
color: #e0e0e0;
}
.code-0-0-3 .token.punctuation {
color: #fcf7bb;
}
.code-0-0-3 .token.class-name {
color: #e0e0e0;
}
.code-0-0-3 .token.attr-name {
color: #f6d186;
}
.code-0-0-3 .token.attr-value {
color: #69f0ae;
}
.code-0-0-3 .token.plain-text {
color: #bdbdbd;
}
.code-0-0-3 .token.script {
color: #e0e0e0;
}
.code-0-0-3 .token.placeholder {
color: #18ffff;
}
.code-0-0-3 .token.selector {
color: #ffa372;
}
.code-0-0-3 .token.property {
color: #f6d186;
}
.code-0-0-3 .token.important {
color: #be79df;
}
.code-0-0-3.scss .token.function, .code-0-0-3.css .token.function, .code-0-0-3.sass .token.function {
color: #9aceff;
}
.code-0-0-3 .token.key {
color: #f6d186;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .code-0-0-3 {
color: #e0e0e0;
background: #000000;
box-shadow: 0 6px 12px #121212;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.keyword {
color: #7187ff;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.string {
color: #69f0ae;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.number {
color: #ffc400;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.boolean {
color: #ffc400;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.operator {
color: #18ffff;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.function {
color: #e0e0e0;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.parameter {
color: #e0e0e0;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.comment {
color: #757575;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.tag {
color: #ffa372;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.builtin {
color: #e0e0e0;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.punctuation {
color: #fcf7bb;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.class-name {
color: #e0e0e0;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.attr-name {
color: #f6d186;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.attr-value {
color: #69f0ae;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.plain-text {
color: #bdbdbd;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.script {
color: #e0e0e0;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.placeholder {
color: #18ffff;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.selector {
color: #ffa372;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.property {
color: #f6d186;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.important {
color: #be79df;
}
body:not(.dark-mode-animate) .code-0-0-3.scss .token.function, body:not(.dark-mode-animate) .code-0-0-3.css .token.function, body:not(.dark-mode-animate) .code-0-0-3.sass .token.function {
color: #9aceff;
}
body:not(.dark-mode-animate) .code-0-0-3 .token.key {
color: #f6d186;
}
}
body.dark .code-0-0-3 {
color: #e0e0e0;
background: #000000;
box-shadow: 0 6px 12px #121212;
}
body.dark .code-0-0-3 .token.keyword {
color: #7187ff;
}
body.dark .code-0-0-3 .token.string {
color: #69f0ae;
}
body.dark .code-0-0-3 .token.number {
color: #ffc400;
}
body.dark .code-0-0-3 .token.boolean {
color: #ffc400;
}
body.dark .code-0-0-3 .token.operator {
color: #18ffff;
}
body.dark .code-0-0-3 .token.function {
color: #e0e0e0;
}
body.dark .code-0-0-3 .token.parameter {
color: #e0e0e0;
}
body.dark .code-0-0-3 .token.comment {
color: #757575;
}
body.dark .code-0-0-3 .token.tag {
color: #ffa372;
}
body.dark .code-0-0-3 .token.builtin {
color: #e0e0e0;
}
body.dark .code-0-0-3 .token.punctuation {
color: #fcf7bb;
}
body.dark .code-0-0-3 .token.class-name {
color: #e0e0e0;
}
body.dark .code-0-0-3 .token.attr-name {
color: #f6d186;
}
body.dark .code-0-0-3 .token.attr-value {
color: #69f0ae;
}
body.dark .code-0-0-3 .token.plain-text {
color: #bdbdbd;
}
body.dark .code-0-0-3 .token.script {
color: #e0e0e0;
}
body.dark .code-0-0-3 .token.placeholder {
color: #18ffff;
}
body.dark .code-0-0-3 .token.selector {
color: #ffa372;
}
body.dark .code-0-0-3 .token.property {
color: #f6d186;
}
body.dark .code-0-0-3 .token.important {
color: #be79df;
}
body.dark .code-0-0-3.scss .token.function, body.dark .code-0-0-3.css .token.function, body.dark .code-0-0-3.sass .token.function {
color: #9aceff;
}
body.dark .code-0-0-3 .token.key {
color: #f6d186;
}
.lineCounter-0-0-4 {
left: 0;
color: transparent;
width: 24px;
height: 1.25rem;
display: inline-flex;
position: sticky;
font-size: 10px;
background: #212121;
align-items: center;
border-right: 2px solid rgba(255, 255, 255, .015);
margin-right: 12px;
padding-right: 12px;
flex-direction: row-reverse;
vertical-align: top;
}
.lineCounter-0-0-4.prim {
color: #616161;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .lineCounter-0-0-4 {
background: #000000;
border-color: rgba(255, 255, 255, .015);
}
body:not(.dark-mode-animate) .lineCounter-0-0-4.prim {
color: #616161;
}
}
body.dark .lineCounter-0-0-4 {
background: #000000;
border-color: rgba(255, 255, 255, .015);
}
body.dark .lineCounter-0-0-4.prim {
color: #616161;
}
.line-0-0-5 {
cursor: pointer;
height: 1.25rem;
display: inline-block;
min-width: 100%;
background: transparent;
transition: opacity .15s;
}
.has-selection .line-0-0-5:not(.selected) {
opacity: 0.35;
transition: opacity 3s;
}
.line-0-0-5.highlight {
color: #ffffff;
background: rgb(40, 46, 73);
}
.line-0-0-5.selected .lineCounter-0-0-4 {
border-color: #7187ff !important;
}
.line-0-0-5:hover, .line-0-0-5.selected {
background: #3b3b3b;
}
.line-0-0-5:hover .lineCounter-0-0-4 {
border-color: rgba(255, 255, 255, .1);
}
body.dark .line-0-0-5:hover .lineCounter-0-0-4 {
border-color: rgba(255, 255, 255, .1);
}
.line-0-0-5:hover .lineCounter-0-0-4, .line-0-0-5.selected .lineCounter-0-0-4 {
color: #7187ff;
background: #3b3b3b !important;
}
body.dark .line-0-0-5:hover, body.dark .line-0-0-5.selected {
background: #1a1a1a !important;
}
body.dark .line-0-0-5:hover .lineCounter-0-0-4, body.dark .line-0-0-5.selected .lineCounter-0-0-4 {
color: #7187ff;
background: #1a1a1a !important;
}
body.dark .line-0-0-5.selected .lineCounter-0-0-4 {
border-color: #7187ff !important;
}
.line-0-0-5.highlight .lineCounter-0-0-4 {
background: rgb(40, 46, 73);
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .line-0-0-5.highlight {
color: #ffffff;
background: rgb(28, 29, 48);
}
body:not(.dark-mode-animate) .line-0-0-5.highlight .lineCounter-0-0-4 {
background: rgb(28, 29, 48);
}
}
body.dark .line-0-0-5.highlight {
color: #ffffff;
background: rgb(28, 29, 48);
}
body.dark .line-0-0-5.highlight .lineCounter-0-0-4 {
background: rgb(28, 29, 48);
}
.wmbar-0-0-6 {
left: 0;
display: none;
padding: 16px;
position: sticky;
}
.wmbar-0-0-6>span {
display: block;
opacity: 0.5;
flex-grow: 1;
font-size: 12px;
text-align: center;
font-family: sans-serif;
margin-right: 64px;
}
.wmbar-0-0-6>span:first-child, .wmbar-0-0-6>span:nth-child(2), .wmbar-0-0-6>span:nth-child(3) {
width: 8px;
height: 8px;
opacity: 1;
flex-grow: 0;
margin-right: 8px;
border-radius: 8px;
}
pre.with-bar .wmbar-0-0-6 {
display: flex;
}
.wmbar-0-0-6>span:first-child:first-child, .wmbar-0-0-6>span:nth-child(2):first-child, .wmbar-0-0-6>span:nth-child(3):first-child {
background: rgb(255, 95, 86);
}
.wmbar-0-0-6>span:first-child:nth-child(2), .wmbar-0-0-6>span:nth-child(2):nth-child(2), .wmbar-0-0-6>span:nth-child(3):nth-child(2) {
background: rgb(255, 189, 46);
}
.wmbar-0-0-6>span:first-child:nth-child(3), .wmbar-0-0-6>span:nth-child(2):nth-child(3), .wmbar-0-0-6>span:nth-child(3):nth-child(3) {
background: rgb(39, 201, 63);
}
.collapse-0-0-7>.label {
cursor: pointer;
margin: 8px 0;
display: flex;
align-items: center;
user-select: none;
}
.collapse-0-0-7>.content {
opacity: 0;
max-height: 0;
transition: opacity .3s;
visibility: hidden;
border-left: 2px solid rgba(224, 224, 224, 0.5);
padding-left: 16px;
}
.collapse-0-0-7.open>.content {
opacity: 1;
max-height: none;
visibility: visible;
}
.collapse-0-0-7.open>.label .icon-font {
transform: rotate(90deg);
}
body.dark-mode-animate .collapse-0-0-7>.content {
transition: transform .15s, opacity .15s, border-color .3s;
}
body.dark .collapse-0-0-7>.content {
border-color: rgba(49, 49, 49, 0.5);
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .collapse-0-0-7>.content {
border-color: rgba(49, 49, 49, 0.5);
}
}
.collapse-0-0-7>.label .text {
flex-grow: 1;
}
.collapse-0-0-7>.label .icon-font {
margin-right: 32px;
}
.collapse-0-0-7>.label:hover {
color: #1eb2a6;
transition: color .15s;
}
body.dark .collapse-0-0-7>.label:hover {
color: #1eb2a6;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .collapse-0-0-7>.label:hover {
color: #1eb2a6;
}
}
body.dark-mode-animate .collapse-0-0-7>.label .icon-font {
transition: transform .15s;
}
.watermark-0-0-8 {
color: #424242;
cursor: pointer;
display: inline-block;
opacity: 0.2;
font-size: 8px;
transition: opacity .15s;
text-decoration: none !important;
}
body.dark-mode-animate .watermark-0-0-8 {
transition: opacity .15s, color .3s;
}
.watermark-0-0-8:hover {
opacity: 1;
text-decoration: none;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .watermark-0-0-8 {
color: #eeeeee;
}
}
body.dark .watermark-0-0-8 {
color: #eeeeee;
}
.watermark-0-0-8 svg {
width: 2.8rem;
display: block;
margin-top: .25rem;
}
.watermark-0-0-8 svg g {
fill: #424242;
}
body.dark-mode-animate .watermark-0-0-8 svg g {
transition: fill .3s;
}
body.dark .watermark-0-0-8 svg g {
fill: #eeeeee;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .watermark-0-0-8 svg g {
fill: #eeeeee;
}
}
.header-0-0-9 {
top: 0;
right: 0;
padding: 32px;
z-index: 100;
position: fixed;
text-align: right;
}
.footer-0-0-10 {
left: 0;
right: 0;
bottom: 0;
height: 64px;
display: flex;
z-index: 102;
position: fixed;
background: rgba(245, 245, 245, 0.85);
box-shadow: 0 -2px 6px rgba(0, 0, 0, .03);
align-items: center;
backdrop-filter: blur(12px);
justify-content: center;
-webkit-backdrop-filter: blur(12px);
}
body.dark-mode-animate .footer-0-0-10 {
transition: background .3s;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .footer-0-0-10 {
background: rgba(33, 33, 33, 0.85);
}
}
body.dark .footer-0-0-10 {
background: rgba(33, 33, 33, 0.85);
}
.footer-0-0-10 .main {
overflow: hidden;
flex-grow: 1;
text-align: center;
}
.footer-0-0-10 .left {
padding-left: 32px;
}
.footer-0-0-10 .right {
padding-right: 32px;
}
@media screen and (max-width: 800px) {
.footer-0-0-10 .left {
padding-left: 16px;
}
.footer-0-0-10 .right {
padding-right: 16px;
}
}
.footer-0-0-10 .main>.inside {
display: inline-flex;
overflow: auto;
max-width: 100%;
align-items: center;
}
.footer-0-0-10 .main>.inside hr {
width: 2px;
border: none;
height: 16px;
margin: 16px;
background: #e0e0e0;
}
.footer-0-0-10 .main>.inside a {
text-decoration: none;
}
.footer-0-0-10 .main>.inside a:hover {
text-decoration: underline ;
}
body.dark-mode-animate .footer-0-0-10 .main>.inside hr {
transition: background .3s;
}
body.dark .footer-0-0-10 .main>.inside hr {
background: #313131;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .footer-0-0-10 .main>.inside hr {
background: #313131;
}
}
.toc-0-0-11 {
top: 0;
left: 0;
width: calc(50vw - 464px);
bottom: 0;
display: flex;
z-index: 101;
position: fixed;
transform: translateX(-50vw);
background: #f1f1f1;
border-right: 1px solid #e7e7e7;
flex-direction: column;
padding-bottom: 64px;
}
body.dark-mode-animate .toc-0-0-11 {
transition: background .3s, border-color .3s;
}
body.dark .toc-0-0-11 {
background: #1f1f1f;
border-color: #282828;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .toc-0-0-11 {
background: #1f1f1f;
border-color: #282828;
}
}
@media screen and (max-width: 1200px) {
.toc-0-0-11 {
width: 100vw;
transform: translateX(-110vw);
}
}
.toc-0-0-11.animated {
transition: transform .3s;
}
.toc-0-0-11.active {
transform: translateX(0);
}
.toc-0-0-11 p {
margin: 0;
}
.toc-0-0-11 a {
border: 1px solid transparent;
display: block;
padding: 8px;
margin-left: -8px;
border-right: none;
margin-right: 1px;
border-radius: 3px;
text-decoration: none;
}
body.dark-mode-animate .toc-0-0-11 a {
transition: border-color .3s, background .3s;
}
.toc-0-0-11 a:hover {
background: #f5f5f5;
text-decoration: none;
}
.toc-0-0-11 a.current {
background: #f5f5f5;
border-color: #e7e7e7;
margin-right: 0;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
body.dark .toc-0-0-11 a.current {
background: hsl(0, 0%, 13.2%);
border-color: #282828;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .toc-0-0-11 a.current {
background: #212121;
border-color: #282828;
}
}
@media screen and (max-width: 1200px) {
.toc-0-0-11 a.current {
border-right: 1px solid;
margin-right: -8px;
border-radius: 3px;
}
}
body.dark .toc-0-0-11 a:hover {
background: hsl(0, 0%, 13.2%);
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .toc-0-0-11 a:hover {
background: hsl(0, 0%, 13.2%);
}
}
body.dark-mode-animate .toc-0-0-11.animated {
transition: transform .3s, background .3s, border-color .3s;
}
.content-0-0-12 {
padding: 32px;
overflow: auto;
flex-grow: 1;
margin-right: -1px;
padding-right: 0;
}
@media screen and (max-width: 1200px) {
.content-0-0-12 {
margin-right: 0;
padding-right: 32px;
}
}
.contentnav-0-0-14 {
right: 0;
width: calc(50vw - 496px);
bottom: 96px;
position: fixed;
font-size: 12px;
border-left: 1px dashed #e0e0e0;
margin-left: 64px;
padding-left: 48px;
}
@media screen and (max-width: 1200px) {
.contentnav-0-0-14 {
display: none;
}
}
.contentnav-0-0-14 a {
color: #424242;
display: block;
opacity: 0.2;
text-decoration: none;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) .contentnav-0-0-14 {
border-color: #313131;
}
body:not(.dark-mode-animate) .contentnav-0-0-14 a {
color: #eeeeee;
}
body:not(.dark-mode-animate) .contentnav-0-0-14 a:hover, body:not(.dark-mode-animate) .contentnav-0-0-14 a.active {
color: #1eb2a6;
}
}
body.dark .contentnav-0-0-14 {
border-color: #313131;
}
body.dark .contentnav-0-0-14 a {
color: #eeeeee;
}
body.dark .contentnav-0-0-14 a:hover, body.dark .contentnav-0-0-14 a.active {
color: #1eb2a6;
}
body.dark-mode-animate .contentnav-0-0-14 a {
transition: color .3s, opacity .3s;
}
.contentnav-0-0-14 a:hover, .contentnav-0-0-14 a.active {
color: #1eb2a6;
opacity: 1;
}
.contentnav-0-0-14 a.h2 {
margin-left: 12px;
}
.contentnav-0-0-14 a.h3 {
margin-left: 24px;
}
.contentnav-0-0-14 a.h4 {
margin-left: 36px;
}
.contentnav-0-0-14 a.h5 {
margin-left: 48px;
}
.contentnav-0-0-14 a.h6 {
margin-left: 60px;
}
* {
touch-action: manipulation;
scroll-behavior: smooth;
-webkit-tap-highlight-color: transparent;
}
body {
color: #424242;
width: 100vw;
margin: 0;
padding: 0;
background: #f5f5f5;
overflow-x: hidden;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
body.dark-mode-animate {
transition: color .3s, background .3s;
}
a {
color: #1eb2a6;
}
a:hover {
text-decoration: underline;
text-decoration-thickness: 2px;
}
body.dark-mode-animate a {
transition: color .3s;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) a {
color: #1eb2a6;
}
}
body.dark a {
color: #1eb2a6;
}
.container {
margin: 0 auto;
padding: 96px 16px;
max-width: 768px;
transition: opacity .15s;
}
hr {
border: none;
margin: 64px;
background: none;
border-top: 1px solid #e0e0e0;
}
body.dark-mode-animate hr {
transition: border-color .3s;
}
body.dark hr {
border-color: #313131;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) hr {
border-color: #313131;
}
}
blockquote {
color: #757575;
margin: 0;
padding: 16px 40px;
position: relative;
background: #eeeeee;
border-radius: 3px;
}
body.dark-mode-animate blockquote {
transition: color .3s, background .3s;
}
blockquote:after {
top: 16px;
left: 16px;
width: 8px;
bottom: 16px;
content: '';
display: block;
position: absolute;
background: radial-gradient(circle at center, #e0e0e0 50%, transparent 52%),transparent;
background-size: 4px 4px;
}
body.dark-mode-animate blockquote:after {
transition: color .3s, background .3s;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) {
color: #eeeeee;
background: #212121;
}
body:not(.dark-mode-animate) blockquote {
color: #cacaca;
background: #282828;
}
body:not(.dark-mode-animate) blockquote:after {
background: radial-gradient(circle at center, #363636 50%, transparent 52%),transparent;
background-size: 4px 4px;
}
}
body.dark {
color: #eeeeee;
background: #212121;
}
body.dark blockquote {
color: #cacaca;
background: #282828;
}
body.dark blockquote:after {
background: radial-gradient(circle at center, #363636 50%, transparent 52%),transparent;
background-size: 4px 4px;
}
img {
max-width: 100%;
}
iframe {
width: 100%;
border: none;
background: white;
border-radius: 3px;
}
code {
color: #616161;
padding: 4px;
font-size: .85em;
background: #eeeeee;
border-radius: 3px;
}
body.dark-mode-animate code {
transition: color .3s, background .3s;
}
body.dark code {
color: #e0e0e0;
background: #282828;
}
@media (prefers-color-scheme: dark) {
body:not(.dark-mode-animate) code {
color: #e0e0e0;
background: #282828;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,19 +1,21 @@
# 🐣 Examples
## List all the snapshots for all the backends
## Exec
### List all the snapshots for all the backends
```bash
autorestic -a exec snapshots
autorestic exec -a -- snapshots
```
## Unlock a locked repository
### Unlock a locked repository
If you accidentally cancelled a running operation this could be useful.
Only do this if you know what you are doing.
```bash
autorestic -b my-backend exec unlock
autorestic exec -b my-backend -- unlock
```
> :ToCPrevNext

View File

@@ -1,58 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | autorestic</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="autorestic" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>autorestic</h1><p>High backup level CLI utility for <a href="https://restic.net/">restic</a>.</p><p>Autorestic is a wrapper around the amazing <a href="https://restic.net/">restic</a>. While being amazing the restic cli can be a bit overwhelming and difficoult to manage if you have many different location that you want to backup to multiple locations. This utility is aimed at making this easier 🙂</p><marker><!-- ![Sketch](./docs/Sketch.png) -->
</marker><h2 id="✈️-roadmap" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>✈️ Roadmap</h2><p>I would like to make the official <code>1.0</code> release in the coming months. Until then please feel free to file issues or feature requests so that the tool is as flexible as possible :)</p><h2 id="🌈-features" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>🌈 Features</h2><ul><li>YAML config files, no CLI</li><li>Predictable</li><li>Incremental -&gt; Minimal space is used</li><li>Backup locations to multiple backends</li><li>Snapshot policies and pruning</li><li>Simple interface</li><li>Fully encrypted</li><li>Pre/After hooks</li><li>Exclude pattern/files</li><li>Backup &amp; Restore docker volumes</li><li><del>Seamless cron jobs for automatic backup</del> <a href="https://github.com/cupcakearmy/autorestic/issues/21">in development</a>.</li></ul><script id="orjaQRqhhr">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("orjaQRqhhr", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#autorestic" class="h1" data-content-highlight="autorestic">autorestic</a><a href="#✈️-roadmap" class="h2" data-content-highlight="✈️-roadmap">✈️ Roadmap</a><a href="#🌈-features" class="h2" data-content-highlight="🌈-features">🌈 Features</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="yKqvbTVB_P">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("yKqvbTVB_P", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="XfKCwZcXGT">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("XfKCwZcXGT", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="NDydHArUOB">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("NDydHArUOB", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="ujoxOtTdeq">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("ujoxOtTdeq", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="NEoElkGOBn">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("NEoElkGOBn", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="PajDyKKpIm">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("PajDyKKpIm", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="BOFoKgmFqz">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("BOFoKgmFqz", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

27
docs/index.md Normal file
View File

@@ -0,0 +1,27 @@
# `autorestic`
High backup level CLI utility for [restic](https://restic.net/).
Autorestic is a wrapper around the amazing [restic](https://restic.net/). While being amazing the restic cli can be a bit overwhelming and difficult to manage if you have many different location that you want to backup to multiple locations. This utility is aimed at making this easier 🙂
<!-- ![Sketch](./docs/Sketch.png) -->
## ✈️ Roadmap
~~I would like to make the official `1.0` release in the coming months. Until then please feel free to file issues or feature requests so that the tool is as flexible as possible :)~~
As of version `0.18` crons are supported wich where the last feature missing for a `1.0`. Will test this for a few weeks and then it's time for the first "real" release! 🎉 Also we now have waaay better docs 📒
## 🌈 Features
- YAML config files, no CLI
- Incremental -> Minimal space is used
- Backup locations to multiple backends
- Snapshot policies and pruning
- Fully encrypted
- Pre/After hooks
- Exclude pattern/files
- Cron jobs for automatic backup
- Backup & Restore docker volumes
> :ToCPrevNext

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | 🛳 Installation</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="🛳-installation" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>🛳 Installation</h1><p>Linux &amp; macOS. Windows is not supported. If you have problems installing please open an issue :)</p><p>Autorestic requires <code>curl</code>, <code>wget</code> and <code>bzip2</code> to be installed. For most systems these should be already installed.</p><pre class=""><code class="bash code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span></span></span><div class="line-0-0-5 " data-content="curl -s https://raw.githubusercontent.com/CupCakeArmy/autorestic/master/install.sh | bash"><span class="lineCounter-0-0-4 prim">1</span><span class="token function">curl</span> -s https://raw.githubusercontent.com/CupCakeArmy/autorestic/master/install.sh <span class="token operator">|</span> <span class="token function">bash</span></div><br></code></pre><script id="PrarcMVlUm">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("PrarcMVlUm", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#🛳-installation" class="h1" data-content-highlight="🛳-installation">🛳 Installation</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="mmGSdSjNoh">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("mmGSdSjNoh", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="SAbgJmyGtn">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("SAbgJmyGtn", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="sgvTXhEsNC">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("sgvTXhEsNC", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="kESCMjMDfi">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("kESCMjMDfi", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="oaQCKDhxTo">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("oaQCKDhxTo", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="DsfglbUnDO">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("DsfglbUnDO", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="uoGxkBWILI">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("uoGxkBWILI", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

File diff suppressed because one or more lines are too long

49
docs/location/cron.md Normal file
View File

@@ -0,0 +1,49 @@
# Cron
Often it is usefull to trigger backups autmatically. For this we can specify a `cron` attribute to each location.
> Available since version 0.18
```yaml | .autorestic.yml
locations:
my-location:
from: /data
to: my-backend
cron: '0 3 * * 0' # Every Sunday at 3:00
```
Here is a awesome website with [some examples](https://crontab.guru/examples.html) and an [explorer](https://crontab.guru/)
## Installing the cron
**This has to be done only once, regadless of now many cros you have in your config file.**
To actually enable cron jobs you need something to call `autorestic cron` on a timed shedule.
Note that the shedule has nothing to do with the `cron` attribute in each location.
My advise would be to trigger the command every 5min, but if you have a cronjob that runs only once a week, it's probably enough to shedule it once a day.
### Crontab
Here is an example using crontab, but systemd would do too.
First, open your crontab in edit mode
```bash
crontab -e
```
Then paste this at the bottom of the file and save it. Note that in this specific example the `.autorestic.yml` is located in `/srv/`. You need to modify that part of course to fit your config file.
```bash
# This is required, as it otherwise cannot find restic as a command.
PATH="/usr/local/bin:/usr/bin:/bin"
# Example running every 5 minutes
*/5 * * * * autorestic -c /srv/.autorestic.yml --ci cron
```
> The `--ci` option is not required, but recommended
Now you can add as many `cron` attributes as you wish in the config file ⏱
> :ToCPrevNext

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,8 @@
# Docker
Since version 0.13 autorestic supports docker volumes directly, without needing them to be mounted to the host filesystem.
autorestic supports docker volumes directly, without needing them to be mounted to the host filesystem.
> Available since version 0.13
Let see an example.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,57 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | 🗂 Locations</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="🗂-locations" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>🗂 Locations</h1><p>Locations can be seen as the input to the backup process. Generally this is simply a folder.
The paths can be relative from the config file. A location can have multiple backends, so that the data is secured across multiple servers.</p><pre class="with-bar"><code class="yaml code-0-0-3" tabindex="0"><span class="wmbar-0-0-6"><span></span><span></span><span></span><span>.autorestic.yml</span></span><div class="line-0-0-5 " data-content="locations:"><span class="lineCounter-0-0-4 prim">1</span><span class="token key atrule">locations</span><span class="token punctuation">:</span></div><br><div class="line-0-0-5 " data-content=" my-location-name:"><span class="lineCounter-0-0-4">2</span> <span class="token key atrule">my-location-name</span><span class="token punctuation">:</span></div><br><div class="line-0-0-5 " data-content=" from: path/to/backup"><span class="lineCounter-0-0-4">3</span> <span class="token key atrule">from</span><span class="token punctuation">:</span> path/to/backup</div><br><div class="line-0-0-5 " data-content=" to:"><span class="lineCounter-0-0-4">4</span> <span class="token key atrule">to</span><span class="token punctuation">:</span></div><br><div class="line-0-0-5 " data-content=" - name-of-backend"><span class="lineCounter-0-0-4 prim">5</span> <span class="token punctuation">-</span> name<span class="token punctuation">-</span>of<span class="token punctuation">-</span>backend</div><br><div class="line-0-0-5 " data-content=" - also-backup-to-this-backend"><span class="lineCounter-0-0-4 prim">6</span> <span class="token punctuation">-</span> also<span class="token punctuation">-</span>backup<span class="token punctuation">-</span>to<span class="token punctuation">-</span>this<span class="token punctuation">-</span>backend</div><br></code></pre><h2 id="from" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span><code>from</code></h2><p>This is the source of the location.</p><h4 id="how-are-paths-resolved" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>How are paths resolved?</h4><p>Paths can be absolute or relative. If relative they are resolved relative to the location of the config file. Tilde <code>~</code> paths are also supported for home folder resolution.</p><h2 id="to" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span><code>to</code></h2><p>This is einther a single backend or an array of backends. The backends have to be configured in the same config file.</p><script id="bCPgbOHOjf">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("bCPgbOHOjf", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#🗂-locations" class="h1" data-content-highlight="🗂-locations">🗂 Locations</a><a href="#from" class="h2" data-content-highlight="from">from</a><a href="#how-are-paths-resolved" class="h4" data-content-highlight="how-are-paths-resolved">How are paths resolved?</a><a href="#to" class="h2" data-content-highlight="to">to</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="cAMzSlpRfn">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("cAMzSlpRfn", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="klBVMHflqG">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("klBVMHflqG", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="_PZSBXAPDM">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("_PZSBXAPDM", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="E_VqXDfnWf">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("E_VqXDfnWf", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="EgVlVInxQk">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("EgVlVInxQk", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="xwJIApIopb">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("xwJIApIopb", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="cVBfLTXfgC">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("cVBfLTXfgC", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

View File

@@ -1,13 +0,0 @@
# Backup
```bash
autorestic backup [-l, --location] [-a, --all]
```
Performes a backup of all locations if the `-a` flag is passed. To only backup some locations pass one or more `-l` or `--location` flags.
```bash
autorestic backup -l my-location
```
> :ToCPrevNext

View File

@@ -1,27 +0,0 @@
# autorestic
High backup level CLI utility for [restic](https://restic.net/).
Autorestic is a wrapper around the amazing [restic](https://restic.net/). While being amazing the restic cli can be a bit overwhelming and difficoult to manage if you have many different location that you want to backup to multiple locations. This utility is aimed at making this easier 🙂
<!-- ![Sketch](./docs/Sketch.png) -->
## ✈️ Roadmap
I would like to make the official `1.0` release in the coming months. Until then please feel free to file issues or feature requests so that the tool is as flexible as possible :)
## 🌈 Features
- YAML config files, no CLI
- Predictable
- Incremental -> Minimal space is used
- Backup locations to multiple backends
- Snapshot policies and pruning
- Simple interface
- Fully encrypted
- Pre/After hooks
- Exclude pattern/files
- Backup & Restore docker volumes
- ~~Seamless cron jobs for automatic backup~~ [in development](https://github.com/cupcakearmy/autorestic/issues/21).
> :ToCPrevNext

View File

@@ -1,15 +0,0 @@
# Cron
Often it is usefull to trigger backups autmatically. For this we can specify a `cron` attribute to each location.
```yaml | .autorestic.yml
locations:
my-location:
from: /data
to: my-backend
cron: '0 3 * * 0' # Every Sunday at 3:00
```
Here is a awesome website with [some examples](https://crontab.guru/examples.html) and an [explorer](https://crontab.guru/)
> :ToCPrevNext

View File

@@ -1,57 +0,0 @@
<!DOCTYPE html><html><head><title>Autorestic | ❓ QA</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"><meta name="robots" content="index,follow"><meta name="theme-color" content="#212121"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><link href="https://fonts.googleapis.com/css?family=Hind:400,700&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400&amp;display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined" rel="stylesheet"><style>
body, input, button {
font-family: 'Hind', sans-serif;
}
code, .hljs {
font-family: 'Source Code Pro', 'Courier New', Courier, monospace;
}
.icon-font {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
.icon-font.outline {
font-family: 'Material Icons Outlined';
}
</style><link href="/autorestic/./dist/codedoc-styles.css" rel="stylesheet"><script async="" defer="" src="/autorestic/./dist/codedoc-bundle.js"></script></head><body><div class="header-0-0-9"><script async="" defer="" src="https://buttons.github.io/buttons.js"></script><a class="github-button" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="false" data-show-count="true" data-size="false" href="https://github.com/cupcakearmy/autorestic/">Star</a><br><br><a class="watermark-0-0-8" href="https://github.com/CONNECT-platform/codedoc" target="_blank">Created With<svg viewBox="0 0 536 296" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="codedoc" transform="translate(-244.000000, -364.000000)" fill-rule="nonzero"><path d="M580,532 C615.346224,532 644,560.653776 644,596 C644,631.346224 615.346224,660 580,660 C544.653776,660 516,631.346224 516,596 C516,560.653776 544.653776,532 580,532 Z M716,532 C751.346224,532 780,560.653776 780,596 C780,631.346224 751.346224,660 716,660 L692,660 C687.581722,660 684,656.418278 684,652 C684,647.581722 687.581722,644 692,644 L716,644 C742.509668,644 764,622.509668 764,596 C764,569.490332 742.509668,548 716,548 L692,548 C687.581722,548 684,544.418278 684,540 C684,535.581722 687.581722,532 692,532 L716,532 Z M468,532 C472.418278,532 476,535.581722 476,540 L476,652 C476,656.418278 472.418278,660 468,660 L444,660 C408.653776,660 380,631.346224 380,596 C380,560.653776 408.653776,532 444,532 L468,532 Z M332,532 C336.418278,532 340,535.581722 340,540 L340,652 C340,656.418278 336.418278,660 332,660 L252,660 C247.581722,660 244,656.418278 244,652 L244,540 C244,535.581722 247.581722,532 252,532 L332,532 Z M580,548 C553.490332,548 532,569.490332 532,596 C532,622.509668 553.490332,644 580,644 C606.509668,644 628,622.509668 628,596 C628,569.490332 606.509668,548 580,548 Z M461,548 L444,548 C417.490332,548 396,569.490332 396,596 C396,622.509668 417.490332,644 444,644 L461,644 L461,548 Z M444,364 C479.346224,364 508,392.653776 508,428 C508,463.346224 479.346224,492 444,492 C408.653776,492 380,463.346224 380,428 C380,392.653776 408.653776,364 444,364 Z M332,364 C336.418278,364 340,367.581722 340,372 C340,376.418278 336.418278,380 332,380 L308,380 C281.490332,380 260,401.490332 260,428 C260,454.509668 281.490332,476 308,476 L332,476 C336.418278,476 340,479.581722 340,484 C340,488.418278 336.418278,492 332,492 L308,492 C272.653776,492 244,463.346224 244,428 C244,392.653776 272.653776,364 308,364 L332,364 Z M580,364 C615.346224,364 644,392.653776 644,428 C644,463.346224 615.346224,492 580,492 L556,492 C551.581722,492 548,488.418278 548,484 L548,372 C548,367.581722 551.581722,364 556,364 L580,364 Z M772,364 C776.418278,364 780,367.581722 780,372 C780,376.418278 776.418278,380 772,380 L700,380 L700,420 L772,420 C776.418278,420 780,423.581722 780,428 C780,432.418278 776.418278,436 772,436 L700,436 L700,476 L772,476 C776.418278,476 780,479.581722 780,484 C780,488.418278 776.418278,492 772,492 L692,492 C687.581722,492 684,488.418278 684,484 L684,372 C684,367.581722 687.581722,364 692,364 L772,364 Z M444,380 C417.490332,380 396,401.490332 396,428 C396,454.509668 417.490332,476 444,476 C470.509668,476 492,454.509668 492,428 C492,401.490332 470.509668,380 444,380 Z M580,380 L563,380 L563,476 L580,476 C606.509668,476 628,454.509668 628,428 C628,401.490332 606.509668,380 580,380 Z"></path></g></svg></a></div><div id="-codedoc-container" class="container"><h1 id="❓-qa" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>❓ QA</h1><h2 id="my-config-file-was-moved" class="heading-0-0-1"><span class="anchor-0-0-2" data-ignore-text=""><span class="icon-font" data-ignore-text="" style="vertical-align: sub">link</span></span>My config file was moved?</h2><p>This happens when autorestic needs to write to the config file. This happend e.g. when we are generating a key for you.
Unforunately during this process formatting and comments are lost. That is why autorestic will place a copy of your old config next to the one we are writing to.</p><script id="EDDjPqkVjh">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("EDDjPqkVjh", "qcaKEY878Mn2dFQW/lSrDg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="contentnav-0-0-14" data-no-search=""><a href="#❓-qa" class="h1" data-content-highlight="❓-qa">❓ QA</a><a href="#my-config-file-was-moved" class="h2" data-content-highlight="my-config-file-was-moved">My config file was moved?</a></div></div><div id="-codedoc-toc" class="toc-0-0-11"><div class="content-0-0-12"><p><a href="/autorestic/">Home</a>
<a href="/autorestic/quick">Quick Start</a>
<a href="/autorestic/installation">Installation</a>
<a href="/autorestic/config">Configuration</a></p><div class="collapse-0-0-7 "><script id="cGVwWONAdN">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("cGVwWONAdN", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Locations</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/location/overview">Overview</a>
<a href="/autorestic/location/hooks">Hooks</a>
<a href="/autorestic/location/exclude">Exluding Files</a>
<a href="/autorestic/location/forget">Forget Policy</a>
<a href="/autorestic/location/cron">Cron</a>
<a href="/autorestic/location/docker">Docker Volumes</a></p></div></div><div class="collapse-0-0-7 "><script id="NOMjnRAogE">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("NOMjnRAogE", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">Backend</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/backend/overview">Overview</a>
<a href="/autorestic/backend/available">Available Backends</a></p></div></div><div class="collapse-0-0-7 "><script id="UIOXtPscWT">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("UIOXtPscWT", "fz894w7KG2/tX4kLbbA1Kg==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script><div class="label" onclick="this.parentElement.classList.toggle('open')"><span class="text">CLI</span><span class="icon-font closed">chevron_right</span></div><div class="content"><p><a href="/autorestic/cli/info">Info</a>
<a href="/autorestic/cli/check">Check</a>
<a href="/autorestic/cli/backup">Backup</a>
<a href="/autorestic/cli/restore">Restore</a>
<a href="/autorestic/cli/forget">Forget</a>
<a href="/autorestic/cli/cron">Cron</a>
<a href="/autorestic/cli/exec">Exec</a>
<a href="/autorestic/cli/install">Install</a>
<a href="/autorestic/cli/uninstall">Uninstall</a>
<a href="/autorestic/cli/update">Update</a></p></div></div><p><a href="/autorestic/examples">Examples</a></p><p><a href="/autorestic/qa">QA</a></p><p><a href="/autorestic/contrib">Contributors</a></p></div><div class="search-0-0-13"><script id="auzKbknmTm">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("auzKbknmTm", "+SrlfVhZ/PRQ5WhUlZbTaA==", {"repo":"autorestic","user":"cupcakearmy","root":"docs/md","pick":"\\.md$","drop":"(^_)|(\\/_)"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><div class="footer-0-0-10"><div class="left"><script id="wLeEAUPJQZ">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("wLeEAUPJQZ", "XsNW3ht5ee+RmVUActEo9g==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div><div class="main"><div class="inside"><a href="https://github.com/cupcakearmy/autorestic/" target="_blank">GitHub</a></div></div><div class="right"><script id="NSrxaJMLfE">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("NSrxaJMLfE", "Y1WWvCKxkgk1yh8xbCfXqw==", {});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></div></div><script id="TLtFEHWiSj">(function(){function load(){if (window.__sdh_transport){window.__sdh_transport("TLtFEHWiSj", "v641FmLj+AeGp0uuFTI6ug==", {"namespace":"/autorestic"});} }; if (document.readyState == 'complete') load(); else window.addEventListener('load', load); })()</script></body></html>

View File

@@ -3,6 +3,6 @@
## My config file was moved?
This happens when autorestic needs to write to the config file. This happend e.g. when we are generating a key for you.
Unforunately during this process formatting and comments are lost. That is why autorestic will place a copy of your old config next to the one we are writing to.
Unfortunately during this process formatting and comments are lost. That is why autorestic will place a copy of your old config next to the one we are writing to.
> :ToCPrevNext

File diff suppressed because one or more lines are too long

View File

@@ -16,7 +16,8 @@ For a quick overview:
- `locations` can be seen as the inputs and `backends` the output where the data is stored and backed up.
- One `location` can have one or multiple `backends` for redudancy.
- One `backend` can also be the target for multiple `locations`
- One `backend` can also be the target for multiple `locations`.
- **Backup the config file as it will contain the generated keys**. If you don't have a copy of that keys, the backups are useless as they are encrypted and data will be not recoverable.
```yaml | .autorestic.yml
locations:
@@ -42,7 +43,7 @@ backends:
path: /mnt/my_external_storage
```
## Check [Optional]
## Check
```bash
autorestic check -a
@@ -50,6 +51,8 @@ autorestic check -a
This checks if the config file has any issues. If this is the first time this can take longer as autorestic will setup the backends.
Now is good time to **backup the config**. After you run autorestic at least once we will add the generated encryption keys to the config.
## Backup
```bash

View File

@@ -2,29 +2,27 @@
"private": true,
"scripts": {
"build": "tsc",
"build:watch": "tsc -w",
"dev": "tsnd --no-notify --respawn ./src/autorestic.ts",
"move": "mv bin/autorestic-linux bin/autorestic_linux_x64 && mv bin/autorestic-macos bin/autorestic_macos_x64",
"bin": "yarn run build && pkg lib/autorestic.js --targets latest-macos-x64,latest-linux-x64 --out-path bin && yarn run move",
"docs:build": "codedoc build",
"dev": "tsc -w",
"move": "mv bin/index-linux bin/autorestic_linux_x64 && mv bin/index-macos bin/autorestic_macos_x64",
"bin": "yarn run build && pkg lib/index.js --targets latest-macos-x64,latest-linux-x64 --out-path bin && yarn run move",
"docs:build": "codedoc install && codedoc build",
"docs:dev": "codedoc serve"
},
"devDependencies": {
"@codedoc/cli": "^0.1.4",
"@types/js-yaml": "^3.12.1",
"@types/minimist": "^1.2.0",
"@types/node": "^12.11.7",
"pkg": "^4.4.0",
"ts-node-dev": "^1.0.0-pre.40",
"typescript": "^3.7"
"@codedoc/cli": "^0.2",
"@types/js-yaml": "^3",
"@types/node": "^14",
"pkg": "^4.4",
"ts-node-dev": "^1",
"typescript": "^3.9"
},
"dependencies": {
"axios": "^0.19.0",
"clitastic": "0.0.1",
"colors": "^1.3.3",
"cron-parser": "^2.13.0",
"js-yaml": "^3.13.1",
"minimist": "^1.2.0",
"uhrwerk": "^1.0.0"
"axios": "^0.19",
"clitastic": "^0.1.2",
"colors": "^1",
"commander": "^6.2",
"cron-parser": "2.x.x",
"js-yaml": "3.x.x",
"uhrwerk": "1.x.x"
}
}

View File

@@ -1,52 +0,0 @@
import 'colors'
import minimist from 'minimist'
import { init } from './config'
import handlers, { error, help } from './handlers'
import { Config } from './types'
process.on('uncaughtException', err => {
console.log(err.message)
process.exit(1)
})
export const { _: commands, ...flags } = minimist(process.argv.slice(2), {
alias: {
c: 'config',
v: 'version',
h: 'help',
a: 'all',
l: 'location',
b: 'backend',
d: 'dry-run',
},
boolean: ['a', 'd'],
string: ['l', 'b'],
})
export const VERSION = '0.17'
export const INSTALL_DIR = '/usr/local/bin'
export const VERBOSE = flags.verbose
export let config: Config
async function main() {
config = init()
// For dev
// return await handlers['cron']([], { ...flags, all: true })
if (commands.length < 1 || commands[0] === 'help') return help()
const command: string = commands[0]
const args: string[] = commands.slice(1)
const fn = handlers[command] || error
await fn(args, flags)
}
main().catch((e: Error) => console.error(e.message))

View File

@@ -1,75 +1,66 @@
import { Writer } from 'clitastic'
import { config, VERBOSE } from './autorestic'
import { config, VERBOSE } from './'
import { Backend, Backends, Locations } from './types'
import { exec, pathRelativeToConfigFile, filterObjectByKey } from './utils'
const ALREADY_EXISTS = /(?=.*already)(?=.*config).*/
export const getPathFromBackend = (backend: Backend): string => {
switch (backend.type) {
case 'local':
return pathRelativeToConfigFile(backend.path)
case 'b2':
case 'azure':
case 'gs':
case 's3':
case 'sftp':
return `${backend.type}:${backend.path}`
case 'rest':
throw new Error(`Unsupported backend type: "${backend.type}"`)
default:
throw new Error(`Unknown backend type.`)
}
switch (backend.type) {
case 'local':
return pathRelativeToConfigFile(backend.path)
case 'b2':
case 'azure':
case 'gs':
case 's3':
case 'sftp':
case 'rest':
return `${backend.type}:${backend.path}`
default:
throw new Error(`Unknown backend type.`)
}
}
export const getEnvFromBackend = (backend: Backend) => {
const { type, path, key, ...rest } = backend
return {
RESTIC_PASSWORD: key,
RESTIC_REPOSITORY: getPathFromBackend(backend),
...rest,
}
const { type, path, key, ...rest } = backend
return {
RESTIC_PASSWORD: key,
RESTIC_REPOSITORY: getPathFromBackend(backend),
...rest,
}
}
export const getBackendsFromLocations = (locations: Locations): string[] => {
const backends = new Set<string>()
for (const to of Object.values(locations).map(location => location.to))
Array.isArray(to) ? to.forEach(t => backends.add(t)) : backends.add(to)
return Array.from(backends)
const backends = new Set<string>()
for (const to of Object.values(locations).map((location) => location.to)) Array.isArray(to) ? to.forEach((t) => backends.add(t)) : backends.add(to)
return Array.from(backends)
}
export const checkAndConfigureBackend = (name: string, backend: Backend) => {
const writer = new Writer(name.blue + ' : ' + 'Configuring... ⏳')
try {
const env = getEnvFromBackend(backend)
const writer = new Writer(name.blue + ' : ' + 'Configuring... ⏳')
try {
const env = getEnvFromBackend(backend)
const { out, err } = exec('restic', ['init'], { env })
const { out, err } = exec('restic', ['init'], { env })
if (err.length > 0 && !ALREADY_EXISTS.test(err))
throw new Error(`Could not load the backend "${name}": ${err}`)
if (err.length > 0 && !ALREADY_EXISTS.test(err)) throw new Error(`Could not load the backend "${name}": ${err}`)
if (VERBOSE && out.length > 0) console.log(out)
if (VERBOSE && out.length > 0) console.log(out)
writer.done(name.blue + ' : ' + 'Done ✓'.green)
} catch (e) {
writer.done(name.blue + ' : ' + 'Error ⚠️ ' + e.message.red)
}
writer.done(name.blue + ' : ' + 'Done ✓'.green)
} catch (e) {
writer.done(name.blue + ' : ' + 'Error ⚠️ ' + e.message.red)
}
}
export const checkAndConfigureBackends = (backends?: Backends) => {
if (!backends)
backends = config.backends
if (!backends) backends = config.backends
console.log('\nConfiguring Backends'.grey.underline)
for (const [name, backend] of Object.entries(backends))
checkAndConfigureBackend(name, backend)
console.log('\nConfiguring Backends'.grey.underline)
for (const [name, backend] of Object.entries(backends)) checkAndConfigureBackend(name, backend)
}
export const checkAndConfigureBackendsForLocations = (locations: Locations) => {
checkAndConfigureBackends(
filterObjectByKey(config.backends, getBackendsFromLocations(locations)),
)
checkAndConfigureBackends(filterObjectByKey(config.backends, getBackendsFromLocations(locations)))
}

View File

@@ -1,111 +1,104 @@
import { Writer } from 'clitastic'
import { mkdirSync } from 'fs'
import { config, VERBOSE } from './autorestic'
import { config, hasError, VERBOSE } from './'
import { getEnvFromBackend } from './backend'
import { LocationFromPrefixes } from './config'
import { Locations, Location, Backend } from './types'
import {
exec,
pathRelativeToConfigFile,
getFlagsFromLocation,
makeArrayIfIsNot,
execPlain,
MeasureDuration,
fill,
decodeLocationFromPrefix,
checkIfDockerVolumeExistsOrFail,
getPathFromVolume,
exec,
pathRelativeToConfigFile,
getFlagsFromLocation,
makeArrayIfIsNot,
execPlain,
MeasureDuration,
fill,
decodeLocationFromPrefix,
checkIfDockerVolumeExistsOrFail,
getPathFromVolume,
} from './utils'
export const backupFromFilesystem = (from: string, location: Location, backend: Backend, tags?: string[]) => {
const path = pathRelativeToConfigFile(from)
const path = pathRelativeToConfigFile(from)
const { out, err, status } = exec(
'restic',
['backup', '.', ...getFlagsFromLocation(location, 'backup')],
{ env: getEnvFromBackend(backend), cwd: path },
)
const { out, err, status } = exec('restic', ['backup', '.', ...getFlagsFromLocation(location, 'backup')], {
env: getEnvFromBackend(backend),
cwd: path,
})
if (VERBOSE) console.log(out, err)
if (status != 0 || err.length > 0)
throw new Error(err)
if (VERBOSE) console.log(out, err)
if (status != 0 || err.length > 0) throw new Error(err)
}
export const backupFromVolume = (volume: string, location: Location, backend: Backend) => {
const tmp = getPathFromVolume(volume)
try {
mkdirSync(tmp)
checkIfDockerVolumeExistsOrFail(volume)
const tmp = getPathFromVolume(volume)
try {
mkdirSync(tmp)
checkIfDockerVolumeExistsOrFail(volume)
// For incremental backups. Unfortunately due to how the docker mounts work the permissions get lost.
// execPlain(`docker run --rm -v ${volume}:/data -v ${tmp}:/backup alpine cp -aT /data /backup`)
execPlain(`docker run --rm -v ${volume}:/data -v ${tmp}:/backup alpine tar cf /backup/archive.tar -C /data .`)
// For incremental backups. Unfortunately due to how the docker mounts work the permissions get lost.
// execPlain(`docker run --rm -v ${volume}:/data -v ${tmp}:/backup alpine cp -aT /data /backup`)
execPlain(`docker run --rm -v ${volume}:/data -v ${tmp}:/backup alpine tar cf /backup/archive.tar -C /data .`)
backupFromFilesystem(tmp, location, backend)
} catch (e) {
throw e
} finally {
execPlain(`rm -rf ${tmp}`)
}
backupFromFilesystem(tmp, location, backend)
} catch (e) {
throw e
} finally {
execPlain(`rm -rf ${tmp}`)
}
}
export const backupSingle = (name: string, to: string, location: Location) => {
const delta = new MeasureDuration()
const writer = new Writer(name + to.blue + ' : ' + 'Backing up... ⏳')
const delta = new MeasureDuration()
const writer = new Writer(name + to.blue + ' : ' + 'Backing up... ⏳')
try {
const backend = config.backends[to]
const [type, value] = decodeLocationFromPrefix(location.from)
try {
const backend = config.backends[to]
const [type, value] = decodeLocationFromPrefix(location.from)
switch (type) {
switch (type) {
case LocationFromPrefixes.Filesystem:
backupFromFilesystem(value, location, backend)
break
case LocationFromPrefixes.Filesystem:
backupFromFilesystem(value, location, backend)
break
case LocationFromPrefixes.DockerVolume:
backupFromVolume(value, location, backend)
break
}
case LocationFromPrefixes.DockerVolume:
backupFromVolume(value, location, backend)
break
}
writer.done(`${name}${to.blue} : ${'Done ✓'.green} (${delta.finished(true)})`)
} catch (e) {
writer.done(`${name}${to.blue} : ${'Failed!'.red} (${delta.finished(true)}) ${e.message}`)
}
writer.done(`${name}${to.blue} : ${'Done ✓'.green} (${delta.finished(true)})`)
} catch (e) {
hasError()
writer.done(`${name}${to.blue} : ${'Failed!'.red} (${delta.finished(true)}) ${e.message}`)
}
}
export const backupLocation = (name: string, location: Location) => {
const display = name.yellow + ' ▶ '
const filler = fill(name.length + 3)
let first = true
const display = name.yellow + ' ▶ '
const filler = fill(name.length + 3)
let first = true
if (location.hooks && location.hooks.before)
for (const command of makeArrayIfIsNot(location.hooks.before)) {
const cmd = execPlain(command, {})
console.log(cmd.out, cmd.err)
}
if (location.hooks && location.hooks.before)
for (const command of makeArrayIfIsNot(location.hooks.before)) {
const cmd = execPlain(command, {})
console.log(cmd.out, cmd.err)
}
for (const t of makeArrayIfIsNot(location.to)) {
backupSingle(first ? display : filler, t, location)
if (first) first = false
}
for (const t of makeArrayIfIsNot(location.to)) {
backupSingle(first ? display : filler, t, location)
if (first) first = false
}
if (location.hooks && location.hooks.after)
for (const command of makeArrayIfIsNot(location.hooks.after)) {
const cmd = execPlain(command)
console.log(cmd.out, cmd.err)
}
if (location.hooks && location.hooks.after)
for (const command of makeArrayIfIsNot(location.hooks.after)) {
const cmd = execPlain(command)
console.log(cmd.out, cmd.err)
}
}
export const backupAll = (locations?: Locations) => {
if (!locations)
locations = config.locations
if (!locations) locations = config.locations
console.log('\nBacking Up'.underline.grey)
for (const [name, location] of Object.entries(locations))
backupLocation(name, location)
console.log('\nBacking Up'.underline.grey)
for (const [name, location] of Object.entries(locations)) backupLocation(name, location)
}

View File

@@ -5,117 +5,100 @@ import { homedir } from 'os'
import yaml from 'js-yaml'
import CronParser from 'cron-parser'
import { flags } from './autorestic'
import { Backend, Config } from './types'
import { makeArrayIfIsNot, makeObjectKeysLowercase, rand } from './utils'
export enum LocationFromPrefixes {
Filesystem,
DockerVolume
Filesystem,
DockerVolume,
}
export const normalizeAndCheckBackends = (config: Config) => {
config.backends = makeObjectKeysLowercase(config.backends)
config.backends = makeObjectKeysLowercase(config.backends)
for (const [name, { type, path, key, ...rest }] of Object.entries(
config.backends,
)) {
if (!type || !path)
throw new Error(
`The backend "${name}" is missing some required attributes`,
)
for (const [name, { type, path, key, ...rest }] of Object.entries(config.backends)) {
if (!type || !path) throw new Error(`The backend "${name}" is missing some required attributes`)
const tmp: any = {
type,
path,
key: key || rand(128),
}
for (const [key, value] of Object.entries(rest))
tmp[key.toUpperCase()] = value
const tmp: any = {
type,
path,
key: key || rand(128),
}
for (const [key, value] of Object.entries(rest)) tmp[key.toUpperCase()] = value
config.backends[name] = tmp as Backend
}
config.backends[name] = tmp as Backend
}
}
export const normalizeAndCheckLocations = (config: Config) => {
config.locations = makeObjectKeysLowercase(config.locations)
const backends = Object.keys(config.backends)
config.locations = makeObjectKeysLowercase(config.locations)
const backends = Object.keys(config.backends)
const checkDestination = (backend: string, location: string) => {
if (!backends.includes(backend))
throw new Error(`Cannot find the backend "${backend}" for "${location}"`)
}
const checkDestination = (backend: string, location: string) => {
if (!backends.includes(backend)) throw new Error(`Cannot find the backend "${backend}" for "${location}"`)
}
for (const [name, { from, to, cron, ...rest }] of Object.entries(config.locations)) {
if (!from)
throw new Error(`The location "${name.blue}" is missing the "${'from'.underline.red}" source folder. See https://git.io/Jf0xw`)
if (!to || (Array.isArray(to) && !to.length))
throw new Error(`The location "${name.blue}" has no backend "${'to'.underline.red}" to save the backups. See https://git.io/Jf0xw`)
for (const [name, { from, to, cron, ...rest }] of Object.entries(config.locations)) {
if (!from) throw new Error(`The location "${name.blue}" is missing the "${'from'.underline.red}" source folder. See https://git.io/Jf0xw`)
if (!to || (Array.isArray(to) && !to.length))
throw new Error(`The location "${name.blue}" has no backend "${'to'.underline.red}" to save the backups. See https://git.io/Jf0xw`)
for (const t of makeArrayIfIsNot(to))
checkDestination(t, name)
for (const t of makeArrayIfIsNot(to)) checkDestination(t, name)
if (cron) {
try {
CronParser.parseExpression(cron)
} catch {
throw new Error(`The location "${name.blue}" has an invalid ${'cron'.underline.red} entry. See https://git.io/Jf0xP`)
}
}
}
if (cron) {
try {
CronParser.parseExpression(cron)
} catch {
throw new Error(`The location "${name.blue}" has an invalid ${'cron'.underline.red} entry. See https://git.io/Jf0xP`)
}
}
}
}
const findConfigFile = (): string => {
const config = '.autorestic.yml'
const paths = [
resolve(flags.config || ''),
resolve('./' + config),
homedir() + '/' + config,
]
for (const path of paths) {
try {
const file = statSync(path)
if (file.isFile()) return path
} catch (e) {
}
}
throw new Error('Config file not found')
const findConfigFile = (custom: string): string => {
const config = '.autorestic.yml'
const paths = [resolve(custom || ''), resolve('./' + config), homedir() + '/' + config]
for (const path of paths) {
try {
const file = statSync(path)
if (file.isFile()) return path
} catch (e) {}
}
throw new Error('Config file not found')
}
export let CONFIG_FILE: string = ''
export const init = (): Config => {
const file = findConfigFile()
CONFIG_FILE = file
export const init = (custom: string): Config => {
const file = findConfigFile(custom)
CONFIG_FILE = file
const raw: Config = makeObjectKeysLowercase(
yaml.safeLoad(readFileSync(CONFIG_FILE).toString()),
)
const parsed = yaml.safeLoad(readFileSync(CONFIG_FILE).toString())
if (!parsed || typeof parsed === 'string') throw new Error('Could not parse the config file')
const raw: Config = makeObjectKeysLowercase(parsed)
const current = JSON.stringify(raw)
const current = JSON.stringify(raw)
normalizeAndCheckBackends(raw)
normalizeAndCheckLocations(raw)
normalizeAndCheckBackends(raw)
normalizeAndCheckLocations(raw)
const changed = JSON.stringify(raw) !== current
const changed = JSON.stringify(raw) !== current
if (changed) {
const OLD_CONFIG_FILE = CONFIG_FILE + '.old'
copyFileSync(CONFIG_FILE, OLD_CONFIG_FILE)
writeFileSync(CONFIG_FILE, yaml.safeDump(raw))
console.log(
'\n' +
'⚠️ MOVED OLD CONFIG FILE TO: ⚠️'.red.underline.bold +
'\n' +
OLD_CONFIG_FILE +
'\n' +
'What? Why? '.grey + 'https://git.io/Jf0xK'.underline.grey +
'\n'
)
}
if (changed) {
const OLD_CONFIG_FILE = CONFIG_FILE + '.old'
copyFileSync(CONFIG_FILE, OLD_CONFIG_FILE)
writeFileSync(CONFIG_FILE, yaml.safeDump(raw))
console.log(
'\n' +
'⚠️ MOVED OLD CONFIG FILE TO: ⚠️'.red.underline.bold +
'\n' +
OLD_CONFIG_FILE +
'\n' +
'What? Why? '.grey +
'https://git.io/Jf0xK'.underline.grey +
'\n'
)
}
return raw
return raw
}

View File

@@ -1,51 +1,22 @@
import fs from 'fs'
import CronParser from 'cron-parser'
import { config } from './autorestic'
import { config } from './'
import { checkAndConfigureBackendsForLocations } from './backend'
import { Location, Lockfile } from './types'
import { Location } from './types'
import { backupLocation } from './backup'
import { pathRelativeToConfigFile } from './utils'
const getLockFileName = () => {
const LOCK_FILE = '.autorestic.lock'
return pathRelativeToConfigFile(LOCK_FILE)
}
const readLock = (): Lockfile => {
const name = getLockFileName()
let lock = {}
try {
lock = JSON.parse(fs.readFileSync(name, { encoding: 'utf-8' }))
} catch { }
return lock
}
const writeLock = (diff: Lockfile = {}) => {
const name = getLockFileName()
const newLock = Object.assign(
readLock(),
diff
)
fs.writeFileSync(name, JSON.stringify(newLock, null, 2), { encoding: 'utf-8' })
}
import { readLock, writeLock } from './lock'
const runCronForLocation = (name: string, location: Location) => {
const lock = readLock()[name]
const lock = readLock()
const parsed = CronParser.parseExpression(location.cron || '')
const last = parsed.prev()
if (!lock || last.toDate().getTime() > lock.lastRun) {
if (!lock.crons[name] || last.toDate().getTime() > lock.crons[name].lastRun) {
backupLocation(name, location)
writeLock({
[name]: {
...lock,
lastRun: Date.now()
}
})
lock.crons[name] = { lastRun: Date.now() }
writeLock(lock)
} else {
console.log(`${name.yellow} ▶ Skipping. Sheduled for: ${parsed.next().toString().underline.blue}`)
console.log(`${name.yellow} ▶ Skipping. Scheduled for: ${parsed.next().toString().underline.blue}`)
}
}
@@ -54,8 +25,7 @@ export const runCron = () => {
checkAndConfigureBackendsForLocations(Object.fromEntries(locationsWithCron))
console.log('\nRunning cron jobs'.underline.gray)
for (const [name, location] of locationsWithCron)
runCronForLocation(name, location)
for (const [name, location] of locationsWithCron) runCronForLocation(name, location)
console.log('\nFinished!'.underline + ' 🎉')
}
}

View File

@@ -1,75 +1,61 @@
import { Writer } from 'clitastic'
import { config, VERBOSE } from './autorestic'
import { config, VERBOSE } from './'
import { getEnvFromBackend } from './backend'
import { LocationFromPrefixes } from './config'
import { Locations, Location, Flags } from './types'
import {
exec,
pathRelativeToConfigFile,
getFlagsFromLocation,
makeArrayIfIsNot,
fill, decodeLocationFromPrefix, getPathFromVolume,
} from './utils'
import { exec, pathRelativeToConfigFile, getFlagsFromLocation, makeArrayIfIsNot, fill, decodeLocationFromPrefix, getPathFromVolume } from './utils'
export const forgetSingle = (name: string, to: string, location: Location, dryRun: boolean) => {
const base = name + to.blue + ' : '
const writer = new Writer(base + 'Removing old snapshots… ⏳')
const base = name + to.blue + ' : '
const writer = new Writer(base + 'Removing old snapshots… ⏳')
const backend = config.backends[to]
const flags = getFlagsFromLocation(location, 'forget')
const backend = config.backends[to]
const flags = getFlagsFromLocation(location, 'forget')
const [type, value] = decodeLocationFromPrefix(location.from)
let path: string
switch (type) {
case LocationFromPrefixes.Filesystem:
path = pathRelativeToConfigFile(value)
break
case LocationFromPrefixes.DockerVolume:
path = getPathFromVolume(value)
break
}
const [type, value] = decodeLocationFromPrefix(location.from)
let path: string
switch (type) {
case LocationFromPrefixes.Filesystem:
path = pathRelativeToConfigFile(value)
break
case LocationFromPrefixes.DockerVolume:
path = getPathFromVolume(value)
break
}
if (flags.length == 0) {
writer.done(base + 'Skipping, no policy declared')
return
}
if (dryRun) flags.push('--dry-run')
if (flags.length == 0) {
writer.done(base + 'Skipping, no policy declared')
return
}
if (dryRun) flags.push('--dry-run')
writer.replaceLn(base + 'Forgetting old snapshots… ⏳')
const cmd = exec(
'restic',
['forget', '--path', path, '--prune', ...flags],
{ env: getEnvFromBackend(backend) },
)
writer.replaceLn(base + 'Forgetting old snapshots… ⏳')
const cmd = exec('restic', ['forget', '--path', path, '--prune', ...flags], { env: getEnvFromBackend(backend) })
if (VERBOSE) console.log(cmd.out, cmd.err)
writer.done(base + 'Done ✓'.green)
if (VERBOSE) console.log(cmd.out, cmd.err)
writer.done(base + 'Done ✓'.green)
}
export const forgetLocation = (name: string, backup: Location, dryRun: boolean) => {
const display = name.yellow + ' ▶ '
const filler = fill(name.length + 3)
let first = true
const display = name.yellow + ' ▶ '
const filler = fill(name.length + 3)
let first = true
for (const t of makeArrayIfIsNot(backup.to)) {
const nameOrBlankSpaces: string = first ? display : filler
forgetSingle(nameOrBlankSpaces, t, backup, dryRun)
if (first) first = false
}
for (const t of makeArrayIfIsNot(backup.to)) {
const nameOrBlankSpaces: string = first ? display : filler
forgetSingle(nameOrBlankSpaces, t, backup, dryRun)
if (first) first = false
}
}
export const forgetAll = (backups?: Locations, flags?: Flags) => {
if (!backups) {
backups = config.locations
}
export const forgetAll = (backups?: Locations, dryRun = false) => {
if (!backups) {
backups = config.locations
}
console.log('\nRemoving old snapshots according to policy'.underline.grey)
const dryRun = flags ? flags['dry-run'] : false
if (dryRun) console.log('Running in dry-run mode, not touching data\n'.yellow)
console.log('\nRemoving old snapshots according to policy'.underline.grey)
if (dryRun) console.log('Running in dry-run mode, not touching data\n'.yellow)
for (const [name, backup] of Object.entries(backups))
forgetLocation(name, backup, dryRun)
for (const [name, backup] of Object.entries(backups)) forgetLocation(name, backup, dryRun)
}

View File

@@ -1,244 +0,0 @@
import { chmodSync, renameSync, unlinkSync } from 'fs'
import { tmpdir } from 'os'
import { join, resolve } from 'path'
import axios from 'axios'
import { Writer } from 'clitastic'
import { config, INSTALL_DIR, VERSION } from './autorestic'
import { checkAndConfigureBackends, getEnvFromBackend, checkAndConfigureBackendsForLocations } from './backend'
import { backupAll } from './backup'
import { runCron } from './cron'
import { forgetAll } from './forget'
import showAll from './info'
import { restoreSingle } from './restore'
import { Backends, Flags, Locations } from './types'
import {
checkIfCommandIsAvailable,
checkIfResticIsAvailable,
downloadFile,
exec,
filterObjectByKey,
makeArrayIfIsNot,
} from './utils'
export type Handlers = {
[command: string]: (args: string[], flags: Flags) => void
}
const parseBackend = (flags: Flags): Backends => {
if (!flags.all && !flags.backend)
throw new Error(
'No backends specified.'.red +
'\n--all [-a]\t\t\t\tCheck all.' +
'\n--backend [-b] myBackend\t\tSpecify one or more backend',
)
if (flags.all) return config.backends
else {
const backends = makeArrayIfIsNot<string>(flags.backend)
for (const backend of backends)
if (!config.backends[backend])
throw new Error('Invalid backend: '.red + backend)
return filterObjectByKey(config.backends, backends)
}
}
const parseLocations = (flags: Flags): Locations => {
if (!flags.all && !flags.location)
throw new Error(
'No locations specified.'.red +
'\n--all [-a]\t\t\t\tBackup all.' +
'\n--location [-l] site1\t\t\tSpecify one or more locations',
)
if (flags.all) {
return config.locations
} else {
const locations = makeArrayIfIsNot<string>(flags.location)
for (const location of locations)
if (!config.locations[location])
throw new Error('Invalid location: '.red + location)
return filterObjectByKey(config.locations, locations)
}
}
const handlers: Handlers = {
check(args, flags) {
checkIfResticIsAvailable()
const backends = parseBackend(flags)
checkAndConfigureBackends(backends)
},
backup(args, flags) {
checkIfResticIsAvailable()
const locations: Locations = parseLocations(flags)
checkAndConfigureBackendsForLocations(locations)
backupAll(locations)
console.log('\nFinished!'.underline + ' 🎉')
},
cron(args, flags) {
checkIfResticIsAvailable()
runCron()
},
restore(args, flags) {
checkIfResticIsAvailable()
const locations = parseLocations(flags)
const keys = Object.keys(locations)
if (keys.length < 1) throw new Error(`You need to specify the location to restore with --location`.red)
if (keys.length > 2) throw new Error(`Only one location is supported at a time when restoring`.red)
restoreSingle(keys[0], flags.from, flags.to)
},
forget(args, flags) {
checkIfResticIsAvailable()
const locations: Locations = parseLocations(flags)
checkAndConfigureBackendsForLocations(locations)
forgetAll(locations, flags)
console.log('\nFinished!'.underline + ' 🎉')
},
exec(args, flags) {
checkIfResticIsAvailable()
const backends = parseBackend(flags)
for (const [name, backend] of Object.entries(backends)) {
console.log(`\n${name}:\n`.grey.underline)
const env = getEnvFromBackend(backend)
const { out, err } = exec('restic', args, { env })
console.log(out, err)
}
},
info() {
showAll()
},
async install() {
try {
checkIfResticIsAvailable()
console.log('Restic is already installed')
return
} catch {
}
const w = new Writer('Checking latest version... ⏳')
checkIfCommandIsAvailable('bzip2')
const { data: json } = await axios({
method: 'get',
url: 'https://api.github.com/repos/restic/restic/releases/latest',
responseType: 'json',
})
const archMap: { [a: string]: string } = {
x32: '386',
x64: 'amd64',
}
w.replaceLn('Downloading binary... 🌎')
const name = `${json.name.replace(' ', '_')}_${process.platform}_${archMap[process.arch]}.bz2`
const dl = json.assets.find((asset: any) => asset.name === name)
if (!dl)
return console.log(
'Cannot get the right binary.'.red,
'Please see https://bit.ly/2Y1Rzai',
)
const tmp = join(tmpdir(), name)
const extracted = tmp.slice(0, -4) //without the .bz2
await downloadFile(dl.browser_download_url, tmp)
w.replaceLn('Decompressing binary... 📦')
exec('bzip2', ['-dk', tmp])
unlinkSync(tmp)
w.replaceLn(`Moving to ${INSTALL_DIR} 🚙`)
chmodSync(extracted, 0o755)
renameSync(extracted, INSTALL_DIR + '/restic')
w.done(
`\nFinished! restic is installed under: ${INSTALL_DIR}`.underline + ' 🎉',
)
},
uninstall() {
for (const bin of ['restic', 'autorestic'])
try {
unlinkSync(INSTALL_DIR + '/' + bin)
console.log(`Finished! ${bin} was uninstalled`)
} catch (e) {
console.log(`${bin} is already uninstalled`.red)
}
},
async update() {
checkIfResticIsAvailable()
const w = new Writer('Checking for latest restic version... ⏳')
exec('restic', ['self-update'])
w.replaceLn('Checking for latest autorestic version... ⏳')
const { data: json } = await axios({
method: 'get',
url:
'https://api.github.com/repos/cupcakearmy/autorestic/releases/latest',
responseType: 'json',
})
if (json.tag_name != VERSION) {
const platformMap: { [key: string]: string } = {
darwin: 'macos',
}
const name = `autorestic_${platformMap[process.platform] || process.platform}_${process.arch}`
const dl = json.assets.find((asset: any) => asset.name === name)
const to = INSTALL_DIR + '/autorestic'
w.replaceLn('Downloading binary... 🌎')
await downloadFile(dl.browser_download_url, to)
chmodSync(to, 0o755)
}
w.done('All up to date! 🚀')
},
version() {
console.log('version'.grey, VERSION)
},
}
export const help = () => {
console.log(
'\nAutorestic'.blue +
` - ${VERSION} - Easy Restic CLI Utility` +
'\n' +
'\nOptions:'.yellow +
`\n -c, --config Specify config file. Default: .autorestic.yml` +
'\n' +
'\nCommands:'.yellow +
'\n info Show all locations and backends' +
'\n check [-b, --backend] [-a, --all] Check backends' +
'\n backup [-l, --location] [-a, --all] Backup all or specified locations' +
'\n forget [-l, --location] [-a, --all] [--dry-run] Forget old snapshots according to declared policies' +
'\n restore [-l, --location] [--from backend] [--to <out dir>] Restore all or specified locations' +
'\n' +
'\n exec [-b, --backend] [-a, --all] <command> -- [native options] Execute native restic command' +
'\n' +
'\n install install restic' +
'\n uninstall uninstall restic' +
'\n update update restic' +
'\n help Show help' +
'\n' +
'\nExamples: '.yellow +
'https://git.io/Jf0x6' +
'\n',
)
}
export const error = () => {
help()
console.log(
`Invalid Command:`.red.underline,
`${process.argv.slice(2).join(' ')}`,
)
}
export default handlers

13
src/handlers/backup.ts Normal file
View File

@@ -0,0 +1,13 @@
import { checkAndConfigureBackendsForLocations } from '../backend'
import { backupAll } from '../backup'
import { Flags, Locations } from '../types'
import { checkIfResticIsAvailable, parseLocations } from '../utils'
export default function backup({ location, all }: Flags) {
checkIfResticIsAvailable()
const locations: Locations = parseLocations(location, all)
checkAndConfigureBackendsForLocations(locations)
backupAll(locations)
console.log('\nFinished!'.underline + ' 🎉')
}

9
src/handlers/check.ts Normal file
View File

@@ -0,0 +1,9 @@
import { checkAndConfigureBackends } from '../backend'
import { Flags } from '../types'
import { checkIfResticIsAvailable, parseBackend } from '../utils'
export default function check({ backend, all }: Flags) {
checkIfResticIsAvailable()
const backends = parseBackend(backend, all)
checkAndConfigureBackends(backends)
}

7
src/handlers/cron.ts Normal file
View File

@@ -0,0 +1,7 @@
import { runCron } from '../cron'
import { checkIfResticIsAvailable } from '../utils'
export function cron() {
checkIfResticIsAvailable()
runCron()
}

14
src/handlers/exec.ts Normal file
View File

@@ -0,0 +1,14 @@
import { getEnvFromBackend } from '../backend'
import { Flags } from '../types'
import { checkIfResticIsAvailable, exec as execCLI, parseBackend } from '../utils'
export default function exec({ backend, all }: Flags, args: string[]) {
checkIfResticIsAvailable()
const backends = parseBackend(backend, all)
for (const [name, backend] of Object.entries(backends)) {
console.log(`\n${name}:\n`.grey.underline)
const env = getEnvFromBackend(backend)
const { out, err } = execCLI('restic', args, { env })
console.log(out, err)
}
}

13
src/handlers/forget.ts Normal file
View File

@@ -0,0 +1,13 @@
import { checkAndConfigureBackendsForLocations } from '../backend'
import { forgetAll } from '../forget'
import { Flags, Locations } from '../types'
import { checkIfResticIsAvailable, parseLocations } from '../utils'
export default function forget({ location, all, dryRun }: Flags) {
checkIfResticIsAvailable()
const locations: Locations = parseLocations(location, all)
checkAndConfigureBackendsForLocations(locations)
forgetAll(locations, dryRun)
console.log('\nFinished!'.underline + ' 🎉')
}

18
src/handlers/info.ts Normal file
View File

@@ -0,0 +1,18 @@
import { config } from '../'
import { fill, treeToString } from '../utils'
const showAll = () => {
console.log('\n\n' + fill(32, '_') + 'LOCATIONS:'.underline)
for (const [key, data] of Object.entries(config.locations)) {
console.log(`\n${key.blue.underline}:`)
console.log(treeToString(data, ['to:', 'from:', 'hooks:', 'options:', 'cron:']))
}
console.log('\n\n' + fill(32, '_') + 'BACKENDS:'.underline)
for (const [key, data] of Object.entries(config.backends)) {
console.log(`\n${key.blue.underline}:`)
console.log(treeToString(data, ['type:', 'path:', 'key:']))
}
}
export default showAll

50
src/handlers/install.ts Normal file
View File

@@ -0,0 +1,50 @@
import { join } from 'path'
import { chmodSync, renameSync, unlinkSync } from 'fs'
import { tmpdir } from 'os'
import axios from 'axios'
import { Writer } from 'clitastic'
import { INSTALL_DIR } from '..'
import { checkIfCommandIsAvailable, checkIfResticIsAvailable, downloadFile, exec } from '../utils'
export default async function install() {
try {
checkIfResticIsAvailable()
console.log('Restic is already installed')
return
} catch {}
const w = new Writer('Checking latest version... ⏳')
checkIfCommandIsAvailable('bzip2')
const { data: json } = await axios({
method: 'get',
url: 'https://api.github.com/repos/restic/restic/releases/latest',
responseType: 'json',
})
const archMap: { [a: string]: string } = {
x32: '386',
x64: 'amd64',
}
w.replaceLn('Downloading binary... 🌎')
const name = `${json.name.replace(' ', '_')}_${process.platform}_${archMap[process.arch]}.bz2`
const dl = json.assets.find((asset: any) => asset.name === name)
if (!dl) return console.log('Cannot get the right binary.'.red, 'Please see https://bit.ly/2Y1Rzai')
const tmp = join(tmpdir(), name)
const extracted = tmp.slice(0, -4) //without the .bz2
await downloadFile(dl.browser_download_url, tmp)
w.replaceLn('Decompressing binary... 📦')
exec('bzip2', ['-dk', tmp])
unlinkSync(tmp)
w.replaceLn(`Moving to ${INSTALL_DIR} 🚙`)
chmodSync(extracted, 0o755)
renameSync(extracted, INSTALL_DIR + '/restic')
w.done(`\nFinished! restic is installed under: ${INSTALL_DIR}`.underline + ' 🎉')
}

9
src/handlers/restore.ts Normal file
View File

@@ -0,0 +1,9 @@
import { restoreSingle } from '../restore'
import { Flags } from '../types'
import { checkIfResticIsAvailable, checkIfValidLocation } from '../utils'
export default function restore({ location, to, from }: Flags) {
checkIfResticIsAvailable()
checkIfValidLocation(location)
restoreSingle(location, from, to)
}

13
src/handlers/uninstall.ts Normal file
View File

@@ -0,0 +1,13 @@
import { unlinkSync } from 'fs'
import { INSTALL_DIR } from '..'
export function uninstall() {
for (const bin of ['restic', 'autorestic'])
try {
unlinkSync(INSTALL_DIR + '/' + bin)
console.log(`Finished! ${bin} was uninstalled`)
} catch (e) {
console.log(`${bin} is already uninstalled`.red)
}
}

37
src/handlers/upgrade.ts Normal file
View File

@@ -0,0 +1,37 @@
import { chmodSync } from 'fs'
import axios from 'axios'
import { Writer } from 'clitastic'
import { INSTALL_DIR, VERSION } from '..'
import { checkIfResticIsAvailable, downloadFile, exec } from '../utils'
export async function upgrade() {
checkIfResticIsAvailable()
const w = new Writer('Checking for latest restic version... ⏳')
exec('restic', ['self-update'])
w.replaceLn('Checking for latest autorestic version... ⏳')
const { data: json } = await axios({
method: 'get',
url: 'https://api.github.com/repos/cupcakearmy/autorestic/releases/latest',
responseType: 'json',
})
if (json.tag_name != VERSION) {
const platformMap: { [key: string]: string } = {
darwin: 'macos',
}
const name = `autorestic_${platformMap[process.platform] || process.platform}_${process.arch}`
const dl = json.assets.find((asset: any) => asset.name === name)
const to = INSTALL_DIR + '/autorestic'
w.replaceLn('Downloading binary... 🌎')
await downloadFile(dl.browser_download_url, to)
chmodSync(to, 0o755)
}
w.done('All up to date! 🚀')
}

132
src/index.ts Normal file
View File

@@ -0,0 +1,132 @@
import 'colors'
import { program } from 'commander'
import { setCIMode } from 'clitastic'
import { unlock, readLock, writeLock } from './lock'
import { Config } from './types'
import { init } from './config'
import info from './handlers/info'
import check from './handlers/check'
import backup from './handlers/backup'
import restore from './handlers/restore'
import forget from './handlers/forget'
import { cron } from './handlers/cron'
import exec from './handlers/exec'
import install from './handlers/install'
import { uninstall } from './handlers/uninstall'
import { upgrade } from './handlers/upgrade'
export const VERSION = '0.24'
export const INSTALL_DIR = '/usr/local/bin'
let requireConfig: boolean = true
let error: boolean = false
export function hasError() {
error = true
}
process.on('uncaughtException', (err) => {
console.log(err.message)
unlock()
process.exit(1)
})
let queue: () => Promise<void> = async () => {}
const enqueue = (fn: Function) => (cmd: any) => {
queue = async () => fn(cmd.opts())
}
program.storeOptionsAsProperties()
program.name('autorestic').description('Easy Restic CLI Utility').version(VERSION)
program.option('-c, --config <path>', 'Config file')
program.option('-v, --verbose', 'Verbosity', false)
program.option('--ci', 'CI Mode. Removes interactivity from the shell', false)
program.command('info').action(enqueue(info))
program.on('--help', () => {
console.log('')
console.log(`${'Docs:'.yellow}\t\thttps://autorestic.vercel.app`)
console.log(`${'Examples:'.yellow}\thttps://autorestic.vercel.app/examples`)
})
program
.command('check')
.description('Checks and initializes backend as needed')
.option('-b, --backend <backends...>')
.option('-a, --all')
.action(enqueue(check))
program.command('backup').description('Performs a backup').option('-l, --location <locations...>').option('-a, --all').action(enqueue(backup))
program
.command('restore')
.description('Restores data to a specified folder from a location')
.requiredOption('-l, --location <location>')
.option('--from <backend>')
.requiredOption('--to <path>', 'Path to save the restored data to')
.action(enqueue(restore))
program
.command('forget')
.description('This will prune and remove data according to your policies')
.option('-l, --location <locations...>')
.option('-a, --all')
.option('--dry-run')
.action(enqueue(forget))
program
.command('cron')
.description('Intended to be triggered by an automated system like systemd or crontab.')
.option('-a, --all')
.action(enqueue(cron))
program
.command('exec')
.description('Run any native restic command on desired backends')
.option('-b, --backend <backends...>')
.option('-a, --all')
.action(({ args, all, backend }) => {
queue = async () => exec({ all, backend }, args)
})
program.command('install').description('Installs both restic and autorestic to /usr/local/bin').action(enqueue(install))
program.command('uninstall').description('Uninstalls autorestic from the system').action(enqueue(uninstall))
program
.command('upgrade')
.alias('update')
.description('Checks and installs new autorestic versions')
.action(() => {
requireConfig = false
queue = upgrade
})
const { verbose, config: configFile, ci } = program.parse(process.argv)
export const VERBOSE = verbose
export let config: Config
setCIMode(ci)
;(async () => {
try {
const lock = readLock()
if (lock.running) throw new Error('An instance of autorestic is already running for this config file'.red)
writeLock({
...lock,
running: true,
})
if (requireConfig) config = init(configFile)
await queue()
if (error) process.exit(1)
} catch (e) {
console.error(e.message)
} finally {
unlock()
}
})()

View File

@@ -1,26 +1,18 @@
import { config } from './autorestic'
import { config } from './'
import { fill, treeToString } from './utils'
const showAll = () => {
console.log('\n\n' + fill(32, '_') + 'LOCATIONS:'.underline)
for (const [key, data] of Object.entries(config.locations)) {
console.log(`\n${key.blue.underline}:`)
console.log(treeToString(
data,
['to:', 'from:', 'hooks:', 'options:', 'cron:'],
))
}
console.log('\n\n' + fill(32, '_') + 'LOCATIONS:'.underline)
for (const [key, data] of Object.entries(config.locations)) {
console.log(`\n${key.blue.underline}:`)
console.log(treeToString(data, ['to:', 'from:', 'hooks:', 'options:', 'cron:']))
}
console.log('\n\n' + fill(32, '_') + 'BACKENDS:'.underline)
for (const [key, data] of Object.entries(config.backends)) {
console.log(`\n${key.blue.underline}:`)
console.log(treeToString(
data,
['type:', 'path:', 'key:'],
))
}
console.log('\n\n' + fill(32, '_') + 'BACKENDS:'.underline)
for (const [key, data] of Object.entries(config.backends)) {
console.log(`\n${key.blue.underline}:`)
console.log(treeToString(data, ['type:', 'path:', 'key:']))
}
}
export default showAll
export default showAll

Some files were not shown because too many files have changed in this diff Show More