我试图容纳一个前端Web应用程序,我有麻烦弄清楚如何传递环境变量.该应用程序是一个Angular应用程序,因此它是100%客户端.
在典型的后端服务中,传递环境变量很容易,因为一切都在同一主机上运行,因此后端服务可以轻松选择环境变量.但是,在前端应用程序中,这是不同的:应用程序在客户端的浏览器中运行.
我想通过环境变量配置我的应用程序,因为这使部署更容易.所有配置都可以完成,docker-compose.yml无需维护多个映像,每个映像都适用于所有可能的环境.只有一个不可变的图像.这遵循12因素应用原则,可以在https://12factor.net/config上找到.
我正在构建我的应用程序映像如下:
FROM node:alpine as builder
COPY package.json ./
RUN npm i && mkdir /app && cp -R ./node_modules ./app
WORKDIR /app
COPY . .
RUN $(npm bin)/ng build
FROM nginx:alpine
COPY nginx/default.conf /etc/nginx/conf.d/
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud)
在app/config.ts,我有:
export const config = {
REST_API_URL: 'http://default-url-to-my-backend-rest-api'
};
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想在我的网站上做这样的事情docker-compose.yml:
backend:
image: ...
frontend:
image: my-frontend-app
environment:
- REST_API_URL=http://backend:8080/api
Run Code Online (Sandbox Code Playgroud)
所以我相信我应该改变它app/config.ts来替换REST_API_URL …
我很高兴在Heroku上使用Rails,就像我可以调整Heroku应用程序的配置属性而无需提交更改xyz.yml和重新部署.
在我的Rails应用程序中完全取消Yaml配置文件会很好,并尽可能地依赖于在ENV中存储配置.这与12因素配置原则一致.
但是,从基于Yaml的配置管理切换到基于Heroku/12因子的配置管理有一些权衡.
希望听到那些在私有应用程序中使用过12因子样式配置的人,以及他们如何在许多部署中管理大量配置变量.
谢谢!
通过阅读12factor中的以下帖子,我想出了一个问题,我想检查一下你们如何处理这个问题.
基本上,应用程序应直接写入stdout/stderr.反正将这些流直接重定向到流畅(不绑定到rsyslog/syslog)?随着我越来越清楚流利,我相信它将成为来自多个应用/平台的日志聚合的绝佳工具.
这样做的主要原因是,如果应用程序是跨平台的,则rsyslog/syslog可能不可用,并且据我所知,使用日志框架(需要使用它们所需的配置)将违反12factor.
谢谢!
这是否包括SSL证书和密钥文件,它们可以是"大"(至少是kb的倍数),并且(取决于格式)通常包含不可打印的字符(至少是换行符).
或者预期环境只是指向证书/密钥文件名?(例如,当尝试通过Docker进行部署时,这似乎可能不太理想 - 我们真的不想在Docker镜像中存储私钥,对吗?但是,这可能是一个单独的问题.)
我们的团队目前正在使用Consul探索Symfony2应用程序的服务发现概念.处于相对边界,讨论的方式很少.到目前为止,我们已经发现:
目前的想法是探索利用Consul观察者重新触发缓存构建以及外部参数.也就是说,如果服务半频繁地改变,那么对这种操作的开销存在一些担忧.
基于上述内容以及Consul/Symfony内部的知识,这是一种可行的方法吗?如果没有,为什么,有什么替代品?
service-discovery symfony 12factor consul runtime-configuration
我主要将应用程序构建为 12 因素应用程序,现在正在研究配置部分。
目前,我有单独的用于开发和生产的配置文件,通过构建过程,我们可以构建开发或生产映像。代码100%相同;唯一改变的是配置。
现在我 100% 明白,在 12 因素应用程序中,配置应该来自外部源,例如:环境变量,或者可能是保险库等安全存储。
因此,各种文章和博客都没有提到配置是如何存储/处理配置的。如果代码单独存放在自己的 Git 存储库中,并且没有存储任何配置,那么我们如何处理配置呢?
我们是否将实际的配置值存储在单独的 Git 存储库中,然后通过使用某种触发器的构建过程以某种方式在目标环境(Kubernetes 配置映射、marathon JSON 配置、Vault 等)上合并/推送/执行这些配置值?
我打算遵循"The Twelve-Factor App"方法在Heroku上构建我的Django应用程序.
我正在关注"Heroku上的Django入门"快速入门指南.目前我有以下目录结构:
~/Projects/
hellodjango_rep/
.env (empty)
.git
.gitignore
Procfile
requirements.txt
hellodjango/
manage.py
hellodjango/
__init__.py
settings/
urls.py
wsgi.py
Run Code Online (Sandbox Code Playgroud)
我安装了django-toolbelt,创建了我的简单Django应用程序,在我的Procfile中启动了这个过程...一切似乎工作正常,但是当我为Heroku环境配置应用程序并添加时问题就开始了:
import dj_database_url
DATABASES['default'] = dj_database_url.config()
Run Code Online (Sandbox Code Playgroud)
到我的settings.py文件的底部.
我将应用程序的存储库推送到Heroku,$ heroku open成功访问了我的浏览器中的应用程序,但是本地:dj_database_url.config() 返回了一个空字典.
OS X 10.8.4
pip == 1.4.1
virtualenv == 1.10.1
virtualenvwrapper == 4.1.1
wsgiref == 0.1.2
Postgres.app在5432端口上运行
环境变量:
mac-pol:hellodjango_rep oubiga$ python
>>> import os
>>> os.environ
{
'PROJECT_HOME': '/Users/oubiga/Projects'...
'PATH': '/usr/local/heroku/bin:/usr/local/share/python:/usr/local/bin:/Applications/Postgres.app/Contents/MacOS/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin'...
'HOME': '/Users/oubiga'...
'WORKON_HOME': '/Users/oubiga/Envs'...
'VIRTUALENVWRAPPER_HOOK_DIR': '/Users/oubiga/Envs'...
'PWD': '/Users/oubiga/Projects/hellodjango_rep'
}
Run Code Online (Sandbox Code Playgroud)
Django == 1.5.2 …
我正在阅读12因素应用宣言http://12factor.net/.宣言建议在Enviornment变量中存储应用程序的配置数据.这是否意味着像DB用户名/密码,资源URL这样的属性应该存储为Java Env变量的一部分而不是属性文件?这是一种存储信息的安全方式吗?对我来说,这似乎是存储信息的一种非常笨重的方式.是否有可以共享的最佳实践/经验?
我能想到的一个选项是在横向上运行单独的配置服务,并使用Env属性连接到配置服务,然后查询配置服务以获取更详细的配置数据.
我的问题涉及12因素应用宣言的第一个因素:代码库.(见http://12factor.net/codebase).
TL; DR:
这个因素表明代码库和部署之间存在一对一的关系,所以在这种情况下,你不应该为两个应用程序使用相同的代码库(存储库)
我的要求:我有一个网站Spring应用程序和一个批处理Spring应用程序共享一个公共代码,即域模型(JPA实体类).我需要能够分享这个共同的代码.而这两个应用程序需要使用的通用代码相同的版本在任何一个时间.
我目前的设置:我目前在github上有三个"顶级"存储库:
git subtree pull/push)git subtree pull/push)另请注意,域模型存储库单独存在(如上所述),但也嵌套在网站和批处理应用程序存储库中.我使用a git subtree pull/push来包含此域模型仓库作为目录和另外两个仓库中的gradle项目.原因是Heroku从repos构建代码本身.
所有这些都非常乏味且容易出错.
有人可以建议更好的解决方案吗?
这个问题非常开放,但是有没有资源讨论(一页)客户端Javascript应用程序的12 Factor方法?如果它考虑采用12 Factor方法来构建使用EmberJS的Web应用程序,那就更好了.