Всем привет! Меня зовут Досжан. Я являюсь DevOps инженер с опытом более 4 лет. До этого программировал на разных языках как JS, Python, PHP, C++, Delphi. Когда только учился программировать и разбираться с компьютерными технологиями застал эпоху, когда интернет был не всегда и не везде. Приходилось бегать с флешками или ЖД.
Сегодня хоть и есть интеренет в больших компаниях или в компаниях с закрытой политикой хранения кода возникает необходимость хранить артифакты или прочее библиотеки под боком, чтобы те в свою очередь не попавли в руки к третим лицам, либо просто в целях экономии трафика, для того чтобы не приходилось каждый раз скачивать все с интернета.
У каждого пакетного менеджера или сборщика есть свои утилиты для хранения и кэширования данных для локального использования. Но для меня всегда удобно, когда все хранится в одном месте. Это помогает решить проблему и с распределением доступа и с администрированием по уходу за сервисом.
Когда впервые познакомился с продуком Sonatype Nexus использовал его только для хранения артифактов Maven. Поднял его на докере, примантировал папку для хранения blob репозитория и пробросил порты.
docker run -d -p 8081:8081 -p 5050:5050 --name nexus -v nexus-data:/nexus-data sonatype/nexus3
По умолчанию настроены репозитории для snapshot и release с группой для их объединения. То есть если вы и дальше будете использовать Nexus в качестве репозитория для Maven то вам больше нет необходимости что-то делать. Только указать в сборщике чтобы он обращался в локальное хранилище. Сделать это можно двумя способами.
При сборке поставив флаг
-Dmaven.repo.local=<путь к вашему серверу с nexus>
Добавив параметры в ~/.m2/settings.xml
Аналогичным образом настроим репозитории для npm. Рецепт такой же, только вместо release у нас будет proxy который будет обращаться https://registry.npmjs.org если не найдет пакет в hosted. Дальше при сборке, чтобы обращаться к нему необходимо создать .npmrc. Но для начала надо сделать хэш логина и пароля следующим образом
echo -n 'username:password' | openssl base64
; Nexus proxy registry pointing to http://registry.npmjs.org/
registry = http://<host>/<название group репозитория>/
; base64 encoded authentication token
_auth = <see question below>
; required by Nexus
email = <valid email>
; force auth to be used for GET requests
always-auth = true
; we don't want to put certificates in .npmrc
strict-ssl = false
loglevel = silly
Nexus позволяет не только хранить npm паректы, там так же есть репозитории для apt, yum, pip даже helm chart может собирать. Настройка которых такая же как для npm.
С Docker Registry немного отличается. Хоть там и есть proxy и другие варианты, нам понадобится только hosted. В форме нового репозитория указываем название и порт (если не подгружали валидные сертификаты то лучше использовать http). Порт должен быть доступен снаружи. Если Вы запустили docker для nexus-a как в моем примере то укажите 5050.
Так как у нас http при авторизации будет ругать что не отвечает по https. Для этого в файле /etc/docker/daemon.json добавляем
{
"insecure-registries" : [ "хост:5050" ],
"live-restore": true
}
и перезапускам daemon для docker следующей командой
sudo systemctl reload docker
и можно логиниться
docker login --username пользователь --password пароль
Чтобы образы падали в локальный репозиторий необходимо чтобы они начинались с <хост>/<название репозитория>/<название образа>:<тэг>
Все! можно пользоваться! При необходимости можно переносить виртуалку, бывают кейсы когда необходимо накопить репозитории с интернетом и затем запуститься в закрытой среде. Думаю в любой случае данная статья поможет вам не только запустить, но и работать с другими приватными репозиториями.