# Google Drive přes rclone

Připojení Google Disku na Linux (Arch, KDE Plasma) pomocí rclone a FUSE.
Tři účty jsou trvale namountované v `~/Drive` a chovají se jako běžné adresáře,
takže s nimi umí pracovat každá aplikace, ne jen správce souborů.

Postaveno 19.–23. 8. 2026, nasazeno na dvou strojích (domácí a `valy-work`).
Tento dokument popisuje jak to funguje, jak se to obsluhuje a jak to postavit znovu.

## Obsah

1. [Proč rclone a ne KDE Online účty](#proč-rclone-a-ne-kde-online-účty)
2. [Jak to funguje](#jak-to-funguje)
3. [Kde co leží](#kde-co-leží)
4. [Běžný provoz](#běžný-provoz)
5. [Postup zřízení od nuly](#postup-zřízení-od-nuly)
6. [Časté situace a poruchy](#časté-situace-a-poruchy)
7. [Na co si dát pozor](#na-co-si-dát-pozor)

## Proč rclone a ne KDE Online účty

Původní stav byl Google účet přidaný v systémovém nastavení KDE, tedy
`kaccounts` plus `kio-gdrive`. Mělo to dvě zásadní vady.

**Přihlášení vypršelo každých sedm dní.** KDE má v databázi
`~/.config/libaccounts-glib/accounts.db` natvrdo zadrátované sdílené OAuth
client ID svého projektu (`123123122333-…`). Ta aplikace je u Googlu v režimu
„Testing“ a u takových aplikací Google nechává refresh tokeny vypršet po
7 dnech. Odtud ten vzorec, kdy Disk chvíli fungoval a pak zase ne.

**Nebyl to skutečný mount.** `kio-gdrive` je KIO slave, tedy virtuální
protokol uvnitř KDE. Dolphin a další KDE aplikace ho vidí, ale terminál,
editor, Docker ani nic mimo KDE ne. Zadání znělo „pracovat s Diskem jako
s kterýmkoliv jiným diskem“ a KIO to z principu neumí.

rclone s FUSE mountem řeší obojí: je to opravdový souborový systém v
`~/Drive` a autorizace drží, protože běží pod vlastní publikovanou OAuth
aplikací.

## Jak to funguje

### Vrstvy

```
Google API
    ↓
rclone remotes  UXF:  Osobni:  Dukla:          (type = drive, jeden na účet)
    ↓
UXF-shared:                                    (combine: slepí sdílené disky)
    ↓
UXF-combine:                                   (combine: Můj disk + Sdílené disky)
    ↓
systemd user služba rclone-mount@UXF.service
    ↓
~/Drive/UXF/                                   (FUSE mount)
```

Výsledná struktura je u všech tří účtů stejná:

```
~/Drive/<účet>/Můj disk/
~/Drive/<účet>/Sdílené disky/<název sdíleného disku>/
```

### Proč dvě vrstvy combine

Backend `combine` skládá několik remotů do jednoho stromu, ale neumí
lomítko v názvu adresáře. Nejde tedy říct `"Sdílené disky/UXF Projects=…"`
jedním zápisem. Proto se to skládá na dvakrát: `<účet>-shared` slepí
jednotlivé sdílené disky vedle sebe, a `<účet>-combine` ten výsledek pověsí
jako `Sdílené disky` vedle `Můj disk`.

### Proč je „Můj disk“ i tam, kde žádné sdílené disky nejsou

Osobní účet žádný sdílený disk nemá, přesto má mezivrstvu `Můj disk`.
Je to záměr. Kdyby se struktura lišila podle toho, jestli účet sdílené disky
má, tak by první přizvání do sdíleného disku posunulo všechny existující
cesty o úroveň níž a rozbilo by odkazy, skripty i záložky.

### Volby mountu a proč jsou tam

| Volba | Proč |
| --- | --- |
| `--vfs-cache-mode full` | bez ní nejde do souborů zapisovat na přeskáčku, takže by většina aplikací soubor na Disku neotevřela k editaci |
| `--vfs-cache-max-size 10G` | strop pro místní cache v `~/.cache/rclone` |
| `--vfs-cache-max-age 720h` | co se měsíc nepoužilo, může z cache zmizet |
| `--vfs-read-chunk-size 32M` a `--vfs-read-chunk-size-limit 256M` | velké soubory se stahují po rostoucích blocích, ne celé naráz |
| `--dir-cache-time 1000h` a `--poll-interval 15s` | adresáře se nedotazují pořád dokola, ale změna z Googlu se propíše do 15 s, protože rclone se ptá na změnový kanál |
| `--drive-export-formats link.html` | Google dokumenty nejsou soubory ke stažení, takhle se zobrazí jako `.link.html` odkaz místo chyby |
| `--drive-acknowledge-abuse` | jinak se nestáhne soubor, který Google označil jako podezřelý |
| `--umask 022` | běžná práva, aby soubory nebyly jen pro čtení |
| `--log-level NOTICE` a `--syslog` | logy jdou do journalu, ne do rostoucího souboru; při `INFO` do souboru narostl log o tisíce řádků za dvacet minut provozu |

Typ služby je `notify`, takže systemd považuje mount za nastartovaný až ve chvíli,
kdy rclone opravdu připojí adresář, ne hned po spuštění procesu.

## Kde co leží

| Cesta | Co to je |
| --- | --- |
| `~/.config/rclone/rclone.conf` | remotes, client ID, client secret a refresh tokeny. Práva 600, obsahuje citlivé údaje |
| `~/.config/systemd/user/rclone-mount@.service` | šablona služby, instance `@UXF`, `@Osobni`, `@Dukla` |
| `~/.local/bin/drive-refresh` | přegeneruje combine remotes podle aktuálních sdílených disků a restartuje mounty |
| `~/Drive/{UXF,Osobni,Dukla}` | samotné mounty |
| `~/.cache/rclone` | VFS cache, aktuálně kolem 500 MB |
| `~/.local/share/kaccounts-backup/accounts.db.bak` | záloha KDE účtů z doby před smazáním |
| `~/.local/share/user-places.xbel` | záložky Dolphinu, obsahuje tři položky na `~/Drive` |

Účty a jejich remotes:

| Mount | Účet | Sdílené disky |
| --- | --- | --- |
| `~/Drive/UXF` | aaaaaaaa@bbb.cz | 5 (UXF - BOARD, UXF Interní, UXF Obchod, UXF Projects, UXF x INAGO) |
| `~/Drive/Osobni` | xxxyyy@gmail.com | žádné |
| `~/Drive/Dukla` | aaaaa.bbbbcccc@ccccccc.cz | 1 (Dukla) |

OAuth aplikace: `rclone-valy`, projekt v Google Cloudu pod soukromým Gmailem,
typ External, stav **publikovaná**. Client ID
`123123123123-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.apps.googleusercontent.com`,
client secret je v `rclone.conf`. Jeden klient obsluhuje všechny tři účty.

Verze v době psaní: rclone 1.75.0, fuse3 3.18.2.

## Běžný provoz

Nic se nespouští ručně, mounty naběhnou po přihlášení do grafické session.

### Přibyl nový sdílený disk

Sám se neobjeví, protože seznam sdílených disků je zapsaný v combine remotu.
Po přizvání do nového sdíleného disku:

```bash
drive-refresh            # všechny účty
drive-refresh UXF        # jen vybraný účet
```

Skript načte sdílené disky přes `rclone backend drives`, přepíše
`<účet>-shared` i `<účet>-combine` a restartuje mount.

### Stav a diagnostika

```bash
# běží všechny tři?
for a in UXF Osobni Dukla; do printf "%-8s %s\n" "$a" "$(systemctl --user is-active rclone-mount@$a.service)"; done

# log konkrétního mountu
journalctl --user -u rclone-mount@UXF.service -n 50

# je to opravdu připojené?
findmnt -T ~/Drive/UXF -o TARGET,SOURCE,FSTYPE

# co vidí rclone přímo, bez mountu
rclone lsd UXF-combine:
rclone about UXF:
```

### Restart

```bash
systemctl --user restart rclone-mount@UXF.service
```

Když mount zůstane viset po pádu procesu, odpojí se ručně:

```bash
fusermount3 -uz ~/Drive/UXF
systemctl --user restart rclone-mount@UXF.service
```

## Postup zřízení od nuly

### A. OAuth klient v Google Cloudu (jednorázově, ručně)

Tohle je jediná část, kterou nejde udělat z příkazové řádky, Google Cloud
Console na zakládání OAuth klientů použitelné CLI nemá. Zabere asi 10 minut
a dělá se jen jednou pro všechny účty i stroje.

1. [console.cloud.google.com](https://console.cloud.google.com) → nový projekt
2. **APIs & Services → Library** → povolit **Google Drive API**
3. **APIs & Services → OAuth consent screen** → typ **External**,
   App name `rclone-valy`, support i developer e-mail vlastní Gmail
4. **PUBLISH APP** a potvrdit. Tenhle krok se nesmí vynechat, viz
   [Na co si dát pozor](#na-co-si-dát-pozor)
5. **Credentials → Create Credentials → OAuth client ID** → typ
   **Desktop app** → opsat Client ID a Client secret

### B. Instalace a první účet

```bash
sudo pacman -S rclone fuse3

rclone config create <účet> drive \
  client_id=<client id> \
  client_secret=<client secret> \
  scope=drive
```

Příkaz otevře prohlížeč a čeká na přihlášení. U vlastní publikované aplikace
přijde obrazovka *„Google hasn't verified this app“* → **Advanced** →
**Go to rclone-valy (unsafe)**. To je u aplikace s Drive scope normální,
ověření Googlem se vyžaduje až u aplikací pro veřejnost.

Ověření, že účet odpovídá:

```bash
rclone about <účet>:
rclone backend drives <účet>:      # výpis sdílených disků
chmod 600 ~/.config/rclone/rclone.conf
```

Pro další účty se krok opakuje se stejným client ID a secretem, liší se jen
přihlášení v prohlížeči.

### C. Šablona systemd služby

```bash
mkdir -p ~/.config/systemd/user ~/.local/bin ~/Drive
cat > ~/.config/systemd/user/rclone-mount@.service <<'UNIT'
[Unit]
Description=rclone mount %i
Documentation=man:rclone(1)
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
Environment=RCLONE_CONFIG=%h/.config/rclone/rclone.conf
ExecStartPre=/usr/bin/mkdir -p %h/Drive/%i
ExecStart=/usr/bin/rclone mount %i-combine: %h/Drive/%i \
    --config %h/.config/rclone/rclone.conf \
    --vfs-cache-mode full \
    --vfs-cache-max-size 10G \
    --vfs-cache-max-age 720h \
    --vfs-read-chunk-size 32M \
    --vfs-read-chunk-size-limit 256M \
    --dir-cache-time 1000h \
    --poll-interval 15s \
    --drive-export-formats link.html \
    --drive-acknowledge-abuse \
    --umask 022 \
    --log-level NOTICE \
    --syslog
ExecStop=/usr/bin/fusermount3 -uz %h/Drive/%i
Restart=on-failure
RestartSec=15
TimeoutStopSec=30

[Install]
WantedBy=default.target
UNIT
```

### D. Skript drive-refresh

Skript `~/.local/bin/drive-refresh` je v repozitáři konfigurace, případně
se dá vytáhnout z druhého stroje. Musí být spustitelný a `~/.local/bin`
musí být v `PATH`. Seznam účtů je v konstantě `ACCOUNTS` na začátku souboru,
při přidání nového účtu se tam dopíše.

### E. Spuštění

```bash
drive-refresh                       # vytvoří combine remotes
systemctl --user daemon-reload
systemctl --user enable --now rclone-mount@UXF rclone-mount@Osobni rclone-mount@Dukla
```

Ověření:

```bash
ls ~/Drive/UXF/
ls ~/Drive/UXF/"Sdílené disky"/
```

### F. Zapojení do prostředí a úklid po KDE

Záložky v Dolphinu jsou v `~/.local/share/user-places.xbel`. Soubor se edituje
jen když Dolphin neběží, jinak si změny přepíše. Mrtvá položka `gdrive:` se
odstraní a nahradí třemi odkazy na `file:///home/valy/Drive/<účet>`.

Google účet z KDE se smaže až nakonec, po ověření, že mounty fungují:

```bash
mkdir -p ~/.local/share/kaccounts-backup
cp ~/.config/libaccounts-glib/accounts.db ~/.local/share/kaccounts-backup/accounts.db.bak
ag-tool list-accounts
ag-tool delete-account <id>
```

### G. Přenos na další stroj

Druhý stroj nepotřebuje vlastní autorizaci, stačí mu stejný `rclone.conf`.
Refresh token se dá sdílet.

```bash
ssh <stroj> 'mkdir -p ~/.config/rclone ~/.config/systemd/user ~/.local/bin ~/Drive && chmod 700 ~/.config/rclone'
scp ~/.config/rclone/rclone.conf <stroj>:~/.config/rclone/rclone.conf
scp ~/.config/systemd/user/rclone-mount@.service <stroj>:~/.config/systemd/user/
scp ~/.local/bin/drive-refresh <stroj>:~/.local/bin/
ssh <stroj> 'chmod 600 ~/.config/rclone/rclone.conf; chmod +x ~/.local/bin/drive-refresh'
ssh <stroj> 'export XDG_RUNTIME_DIR=/run/user/$(id -u); systemctl --user daemon-reload; systemctl --user enable --now rclone-mount@UXF rclone-mount@Osobni rclone-mount@Dukla'
```

Při ovládání systemd přes SSH je potřeba nastavit `XDG_RUNTIME_DIR`, jinak
`systemctl --user` nenajde sběrnici uživatelské session.

## Časté situace a poruchy

| Příznak | Příčina a řešení |
| --- | --- |
| Nový sdílený disk není vidět | seznam je zapsaný v combine remotu, spustit `drive-refresh` |
| Adresář `~/Drive/<účet>` je prázdný | služba spadla nebo neběží, `systemctl --user status rclone-mount@<účet>` a `journalctl --user -u …` |
| „Transport endpoint is not connected“ | mount zůstal viset po pádu procesu, `fusermount3 -uz ~/Drive/<účet>` a restart služby |
| Google dokument nejde otevřít | je to `.link.html`, tedy odkaz do prohlížeče, ne soubor. Nativní Google formáty se stáhnout nedají |
| Po restartu stroje nic není připojené | mounty startují s grafickou session, `Linger` je vypnutý. Když mají běžet i bez přihlášení: `loginctl enable-linger valy` |
| „Access blocked: rclone-valy has not completed the Google verification process“ | správce Workspace domény blokuje neověřené aplikace, řeší se v Admin Console v nastavení přístupu aplikací třetích stran |
| Přestaly fungovat všechny účty naráz na obou strojích | aplikaci `rclone-valy` byl odebrán přístup v nastavení Google účtu, nebo se projekt vrátil do režimu „Testing“ |
| Pomalý výpis velkého adresáře poprvé | `--dir-cache-time` je dlouhý, ale první načtení jde přes API. Podruhé už je to z cache |

## Na co si dát pozor

**Aplikace `rclone-valy` musí zůstat publikovaná.** V režimu „Testing“ nechá
Google vypršet refresh tokeny po 7 dnech, což je přesně ta porucha, kvůli
které přestalo fungovat KDE. Publikováním to mizí, návratem do „Testing“ se to
vrátí.

**Vestavěné client ID rclonu nepoužívat.** rclone má vlastní zabudované
client ID a zpočátku to vypadalo jako cesta bez práce v Google Cloudu.
Verze 1.75 ale oznámila, že ho autoři během roku 2026 ruší, takže by na něm
postavená konfigurace jednou během roku prostě přestala fungovat. Proto vlastní
OAuth klient.

**Oba stroje sdílejí jeden refresh token.** Funguje to a Google to umožňuje,
ale je to společná pojistka: odebrání přístupu aplikaci v nastavení Google účtu
odstřihne oba stroje najednou.

**`rclone.conf` je citlivý soubor.** Obsahuje client secret i refresh tokeny ke
třem účtům, tedy plný přístup k Disku. Práva 600, nepatří do gitu ani do zálohy,
která se někam synchronizuje.

**Dokumentaci nedávat do `~/Drive`.** Když se mount rozbije, byl by návod, jak
ho opravit, nedostupný. Proto tenhle soubor leží na lokálním disku.

**Combine neumí lomítko v názvu adresáře.** Kdo by chtěl strukturu měnit,
narazí na to hned. Odtud dvouvrstvá konstrukce `-shared` a `-combine`.

**Názvy sdílených disků s lomítkem** si `drive-refresh` přepisuje na pomlčku,
jinak by rozbily strukturu adresářů.

## Odkazy

- Dokumentace rclone k backendu Drive: <https://rclone.org/drive/>
- Backend combine: <https://rclone.org/combine/>
- Volby VFS a mount: <https://rclone.org/commands/rclone_mount/>
