起源
上次部署项目已经是2年前的事了。
现在项目需要部署,非专业运维,又踩了不少坑,所以记录下来,避免再踩同样的坑。
环境
项目部署在VPS是Linode日本节点,系统选的是CentOS 7。
Linode VPS最低美元5美元/月,即35元/月,了解一下?
部署工具使用的是mina
模板来自 codyeatworld/mina-recipes
但是针对部署的环境是Ubuntu,所以 fork 针对 CentOS7 做了调整 destinyd/mina-recipes
项目环境
- Ruby (2.4.4) -- 2.5 rails还遇到很多坑,所以还是先用2.4.4
- Postgresql (9.6)
- Nginx
- Gems
- Rails (5.2.0)
- pg (1.0.0)
- 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配置
注意:
- 注释掉的
# mina provision:imagemagick等因为本项目不需要,所以代码未修改,如果有需要请自行调整。 - 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/*;
}
- nginx:由于之前踩坑,所以 nginx 用户改为 deployer 。如果跑着有什么不对劲,可以先尝试将用户修改为 deployer,看看能不能成功
- postgresql:密码验证需要手动修改
postgresql配置/var/lib/pgsql/9.6/data/pg_hba.conf将ident改为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, 成功!!!