Резервное копирование фотографий Partoska на Raspberry Pi

Представьте клуб, который проводит матч каждую субботу. Гости добавляют фотографии в Partoska, но до следующего тура никто не вспоминает их скачать. Резервное копирование фотографий на Raspberry Pi решает задачу без нового напоминания в календаре. Маленький компьютер стоит рядом с внешним SSD и каждую ночь скачивает новые файлы.
Partoska продолжает собирать фотографии гостей по QR-коду, а Raspberry Pi сохраняет копию на диске дома или в клубе. После скачивания файла его последующее удаление из Partoska не затронет локальную копию.
Начнём с пустой карты microSD. Установим Raspberry Pi OS, подготовим внешний диск, добавим инструмент p6a, войдём через OAuth и настроим ежедневную задачу cron.
Что понадобится?
Выберите Raspberry Pi с поддержкой 64-разрядной системы. Производительности Pi 3, Pi 4, Pi 5 или Zero 2 W для этой задачи достаточно. Старый 32-разрядный вариант не запустит актуальную официальную сборку p6a для ARM64.
Подготовьте также:
- карту microSD. Для Raspberry Pi OS Lite производитель рекомендует минимум 16 ГБ, но 32 ГБ оставят больше места обновлениям и журналам;
- подходящий блок питания;
- внешний SSD, жёсткий диск или USB-накопитель достаточного объёма;
- устройство чтения microSD для компьютера, на котором будет готовиться карта;
- подключение по Ethernet или Wi-Fi.
Меньше всего проблем обычно доставляет SSD. Некоторые портативные жёсткие диски потребляют через USB больше тока, чем Raspberry Pi способен стабильно предоставить. Если диск отключается во время работы, используйте USB-концентратор с питанием или накопитель с собственным блоком.
Запишите Raspberry Pi OS на карту microSD
В старых руководствах встречается название «Raspbian». Сегодня система называется Raspberry Pi OS. Форматировать карту вручную заранее не нужно: Raspberry Pi Imager очистит выбранный накопитель, создаст разделы, запишет систему и проверит результат.
Установите Raspberry Pi Imager на компьютере с устройством чтения карт:
- В Windows скачайте установщик Windows со страницы Raspberry Pi и запустите его.
- В macOS скачайте версию для macOS и установите обычным способом.
- В Linux используйте официальную сборку x86_64. В Debian или Ubuntu также может быть доступна команда
sudo apt install rpi-imager.
Дальнейшие шаги одинаковы во всех системах:
- Выберите модель Raspberry Pi.
- Выберите Raspberry Pi OS Lite (64-bit). Графическая среда не нужна устройству, которое стоит рядом с диском и управляется через SSH.
- В качестве накопителя выберите карту microSD.
- Перед записью откройте системные настройки.
Задайте имя устройства, например partoska-backup, создайте пользователя и пароль, при необходимости укажите Wi-Fi и правильный часовой пояс. В разделе Services включите SSH. Если вы уже пользуетесь ключами SSH, выберите вход по открытому ключу. Для первой установки в доверенной домашней сети подойдёт и пароль.
Перед нажатием Write ещё раз проверьте выбранный накопитель: Imager его сотрёт. Самая простая страховка — заранее отключить остальные USB-диски, не нужные для установки.
Дождитесь окончания записи и проверки. Безопасно извлеките карту, вставьте её в Raspberry Pi и подключите внешний диск. После включения подождите одну-две минуты, пока Pi появится в сети.
Подключитесь по SSH и обновите систему
В Terminal на macOS или Linux либо PowerShell в Windows используйте имя учётной записи из Imager:
ssh your-user@partoska-backup.local
Если адрес с окончанием .local не работает, найдите IP-адрес Raspberry Pi в панели маршрутизатора:
ssh your-user@192.168.1.50
Сначала обновите систему:
sudo apt update sudo apt full-upgrade -y sudo reboot
После перезапуска подключитесь снова и проверьте архитектуру:
uname -m
Команда должна вывести aarch64. Результат armv7l означает, что установлена 32-разрядная система. В таком случае запишите Raspberry Pi OS Lite (64-bit) заново и пока не продолжайте.
Подготовьте внешний диск
Внешнему диску для Raspberry Pi нужен постоянный каталог, куда Linux будет подключать его после каждого запуска. Сначала выведите доступные накопители:
lsblk -o NAME,SIZE,FSTYPE,LABEL,UUID,MOUNTPOINTS,MODEL
Внешний раздел можно определить по объёму, модели и имени. В примерах используется /dev/sda1, но у вас это может быть /dev/sdb1. Карта microSD обычно начинается с /dev/mmcblk0; не форматируйте её.
Если на внешнем диске уже есть данные, пропустите команду форматирования. Перед изменением файловой системы скопируйте нужные файлы в другое место.
Для диска, который останется рядом с Raspberry Pi, рекомендуем ext4:
sudo mkfs.ext4 -L PARTOSKA /dev/sda1
Команда сотрёт весь выбранный раздел. Перед запуском снова проверьте вывод lsblk. Если диск нужно регулярно отключать и читать непосредственно в Windows или macOS, используйте exFAT:
sudo apt install -y exfatprogs sudo mkfs.exfat -n PARTOSKA /dev/sda1
Вторая команда тоже стирает раздел.
Создайте точку подключения и узнайте UUID раздела:
sudo mkdir -p /mnt/partoska sudo blkid /dev/sda1
Перед изменением файла fstab сделайте резервную копию:
sudo cp /etc/fstab /etc/fstab.before-partoska sudo nano /etc/fstab
Добавьте в конец следующую строку. Замените пример UUID значением из команды blkid:
UUID=12345678-1234-1234-1234-123456789abc /mnt/partoska ext4 defaults,nofail,x-systemd.device-timeout=10 0 2
Для exFAT измените тип на exfat. Значения uid и gid можно получить командами id -u и id -g; у первого пользователя оба обычно равны 1000.
UUID=1234-ABCD /mnt/partoska exfat defaults,nofail,x-systemd.device-timeout=10,uid=1000,gid=1000,umask=0022 0 0
В Nano файл сохраняется сочетанием Ctrl+O, имя подтверждается клавишей Enter, а редактор закрывается через Ctrl+X. Nano показывает эти комбинации как ^O и ^X; знак крышки означает клавишу Ctrl.
Перечитайте fstab и проверьте подключение диска:
sudo mount -a findmnt /mnt/partoska
Правильный результат выглядит примерно так:
TARGET SOURCE FSTYPE OPTIONS /mnt/partoska /dev/sda1 ext4 rw,relatime
В столбце TARGET должен быть /mnt/partoska, а SOURCE должен соответствовать найденному ранее внешнему разделу. Если findmnt ничего не выводит или показывает системный раздел microSD, не продолжайте. Исправьте UUID или тип файловой системы.
Создайте папку для фотографий и дайте своей учётной записи право записи:
sudo mkdir -p /mnt/partoska/events sudo chown "$USER":"$USER" /mnt/partoska/events touch /mnt/partoska/events/.write-test unlink /mnt/partoska/events/.write-test
На exFAT пропустите команду chown. Владелец уже определяется параметрами uid и gid в файле fstab.
Следующие команды работают с ext4 и exFAT, если диск подключён в /mnt/partoska. Другие варианты описаны в официальной документации по внешним накопителям.
Установите p6a
p6a — инструмент командной строки Partoska с открытым исходным кодом. В актуальной версии есть готовый файл для 64-разрядного Linux на ARM, поэтому p6a на Raspberry Pi не нужно компилировать. Выберите один способ установки.
Вариант A: скачивание через wget
Для отдельного Raspberry Pi с резервными копиями это самый короткий путь. Node.js и другой менеджер пакетов не требуются. Версия в примере была актуальна при публикации статьи; новое число можно проверить на странице выпусков p6a.
sudo apt install -y wget ca-certificates P6A_VERSION="1.11.5" wget "https://github.com/partoska/p6a-cmd/releases/download/v${P6A_VERSION}/p6a_${P6A_VERSION}_linux_arm64" -O p6a sudo install -m 0755 p6a /usr/local/bin/p6a p6a version
Вариант B: установка через npm
В Raspberry Pi OS может не быть npm. Сначала установите Node.js и npm, затем пакет p6a:
sudo apt update sudo apt install -y nodejs npm sudo npm install -g @partoska/p6a p6a version
Вариант C: Homebrew в Linux
Homebrew поддерживает 64-разрядный Linux на ARM, а формула Partoska выберет правильный файл для Raspberry Pi. Если Homebrew уже установлен, достаточно:
brew install partoska/tap/p6a p6a version
В этих примерах команда p6a version должна вывести p6a v1.11.5 или более новую версию. Ошибка Exec format error обычно означает 32-разрядную систему или неверно скачанную сборку.
Устанавливать Homebrew только ради p6a нет смысла. Ему нужны инструменты разработки и собственная структура каталогов, тогда как прямое скачивание выполняет ту же задачу. Если вы управляете через Homebrew и другим ПО, смело используйте его.
Наконец, запишите полный путь к программе. Он понадобится в скрипте cron:
command -v p6a
При прямом скачивании обычно выводится /usr/local/bin/p6a. Homebrew в Linux обычно возвращает путь внутри /home/linuxbrew/.linuxbrew/bin.
Войдите через OAuth
Запустите вход от обычной учётной записи, без sudo:
p6a login
Команда выведет адрес авторизации. Откройте его в браузере — удобнее всего на компьютере, с которого установлено SSH-подключение, — войдите в Partoska и разрешите доступ. Затем браузер покажет код авторизации. Скопируйте его и вставьте в ожидающую команду p6a. Браузер не обязан работать на Raspberry Pi.
p6a сохраняет данные входа в домашнем каталоге вашей учётной записи, по умолчанию в ~/.p6a. Поэтому cron должен выполняться от того же пользователя. Команда sudo p6a login записала бы данные пользователю root, и обычная учётная запись их не нашла бы.
Проверьте подключение:
p6a list
В выводе должны появиться мероприятия Partoska, к которым у вас есть доступ.
Запустите первую резервную копию вручную
Прежде чем полагаться на автоматическое резервное копирование фотографий, выполните процесс вручную:
mountpoint -q /mnt/partoska && echo "External drive mounted" p6a sync -t /mnt/partoska/events --owner-only find /mnt/partoska/events -maxdepth 2 -type f | head df -h /mnt/partoska
Первая команда должна вывести:
External drive mounted
Если вывода нет, остановитесь: внешний диск подключён не к тому каталогу. Команда p6a sync должна завершиться без ошибок авторизации, сети и файловой системы. Точный вывод зависит от количества мероприятий и новых файлов.
Команда find покажет не более десяти скачанных файлов. Например:
/mnt/partoska/events/2026-07-18 Letní zápas/.event.p6a.ini /mnt/partoska/events/2026-07-18 Letní zápas/IMG_0001.jpg /mnt/partoska/events/2026-07-18 Letní zápas/IMG_0002.jpg /mnt/partoska/events/2026-07-18 Letní zápas/MOV_0001.mp4
Для каждого мероприятия создаётся папка в формате RRRR-MM-DD Název akce. Фотографии получают имена вроде IMG_0001.jpg, видео — MOV_0001.mp4. Скрытый файл .event.p6a.ini хранит связь папки с идентификаторами мероприятия и файлов в Partoska; не удаляйте его. Команда head показывает только первые десять путей, а не общее число файлов.
Команда df должна показывать внешний раздел для /mnt/partoska. Объём у каждого диска свой:
Filesystem Size Used Avail Use% Mounted on /dev/sda1 916G 18G 852G 3% /mnt/partoska
Size означает общий объём, Used — занятое место, а Avail — свободное. В первом столбце должен стоять внешний раздел из вывода lsblk, например /dev/sda1. Если указан /dev/mmcblk0p2, /dev/root или другой системный раздел карты microSD, не продолжайте. USB-диск не подключён, и фотографии будут записаны на системную карту Raspberry Pi.
После проверки запустите синхронизацию второй раз. Уже сохранённые файлы должны быть пропущены, а скачиваться будут только новые.
Выберите мероприятия для синхронизации
Команда sync принимает два фильтра мероприятий:
# Все мероприятия, доступные этой учётной записи p6a sync -t /mnt/partoska/events # Только мероприятия, созданные этой учётной записью p6a sync -t /mnt/partoska/events --owner-only # Только мероприятия, добавленные в избранное p6a sync -t /mnt/partoska/events --favorite-only # Собственные мероприятия, добавленные в избранное p6a sync -t /mnt/partoska/events -o -f
Короткий параметр -f означает избранные мероприятия, а не избранные фотографии внутри них. Для Raspberry Pi в клубе или культурном центре разумным вариантом по умолчанию будет --owner-only: не скачаются мероприятия, которые учётная запись не создала, а лишь посетила как гость.
Добавьте защиту от отключённого диска
У одной строки p6a sync в cron есть неприятная особенность. Если внешний диск отсутствует, каталог /mnt/partoska всё равно существует на карте microSD. Linux может начать скачивать туда фотографии, и несколько крупных видео быстро заполнят системную карту.
Поэтому используем короткий скрипт, который завершится, если внешний диск не подключён. Создайте каталог bin:
mkdir -p "$HOME/bin" nano "$HOME/bin/partoska-backup.sh"
Вставьте следующий скрипт. Измените P6A_BIN в соответствии с выводом команды command -v p6a:
#!/usr/bin/env bash set -euo pipefail P6A_BIN="/usr/local/bin/p6a" MOUNT_POINT="/mnt/partoska" TARGET="${MOUNT_POINT}/events" if ! /usr/bin/mountpoint -q "$MOUNT_POINT"; then echo "External drive is not mounted at $MOUNT_POINT" >&2 exit 1 fi if [[ ! -x "$P6A_BIN" ]]; then echo "p6a is not executable at $P6A_BIN" >&2 exit 1 fi mkdir -p "$TARGET" "$P6A_BIN" sync -t "$TARGET" --owner-only
Сохраните файл и закройте редактор.
Разрешите выполнение и один раз запустите скрипт вручную:
chmod 700 "$HOME/bin/partoska-backup.sh" "$HOME/bin/partoska-backup.sh"
Права 700 позволяют читать, изменять и запускать файл только владельцу. Если доверенная группа Linux тоже должна читать и запускать его, используйте chmod 750: владелец получает чтение, изменение и выполнение, группа — чтение и выполнение, остальные — ничего.
Не добавляйте скрипт в cron, пока ручная проверка завершается ошибкой.
Запланируйте ежедневную копию в cron
Теперь подготовленный скрипт может выполнять резервное копирование через cron на Raspberry Pi. Сначала убедитесь, что cron установлен и запускается вместе с системой:
sudo apt install -y cron sudo systemctl enable --now cron
Откройте crontab своего пользователя:
crontab -e
Добавьте строку, запускающую копирование каждый день в 3:15 по часовому поясу Raspberry Pi:
15 3 * * * "$HOME/bin/partoska-backup.sh" >> "$HOME/partoska-backup.log" 2>&1
Сохраните и закройте редактор. Затем убедитесь, что строка записалась:
crontab -l
В выводе должен быть сохранённый график:
15 3 * * * "$HOME/bin/partoska-backup.sh" >> "$HOME/partoska-backup.log" 2>&1
После первого запуска по расписанию проверьте журнал и диск:
tail -n 50 "$HOME/partoska-backup.log" findmnt /mnt/partoska df -h /mnt/partoska
Если Raspberry Pi выключен в 3:15, cron не повторит задачу в 3:16. Но при следующем успешном запуске скачаются все файлы, которых ещё нет на диске. После долгого простоя скрипт можно запустить вручную.
Что произойдёт после удаления фотографии из Partoska?
p6a sync только дополняет локальный архив. Он скачивает отсутствующие онлайн-файлы и пропускает уже записанные на внешний диск. Локальная фотография не удаляется лишь потому, что снимок или всё мероприятие перестало быть доступным в Partoska.
После ночного скачивания последующее удаление в Partoska не меняет копию на Raspberry Pi. Но фотографию, удалённую до первого успешного скачивания, p6a получить не сможет. Поэтому оставляйте Pi включённым в течение срока хранения файлов в Partoska.
Переименование мероприятия работает иначе. Если изменить название онлайн, p6a может переименовать локальную папку, сохранив внутри скачанные материалы.
Внешний диск возле Raspberry Pi всё ещё остаётся одним диском и может сломаться. Незаменимые фотографии копируйте ещё на второй накопитель или во внешнее хранилище вне дома либо клуба.
Гости продолжают пользоваться Partoska как раньше
Для гостей ничего не меняется. Они сканируют QR-код мероприятия и загружают фотографии в браузере. Raspberry Pi, p6a и cron им вообще не видны: Pi отвечает только за архив организатора после попадания файлов в Partoska.
Веб-приложение остаётся доступным для создания мероприятий, модерации и просмотра. Резервное копирование фотографий Partoska на Raspberry Pi полезно там, где скачивание должно повторяться без напоминаний. Если из терминала нужно также создавать мероприятия, генерировать QR-коды или подключать AI-ассистента, прочитайте связанное руководство по Partoska в командной строке.
Весь процесс можно проверить на небольшом мероприятии в бесплатном пакете. Ограничения хранилища и срока различаются по тарифам.
После этого проверьте ручную синхронизацию, а ночную смену оставьте Raspberry Pi.
Частые вопросы
Какой Raspberry Pi подходит для резервного копирования фотографий Partoska?
Используйте модель с 64-разрядной Raspberry Pi OS, например Pi 3, Pi 4, Pi 5 или Zero 2 W. Актуальная версия p6a для Raspberry Pi использует ARM64. Проще всего установить Pi 4 или Pi 5 с внешним SSD, но сама синхронизация не требует большой производительности.
Должен ли Raspberry Pi работать весь день?
Нет. В момент запланированного копирования ему нужны питание, сеть и подключённый внешний диск. Постоянная работа проще, а Raspberry Pi потребляет мало энергии. Если один запуск пропущен, следующая синхронизация добавит ещё не сохранённые файлы.
Что скачивает команда p6a sync -f?
Она скачивает мероприятия, отмеченные как избранные. Содержимое не ограничивается избранными фотографиями внутри них. Сочетание -f и -o выбирает избранные мероприятия, созданные вами.
Заполнит ли cron карту microSD при отключении USB-диска?
Скрипт из руководства перед запуском проверяет mountpoint. Если внешний диск отсутствует, он завершится ошибкой и ничего не запишет. Не удаляйте эту проверку.
Останутся ли удалённые фотографии на Raspberry Pi?
Да, если p6a успел скачать их до удаления из Partoska. Синхронизация не удаляет локальные файлы вслед за изменениями на сервере. Фотография, удалённая до первого скачивания Pi, в архив не попадёт.
Можно ли подключать архивный диск непосредственно к Windows или macOS?
Если его нужно регулярно переносить между всеми тремя системами, выберите exFAT. Для диска, остающегося у Raspberry Pi, лучше ext4; доступ к файлам можно получить через SSH, SFTP или сетевую папку.
Можно ли продолжать пользоваться веб-приложением Partoska?
Да. Создавайте и модерируйте мероприятия в веб-приложении, когда это удобнее. p6a подключается к той же учётной записи, а теми же мероприятиями можно управлять или скачивать их из терминала.