Резервне копіювання фото з 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-диски, які не потрібні для встановлення.
Дочекайтеся завершення запису й перевірки в Imager. Безпечно вийміть картку, вставте її в Raspberry Pi та під’єднайте зовнішній диск. Після ввімкнення зачекайте хвилину-дві, поки Pi з’явиться в мережі.
Під’єднайтеся через SSH та оновіть систему
У Терміналі на 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
На окремому 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 Літній матч/.event.p6a.ini /mnt/partoska/events/2026-07-18 Літній матч/IMG_0001.jpg /mnt/partoska/events/2026-07-18 Літній матч/IMG_0002.jpg /mnt/partoska/events/2026-07-18 Літній матч/MOV_0001.mp4
Для кожної події створюється папка у форматі YYYY-MM-DD Назва події. Фото отримують назви на кшталт 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 під’єднується до того самого облікового запису, і тими самими подіями можна керувати з термінала або завантажувати їхні файли.