Newsletter 365tipů můžete číst zdarma. Placené předplatné je dobrovolná podpora, která pomáhá webu pokračovat.
Podpořit 365tipů

TIP#3285: rclone: nahrávejte (na web) jen to, co se skutečně změnilo

Máte na webu vlastní šablonu nebo sadu skriptů, upravujete je u sebe na počítači a pak je potřebujete dostat na server. A hosting umí jenom FTP — žádné SSH, žádný Git, žádné nasazení jedním příkazem. A navíc chcete, aby si tohle mohl spustit Codex/Claude Code. 

Většina lidí to řeší tak, že otevře FTP klienta, vlevo má lokální adresář, vpravo server, myší označí soubory a mačká kopírovat. Funguje to, ale je to ruční práce a snadno se stane, že na něco zapomenete nebo naopak přepíšete něco, co jste přepsat nechtěli.

Existuje na to nástroj, který umí porovnat lokální adresář se serverem a nahrát jenom rozdíl. Jmenuje se rclone, je zdarma, běží na macOS, Linuxu i Windows a ovládá se z příkazové řádky. A nutno dodat, že to umí nejen přes ftp, ale i v řadě dalších podob (viz ostatně dále)..

Co rclone je

Rclone je znám hlavně jako nástroj pro synchronizaci s cloudovými úložišti — Dropbox, Google Drive, S3 a několik desítek dalších. Méně se ví, že mezi podporovanými protokoly je i obyčejné FTP a FTPS. A to je přesně to, co potřebujeme.

Instalace na macOS přes Homebrew:

brew install rclone

Na Linuxu bude v balíčkovacím systému distribuce, na Windows se stahuje ze stránek projektu.

TIP: O rclone už tu byla zmínka v Jak přenést soubory z jednoho cloudu do jiného?

Nastavení připojení

Rclone si přístupy pamatuje v konfiguračním souboru, takže je nemusíte psát do každého příkazu (a nebudou ani tedy přímo ve skriptech). Spustíte průvodce:

rclone config

Ten se postupně zeptá na několik věcí. Zvolíte „n“ pro nový záznam, pojmenujete si ho (třeba mujweb), jako typ úložiště napíšete ftp a pak vyplníte adresu serveru, uživatelské jméno a port. Heslo zadáte skrytě, na obrazovce se nezobrazuje.

Dvě volby stojí za vysvětlení, protože z jejich názvů to není zřejmé:

  • tls znamená implicitní FTPS, tedy šifrování od první vteřiny spojení. Běží obvykle na portu 990 a většina hostingů ho nemá. Nechte false.
  • explicit_tls je explicitní FTPS. Spojení se naváže nešifrovaně na portu 21 a hned se přepne na TLS. Tohle dnes umí skoro každý hosting a chcete true.

Když nastavíte explicit_tls na true a připojení pak selže, hosting šifrování nepodporuje. Vraťte se do rclone config, dejte „e“ pro úpravu existujícího záznamu a přepněte na false. Heslo pak ale poletí po síti čitelně, takže je dobré se hostingu zeptat, jestli FTPS opravdu nemá.

Průvodce se také zeptá na kódování znaků a nabídne předvolby pro běžné FTP servery. Pokud máte v názvech souborů diakritiku, vyberte tu, která odpovídá vašemu serveru.

První test

Než začnete cokoli nahrávat, ověřte, že spojení a cesta fungují. Nejsnazší kontrola je výpis adresářů:

rclone lsd mujweb:/www/wp-content/themes

Když uvidíte seznam, máte hotovo.

Pozor na rozdíl mezi copy a sync

Tohle je jediné místo, kde si můžete udělat vážnou škodu, takže si to zapamatujte:

  • rclone copy soubory přidává a přepisuje. Co na serveru navíc je, tam zůstane.
  • rclone sync ale oproti tomu smaže na serveru vše, co v lokálním adresáři není.

Pro nasazování webu chcete copy. K sync sáhněte, až budete mít stoprocentní jistotu, že váš lokální adresář obsahuje kompletní obsah cílové složky. Když máte lokálně jen část, sync vám zbytek smaže.

Šetrné nastavení, aby vás hosting nezablokoval

Rclone umí přenášet soubory paralelně, což je u cloudových úložišť skvělé. U FTP na sdíleném hostingu je to cesta k problémům — každý paralelní přenos znamená samostatné přihlášení a několik desítek přihlášení během pár vteřin vypadá pro ochranu serveru jako útok hrubou silou.

Výsledkem bývá zablokování vaší IP adresy, a to často na úrovni firewallu, takže se na ten web nedostanete ani prohlížečem.

Proto do příkazu patří tyhle přepínače:

–transfers 1 –checkers 1 –ftp-concurrency 1 –retries 1 –low-level-retries 1

První tři drží rclone na jediném spojení, další dvě mu zakazují opakovat neúspěšné pokusy dokola. Zdržení je zanedbatelné, klid od hostingu za to stojí.

Vyzkoušejte nanečisto

Rclone má přepínač –dry-run, který vypíše, co by udělal, ale neudělá nic. Používejte ho vždy, když jste něco změnili v konfiguraci nebo ve filtrech:

rclone copy ~/weby/mujprojekt mujweb:/www/wp-content/themes/mujprojekt \
  –transfers 1 –checkers 1 –ftp-concurrency 1 \
  –retries 1 –low-level-retries 1 \
  –dry-run -v

Ve výpisu se pravděpodobně objeví soubory, které na server rozhodně nepatří. Typicky .env s přístupy k databázi, obsah složky .git, poznámky pro AI nástroje nebo node_modules. Adresář šablony je veřejně dostupný přes web a soubor jako .env se z něj pošle komukoli, kdo si o něj řekne, jako čitelný text. Automatické skenery tuhle cestu zkoušejí běžně.

Seznam výjimek

Filtry si dejte do samostatného souboru, ať nemáte na řádku deset přepínačů. Vytvořte deploy-exclude.txt například s těmito výjimkami:

.git/**
.gitignore
.env
.env.*
.DS_Store
._*
.vscode/**
.idea/**
node_modules/**
deploy.sh
deploy-exclude.txt
*.md
*.log
*.map
*.scss

Celé to zabalte do skriptu

Aby se to dalo spustit jedním příkazem, uložte si do projektu soubor deploy.sh (musíte v něm samozřejmě změnit cílovou adresu):

#!/usr/bin/env bash
set -euo pipefail
DIR=“$(cd „$(dirname „${BASH_SOURCE[0]}“)“ && pwd)“
exec rclone copy \
  „$DIR“ \
  mujweb:/www/wp-content/themes/mujprojekt \
  –transfers 1 –checkers 1 –ftp-concurrency 1 \
  –retries 1 –low-level-retries 1 \
  –exclude-from „$DIR/deploy-exclude.txt“ \
  –progress „$@“

Nezapomeňte ho zpřístupnit ke spuštění příkazem chmod +x deploy.sh.

Řádek s DIR= zjistí, kde skript sám leží, takže funguje bez ohledu na to, odkud ho pustíte. A „$@“ na konci znamená, že mu můžete předat další přepínače — třeba ./deploy.sh –dry-run na zkoušku nanečisto a ./deploy.sh na ostro.

Ověřte si, že to opravdu porovnává

Rclone přes FTP nemá k dispozici kontrolní součty, takže soubory porovnává podle velikosti a času poslední změny. To znamená, že server musí umět čas změny u nahraného souboru nastavit. Většina jich to umí, ale ne všechny.

Otestujete to snadno. Pusťte nasazení naostro a hned po něm nanečisto:

./deploy.sh
./deploy.sh –dry-run

Druhý příkaz nesmí vypsat žádné soubory. Když vypíše ty samé, které jste právě nahráli, server čas změny nepřijímá a rclone si nemá jak zapamatovat, že už je má hotové. Pak by nahrával pokaždé všechno.

Ještě dvě poznámky

Heslo v konfiguračním souboru rclone je jen zamaskované, ne zašifrované. Kdo se k souboru dostane, přečte ho. Omezte proto přístupová práva příkazem chmod 600 ~/.config/rclone/rclone.conf. Rclone umí zašifrovat celý konfigurační soubor heslem, ale pak se na něj ptá při každém spuštění.

A pokud máte na server přístup přes SSH, rclone vůbec nepotřebujete. Použijte rsync, který dělá totéž, je rychlejší a je na Macu i Linuxu předinstalovaný. Rclone je řešení právě pro situaci, kdy vám hosting nabízí jenom FTP.

A vlastně ještě jedna poznámka

Protože řešení přes rclone, včetně zapouzdření do deploy.sh je práce Claude, tak i tento tip je z velké části výsledek sepsaný AI. Claude sepsala, já prošel a místy něco připsal či upravit.