起源
上次部署项目已经是2年前的事了。
现在项目需要部署,非专业运维,又踩了不少坑,所以记录下来,避免再踩同样的坑。
环境
项目部署在VPS是Linode日本节点,系统选的是CentOS 7。
部署工具使用的是mina
模板来自
但是针对部署的环境是Ubuntu,所以 fork 针对 CentOS7 做了调整
项目环境
- 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)
开始部署
由于是时候做的记录,可能会有遗漏,欢迎各位提出,我想办法补充。
新增用户
新增一个用户,专门用于部署
# 登录VPSssh root@domain.comadduser deployergpasswd -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.gitcp -R mina-recipes/deploy* path/to/rails/config复制代码
2、调整项目配置
修改config/deploy.rb:
- domain
- app_name
- repository
- branch 以适用于自己的项目
3、构建部署环境
mina setupmina provision:essentials # 基础库安装# mina provision:imagemagick # 本API服务不需要图片处理mina provision:nginx # 安装、配置nginx。# mina provision:nodejs # 本API服务不需要JS预编译 mina provision:postgresql # 安装、配置 postgresqlmina provision:redis # 本API服务暂不需要Redis做缓存mina provision:rbenv # 安装rbenv用于安装、配置rubymina puma:config # puma配置复制代码
注意:
- 注释掉的
# mina provision:imagemagick
等因为本项目不需要,所以代码未修改,如果有需要请自行调整。 - nginx:由于CentOS 版本并不支持
/etc/nginx/site-enabled
目录引用,所以需要自行修改/etc/nginx.conf
配置,再重新启动 nginx 服务sudo systemctl restart nginx
,以后有时间再补上自动替换功能。
# /etc/nginx/nginx.confuser 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 identhost all all 127.0.0.1/32 md5#host all all ::1/128 identhost 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, 成功!!!