Linode CentOS 7 使用 Mina 部署 Rails API 项目 Postgresql 9.6 + Nginx + Puma + Rbenv

490 阅读3分钟

起源

上次部署项目已经是2年前的事了。

现在项目需要部署,非专业运维,又踩了不少坑,所以记录下来,避免再踩同样的坑。

环境

项目部署在VPS是Linode日本节点,系统选的是CentOS 7。

Linode VPS最低美元5美元/月,即35元/月,了解一下?

部署工具使用的是mina

模板来自 codyeatworld/mina-recipes

但是针对部署的环境是Ubuntu,所以 fork 针对 CentOS7 做了调整 destinyd/mina-recipes

项目环境

  1. Ruby (2.4.4) -- 2.5 rails还遇到很多坑,所以还是先用2.4.4
  2. Postgresql (9.6)
  3. Nginx
  4. Gems
    1. Rails (5.2.0)
    2. pg (1.0.0)
    3. Puma (3.11.4)

开始部署

由于是时候做的记录,可能会有遗漏,欢迎各位提出,我想办法补充。

新增用户

新增一个用户,专门用于部署

# 登录VPS
ssh root@domain.com
adduser deployer
gpasswd -a deployer wheel # 添加到sudo租
passwd deployer # 设置密码
echo "deployer ALL = (ALL) NOPASSWD: ALL" >> /etc/sudoers

# 退出
exit

# 将public key 拷贝到VPS,不需要再手动输入密码登录
ssh-copy-id deployer@domain.com

关闭SELinux

这是一个大坑,在VPS关掉之后可以减少很多麻烦,以后再单独研究。

可以先临时关闭,并修改配置,之后重启就完全关闭了

临时关闭:

setenforce 0

永久关闭:

vi /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled,设置后需要重启才能生效

使用mina部署

1、将mina模板copy到项目

git clone https://github.com/destinyd/mina-recipes.git
cp -R mina-recipes/deploy* path/to/rails/config

2、调整项目配置

修改config/deploy.rb

  • domain
  • app_name
  • repository
  • branch 以适用于自己的项目

3、构建部署环境

mina setup
mina provision:essentials       # 基础库安装
# mina provision:imagemagick    # 本API服务不需要图片处理
mina provision:nginx            # 安装、配置nginx。
# mina provision:nodejs         # 本API服务不需要JS预编译 
mina provision:postgresql       # 安装、配置 postgresql
mina provision:redis            # 本API服务暂不需要Redis做缓存
mina provision:rbenv            # 安装rbenv用于安装、配置ruby
mina puma:config                # puma配置

注意:

  1. 注释掉的 # mina provision:imagemagick 等因为本项目不需要,所以代码未修改,如果有需要请自行调整。
  2. nginx:由于CentOS 版本并不支持/etc/nginx/site-enabled 目录引用,所以需要自行修改 /etc/nginx.conf 配置,再重新启动 nginx 服务sudo systemctl restart nginx,以后有时间再补上自动替换功能。
# /etc/nginx/nginx.conf
user deployer;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
  1. nginx:由于之前踩坑,所以 nginx 用户改为 deployer 。如果跑着有什么不对劲,可以先尝试将用户修改为 deployer,看看能不能成功
  2. postgresql:密码验证需要手动修改postgresql配置 /var/lib/pgsql/9.6/data/pg_hba.confident 改为 md5
#host    all             all             127.0.0.1/32            ident
host    all             all             127.0.0.1/32            md5
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5

4、微调

直接部署会报发布环境 secret_key_base 未设置错误,需要设置 ENV['SECRET_KEY_BASE'] 或者通过 rails credentials:edit 调整 secret_key_base

由于原理还部署很清楚,所以使用了一个笨办法:在 config/deploy.rb 中修改 set :bundle_bin, "SECRET_KEY_BASE=test ~/.rbenv/shims/bundle" 。至于这个值,可以在命令行,执行 rake secret 生成。

5、项目部署

执行

mina deploy

耐心等待完成后,尝试访问http://domain.com, 成功!!!

参考文章

CentOS7关闭SELinux