gemlog/public/uk/kellnr-storage-on-usb-drive.gmi
postscriptum 4cc6d6a242 simplify
2026-03-03 18:57:52 +02:00

121 lines
No EOL
6.3 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Спільне сховище Kellnr на флешці USB
Оскільки мій імпровізований сервер ARM наказав довго жити, постала задача десь розмістити локальний кеш крейтів на випадок відсутності Інтернет та можливості розробки Rust офлайн. Kellnr мені сподобався своєю гнучкістю і не вибагливістю до диску, за рахунок кешування тільки тих даних, які використовуються. З ним легко збудувати децентралізовані ланцюги проксі і так само легко переключатись у разі не доступності одного з них.
Для локального кеш-сервера, першою опцією в мене був сам комп'ютер, але єдиний його HDD (запакований в iMac) майже заповнений, до того ж повільний. Інший комп'ютер PC - наразі не зручно запускати через перебої живлення і його апетити до UPS.
Тому вирішив застосувати свій старий лайф-хак з розширенням пам'яті засобами звичайної флешки USB (Kellnr пише дані тільки при першому запиті крейту, тому проблем з живучістю SSD не повинно бути). Також, цей сценарій дозволяє тягати флешку між компами без жодної залежності від стаціонарного сервера чи локальної мережі.
## Підготовка USB
Фактично, я користуюсь флешкою 32 GB, яка при ~1к крейтів заповнена на 30%. Тобто підійде сама чіпова флешка, і зовсім не обов'язково спеціально купувати заявлені 300 Гб станом на 2024-2026. При першій ініціалізації реєстру, відбувається пікове зростання споживання диску через внутрішні залежності усіх запитаних крейтів, але потім воно збалансовується і тримається на згаданому вище рівні.
### Файлова система
Спочатку я відформатував накопичувач в FAT, оскільки мені набридло морочитись з правами. Утім, як виявилося згодом, Kellnr якось там залежить від мета-даних і сипле в журнали помилки. Тому згодом я обрав формат Ext4, створивши для сховища простір імен `kellnr/data`, розмістивши в `kellnr/` переносний бінарник та пам'ятку для швидкого розгортання на іншому комп'ютері.
## Системний сервіс
Перший час, крутив кеш-проксі через CLI, але згодом вирішив організувати для нього сервіс:
``` /etc/systemd/system/kellnr.service
[Unit]
After=network.target
Wants=network.target
RequiresMountsFor=/mnt/usb1/kellnr/data
[Service]
Type=simple
User=kellnr
Group=kellnr
ExecStart=/usr/local/bin/kellnr start --registry-data-dir /mnt/usb1/kellnr/data \
--proxy-enabled true \
--proxy-download-on-update true \
--local-ip 127.0.0.1 \
-l warn
Environment="NO_COLOR=1"
StandardOutput=file:///var/log/kellnr/debug.log
StandardError=file:///var/log/kellnr/error.log
[Install]
WantedBy=multi-user.target
```
* зверніть увагу: якщо не вказати `--local-ip` то стандартно Kellnr працюватиме на `0.0.0.0`
Хоча сервіс локальний, я також за звичкою створюю для процесу окремого користувача:
``` bash
sudo useradd -s /usr/sbin/nologin -Mr kellnr
```
І відповідні теки для монтування та журналів:
``` bash
sudo mkdir /var/log/kellnr
sudo chown kellnr:kellnr /var/log/kellnr
mkdir /mnt/usb1
```
Отримуємо UUID пристрою для прив'язки його в `/etc/fstab`:
``` bash
lsblk -f
```
Додаємо в кінець файлу`/etc/fstab` новий пристрій, замінивши `xxxx-xxxx-xxxx-xxxx-xxxx` на ваше значення:
``` /etc/fstab
UUID=xxxx-xxxx-xxxx-xxxx-xxxx /mnt/usb1 ext4 defaults,nofail 0 0
```
* важливо вказати `nofail`, інакше система без флешки (або після її пошкодження) може не завантажитись!
Перевіряємо конфігурацію і монтуємось:
``` bash
sudo systemctl daemon-reload
sudo findmnt --verify --verbose
sudo mount -a
```
Kellnr запускатиметься від однойменного користувача, тому для теки сховища потрібні відповідні права:
``` bash
sudo mkdir -p /mnt/usb1/kellnr
sudo chown kellnr:kellnr -R /mnt/usb1/kellnr
sudo chmod 0755 -R /mnt/usb1
```
Тепер можна запустити сервіс:
``` bash
sudo systemctl restart kellnr
```
Автозапуск з системою:
``` bash
sudo systemctl enable kellnr
```
## Клієнт
Для цієї конфігурації, мною використовується наступна конфігурація:
``` ~/.cargo/config.toml
[registries.kellnr]
index = "sparse+http://127.0.0.1:8000/api/v1/cratesio/"
[source.crates-io]
replace-with = "kellnr"
[http]
timeout = 900
```
## Дивіться також
=> rust-crates-mirroring-with-kellnr.gmi Організація локального дзеркала залежностей Cargo з Kellnr
=> kellnr-proxy-verification-using-local-index.gmi Не верифіковане проксі Kellnr на базі власного індексу