Спільне сховище 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

Хоча сервіс локальний, я також за звичкою створюю для процесу окремого користувача:


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

Перевіряємо конфігурацію і монтуємось:


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/