Skip to main content

Лучшие практики

Это руководство - список лучших практик, которые мы собрали, и которые рекомендуем всем пользователям. Не воспринимайте это руководство как высеченную в камне неделимую истину, вы можете использовать только пару пунктов, если так будет правильно для вас.

Не стесняйтесь предлагать ваши лучшие практики комьюнити Verdaccio.

Приватный репозиторий

Вы можете добавлять пользователей и определять, какие пользователи имеют доступ к пакетам.

Мы рекомендуем определить для ваших приватных пакетов префикс, например local-*, или скоуп @my-company/*, так что все ваши приватные пакеты будут выглядеть примерно так: local-foo. Таким образом вы отделите публичные пакеты от приватных.

 yaml
packages:
'@my-company/*':
access: $all
publish: $authenticated
'local-*':
access: $all
publish: $authenticated
'@*/*':
access: $all
publish: $authenticated
'**':
access: $all
publish: $authenticated

Помните, порядок пакетов в списке доступа - важен, потому что совпадения всегда ищутся сверху вниз.

Использование публичных пакетов с npmjs.org

Если какого-то пакета нет в хранилище, сервер попробует скачать его с npmjs.org. Если npmjs.org недоступен, то сервер будет брать пакеты из кэша, исходя из предположения, что других пакетов нет. Verdaccio скачивает только то, что нужно (= то, что запросил пользователь), и эта информация кэшируется, так что когда клиент запросит то же самое второй раз, сервер вернёт требуемое, не запрашивая npmjs.org.

Пример:

Если вы запросили express@4.0.1 с сервера и запрос был успешный, это означает, что вы сможете получить его снова (вместе со всеми зависимостями) в любое время, даже если npmjs.org не работает. Но, скажем, express@4.0.0 не будет загружен, пока кто-нибудь его не запросит. И если npmjs.org недоступен, сервер будет отвечать, что только express@4.0.1 (= только то, что в кэше) опубликован, и больше никих версий нет.

Override public packages

Если вы хотите использовать модифицированную версию какого-либо публичного пакета foo, то просто опубликуйте его на вашем локальном сервере, и когда вы запустите команду npm install foo, будет становлена именно ваша версия.

Возможны две ситуации:

  1. Вы хотите создать отдельный форк и остановить синхронизацию с публичной версией.

    Если вы хотите сделать это, то надо изменить конфигурационный файл так, чтобы verdaccio не делал больше запросы к npmjs. Добавьте отдельную запись для этого пакета в config.yaml и удалите npmjs из списка proxy, затем перезапустите сервер.

    packages:
    '@my-company/*':
    access: $all
    publish: $authenticated
    # comment it out or leave it empty
    # proxy:

    При этом, когда вы локально публикуете пакет, рекомендуется повысить версию, чтобы не было конфликта с версией, которая же есть в кэше.

  2. Вы хотите временно использовать свою версию, но вернуться к публичному пакету, когда выйдет обновление.

    Чтобы избежать конфликта версий, вам нужно использовать свой пре-релизный суффикс для следующей версии. Например, если публичный пакет имел версию 0.1.2, вам нужно опубликовать 0.1.3-my-temp-fix.

     npm version 0.1.3-my-temp-fix
    npm --publish --tag fix --registry http://localhost:4873

    В этом случае ваш пакет будет использоваться до тех пор, пока владелец пакета не опубликует версию 0.1.3.

Безопасность

Security starts in your environment.

Additional reading:

Strong package access with $authenticated

By default all packages you publish in Verdaccio are accessible for all users. По умолчанию все опубликованные в Verdaccio пакеты доступны всем, и мы настоятельно рекомендуем защитить ваш реестр от внешних неавторизированных пользователей, установив значение свойства access в $authenticated.

packages:
'@my-company/*':
access: $authenticated
publish: $authenticated
'@*/*':
access: $authenticated
publish: $authenticated
'**':
access: $authenticated
publish: $authenticated

В этом случае, никто не сможет пользоваться вашим реестром, пока не авторизуется, и приватные пакеты не будут показываться в интерфейса пользователя.

Remove proxy to increase security at private packages

Использовать HTTPS - это частая рекомендация, и мы рекомендуем прочитать раздел SSL, чтобы включить защиту внутри Verdaccio, или использовать HTTPS reverse proxy поверх Verdaccio.

packages:
"@*/*":
access: $authenticated
publish: $authenticated
proxy: npmjs
"**":
access: $authenticated
publish: $authenticated
proxy: npmjs

This means, if a private packaged eg: @my-company/auth is published locally, the registry will look up at the public registry. If your intention is fully protection, remove the proxy property from your configuration, for instance:

packages:
"@my-company/*":
access: $authenticated
publish: $authenticated
unpublish: $authenticated
"@*/*":
access: $authenticated
publish: $authenticated
proxy: npmjs
"**":
access: $authenticated
publish: $authenticated
proxy: npmjs

Использование этой конфигурации изменит текущее поведение сервера и вы сможете управлять временим жизни токенов.

Server

Защищенные соединения

Using HTTPS is a common recommendation. For this reason we recommend reading the SSL section to make Verdaccio secure, or alternatively using an HTTPS reverse proxy on top of Verdaccio.

Expiring Tokens

В verdaccio@3.x токены не имеют ограничений по времени. Поэтому мы ввели в verdaccio@4.x новую фичу - JWT PR#896

security:
api:
jwt:
sign:
expiresIn: 15d
notBefore: 0
web:
sign:
expiresIn: 7d

Using this configuration will override the current system and you will be able to control how long the token will live.

Using JWT also improves the performance with authentication plugins. Использование JWT так же увеличивает производительность плагинов аутентификации, так как старая система производила распаковку и проверку credentials во время каждого запроса, тогда как JWT полагается на подпись токена, устраняя эти накладные расходы для плагина.

В качестве примечания, npmjs токены не имеют ограничений по времени.