Подтвердить что ты не робот

Закрытый модуль NPM git на Heroku

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

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

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

4b9b3361

Ответ 1

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

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

это освобождает размер репо, но обновление легко, выполнив команду выше с помощью gitsubtree pull.

Ответ 2

Базовый auth

GitHub поддерживает базовую аутентификацию:

"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, вероятно, нежелательно.

Листы персонального доступа (GitHub)

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

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

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

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

https://github.com/settings/tokens

Пароли приложений (Bitbucket)

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

"dependencies" : {
    "my-module": "git+https://<username>:<app-password>@bitbucket.org/my_bitbucket_account/my_repo.git"
}

[Устаревший] API-ключ для команд (Bitbucket)

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

"dependencies" : {
    "my-module" : "git+https://<teamname>:<api-key>@bitbucket.org/team_name/repo_name.git"
}

Ответ 3

Обновление 2016-03-26

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

Официальная компоновка node.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. Это было вызвано разочарованием, что buildpack, связанный Майклом, довольно устарел.

Решение заключается в установке и отключении среды SSH в сценариях npm preinstall и postinstall, а не в buildpack.

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

  • Создайте два сценария в своем репо, позвоните им preinstall.sh и postinstall.sh.
  • Сделайте их исполняемыми (chmod +x *.sh).
  • Добавьте в 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
  • Добавьте в 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
  • Добавьте в свой package.json следующее:

    "scripts": {
      "preinstall": "bash preinstall.sh",
      "postinstall": "bash postinstall.sh"
    }
    
  • Создайте пару частных/открытых ключей, используя ssh-agent.

  • Добавить открытый ключ в качестве ключа развертывания в Github.
  • Создайте кодированную версию base64 вашего закрытого ключа и установите ее как конфигурацию Heroku var GIT_SSH_KEY.
  • Зафиксируйте и нажмите приложение в Github.

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

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

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

Ответ 4

Это ДЕЙСТВИТЕЛЬНО плохая идея иметь простые текстовые пароли в вашем репозитории git, используя токен доступа, но вы все равно хотите быть очень осторожным.

"my_module": "git+https://ACCESS_TOKEN:[email protected]/me/my_module.git"

Ответ 5

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

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

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

  • Сгенерируйте ключ: ssh-keygen -t rsa -C "[email protected]" (введите парольную фразу). buildpack не поддерживает ключи с фразными фразами)
  • Добавить открытый ключ в github: pbcopy < ~/.ssh/id_rsa.pub (в OS X) и вставить результаты в файл github admin
  • Добавьте приватный ключ в конфигурацию приложения heroku: cat id_rsa | base64 | pbcopy, затем heroku config:set GIT_SSH_KEY=<paste_here> --app your-app-name
  • Настройте приложение, чтобы использовать buildpack, как описано в файле heroku nodeJS buildpack README, включенном в проект. В общем, самый простой способ - установить специальное значение конфигурации с конфигурацией heroku: установить в github url репозитория, содержащего требуемый buildpack. Я бы рекомендовал развернуть мою версию и связать ее с собственной вилкой github, так как я не обещаю не менять свой buildpack.

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

Ответ 6

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

  • Добавьте buildpack в ваше приложение:

    $ heroku buildpacks:add --index 1 https://github.com/simon0191/custom-ssh-key-buildpack
    
  • Создайте новый ключ SSH (скажем, вы назвали его deploy_key)

  • Добавить ключ в ваш приватный репозиторий

  • Добавьте переменные окружения CUSTOM_SSH_KEY и CUSTOM_SSH_KEY_HOSTS к вам приложение heroku

    # MacOS
    $ heroku config:set CUSTOM_SSH_KEY=$(base64 --input ~/.ssh/deploy_key.pub) CUSTOM_SSH_KEY_HOSTS=bitbucket.org,github.com
    # Ubuntu
    $ heroku config:set CUSTOM_SSH_KEY=$(base64 ~/.ssh/deploy_key.pub) CUSTOM_SSH_KEY_HOSTS=bitbucket.org,github.com
    
  • Разверните приложение и наслаждайтесь:)

Ответ 7

Этот ответ хорош fooobar.com/questions/136104/..., но я немного изменил preinstall script. Надеюсь, это поможет кому-то.

#!/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

Ответ 8

Мне удалось настроить разрешение частных хранилищ Github в сборке Heroku через токены доступа к персональному компьютеру.

  • Создайте токен доступа Github: https://github.com/settings/tokens
  • Установите токен доступа как конфигурацию Heroku var: heroku config:set GITHUB_TOKEN=<paste_here> --app your-app-name или через панель инструментов Heroku
  • Добавить 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
    
  • добавить prebuild script в 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 также должно работать. вы можете настроить postbuild script, чтобы отключить GITHUB_TOKEN.

Ответ 9

Вы можете использовать в приватном репозитории package.json с примером проверки подлинности ниже:

https://usernamegit:[email protected]/reponame/web/tarball/branchname

Ответ 10

Я сделал это раньше с модулями из github. Npm в настоящее время принимает имя пакета или ссылку на файл tar.gz, который содержит пакет.

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

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

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