Инструмент для надёжной ручной заливки сайта, собранного в Publii, на обычный shared-хостинг по FTP / SFTP / FTPS.
Проблема: встроенный Sync в Publii иногда не докачивает последний изменённый файл, при этом files.publii.json на сервере уже помечен как «всё залито». В итоге сайт и сервер расходятся, а повторный Sync считает, что всё актуально.
Решение: выгружать из Publii локально (Manual Deployment → output), сравнивать новый files.publii.json с прошлым снимком и копировать в папку temp только новые/изменённые файлы + список на удаление. Папку temp вы заливаете любым FTP-клиентом вручную и полностью контролируете результат.
Без зависимостей — только Python + Tkinter.
- В Publii делаете Manual Deployment в папку
output(там появляется свежийfiles.publii.jsonс md5-хэшами каждого файла). - Приложение сравнивает новый
files.publii.jsonсо снимком прошлого экспорта (prev_files.publii.json). - Очищает папку
temp, копирует туда только diff:- новые файлы,
- файлы с изменившимся
md5илиtype, - пустые новые директории (чтобы структура сохранилась).
- Удаления не выполняет сразу, а накапливает в
to_delete.txt— их вы удаляете на сервере вручную. - Сохраняет текущий манифест как
prev_files.publii.jsonдля следующего запуска. - При первом запуске (снимка ещё нет) снимок считается пустым — в
tempкопируется весь сайт.
Принцип тот же, что использует сам Publii начиная с 0.46: поэлементное сравнение чек-сумм из files.publii.json, только заливка — под вашим контролем.
Publii из коробки умеет деплоить сайт несколькими способами (экран Server Configuration):
| Вариант | Когда подходит |
|---|---|
| FTP (порт 21) | Обычный shared-хостинг (Bluehost, GoDaddy, Beget, Timeweb и т.п.). Просто, но без шифрования, включая пароль. |
SFTP (порт 22, пароль или ключ .pem + passphrase) |
Тот же хостинг, но всё шифруется. Рекомендуется, если хостер поддерживает. |
| FTPS | FTP + TLS-шифрование данных доступа. Компромисс, если SFTP нет. |
| Amazon S3 / S3-совместимые | Статика на объектном хранилище + CDN. Нужны bucket, endpoint, ключи. |
| Google Cloud Storage | Аналог S3 в экосистеме Google. |
| Netlify | Хостинг для статики с CDN, доменами и автодеплоем. |
| GitHub Pages / GitLab Pages | Бесплатный хостинг для личных проектов и блогов. |
| Manual Deployment | Выгрузка в локальную папку / ZIP / TAR — именно этот режим использует данное приложение. Дальше заливаете файлы куда угодно вручную. |
Данное приложение рассчитано на связку Manual Deployment + любой FTP-клиент (FileZilla, WinSCP, Cyberduck, встроенный в панель хостинга). Это самый переносимый путь: работает с любым хостингом, где есть доступ по FTP/SFTP, и обходит проблему «потерянного последнего файла».
Подробности — в официальной документации: Server Configuration, Syncing your server, Recommended server settings.
Требования: Python 3.8+ с Tkinter (в официальном дистрибутиве python.org для Windows идёт по умолчанию). Сторонних библиотек не нужно.
git clone https://github.com/<user>/publii-manual-sync.git
cd publii-manual-sync
run_publii_sync.batИли напрямую:
python app.pyrun_publii_sync.bat просто переходит в каталог скрипта, проверяет Python в PATH и запускает app.py в UTF-8.
- В Publii: Server → Type = Manual Deployment, Output type = uncompressed folder, укажите папку
output, нажмите Sync. - Запустите приложение, выберите:
- output — папка выгрузки сайта (где лежит
files.publii.json), - temp — пустая папка, куда ляжет diff для заливки.
- output — папка выгрузки сайта (где лежит
- Нажмите Export — в
tempокажутся только изменённые файлы. - Залейте содержимое
tempна сервер FTP-клиентом с сохранением структуры путей в корень сайта (обычноpublic_html/или подпапка). - Откройте Показать список удалений (
to_delete.txt) и удалите эти пути на сервере вручную. - После успешной заливки нажмите Обнулить файл удалений.
Настройки путей сохраняются в set_sync_publii.json рядом с app.py, поэтому выбираются один раз.
| Файл | Назначение |
|---|---|
set_sync_publii.json |
Сохранённые пути output/temp. |
prev_files.publii.json |
Снимок files.publii.json с прошлого экспорта, база для diff. |
to_delete.txt |
Накопительный список путей для ручного удаления с сервера. Дублей нет, вернувшиеся файлы вычёркиваются автоматически. |
Эти файлы индивидуальны для вашего сайта — в репозиторий они не коммитятся (см. .gitignore). Бэкапьте их вместе с проектом сайта, иначе следующий экспорт посчитается «первым» и выгрузит всё.
Симптомы: правите пост → Sync в Publii проходит без ошибок → на сайте изменений нет, повторный Sync тоже «всё ок».
Обходной путь с этим приложением:
- Переключите Publii на Manual Deployment, сделайте Sync в
output. - Export → получите
tempс реальным diff по md5. - Залейте
tempпо SFTP вручную, сверьте размер/дату «подозрительного» файла на сервере. - Если файл битый — просто перезалейте его же из
outputповерх.
Так вы опираетесь на локальные хэши, а не на серверный files.publii.json, который уже мог «соврать».
- Приложение не заливает файлы само — только готовит
temp. Загрузка — вашим FTP-клиентом. - Сравнение идёт строго по
path+md5+typeизfiles.publii.json. Файлы вне манифеста (ручные правки вoutput) не отслеживаются. tempпри каждом экспорте очищается полностью.- Удаления выполняются только вручную по
to_delete.txt— это защита от случайного сноса.
MIT — можно свободно использовать и дорабатывать.