1

我的问题/问题

我们正在开发一个托管在 github 上的开源项目。该项目是用 Django 编写的,因此我们在 settings.py 文件中进行了设置。我们将其开源不是因为订阅太便宜,而是因为我们故意希望它是开源的。

无论如何,我们也想自己运行这段代码,所以我们有一个 site_settings.py ,其中包含所有敏感数据,如 db 密码等。由于我们不希望在 github 上让所有人看到,所以它在 .gitignore 文件中.

通常我们克隆 repo 并在本地和服务器上添加这个文件,这样我们都有我们的个人设置,敏感数据不会存储在 git 上。

问题是我们现在想在 Heroku 上运行我们的代码,它不支持在服务器上创建文件,因为 heroku 不像普通服务器那样工作(它与分布式文件系统一起工作)。

当然我自己也考虑过,但我不确定这是否是正确的方法。请记住,我对 Heroku 和 Git 都是新手。以下是我目前的解决方案:

我目前关于如何解决这个问题的想法

遥控器有两种:

  • 起源 == Github
  • heroku == Heroku

撇开所有的开发和特性分支,我们只需要担心两个主分支(在 Heroku 和 Github 上)。

我的想法是在本地设置这样的分支机构:

  • 主 -> 遥控器/原点/主
  • heroku -> 遥控器/heroku/master

在主分支上,我们将 site_settings.py 放在 .gitignore 中,因此 git 在提交到 Github 时会忽略它,所有开发分支等也是如此。我们在主分支中收集所有更改,直到我们有新版本。

在 heroku 分支上,我们编辑了 .gitignore 文件以停止忽略 site_settings.py,因此一旦我们推送到 heroku 分支,它将被提交给 Heroku。

一旦我们有了新版本,我们切换到 heroku 分支并将 master 合并到 heroku 中,如下所示:

git checkout heroku
git pull
git merge master

一旦我们从合并中解决了合并冲突,我们就提交给 Heroku,我们有一个新版本启动并运行.. =D

我的问题

我的想法是否可以解决这个问题(它甚至可以像这样与 .gitignore 一起使用吗?)如果不是,我们如何以最干净/最好的方式解决这个问题?如果您需要更多信息,请随时询问:)

4

2 回答 2

1

对于初学者来说,将配置存储在文件中是错误的做法,所以不要这样做。

12factor 应用程序

应用程序的配置是可能在部署(登台、生产、开发人员环境等)之间发生变化的所有内容。这包括:

  • 数据库、Memcached 和其他支持服务的资源句柄
  • 外部服务的凭证,例如 Amazon S3 或 Twitter
  • 每个部署的值,例如部署的规范主机名

应用程序有时会将配置存储为代码中的常量。这违反了十二因素,要求严格分离配置与代码。配置因部署而异,但代码没有。

一个应用程序是否正确地从代码中提取所有配置的试金石是代码库是否可以在任何时候开源,而不会损害任何凭据。

请注意,“config”的这个定义不包括内部应用程序配置,例如 Rails 中的 config/routes.rb,或者 Spring 中代码模块的连接方式。这种类型的配置在部署之间没有变化,因此最好在代码中完成。

另一种配置方法是使用未检入修订控制的配置文件,例如 Rails 中的 config/database.yml。与使用检入代码仓库的常量相比,这是一个巨大的改进,但仍然存在弱点:很容易错误地将配置文件检入到代码仓库中;配置文件倾向于分散在不同的地方和不同的格式,使得在一个地方查看和管理所有配置变得困难。此外,这些格式往往是特定于语言或框架的。

十二因素应用程序将配置存储在环境变量中(通常缩写为 env vars 或 env)。环境变量很容易在部署之间更改,而无需更改任何代码;与配置文件不同,它们被意外签入代码仓库的可能性很小;与自定义配置文件或其他配置机制(如 Java 系统属性)不同,它们是与语言和操作系统无关的标准。

配置管理的另一个方面是分组。有时应用程序将配置批处理到以特定部署命名的命名组(通常称为“环境”)中,例如 Rails 中的开发、测试和生产环境。这种方法不能干净地扩展:随着应用程序的更多部署被创建,新的环境名称是必要的,例如 staging 或 qa。随着项目的进一步发展,开发人员可能会添加自己的特殊环境,例如 joes-staging,从而导致配置组合爆炸,这使得管理应用程序的部署变得非常脆弱。

在十二因素应用程序中,环境变量是精细控件,每个控件都与其他环境变量完全正交。它们从不组合为“环境”,而是为每个部署独立管理。这是一个随着应用程序在其生命周期内自然扩展到更多部署而平滑扩展的模型。

对于 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

于 2012-04-03T13:33:51.057 回答
0

我不会在 Heroku 上开发基于 git 的复杂设置文件和变量部署,而是将环境变量用于所有敏感内容。这样您就不必将它们保存在代码中。有关信息,请参阅数据库文档环境变量文档- 将所有这些内容放在那里,然后通过os.getenv() python 文档访问。

要查看应用程序的环境变量,请使用 heroku cli 工具:

 heroku run env

将打印出所有变量。要添加新变量(例如 S3 密钥等),请使用:

heroku config:add VAR_NAME=value
于 2012-04-03T13:30:23.940 回答