Вопрос по node.js – Частный Git-модуль NPM на Heroku

49

Я пытаюсь развернуть свое приложение на Heroku, однако полагаюсь на использование некоторых частных репозиториев git в качестве модулей. Я делаю это для повторного использования кода между проектами, например, У меня есть собственный регистратор, который я использую в нескольких приложениях.

"logger":"git+ssh://[email protected]#master"

Проблема в том, что Heroku не имеет доступа к этому коду через ssh. Я не могу ничего найти по этой проблеме. В идеале у Heroku есть открытый ключ, который я могу просто добавить в модули.

Когда вы устанавливаете npm на свой локальный ПК, это стандартное поведение, начиная с npm 1.0? Alfred
Я не совсем понимаю, но я думаю, что вы говорите, что я мог бы просто сохранить код в папке node_modules и главном репозитории, который бы работал, но это немного хак. henry.oswald
Модули должны быть установлены в каталоге node_modules? Вы могли бы просто заархивировать приложение и затем установить его на героку после отправки его на героку? Alfred
Я тоже хотел бы знать ответ. Вы можете привязать свой ключ Github / Bitbucket SSH к своей учетной записи Heroku:heroku keys:add ~/.ssh/id_rsa.pub, Теоретически это должно сработать, ноgit push heroku master по-прежнему приводит к «Ошибка проверки ключа хоста». Вы спрашивали об этом еще в июне, нашли ли вы ответ с тех пор? lefnire
Скрещенные провода. Я надеялся не рекламировать какие-либо другие процессы между героическим развертыванием, чтобы начать побеждать цель. henry.oswald

Ваш Ответ

10   ответов
35

Update 2016-03-26

Описанный метод больше не работает, если вы используете npm3, так как npm3 выбирает все модули, описанные вpackage.json перед запускомpreinstall скрипт. этобыло подтверждено как ошибка.

Официальный пакет build.js Heroku теперь включает в себяheroku-prebuild а такжеheroku-postbuild, который будет запущен до и послеnpm install соответственно. Вы должны использовать эти сценарии вместоpreinstall а такжеpostinstall во всех случаях для поддержки как npm2, так и npm3.

Другими словами, вашpackage.json должно напоминать:

 "scripts": {
      "heroku-prebuild": "bash preinstall.sh",
      "heroku-postbuild": "bash postinstall.sh"
    }

Я придумала альтернативу ответу Михаэля, сохранив (IMO) благоприятное требование не допускать ваших учетных данных из-под контроля исходного кода, при этом не требуя специального пакета сборки. Это было вызвано разочарованием, чтоbuildpack связан с Майклом довольно устарел.

Решение состоит в том, чтобы настроить и разрушить среду SSH в npm.preinstall а такжеpostinstall скрипты, а не в buildpack.

Следуйте этим инструкциям:

Create two scripts in your repo, let's call them preinstall.sh and postinstall.sh. Make them executable (chmod +x *.sh). Add the following to preinstall.sh:
    #!/bin/bash
    # Generates an SSH config file for connections if a config var exists.

    if [ "$GIT_SSH_KEY" != "" ]; then
      echo "Detected SSH key for git. Adding SSH config" >&1
      echo "" >&1

      # Ensure we have an ssh folder
      if [ ! -d ~/.ssh ]; then
        mkdir -p ~/.ssh
        chmod 700 ~/.ssh
      fi

      # Load the private key into a file.
      echo $GIT_SSH_KEY | base64 --decode > ~/.ssh/deploy_key

      # Change the permissions on the file to
      # be read-only for this user.
      chmod 400 ~/.ssh/deploy_key

      # Setup the ssh config file.
      echo -e "Host github.com\n"\
              " IdentityFile ~/.ssh/deploy_key\n"\
              " IdentitiesOnly yes\n"\
              " UserKnownHostsFile=/dev/null\n"\
              " StrictHostKeyChecking no"\
              > ~/.ssh/config
    fi
Add the following to postinstall.sh:
    #!/bin/bash

    if [ "$GIT_SSH_KEY" != "" ]; then
      echo "Cleaning up SSH config" >&1
      echo "" >&1

      # Now that npm has finished running, we shouldn't need the ssh key/config anymore.
      # Remove the files that we created.
      rm -f ~/.ssh/config
      rm -f ~/.ssh/deploy_key

      # Clear that sensitive key data from the environment
      export GIT_SSH_KEY=0
    fi

Add the following to your package.json:

"scripts": {
  "preinstall": "bash preinstall.sh",
  "postinstall": "bash postinstall.sh"
}

Generate a private/public key pair using ssh-agent.

Add the public key as a deploy key on Github. Create a base64 encoded version of your private key, and set it as the Heroku config var GIT_SSH_KEY. Commit and push your app to Github.

Когда Heroku создает ваше приложение, перед тем, как npm установит ваши зависимости,preinstall.sh скрипт запускается Это создает файл закрытого ключа из декодированного содержимогоGIT_SSH_KEY переменная окружения и создает файл конфигурации SSH, чтобы сообщить SSH об использовании этого файла при подключении кgithub.com, (Если вместо этого вы подключаетесь к Bitbucket, обновитеHost вход вpreinstall.sh вbitbucket.org). Затем npm устанавливает модули, используя эту конфигурацию SSH. После установки закрытый ключ удаляется и конфиг стирается.

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

Кроме того, поскольку ключи развертывания GitHub имеют разрешения на чтение / запись, если вы размещаете модуль в организации GitHub, вы можете вместо этого создать команду только для чтения и назначить «развертывание»; пользователь к нему. Затем пользователь развертывания может быть настроен с открытой половиной пары ключей. Это добавляет дополнительный уровень безопасности для вашего модуля.

Хорошо сделано! Мне никогда не нравилось иметь возможность поддерживать форк пакета сборки, чтобы сделать это
@Pier имя не имеет значения, вы можете легко использоватьGIT_SSH_01, GIT_SSH_02 и т.д. - просто не забудьте изменить скрипт соответствующим образом, чтобы использовать правильные переменные среды.
Да, это хороший момент. Я думаю, вы могли бы сделать копию вашего оригиналаconfig файл, а затем восстановить его, вместо того, чтобы просто удалить его.
Для меняrm -f ~/.ssh/config вcleanup-ssh.script это проблема. Как я уже использую это для некоторых других настроек. Поэтому я не могу удалить этот файл. Хорошо, чтобы добавить понятие здесь.
@roboli, да, этот метод будет работать только без ключевой фразы, поскольку он оставлен без присмотра, я рекомендую создать отдельный ключ SSH только для этой операции, который будет легко отозван, если будет скомпрометирован на более позднем этапе.
-2

ентификации ниже:

https://usernamegit:[email protected]/reponame/web/tarball/branchname
Неправильно хранить свои учетные данные в своем репо и в package.json.
-3

с которой я столкнулся, - это использование новогомерзавец поддерево& APOS; с. На момент написания статьи их нет в официальном источнике git, поэтому их необходимо установить вручную, но они будут включены в v1.7.11. На данный момент он доступен на доморощенных и apt-get. тогда дело

git subtree add -P /node_modules/someprivatemodue [email protected] {master|tag|commit}

это увеличивает объем репо, но обновление легко, выполнив команду выше с gitsubtree pull.

13

который позволит вам указать ключ SSH, который зарегистрирован в ssh-agent и используется npm при первой установке dynos. Это позволяет вам без проблем указывать ваш модуль как ssh url в вашемpackage.json как показано:

"private_module": "git+ssh://[email protected]:me/my_module.git"

Чтобы настроить приложение на использование вашего личного ключа:

Generate a key: ssh-keygen -t rsa -C "[email protected]" (Enter no passphrase. The buildpack does not support keys with passphrases) Add the public key to github: pbcopy < ~/.ssh/id_rsa.pub (in OS X) and paste the results into the github admin Add the private key to your heroku app's config: cat id_rsa | base64 | pbcopy, then heroku config:set GIT_SSH_KEY=<paste_here> --app your-app-name Setup your app to use the buildpack as described in the heroku nodeJS buildpack README included in the project. In summary the simplest way is to set a special config value with heroku config:set to the github url of the repository containing the desired buildpack. I'd recommend forking my version and linking to your own github fork, as I'm not promising to not change my buildpack.

Мой пользовательский buildpack-пакет можно найти здесь:https://github.com/thirdiron/heroku-buildpack-nodejs и это работает для моей системы. Комментарии и запросы на получение более чем приветствуются.

2

https://stackoverflow.com/a/29677091/6135922, но я немного изменил предустановочный скрипт. Надеюсь, это кому-нибудь поможет.

#!/bin/bash
# Generates an SSH config file for connections if a config var exists.

echo "Preinstall"

if [ "$GIT_SSH_KEY" != "" ]; then
  echo "Detected SSH key for git. Adding SSH config" >&1
  echo "" >&1

  # Ensure we have an ssh folder
  if [ ! -d ~/.ssh ]; then
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
  fi

  # Load the private key into a file.
  echo $GIT_SSH_KEY | base64 --decode > ~/.ssh/deploy_key

  # Change the permissions on the file to
  # be read-only for this user.
  chmod o-w ~/
  chmod 700 ~/.ssh
  chmod 600 ~/.ssh/deploy_key

  # Setup the ssh config file.
  echo -e "Host bitbucket.org\n"\
          " IdentityFile ~/.ssh/deploy_key\n"\
          " HostName bitbucket.org\n" \
          " IdentitiesOnly yes\n"\
          " UserKnownHostsFile=/dev/null\n"\
          " StrictHostKeyChecking no"\
          > ~/.ssh/config

  echo "eval `ssh-agent -s`"
  eval `ssh-agent -s`

  echo "ssh-add -l"
  ssh-add -l

  echo "ssh-add ~/.ssh/deploy_key"
  ssh-add ~/.ssh/deploy_key

  # uncomment to check that everything works just fine
  # ssh -v [email protected]
fi
1

Heroku через токены личного доступа.

Generate Github access token here: https://github.com/settings/tokens Set access token as Heroku config var: heroku config:set GITHUB_TOKEN=<paste_here> --app your-app-name or via Heroku Dashboard

Add heroku-prebuild.sh script:

#!/bin/bash
if [ "$GITHUB_TOKEN" != "" ]; then
    echo "Detected GITHUB_TOKEN. Setting git config to use the security token" >&1
    git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf [email protected]:
fi

add the prebuild script to package.json:

"scripts": {
    "heroku-prebuild": "bash heroku-prebuild.sh"
}

Для местной среды мы также можем использоватьgit config ... или мы можем добавить токен доступа к~/.netrc файл:

machine github.com
  login PASTE_GITHUB_USERNAME_HERE
  password PASTE_GITHUB_TOKEN_HERE

и установка частных репозиториев github должна работать.

npm install OWNER/REPO --save появится вpackage.json как:"REPO": "github:OWNER/REPO"

и разрешение частных репозиториев в сборке Heroku также должно работать. При желании вы можете настроить скрипт пост-сборки, чтобы сброситьGITHUB_TOKEN.

-4

ет название пакета или ссылку наtar.gz файл, который содержит пакет.

Например, если вы хотите использовать express.js напрямую из Github (перейдите по ссылке через раздел загрузки), вы можете сделать следующее:

"dependencies" : {
  "express"   :  "https://github.com/visionmedia/express/tarball/2.5.9"
}

Так что вам нужно найти способ получить доступ к вашему хранилищу какtar.gz файл через http (s).

@ TheHippo чувак, просто удали это.
спасибо, но это не обойдёт репо, будучи закрытым для мировой проблемы. henry.oswald
но поскольку модуль является закрытым и требует ssh-доступа, как только heroku попытается его получить, ему будет отказано независимо от того, как передается код. henry.oswald
Как уже говорилось, либо npm, либо tar.gz, возможно, есть какой-то способ экспортировать ваш модуль в архив. Если нет, то для этого всегда есть возможность использовать подмодули git.
Используйте cronjob, post commit hook или что-то еще, чтобы сбросить tag.gz где-нибудь, где это доступно. (Обычная http-аутентификация может защитить ее от всех остальных.) Как я уже говорил, насколько я знаю, не существует волшебного способа решить вашу проблему, написав что-то простое в вашем package.json. Вы должны быть немного более креативным здесь.
6

я создал buildpack-пакет для решения этой проблемы, используя пользовательский ключ ssh, хранящийся в качестве переменной среды. Поскольку buildpack не зависит от технологии, его можно использовать для загрузки зависимостей, используя любой инструмент, такой как composer для php, bundler для ruby, npm для javascript и т. Д .:https://github.com/simon0191/custom-ssh-key-buildpack

Add the buildpack to your app:

$ heroku buildpacks:add --index 1 https://github.com/simon0191/custom-ssh-key-buildpack

Generate a new SSH key without passphrase (lets say you named it deploy_key)

Add the public key to your private repository account. For example:

Github: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/

Bitbucket: https://confluence.atlassian.com/bitbucket/add-an-ssh-key-to-an-account-302811853.html

Encode the private key as a base64 string and add it as the CUSTOM_SSH_KEY environment variable of the heroku app.

Make a comma separated list of the hosts for which the ssh key should be used and add it as the CUSTOM_SSH_KEY_HOSTS environment variable of the heroku app.

# MacOS
$ heroku config:set CUSTOM_SSH_KEY=$(base64 --input ~/.ssh/deploy_key) CUSTOM_SSH_KEY_HOSTS=bitbucket.org,github.com
# Ubuntu
$ heroku config:set CUSTOM_SSH_KEY=$(base64 ~/.ssh/deploy_key) CUSTOM_SSH_KEY_HOSTS=bitbucket.org,github.com
Deploy your app and enjoy :)
Удивительно! Спасибо!
@gmuraleekrishna Я обнаружил, что с помощью--input Флаг зависит от версии base64, которую вы используете. Например, в macOS это было необходимо, но в Ubuntu 14.04 флаг не был распознан.
@SimonSoriano Я имел в виду, что вы должны использовать закрытый ключ вместо открытого ключа.
Входная часть скрипта должна быть--input ~/.ssh/deploy_key, Вы расшифровали base64 секретного ключа в вашем скрипте. Пожалуйста исправьте.
@roboli, да, парольные фразы в ключах ssh обычно не используются для автоматизации, потому что для расшифровки закрытого ключа вам нужно будет вручную ввести кодовую фразу, которая в этом случае не будет работать, потому что сценарии buildpack автоматически запускаются Heroku, или вам также потребуется предоставить парольную фразу для инструмента автоматизации (в данном случае buildpack) и, следовательно, потеряет цель парольной фразы, которая заключается в добавлении дополнительного уровня безопасности. Спасибо за отзыв, я обновил ответ, чтобы уточнить, что ключ SSH должен генерироваться без ключевой фразы.
13

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

"my_module": "git+https://ACCESS_TOKEN:[email protected]/me/my_module.git"
Это лучший ответ! Создайте токен здесь:github.com/settings/applications
Кроме того, не забудьте указать область действия своего токена, чтобы он содержал только «repo». доступ
@bpaul Да, область видимости действительно важна, в противном случае это все равно что проверить текстовый пароль вашего плана.
Я пытаюсь сделать это с помощью bitbucket, и когда Heroku пытается клонировать частное репо, это приводит к «Ошибка проверки ключа хоста». : /
65
Basic auth

"dependencies" : {
    "my-module" : "git+https://my_username:[email protected]/my_github_account/my_repo.git"
}

Как и BitBucket:

"dependencies" : {
    "my-module": "git+https://my_username:[email protected]/my_bitbucket_account/my_repo.git"
}

Но имея простые пароли в вашемpackage.json вероятно, не желательно.

Personal access tokens (GitHub)

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

Теперь вы должны использовать:

"dependencies" : {
    "my-module" : "git+https://<username>:<token>@github.com/my_github_account/my_repo.git"
}

Для Github вы можете сгенерировать новый токен здесь:

https://github.com/settings/tokens

App passwords (Bitbucket)

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

"dependencies" : {
    "my-module": "git+https://<username>:<app-password>@bitbucket.org/my_bitbucket_account/my_repo.git"
}
[Deprecated] API key for teams (Bitbucket)

Для BitBucket вы можете сгенерировать ключ API на странице управления командой, а затем использовать этот URL:

"dependencies" : {
    "my-module" : "git+https://<teamname>:<api-key>@bitbucket.org/team_name/repo_name.git"
}
Понял: & quot; зависимости & quot; : {& quot; my-module & quot; : "git +my_username:[email protected]/my_bitbucket_account/…& Quot; } (обратите внимание, что SO анализирует этот URL, см.gist.github.com/4073148)
Я обновил ответ, чтобы сослаться на новые методы Bitbucket, а комментарии перед этим ссылаются на более старую версию этого ответа.
С помощью API авторизации вы можете сделать это более безопасно, выдав себе OAuth-токен и используя его вместо имени пользователя и пароля своей учетной записи:help.github.com/articles/git-over-https-using-oauth-token
Это вызывает ошибку синтаксического анализа package.json, поскольку спецификацией формата является {module_name: location_or_semver}, а не просто {location_or_semver}: & quot; Установка зависимостей с помощью npm npm ERR! Не удалось прочитать зависимости. нпм ERR! Не удалось проанализировать JSON Npm ERR! Неожиданный токен} & quot;
Просто быстрое обновление этого, я пытался использовать подход API, как упомянуто для bitbucket, НО показанный синтаксис неправильный. Вам нужно сделатьgit+https://<team-name>:<api-key>@bitbucket.org/<team-name>/<repo_name>.git

Похожие вопросы