Varmuuskopiointi — rclone + Google Drive

Tämä ohje kattaa EnergyHub-konfiguraatioiden automaattisen varmuuskopioinnin Google Driveen rclone-työkalulla.

Mitä varmuuskopioidaan

EnergyHubin tärkeimmät tiedostot ovat konfiguraatioita — ne ovat pieniä mutta korvaamattomia. Data (InfluxDB) kasvaa nopeasti ja voidaan jättää varmuuskopioinnin ulkopuolelle alkuvaiheessa — historiadata kertyy uudelleen ajan myötä, kun taas konfiguraatiot ja automaatiot ovat vaikeammin korvattavia.

KansioSisältöKoko
homeassistant/HA-konfiguraatio, packages, secrets~150 MB
nodered/Node-RED flowt~6 MB
mosquitto/config/MQTT-konfiguraatio<1 MB
grafana/data/Grafana-dashboardit~20 MB
docker-compose.ymlKonttien konfiguraatio<1 KB

.storage sisällytetään oletuksena. Vaikka EnergyHub-konfiguraatio on pääosin YAML-pohjainen ja palautettavissa lähdekoodista, .storage-kansio sisältää HA:n entiteettirekisterin, laiterekisterin ja UI:n kautta tehdyt asetukset. Entiteettirekisterin menetys tarkoittaisi kaikkien vahvistettujen entity_id:iden (Shelly-releet, P1-mittari, Netatmo-anturit) uudelleenmäppäystä käsin — juuri se kallis oppi, jonka varmuuskopioinnilla halutaan välttää. Kansio jätetään pois vain jos sinulla on erityinen syy (esim. se halutaan rakentaa puhtaalta pöydältä uudelleen).

rclone-asennus

bash

curl https://rclone.org/install.sh | sudo bash

Tämä on rclonen virallinen asennusskripti, mutta curl | sudo bash ajaa ladatun skriptin suoraan root-oikeuksilla. Jos haluat tarkistaa skriptin ennen ajoa tai välttää pipe-bash-kuvion, voit käyttää paketinhallintaa: sudo apt install rclone. Paketinhallinnan versio voi olla hieman vanhempi mutta on jakelun allekirjoittama.

Google Drive -konfiguraatio

bash

rclone config

Vastaa kysymyksiin:

  1. n — uusi remote
  2. Nimi: gdrive
  3. Storage: drive (Google Drive, numero listasta)
  4. Client id: tyhjä (Enter)
  5. Client secret: tyhjä (Enter)
  6. Scope: 1 (full access)
  7. Root folder: tyhjä
  8. Service account: tyhjä
  9. Advanced: n
  10. Auto config: n — koska palvelimella ei ole selainta

Kohdassa 10 tulostetaan komento joka ajetaan toisella koneella jossa on selain:

rclone authorize "drive" "eyJ..."

Aja tämä Windows/Mac-koneella (rclone asennettuna) → selain avautuu → kirjaudu Google-tilille → kopioi token takaisin palvelimen terminaaliin.

Testaa yhteys:

bash

rclone lsd gdrive:

Huomio: Google Drive suojaa levyvioilta ja palvelinvioilta, mutta ei yksinään korvaa hyvää varmuuskopiointistrategiaa. Tärkeille järjestelmille suositellaan vähintään kahta kopiota eri sijainneissa.

Varmuuskopiointiskripti

Korvaa polku /home/xxxx/energyhub/ omalla asennuspolullasi, jos se eroaa.

bash

cat > /home/xxxx/backup_energyhub.sh << 'EOF'
#!/bin/bash
set -euo pipefail

DATE=$(date +%Y-%m-%d)
BASE=/home/xxxx/energyhub
BACKUP_DIR="/tmp/energyhub_backup_$DATE"

mkdir -p "$BACKUP_DIR"

# Konfiguraatiotiedostot
cp "$BASE/docker-compose.yml" "$BACKUP_DIR/"

# Home Assistant — .storage MUKANA, vain lokit ja tietokanta pois
tar -czf "$BACKUP_DIR/homeassistant.tar.gz" \
  -C "$BASE" \
  --exclude='homeassistant/home-assistant.log*' \
  --exclude='homeassistant/home-assistant_v2.db*' \
  homeassistant

tar -czf "$BACKUP_DIR/nodered.tar.gz" \
  -C "$BASE" nodered

tar -czf "$BACKUP_DIR/mosquitto.tar.gz" \
  -C "$BASE" mosquitto/config

# Grafana-data on UID 472:n omistama — tar tarvitsee sudon.
# Asetetaan arkiston omistus takaisin käyttäjälle, jotta rm ja rclone toimivat ilman sudoa.
sudo tar -czf "$BACKUP_DIR/grafana.tar.gz" \
  -C "$BASE" grafana/data
sudo chown "$(id -u):$(id -g)" "$BACKUP_DIR/grafana.tar.gz"

# Lähetä Google Driveen — poista vanhat kopiot VAIN jos sync onnistui
if rclone sync "$BACKUP_DIR" "gdrive:energyhub-backup/$DATE/" --log-level INFO; then
    echo "Sync onnistui: $DATE"
    rclone delete gdrive:energyhub-backup --min-age 30d
    rclone rmdirs gdrive:energyhub-backup --leave-root
else
    echo "VAROITUS: sync epäonnistui — vanhoja kopioita EI poistettu"
    rm -rf "$BACKUP_DIR"
    exit 1
fi

# Siivoa paikallinen temp
rm -rf "$BACKUP_DIR"

echo "Varmuuskopiointi valmis: $DATE"
EOF
chmod +x /home/xxxx/backup_energyhub.sh

Skriptin keskeiset turvaominaisuudet:

set -euo pipefail — skripti pysähtyy heti virheeseen, määrittelemättömään muuttujaan tai putken epäonnistumiseen. Yksikään vaihe ei jatka hiljaa virheen jälkeen.

Poisto vain onnistuneen synkronoinnin jälkeen — jos rclone sync epäonnistuu (Drive-kiintiö täynnä, verkkokatkos), vanhoja varmuuskopioita ei poisteta. Tämä on sama periaate kuin deployment-skriptien sys.exit(1)-turvatarkistuksissa: tuhoavaan operaatioon ei edetä jos edellinen vaihe epäonnistui.

Grafana-arkiston omistus palautetaan käyttäjälle heti sudo tar:n jälkeen, jotta myöhempi rm ja rclone toimivat ilman root-oikeuksia.

Testaa manuaalisesti:

bash

/home/xxxx/backup_energyhub.sh

Automaattinen ajastus — cron

Ajastetaan varmuuskopio joka yö klo 3:00:

bash

(crontab -l 2>/dev/null; echo "0 3 * * * /home/käyttäjä/backup_energyhub.sh >> /home/käyttäjä/backup.log 2>&1") | crontab -

Tarkista ajastus:

bash

crontab -l

Lokin tarkistus:

bash

cat /home/xxxx/backup.log

Cron ja sudo: skripti käyttää sudo tar:ia Grafana-kansiolle. Jotta cron-ajo ei jää odottamaan salasanaa, lisää käyttäjälle NOPASSWD-oikeus juuri tähän komentoon sudoers-tiedostoon (visudo), tai aja koko varmuuskopiointi root-cronista. Vaihtoehtoisesti, jos Grafana-tiedostot ovat luettavissa käyttäjän ryhmälle, sudo voidaan poistaa kokonaan.

Palautus

Jos konfiguraatio pitää palauttaa:

bash

# Lataa haluttu varmuuskopio (vaihda päivämäärä)
rclone copy gdrive:energyhub-backup/2026-06-02/ /tmp/restore/

# Pura
cd /tmp/restore
tar -xzf homeassistant.tar.gz -C /home/xxxx/energyhub
tar -xzf nodered.tar.gz -C /home/xxxx/energyhub
sudo tar -xzf grafana.tar.gz -C /home/xxxx/energyhub

# Palauta Grafana-datan omistus kontille
sudo chown -R 472:472 /home/xxxx/energyhub/grafana/data

# Käynnistä uudelleen
cd /home/xxxx/energyhub
docker compose restart

Turvallisuushuomio

Home Assistantin secrets.yaml sisältyy varmuuskopioon — se sisältää API-avaimet, salasanat ja tokeneja. Myös .storage voi sisältää arkaluonteisia tunnisteita. Google Drive -tilin suojaus on siksi erityisen tärkeää: käytä vahvaa salasanaa ja aktivoi kaksivaiheinen tunnistautuminen. Harkitse arkistojen salausta (esim. rclonen crypt-remote) jos Drive-tili on jaettu tai sen suojaukseen ei voi täysin luottaa.

Säilytysaika

Skripti säilyttää varmuuskopioita 30 päivää (--min-age 30d). Konfiguraatioille tämä on perusteltua — ne muuttuvat usein, eikä kuukautta vanhempi snapshot yleensä ole tarpeen. Jos haluat pidemmän historian, voit säilyttää erikseen esimerkiksi kuukausittaisen snapshotin omaan kansioonsa, jota retention-poisto ei kosketa. Huomaa että tämä eroaa InfluxDB-datan suosituksesta (1–2 vuotta) — siellä kyse on mittaushistoriasta, tässä konfiguraatioista.

Yleisimmät ongelmat

rclone: Permission denied (grafana) Grafana-kansio on UID 472:n omistama — skripti käyttää sudo tar:ia ja palauttaa arkiston omistuksen käyttäjälle. Varmista että cron-ajossa sudo toimii ilman salasanaa (ks. cron ja sudo yllä).

rclone authorize ei avaa selainta palvelimella Normaalia — aja rclone authorize toisella koneella jossa on selain. Kopioi token takaisin SSH-sessioon.

Cron ei aja skriptiä Tarkista että skriptissä on suoritusoikeus (chmod +x) ja että polku on absoluuttinen. Tarkista myös backup.log virheiden varalta.

Sync poistaa kopioita vaikka uutta ei syntynyt Ei pitäisi enää tapahtua — poisto on ehdollistettu sync-komennon onnistumiselle. Jos näin käy, tarkista että set -euo pipefail ja if rclone sync ... -rakenne ovat ennallaan.

Piditkö artikkelista?

Seuraa blogia myös Blogit.fi:ssä, niin löydät uudet kirjoitukset helposti.

Seuraa blogia Blogit.fi:ssä