Dokumentation · Guide

Moraine-dokumentation

En praktisk guide med kommandoraden i fokus — installation, konfiguration, backends, schemaläggning, gallring, återställning och felsökning — plus en kort rundtur i skrivbordsappen.

Installation

Moraine levereras med en kommandoradsklient (moraine) och en GTK-skrivbordsapp (moraine-gui, Linux). Den här guiden fokuserar på CLI:t.

PlattformInstallation
Debian / Ubuntu / MintLägg till thern.io APT-förrådet, kör sedan sudo apt install moraine
Fedora / RHELLägg till DNF-förrådet, kör sedan sudo dnf install moraine — eller via Copr: sudo dnf copr enable jonaz/moraine
openSUSEsudo zypper ar https://download.opensuse.org/repositories/home:/TheJonaz/openSUSE_Tumbleweed/home:TheJonaz.repo, kör sedan sudo zypper in moraine
Arch LinuxLägg till pacman-förrådet, kör sedan sudo pacman -S moraine
Arch Linux (AUR)paru -S moraine — eller git clone https://aur.archlinux.org/moraine.git && makepkg -si
Gentooeselect repository add moraine git https://github.com/TheJonaz/moraine-overlay.git, kör sedan sudo emerge -av app-backup/moraineUSE="-gui" bygger CLI:t utan att dra in GTK
Flatpak (alla distributioner)flatpak remote-add --if-not-exists moraine https://cdn.thern.io/moraine.flatpakrepo, kör sedan flatpak install moraine io.thern.moraine
AppImage (alla distributioner)Ladda ner, kör sedan chmod +x moraine-x86_64.AppImage && ./moraine-x86_64.AppImage — kräver glibc ≥ 2.39 (Ubuntu 24.04+, Debian 13+, Fedora 40+); äldre system: använd Flatpaken
Raspberry Pi (CLI)Statiskt länkad, inga beroenden — packa upp och kör. uname -m visar vilken: aarch64arm64-arkivet, armv7larmv7-arkivet
macOS (CLI)brew install TheJonaz/moraine/moraine
Windows (CLI)scoop bucket add moraine https://github.com/TheJonaz/scoop-moraine, sedan scoop install moraine
Från källkodcargo build --release — lägg till --no-default-features för enbart CLI:t (hoppar över GTK)

thern.io CDN är värd för GPG-signerade APT-, DNF- och pacman-förråd, så installationer uppdateras automatiskt; de exakta enradarna för att lägga till förrådet (GPG-nyckel + källrad) finns på nedladdningssidan. Varje bygge finns även på GitHub Releases. Vid körning krävs rsync + ssh för SSH-backenden; rclone för moln-/FTP-backendarna.

Snabbstart

Fyra steg från ingenting till en fungerande snapshot:

# 1. Skriv en startkonfiguration (moraine.toml, endast ägaren)
$ moraine init

# 2. Redigera den — ange host, user, dest och dina källor
$ $EDITOR moraine.toml

# 3. Se exakt vad som skulle överföras, utan att röra något
$ moraine run --dry-run

# 4. Ta den första snapshoten
$ moraine run

Varje körning skapar <dest>/<name>/<timestamp>/ på målet och uppdaterar en latest-pekare. Oförändrade filer hårdlänkas mot föregående snapshot, så historiken kostar nästan ingenting.

Som standard läser Moraine moraine.toml i den aktuella katalogen. Peka ut en annan fil med -c/--config, t.ex. moraine -c ~/.config/moraine/moraine.toml run.

Konfigurationsfilen

Konfigurationen är TOML: ett [[target]]-block per destination, vart och ett med en valfri [target.retention]. Här är ett kommenterat SSH-mål:

[[target]]
name    = "nas"          # mapp på målet & namn för --target
host    = "192.168.1.50" # IP eller värdnamn
user    = "backup"       # SSH-användare
port    = 22             # valfritt (standard 22)
key     = "~/.ssh/id_ed25519"  # valfritt; utelämna för att använda ssh-agent
dest    = "/volume1/backups"   # snapshots hamnar under <dest>/<name>/
sources = ["/home/me/documents", "/home/me/pictures"]
exclude = ["*.tmp", "node_modules", ".cache"]  # valfritt
# strict_host_key = true   # kräv att värdnyckeln redan finns i known_hosts
# vpn = "home-vpn"         # NetworkManager-anslutning att starta för körningen

[target.retention]       # valfritt — utelämna för att behålla allt
keep_last    = 7          # behåll de 7 senaste
keep_daily   = 14         # + nyaste per dag, 14 dagar
keep_weekly  = 8
keep_monthly = 12
FältBetydelse
nameUnikt, inget / — blir en mapp under dest.
backendssh (standard), rclone eller ftp.
host, user, portSSH-anslutningen (eller namnet på rclone-remoten i host för rclone-backenden).
keySökväg till en privat SSH-nyckel. Utelämna för att använda ssh-agent.
passwordEndast för FTP-backenden, eller en lösenfras till SSH-nyckeln / ett inloggningslösenord (lagras i klartext — filen skrivs med rättigheterna 0600).
strict_host_keytrue = kräv att nyckeln finns i known_hosts (skyddar den första anslutningen). Standard är förtroende vid första anslutning.
destRotkatalog på målet. Snapshots hamnar i <dest>/<name>/<timestamp>/.
sourcesFiler/mappar på den här maskinen som ska säkerhetskopieras. Två källor får inte ha samma basnamn.
excludeUteslutningsmönster för rsync.
vpnEn NetworkManager-anslutning som startas före körningen och stängs efteråt.

Kommandoreferens

Alla kommandon tar den globala flaggan -c/--config <file>. Utan --target verkar kommandona på alla mål.

KommandoVad det gör
moraine init [--force]Skriv en exempelfil moraine.toml att utgå från.
moraine verify [-t NAME]Kontrollera att källorna finns, att SSH-anslutningen fungerar och att destinationen är skrivbar.
moraine run [-t NAME] [--dry-run]Ta en snapshot. --dry-run visar vad som skulle överföras utan att skriva något.
moraine list -t NAMELista snapshotarna på ett mål.
moraine check [-t NAME] [--snapshot TS]Verifiera en snapshots innehåll mot de aktuella källorna, med kontrollsummor. Utan --snapshot kontrolleras den nyaste kompletta.
moraine prune [-t NAME] [--dry-run]Radera gamla snapshots enligt gallringsreglerna.
$ moraine verify -t nas          # testa anslutning + källor + dest
$ moraine run -t nas             # snapshot av ett mål
$ moraine run --dry-run          # förhandsgranska alla mål
$ moraine list -t nas            # visa tidsstämplar
$ moraine prune -t nas --dry-run # visa vad gallringen skulle radera

En lyckad moraine run gallrar målet automatiskt efteråt om det har en [target.retention]-policy — så en enda schemalagd run både säkerhetskopierar och städar upp.

Ad-hoc-backuper (utan konfigurationsfil)

moraine run kan definiera ett helt mål med enbart flaggor, vilket är praktiskt för engångsjobb och skript — inget skrivs till moraine.toml:

$ moraine run --host nas --user me --key ~/.ssh/id \
      --dest /backups --source ~/docs --source ~/pictures

Det fungerar för alla backends (--backend ssh|rclone|ftp) och tar upprepade --source/--exclude, plus --port, --name (snapshot-mappen under --dest, standard: värdnamnet), --bwlimit (t.ex. 2M) och --strict-host-key.

Kryptera destinationen

För rclone- och FTP-backendarna krypterar --crypt-password destinationen i vila (rclones crypt), med ett valfritt --crypt-salt. Användbart när lagringen ligger någonstans du inte kontrollerar.

Skicka hemligheter via miljön, inte via flaggor. Ett värde som anges med --password eller --crypt-password är synligt för alla andra lokala användare i ps och /proc/<pid>/cmdline. Använd MORAINE_PASSWORD och MORAINE_CRYPT_PASSWORD istället:

$ MORAINE_PASSWORD=… moraine run --host ftp.example.com --backend ftp \
      --user me --dest backups --source ~/docs

Så fungerar snapshots

Moraine använder rsyncs --link-dest. Varje körning skriver ett träd som ser komplett ut, men filer som inte ändrats blir hårdlänkar till föregående snapshot istället för nya kopior:

/volume1/backups/nas/
  2026-07-01T02-00-00/     # första körningen — full kopia
  2026-07-02T02-00-00/     # oförändrade filer är hårdlänkar → ~inget extra diskutrymme
  latest -> 2026-07-02T02-00-00

Eftersom varje snapshot är ett vanligt katalogträd kan du bläddra i den eller kopiera från den med helt vanliga verktyg — inget särskilt format, ingen uppackning. Att radera en snapshot frigör bara de block som inget annat länkar till.

En avbruten körning blir aldrig en snapshot

En snapshot byggs i ett dolt arbetsområde och görs synlig först när varenda fil har överförts. SSH-backenden skriver till .incomplete-<timestamp>/ och byter namn på katalogen atomärt när körningen lyckats; rclone-/FTP-backendarna skapar först en markör <timestamp>.incomplete och raderar den sist.

list, check, återställning och gallring ignorerar alla ofärdiga snapshots. En kraschad eller avbruten körning kan därför inte bli ”den senaste snapshoten”, kan inte återställas av misstag och kan inte lura gallringen att radera din senaste kompletta backup. Rester städas bort automatiskt — vid nästa lyckade backup (SSH), eller vid nästa lyckade backup eller gallring (rclone/FTP).

Bara en körning per mål åt gången. Ett lås som fungerar över processgränser hindrar en schemalagd och en manuell körning — eller CLI:t och skrivbordsappen — från att röra samma mål samtidigt; den andra misslyckas omedelbart med target is busy. Låset släpps av sig självt om en körning kraschar.

Backends

SSH / rsync (standard)

Standardvalet. Moraine kör rsync över ssh till user@host. Autentiseringsalternativ, enklast först:

Fjärrsidan behöver ha rsync installerat. Vid den första anslutningen accepteras en okänd värdnyckel och fästs (sätt strict_host_key = true för att istället kräva den redan från början).

rclone & FTP

Sätt backend = "rclone" och ange namnet på en rclone-remote i host (kör rclone config först). Fungerar med SFTP, SMB, WebDAV, S3, Drive, B2 med mera — inget rsync/ssh behövs, vilket gör det till det portabla valet på Windows.

[[target]]
name    = "cloud"
backend = "rclone"
host    = "myremote"   # en rclone-remote (tomt = en lokal sökväg)
dest    = "backups"
sources = ["/home/me/documents"]

För ren FTP utan rclone-konfiguration, använd backend = "ftp" med host/user/password/port. Inloggningsuppgifterna skickas till rclone via miljön, inte via processlistan.

Gallring & rensning

Gallringen följer grandfather-father-son (GFS). Varje nivå är ett antal; den nyaste snapshoten behålls alltid, och poster som inte går att tolka eller ser udda ut behålls också (raderas aldrig av misstag).

NyckelBehåller
keep_lastde N senaste snapshotarna, oavsett ålder
keep_dailyden nyaste snapshoten per dag, i N dagar
keep_weeklyden nyaste per ISO-vecka, i N veckor
keep_monthlyden nyaste per månad, i N månader

De behållna mängderna slås ihop till en union. Kör moraine prune -t nas --dry-run för att se exakt vad en policy skulle radera, innan den gör det.

Schemaläggning

Automatisera moraine run med cron på Linux och macOS. Eftersom en lyckad körning gallrar automatiskt räcker en rad för båda delarna:

# crontab -e — nattlig backup av alla mål kl. 02:00
0 2 * * *  moraine -c /home/me/moraine.toml run >/dev/null 2>&1

# eller ett enskilt mål, varje timme
0 * * * *  moraine -c /home/me/moraine.toml run -t nas >/dev/null 2>&1

Använd absoluta sökvägar till både moraine och konfigurationsfilen (cron har en minimal miljö). Skrivbordsappens flik Schedule skriver de här raderna åt dig.

Windows

På Windows installerar samma flik Schedule istället jobb i Task Scheduler: varje schema blir en uppgift under mappen \Moraine\, driven av ett litet .cmd-omslag i %APPDATA%\Moraine\tasks\. Från CLI:t pekar du en åtgärd i Task Scheduler mot moraine.exe med samma argument -c och run.

Återställa filer

En snapshot är bara ett katalogträd, så att återställa från CLI:t är en helt vanlig kopiering från målet:

# hela snapshoten
$ rsync -aAX backup@192.168.1.50:/volume1/backups/nas/latest/ ./restore/

# en enskild fil eller mapp från en viss snapshot
$ rsync -aAX backup@192.168.1.50:/volume1/backups/nas/2026-07-01T02-00-00/documents/report.odt  ./

För en återställning med peka-och-klicka — bläddra i filträdet, kryssa i filer, återställ till den ursprungliga platsen eller någon annanstans — använd skrivbordsappens flik Restore (se nedan). Återställning raderar aldrig något på destinationen; den lägger bara till och skriver över.

Återställningar hoppar över symlänkar som pekar utanför det återställda trädet (rsync --safe-links), eftersom fillistan kommer från destinationen och ett komprometterat mål annars skulle kunna placera ut en länk som x → ~/.ssh och skriva genom den. Om en legitim absolut symlänk hoppas över säger rsync till — återskapa den för hand.

VPN per mål

Om ett mål bara går att nå över VPN, sätt vpn till namnet på en NetworkManager-anslutning. Moraine startar den före körningen och stänger den efteråt (och låter den vara uppe om du redan hade anslutit den själv):

vpn = "home-vpn"   # nmcli connection up/down runt körningen

Lista dina anslutningar med nmcli connection show. Detta gäller även schemalagda CLI-körningar.

Säkerhet

Felsökning

MeddelandeVad det betyder / åtgärd
--link-dest arg does not exist: ../latestNormalt vid allra första körningen (det finns ingen tidigare snapshot ännu). Ofarligt.
opendir "…" failed: Permission deniedEn källmapp går inte att läsa — rätta rättigheterna (chown/chmod) eller lägg till den i exclude.
rsync: command not found (på fjärrsidan)Installera rsync på målet — SSH-backenden behöver det i båda ändar.
Host key verification failedServerns nyckel har ändrats. Verifiera att den är legitim och uppdatera sedan known_hosts.
rsync exit 23 (partiell överföring)Körningen misslyckades — vissa källfiler kunde inte läsas (rättigheter, I/O-fel). Snapshoten färdigställs inte och latest fortsätter peka på den föregående kompletta. Åtgärda de oläsbara källorna eller lägg dem i exclude, och kör sedan igen. (Före 0.2.0 räknades detta som en lyckad körning — ett tyst sätt att förlora data, i takt med att gallringen rensade bort de snapshots som fortfarande innehöll filerna.)
rsync exit 24 (filer försvann)Normalt på ett system i drift — filer försvann mitt under körningen. Räknas ändå som lyckat; snapshoten färdigställs och latest uppdateras.
target is busyEn annan körning (schemalagd, manuell, CLI eller skrivbordsapp) håller redan låset för det här målet. Vänta tills den är klar — låset släpps av sig självt även om den körningen kraschar.
rclone anonymous-login- / lösenordsfelFTP-lösenordet kunde inte obfuskeras — kontrollera att rclone är installerat och fungerar.

Kör moraine verify -t NAME för en snabb hälsokontroll av källor, anslutning och destination.

Skrivbordsapp (GUI)

GTK-appen (moraine-gui, Linux) använder samma motor och samma konfiguration som CLI:t — allt du ställer in i den ena dyker upp i den andra. Fem flikar:

Installera skrivbordsappen på Linux från .deb-paketet (Debian/Ubuntu/Mint) eller Arch-paketet — det lägger in både moraine och moraine-gui. Se nedladdningssidan.

← Tillbaka till startsidan   GitHub