背景: 在读一些英文教程的时候时不时被安利 heroku 这个部署环境,于是在自己团队的项目也用上了,有人说很贵,用下来没感觉很贵,更致命的问题是慢,比如一些支付场景,api 需要绕地球 2 圈才能回到用户终端,结果就是调起支付需要等待 5 秒甚至 10 秒。
在用户多次反馈后,终于下定决心搬回国内。于是在国内找 heroku 代替品。BAE,SAE 各种 AE 都很鸡肋,XXPaSS 也找了几个,很不给力。在国内还是只能买到 IaSS,于是上社区找部署文章,大部分是手动安装 rbenv,rvm 什么的。太麻烦了,能不能有点自动化的?最好还能 git 部署。
经过搜索发现了 Dokku,一个基于容器的最小 PaSS 实现。
按照官方文档使用 bootstrap 脚本安装,发现走不下去,看错误信息是 GFVV 惹的祸。于是使用 apt 方式安装,安装完 docker 之后修改镜像,貌似国内有 daocloud 提供。
安装 docker wget -nv -O - https://get.docker.com/ | sh
修改 docker 配置 vim /etc/default/docker
DOCKER_OPTS="--registry-mirror=http://xxxxxxxx.m.daocloud.io"
安装 dokku
wget -nv -O - https://packagecloud.io/gpg.key | apt-key add -
export SOURCE="https://packagecloud.io/dokku/dokku/ubuntu/"
echo "deb $SOURCE trusty main" | tee /etc/apt/sources.list.d/dokku.list
apt-get update
apt-get install dokku
dokku plugin:install-dependencies --core
安装完成后会启动一个 http-server 提供 web 方式的配置,浏览器输入服务器 ip 打开页面,输入公钥和域名就 OK。
服务端使用除了全局命令外大部分需要指定 app 的名字才能运行。所以推荐使用客户端的方式。
把脚本扔到 PATH 改名为 dokku,另外在设置公钥的时候需要客户端的公钥哦。
在服务端创建好一个 app,在客户端设置好 git romote 后就可以部署了。
服务端 dokku apps:create demo
客户端 git remote add dokku [email protected]:demo
部署 git push dokku master
dokku 使用的是 heroku 的 buildpack,因为 GFVV 的问题,安装 runtime 的时候总是出现超时。我的解决方案是 fork 一个 buildpack,然后修改其中的 url 为环境变量,再把环境变量设置为七牛的 bucket。
有 postgresql 的插件,应该也有 mysql,mongodb,redis 之类的。
创建数据库 dokku postgres:create demo-db
连接到 app dokku postgres:link demo-db
link 会在 app 设置 DATABASE_URL,所以 database.yml 里需要使用 url 的方式配置。
heroku 有 maintenance mode,搜了一下 dokku 也有插件。
maintenance:on | off
有 letsencrypt 的插件,使用超级很方便。
dokku config:set --no-restart [email protected]
dokku letsencrypt
环境变量 dokku config
example : dokku config:set APP_ID=xxxxxxxx
运行 dokku run
example:
dokku run rails c
dokku run rake db:migrate
如果你还在纠结到底使用 rvm 还是 rbenv,还在手动配置 nginx,不妨来试试这种部署方式,只需要在 Gemfile 中指定 ruby 版本,剩下的一切都交给工具。这才是正确的部署姿势。
dokku 目前的优势是多 app 部署非常方便,像我们团队同时在弄几个小的项目,创建一个 app,部署完成,就能通过子域名来访问应用。
dokku 的限制:
暂无集群支持计划。
升级 dokku 需要停止所有 app
dokku 适用场合: