0. 引言
本文详细介绍在 Ubuntu 系统上用 Docker 快速部署 Rails 生产环境的步骤,主要流程就是:安装 Nginx,安装 Docker 和 Docker Compose,下载项目代码,下载 docker image 和 gem 依赖包,前端编译,配置 Nginx,启动项目和 Nginx 完成发布。本文将会跳过环境准备部分,比如操作系统的安装配置,包括 git,Nginx 和 Docker 的安装等,直接从下载代码开始。
1. 下载代码库和依赖
首先当然是 git pull
把项目拉下来,至于 gem 依赖的话就看 image 是怎么做的了。笔者的 gem 是放在本地的,也就是说 image 是不包含 gem 包的,所以在部署的时候需要在服务器重新安装:
$ docker-compose run --rm web gem install bundler
$ docker-compose run --rm web bundle install
代码拉下来之后,通常需要创建数据库文件:
$ cp config/database.yml.example config/database.yml
关于生产数据库的信息如何保存也见仁见智了,笔者的做法是在服务器创建 docker-compose.override.yml
文件,并将敏感信息作为环境变量保存其中。与此同时,在该文件中为 web service 添加环境变量:RAILS_ENV=production
。
然后再是将 master.key 上传到生产服务器。
2. 前端编译
$ docker-compose run --rm web rails assets:precompile
3. 配置 Nginx
vi /etc/nginx/sites-available/[project-name]
server {
listen 80 default_server;
server_name _;
root /var/www/[project-name]/public;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:[port];
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ ^/(assets|packs)/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
access_log /var/log/nginx/[project-name].access.log;
error_log /var/log/nginx/[project-name].error.log;
}
cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/[project-name] [project-name]
4. 启动项目和 Nginx
$ cd /var/www/[project-name]
$ docker-compose up -d
$ docker-compose exec web rails db:prepare
$ systemctl restart nginx