Heroku:私有存储库中的Python依赖项,不存储我的密码

wks*_*rtz 13 python github heroku

问题

我的问题与如何安装Python Heroku项目的内部需求完全一样以及如何在Heroku中部署pip的requirements.txt?.也就是说,我有一个私人仓库,我需要在我的Heroku应用程序中安装Python依赖项.Heroku自己的Kenneth Reitz给出的典型答案就是提出类似的东西

-e git+https://username:password@github.com/kennethreitz/requests.git@v0.10.0#egg=requests
Run Code Online (Sandbox Code Playgroud)

在你的requirements.txt文件中.

我的安全需求阻止我将密码存储在回购中.(我也不想将依赖项放在我的app的repo中;它们是单独的软件,需要在单独的repos中.)我唯一可以提供密码的地方(或者,最好是GitHub OAuth令牌或部署密钥)到Heroku,是在一个环境变量之类的

heroku config:add GITHUB_OAUTH_TOKEN=12312312312313
Run Code Online (Sandbox Code Playgroud)

试图解决方案

我可以.profile在我的应用程序的repo中使用自定义,但是每次进程(web,worker等)重新启动时我都会下载并安装我的依赖项.

这使得自定义buildpack和Heroku Labs插件heroku config在buildpack编译之前暴露我的环境.我尝试在Buildpack Multi构建一个.想法是Buildpack Multi是主要的buildpack,并且在我的应用程序的repo中使用该文件,它首先下载普通的Heroku Python buildpack,然后是我的自定义..buildpacks

即使在Buildpack Multi成功运行Python buildpack之后,问题仍然存在,一旦Buildpack Multi运行,我的buildpack就看不到Python二进制文件和Pip包.所以自定义buildpack完全失败了.(在我的测试中,GITHUB_OAUTH_TOKEN环境变量被正确地暴露给buildpacks.)

我能想到的唯一另一件事就是创建我自己的Python buildpack的fork,它安装我的依赖,当它安装所有东西requirements.txt,甚至requirements.txt直接重写.对于我认为是一个非常普遍的问题,这两者似乎都是非常重要的解决方案.

更新:当前的解决方法

我的自定义buildpack(上面链接)现在下载并将我的闭源依赖项("foo")保存到geos buildpack使用的供应商目录中.我在我的应用程序中提交了foo本身存在于我的应用程序中的依赖项requirements.txt.因此,Pip通过我的应用程序安装foo的依赖项requirements.txt,buildpack将foo的托管副本添加到我应用程序的环境中PYTHONPATH(所以foo setup.py install永远不会运行).

这种方法的最大问题是将我的(无可否认写得很糟糕)buildpack与我的app结合起来.第二个问题是我的应用程序requirements.txt应该只将foo列为依赖项,并将foo的依赖项留给foo来确定.最后,如果我忘记设置我的GITHUB_OAUTH_TOKEN环境变量(或者,如果产生更少有用的错误反馈,那么在我忘记如何完成所有这些错误消息之后的六个月内就没有好办法给自己令牌到期且环境变量仍然存在但不再有效).

哭喊帮忙

我错过了什么(很明显)?你是如何在你的应用程序中解决这个问题的?有关让我的构建包工作的建议,或希望更简单的解决方案?

Sim*_*ano 5

我创建了一个构建包来使用存储为环境变量的自定义 ssh 密钥来解决此问题。由于构建包与技术无关,因此可以使用任何工具下载依赖项,例如用于 php 的 Composer、用于 ruby​​ 的捆绑器、用于 javascript 的 npm 等:https://github.com/simon0191/custom-ssh-key-buildpack

  1. 将构建包添加到您的应用程序:

    $ heroku buildpacks:add --index 1 https://github.com/simon0191/custom-ssh-key-buildpack
    
    Run Code Online (Sandbox Code Playgroud)
  2. 生成一个新的 SSH 密钥(假设您将其命名为部署密钥)

  3. 将公钥添加到您的私人存储库帐户。例如:

  4. 将私钥编码为base64字符串并将其添加为CUSTOM_SSH_KEYheroku应用程序的环境变量。

  5. 创建应使用 ssh 密钥的主机的逗号分隔列表,并将其添加为CUSTOM_SSH_KEY_HOSTSheroku 应用程序的环境变量。

    # 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
    
    Run Code Online (Sandbox Code Playgroud)
  6. 部署您的应用程序并享受:)


Joh*_*ohn 0

您可以使用此处描述的预编译步骤来运行 M4 之类的内容来对您的requirements.txt 进行替换,以从环境变量中输入密码。