我们正在开发一个我们在github上托管的开源项目。该项目是用Django编写的,因此我们在settings.py文件中设置了这些项目。我们开源并不是因为我们对订阅来说太便宜了,而是因为我们故意希望它是开源的。
无论如何,我们也希望自己运行这个代码,所以我们有一个site_settings.py,其中包含所有敏感数据,如db密码等。因为我们不希望这个在github上供大家看,所以这是在.gitignore文件。
通常我们克隆repo并在本地和服务器上添加此文件,这样我们都有我们的个人设置,敏感数据不会存储在git上。
问题是我们现在想要在Heroku上运行我们的代码,它不支持在服务器上创建文件,因为heroku不像普通服务器那样工作(它适用于分布式文件系统)。
当然我自己已经考虑过了,但我不确定这是不是正确的做法。请记住,我是Heroku和Git的新手。以下是我目前的解决方案:
有两个遥控器:
省略了所有的开发和功能分支,我们只有两个主分支(在Heroku和Github上)担心。
我的想法是让分支机构在本地设置:
在master分支上我们将site_settings.py放在.gitignore中,所以git在提交给Github时会忽略它,所有dev分支都是如此等等。我们收集了master分支中的所有更改,直到我们有了新版本。
在heroku分支上,我们编辑了.gitignore文件以停止忽略site_settings.py,因此一旦我们推送到heroku分支,它将被提交给Heroku。
一旦我们有了新版本,我们就会切换到heroku分支并将master合并到heroku中,如下所示:
git checkout heroku
git pull
git merge master
一旦我们从合并中整理出合并冲突,我们就会提交Heroku,我们有一个新版本并且正在运行.. = D
解决这个问题我的想法是否可以接受(它甚至可以像这样使用.gitignore吗?)如果不是,我们如何以最干净/最好的方式解决这个问题?如果您需要更多信息,请不要犹豫:)
答案 0 :(得分:1)
对于初学者来说,将配置存储在文件中是错误的方法,所以不要这样做。
来自12factor app:
应用程序的配置是部署之间可能不同的所有内容 (分期,制作,开发者环境等)。这包括:
- 数据库,Memcached和其他支持的资源句柄 服务
- 外部服务的凭据,例如Amazon S3或Twitter
- 按部署值,例如部署的规范主机名
应用程序 有时将配置存储为代码中的常量。这是违规行为 十二因素,需要严格分离配置 码。配置在部署之间差异很大,代码没有。
对应用程序是否正确分析了所有配置的试金石 代码是代码库是否可以在任何时候开源 那一刻,没有妥协任何凭据。
请注意,“config”的此定义不包含internal 应用程序配置,例如Rails中的config / routes.rb,或者代码如何 模块在Spring中连接。这种配置不会改变 在部署之间,最好在代码中完成。
配置的另一种方法是使用不是的配置文件 检查到版本控制,例如Rails中的config / database.yml。 与使用常量检查相比,这是一个巨大的进步 代码回购,但仍有缺点:很容易误检查 在配置文件中到repo;配置文件有倾向 分散在不同的地方和不同的格式,制作 很难在一个地方看到和管理所有配置。而且,这些 格式往往是语言或框架特定的。
十二因素应用程序将配置存储在环境变量中(通常 缩写为env vars或env)。环境变量之间很容易改变 部署而不改变任何代码;与配置文件不同,有 他们偶然检查代码回购的可能性很小; 与自定义配置文件或其他配置机制不同 Java系统属性,它们是与语言和操作系统无关的标准。
配置管理的另一个方面是分组。有时应用批量 配置命名为命名组(通常称为“环境”) 特定部署,例如开发,测试和生产 Rails中的环境。这种方法不能干净地扩展:更多 创建应用程序的部署,新的环境名称是必要的, 如分期或qa。随着项目的进一步发展,开发人员可以 添加自己的特殊环境,如joes-staging,从而产生一个 配置的组合爆炸,这使得管理部署 应用非常脆弱。
在十二因子应用中,env vars是粒度控件,每个都是完全控制的 与其他env vars正交。它们永远不会组合在一起 “环境”,而是针对每个部署进行独立管理。 随着应用程序自然扩展,这是一个可以平滑扩展的模型 在其生命周期中进行更多部署。
对于Python,您的配置可以在os.environ
中找到。对于特定的配置,特别是您希望使用的数据库:
import os
import sys
import urlparse
# Register database schemes in URLs.
urlparse.uses_netloc.append('postgres')
urlparse.uses_netloc.append('mysql')
try:
# Check to make sure DATABASES is set in settings.py file.
# If not default to {}
if 'DATABASES' not in locals():
DATABASES = {}
if 'DATABASE_URL' in os.environ:
url = urlparse.urlparse(os.environ['DATABASE_URL'])
# Ensure default database exists.
DATABASES['default'] = DATABASES.get('default', {})
# Update with environment configuration.
DATABASES['default'].update({
'NAME': url.path[1:],
'USER': url.username,
'PASSWORD': url.password,
'HOST': url.hostname,
'PORT': url.port,
})
if url.scheme == 'postgres':
DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'
if url.scheme == 'mysql':
DATABASES['default']['ENGINE'] = 'django.db.backends.mysql'
except Exception:
print 'Unexpected error:', sys.exc_info()
有关配置变量的详细信息,请参阅此处:https://devcenter.heroku.com/articles/config-vars
答案 1 :(得分:0)
我没有在Heroku上开发复杂的基于git的设置文件和变量部署,而是将环境变量用于所有敏感内容。这样你就不必将它们保存在代码中。有关信息,请参阅database docs和environment variables docs - 将所有内容放入其中,然后通过os.getenv()
python docs进行访问。
使用heroku cli工具查看应用的环境变量:
heroku run env
将打印出所有变量。要添加新变量(例如S3键等),请使用:
heroku config:add VAR_NAME=value