# Спільне сховище 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 на базі власного індексу