Спільне сховище 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, але згодом вирішив організувати для нього сервіс:
[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`
Хоча сервіс локальний, я також за звичкою створюю для процесу окремого користувача:
sudo useradd -s /usr/sbin/nologin -Mr kellnr
І відповідні теки для монтування та журналів:
sudo mkdir /var/log/kellnr sudo chown kellnr:kellnr /var/log/kellnr mkdir /mnt/usb1
Отримуємо UUID пристрою для прив'язки його в `/etc/fstab`:
lsblk -f
Додаємо в кінець файлу`/etc/fstab` новий пристрій, замінивши `xxxx-xxxx-xxxx-xxxx-xxxx` на ваше значення:
UUID=xxxx-xxxx-xxxx-xxxx-xxxx /mnt/usb1 ext4 defaults,nofail 0 0
- важливо вказати `nofail`, інакше система без флешки (або після її пошкодження) може не завантажитись!
Перевіряємо конфігурацію і монтуємось:
sudo systemctl daemon-reload sudo findmnt --verify --verbose sudo mount -a
Kellnr запускатиметься від однойменного користувача, тому для теки сховища потрібні відповідні права:
sudo mkdir -p /mnt/usb1/kellnr sudo chown kellnr:kellnr -R /mnt/usb1/kellnr sudo chmod 0755 -R /mnt/usb1
Тепер можна запустити сервіс:
sudo systemctl restart kellnr
Автозапуск з системою:
sudo systemctl enable kellnr
Клієнт
Для цієї конфігурації, мною використовується наступна конфігурація:
[registries.kellnr] index = "sparse+http://127.0.0.1:8000/api/v1/cratesio/" [source.crates-io] replace-with = "kellnr" [http] timeout = 900
Дивіться також
Організація локального дзеркала залежностей Cargo з Kellnr
Не верифіковане проксі Kellnr на базі власного індексу
/uk/