Heroku:私人存储库中的 Python 依赖项,无需存储我的密码

2024-03-15

问题

我的问题就像如何安装 Python Heroku 项目的内部要求? https://stackoverflow.com/q/9112784/1286628 and 如何在部署时在Heroku中自定义pip的requirements.txt? https://stackoverflow.com/q/16876816/1286628。即,我有一个私人存储库,需要将 Python 依赖项安装到我的 Heroku 应用程序中. The 规范答案 https://stackoverflow.com/a/9136665/1286628,由 Heroku 自己给出肯尼思·赖茨 https://stackoverflow.com/users/120004/kenneth-reitz,就是把类似的东西

-e git+https://username:pas[email protected] /cdn-cgi/l/email-protection/kennethreitz/[email protected] /cdn-cgi/l/email-protection#egg=requests

in your requirements.txt file.

我的安全需要阻止我将密码存储在存储库中。(我也不想将依赖项放入我的应用程序的存储库中;它们是单独的软件,需要位于单独的存储库中。)我可以提供密码的唯一位置(或者最好是 GitHub OAuth 令牌或部署) key) 到 Heroku,位于像这样的环境变量中

heroku config:add GITHUB_OAUTH_TOKEN=12312312312313

尝试的解决方案

我可以使用自定义.profile在我的应用程序的存储库中,但随后我将下载并安装我的依赖项每一次进程(web、worker 等)重新启动。

这就需要使用自定义构建包和Heroku 实验室插件 https://devcenter.heroku.com/articles/labs-user-env-compile这暴露了我的heroku configbuildpack 编译之前的环境。我试过建设一号 https://github.com/EconomistsInc/heroku-buildpack-tvrweb-private-deps在之上多构建包 https://github.com/ddollar/heroku-buildpack-multi。这个想法是 Buildpack Multi 是主要的构建包,并使用.buildpacks当我在我的应用程序存储库中添加一个文件时,它首先下载正常的 Heroku Python 构建包,然后下载我的自定义构建包。

问题是,即使在 Buildpack Multi 成功运行 Python buildpack 之后,Python 二进制文件和 Pip 包不可见 https://github.com/EconomistsInc/heroku-buildpack-tvrweb-private-deps/blob/master/bin/detect#L18一旦 Buildpack Multi 运行,就添加到我的 buildpack。所以自定义构建包彻底失败了。 (在我的测试中,GITHUB_OAUTH_TOKEN环境变量已正确暴露给构建包。)

我唯一能想到尝试的另一件事是制作我自己的 Python 构建包的分支,当它安装来自的所有内容时,它会安装我的依赖项requirements.txt,甚至重写requirements.txt直接地。这两个看起来确实像heavy我认为是一个非常常见的问题的解决方案。

更新:当前解决方法

我的自定义构建包(上面链接)现在下载并将我的闭源依赖项(“foo”)保存到 geos 构建包使用的供应商目录中。我将 foo 本身对我的应用程序的依赖项提交到我的应用程序中requirements.txt。因此 Pip 通过我的应用程序安装 foo 的依赖项requirements.txt并且构建包将 foo 的供应副本添加到我的应用程序的环境中PYTHONPATH(所以 foo 的setup.py install从不运行)。

这种方法的最大问题是将我的(诚然写得很糟糕)构建包与我的应用程序耦合起来。第二个问题是我的应用程序requirements.txt应该只将 foo 列为依赖项,并将 foo 的依赖项留给 foo 来确定。最后,如果我忘记设置 GITHUB_OAUTH_TOKEN 环境变量(或者,如果令牌过期,环境变量仍然存在但不再有效)。

哭喊帮忙

我错过了什么(可能是显而易见的)事情?您是如何在应用程序中解决这个问题的?关于让我的构建包正常工作有什么建议,或者希望有一个更简单的解决方案?


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

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

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

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

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

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

  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
    
  6. 部署您的应用程序并享受:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Heroku:私人存储库中的 Python 依赖项,无需存储我的密码 的相关文章

  • 如何修复 Apache mod_wsgi 的 Python 版本不匹配问题?

    我收到此错误 Thu Jul 12 14 31 36 2012 error python init Python version mismatch expected 2 6 7 found 2 6 8 当尝试启动 Apache 服务器时 在
  • Pandas 字符串提取所有匹配项

    我正在学习 pandas 系列字符串方法中的正则表达式操作 我能够从字符串中提取第一个数字 但我的正则表达式与第二个数字不匹配 如何捕获这两个数字 注意第二行 第二个元素在这里是 NAN CODE import pandas as pd d
  • Python grpc protobuf 存根生成问题:--grpc_out: protoc-gen-grpc: 插件失败,状态代码 1

    正如问题所说 我从源代码编译了 grpc 并且也做了sudo pip install grpcio 但是 那which grpc python plugin不返回任何内容 这是一个问题 因为route guide的grpc python示例
  • 在 Python 中绘制分类数据的三个维度

    我的数据包含三个我试图可视化的分类变量 城市 五个之一 职业 四种之一 血型 四种之一 到目前为止 我已经成功地以一种我认为易于使用的方式对数据进行了分组 import numpy as np pandas as pd Make data
  • 使用 Pymongo 从 Windows 连接到 AWS 实例上的 MongoDB

    此行反复抛出错误 client MongoClient ec2 12 345 67 89 us east 2 compute amazonaws com 27017 ssl True ssl keyfile C mongo pem 由于显而
  • OpenCV - 我需要将彩色图像插入黑白图像并且

    我用以下代码将黑白图像插入彩色图像 没问题 face grey cv cvtColor face cv COLOR RGB2GRAY for row in range 0 face grey shape 0 for column in ra
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • 从主机名中提取域名

    是否有一种编程方式可以从给定的主机名查找域名 给出 gt www yahoo co jp 返回 gt yahoo co jp 有效但非常慢的方法是 拆分为 并从左侧删除 1 个组 使用 dnspython 加入并查询 SOA 记录 当返回有
  • python-polars 通过分隔符将字符串列拆分为许多列

    在 pandas 中 以下代码会将 col1 中的字符串拆分为许多列 有没有办法在极地做到这一点 d col1 a b c d a b c d df pd DataFrame data d df a b c d df col1 str sp
  • 使用 3d 对象作为 3d 散点图中的标记 - Python

    使用下面的代码 我尝试模拟一个用罐头制成的碗 我希望每个标记都是一个罐头 最好的方法是什么 我真的很感激任何建议 谢谢 import pylab import numpy as np from math import pi sin cos
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • 在python中安装scipy模块时出错

    我正在尝试使用 pip 在 python 中安装 scipy 模块 它显示以下错误 Command c users sony appdata local programs python python35 32 python exe u c
  • 如何加速 pandas 字符串函数?

    我正在使用 pandas 矢量化 str split 方法来提取从 上的拆分 返回的第一个元素 我还尝试使用 df apply 与 lambda 和 str split 来产生等效的结果 使用 timeit 时 我发现 df apply 的
  • Qcut Pandas:ValueError:Bin 边缘必须是唯一的

    我使用 Pandas 中的 Qcut 将数据离散化为大小相等的存储桶 我想要有价格桶 这是我的数据框 productId sell prix categ popularity 11997 16758760 0 28 75 50 524137
  • 使用 statsmodels.formula.api 中的 ols - 如何删除常数项?

    我正在遵循第一个例子statsmodels教程 http statsmodels sourceforge net devel http statsmodels sourceforge net devel 如何指定在 ols 中不使用常数项进
  • Heroku 带宽和空间

    Heroku 对于免费应用程序支持多少流量带宽和磁盘空间 Heroku 免费版有一个 5 MB 的数据库和 1 个 dyno dyno 是运行并响应请求的应用程序的实例 此外 您的 slug 的大小有 100 MB 的限制 这包括您使用的所
  • Python 中的十进制到二进制半精度 IEEE 754

    我只能使用以下命令将十进制转换为二进制单精度 IEEE754struct pack模块 或者使用相反的方法 float16 或 float32 numpy frombuffer 是否可以使用 Numpy 将十进制转换为二进制半精度浮点数 我
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • 如何限制scrapy请求对象?

    所以我有一个蜘蛛 我认为它正在泄漏内存 结果当我检查 telnet 控制台 gt gt gt prefs 时 它只是从链接丰富的页面中抓取了太多链接 有时它会超过 100 000 个 现在我已经一遍又一遍地浏览文档和谷歌 但我找不到一种方法
  • Scrapy 抓取并跟踪 href 中的链接

    我对 scrapy 很陌生 我需要从 url 的主页跟踪 href 到多个深度 再次在 href 链接内我有多个 href 我需要遵循这些href 直到到达我想要抓取的页面 我的页面的示例 html 是 初始页 div class page

随机推荐