轻松部署 Laravel 应用 | 《13. 更新与回滚》

:clap: 本系列持续更新中,欢迎关注:https://github.com/wi1dcard/laravel-deploy...

由于课程上下文关联比较紧密,在开始前请先阅读 本文

你的支持是我写作的动力;关注我的客官们,请在右上角点个赞,将会让文章在首页展示,帮助更多人。

感谢 :clap: !

在之前的小节中,我们使用 Git + HTTPS 协议将代码部署服务器上;但每次都输入密码既不方便,也不利于后续开展部署自动化。更加普遍的做法是使用 SSH 协议,并将服务器的公钥配置到 GitHub(或其它托管平台)仓库的部署公钥内。相比普通个人公钥,部署公钥通常不具备推送权限(只读),因此更加安全可靠。

提示:关于更多部署密钥的介绍,可查阅 GitHub 文档

Git 部署公钥

首先登录到服务器,执行以下命令:

$ ssh-keygen -t rsa -C "wi1dcard.cn@gmail.com"

没错,这正是上一小节中所提到的生成密钥对命令,请将 wi1dcard.cn@gmail.com 替换为自己的邮箱地址。整体流程基本一致,此处不再赘述。

接着,使用以下命令输出公钥:

$ cat ~/.ssh/id_rsa.pub

输出类似:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDpTg16xxOTKZ5XruajPtMhwLE+GFk+Kei1xFPJ65rRItXWgDxUEYE4WM81BnVhryjyJ2YtnvaYhqnxnBIqTuRxjg33dLLShizcx9UNhpZyiA6cHchqEyzWPvkpQzTOh7h4cP730XB2hKUkxkYwt0kjhHbsqRu+FAq81k/YTqDF2V+wuxQaIijO7sf4kPrazH7VJQuOvvMkcUKHzGGse/0V65nNzGi5R7BkIH5FANz9aYrL4tU0wtdHUDLnQ9Q9/nWYYFFl7NdC2oUrtNGKTb0gWe/rv1spSx8072kehKJtD2DJghP23yuBDUgxQL2F9aTDlac45MzJ3aueImPOxGYF wi1dcard.cn@gmail.com

复制这段公钥文本备用。

以 GitHub 为例,在浏览器内打开仓库主页,选择右侧的 Settings 标签页;点击左侧的侧边栏中的 Deploy keys,接着点击右上角的 Add deploy key 按钮:

提示:其它 Git 托管平台操作类似,可搜索类似 GitLab deploy keys 等关键词查找对应文档。

在 Title 内给公钥起个名字;在 Key 中粘贴刚刚复制的公钥文本,例如:

注意:除非必要,页面下方 Allow write access 复选框请勿选中,否则该密钥将具备推送权限。另外,密钥保存后无法修改,如需变更只能重新创建,因此务必确保命名规范、公钥无误。

随后,点击 Add key 按钮即可添加成功,如图:

再次回到仓库主页,复制 SSH 协议的 Git 仓库地址备用:

更新与回滚

由于完全基于 Git 部署,因此我们可以「站在巨人的肩膀上」—— 借用 Git 的 reset 功能实现更新、回滚到任意提交。

首先,在服务器中执行以下命令,将文件所有者设置为我们手动创建的新用户:

$ su root -c 'chown -R deployer /var/www/deployment'

将远端的 HTTPS 协议地址修改为 SSH 协议地址:

$ cd /var/www/deployment
$ git remote set-url origin 'git@github.com:wi1dcard/hello-deployment.git'

其中,git@github.com:wi1dcard/hello-deployment.git 请替换为刚刚复制的仓库地址。

接下来,使用 git fetch 命令获取远端状态(但不拉取到本地):

$ git fetch -t -v

其中,-t 代表除提交历史外,同时获取标签(Tags);-v 代表开启 Verbose Mode,直译为「啰嗦模式」,通常表示输出更多详细信息。

提示:-v 选项不仅可用于 git fetch;在其它 Git 操作、甚至许多 Unix 命令中,都用于表示开启啰嗦模式。

稍等片刻,你可能会看到这样的输出:

The authenticity of host 'github.com (13.250.177.223)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?

还记得第一次登录服务器时的提示吗?与此处的询问相同,输入 yes 即可。

如果服务器上的 Git 仓库与 GitHub 上的仓库不存在差异,那么输出将会类似:

From github.com:wi1dcard/hello-deployment
 = [up to date]      master     -> origin/master

如果 GitHub 上存在更新的提交,那么输出将会类似:

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:wi1dcard/hello-deployment
   602fa83..9a69730  master     -> origin/master

此时,本地已经得到了远端的提交历史信息;尽情使用 git reset 命令随意更新或回滚吧。

例如:

  • 穿越到远端 master 分支的倒数第一次提交(即最新提交),通常用于更新至最新代码。

    $ git reset --hard origin/master
  • 穿越到远端 master 分支倒数第三次提交,通常用于回滚一部分错误提交。

    $ git reset --hard origin/master~2
  • 穿越到 ID 为 602fa83 的提交,通常用于回滚到特定版本。

    $ git reset --hard 602fa83
  • 同理,亦可回滚至任意本地分支、标签、HEAD 等...

注意:origin/master~2 实际上是表示 origin/master 的首个父提交的首个父提交,多数情况下可理解为倒数第三次提交,但这两个概念并不相等。有兴趣请阅读 Git 相关书籍,此处不再展开。

最后,由于国内网络环境的特殊性,执行以上 Git 命令可能稍有卡顿,若项目较大则更加明显,可尝试 Gitee 等国内平台,虽然功能不如 GitLab 强大,生态不如 GitHub 完善,但至少... 速度飞快。

我感谢自己平凡,敢爱敢恨没负担。
我感谢自己不凡,可爱可恨都包揽。

本帖由系统于 3个月前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 10

你这个部署好像有问题 每次都要在服务器执行su root -c 'chown -R deployer /var/www/deployment' 赋予权限.不然访问项目会报错.这个步骤需要输入root.用户的密码,这样的话 使用envoy自动部署的时候,没法输入密码,就会报错呀.

4个月前 评论

@Flourishing 你是说使用 Envoy 执行 git pull 吗?

4个月前 评论

@Flourishing 建议你看一下第 14 篇的注意事项;关于 Envoy 的问题,请等待后续小节。

4个月前 评论

@Wi1dcard 就是用deployer用户拉取代码后,然后项目会报错.没有权限,我是尝试用你的这系列课程跟着一步步操作,然后使用envoy部署的时候,发现脱离了root用户后,会出现很多奇奇怪怪的权限问题.希望你后面能拿一个稍微完整点的Laravel项目部署一下,看看哪里没有说明清楚吧......

4个月前 评论

@Flourishing 课程似乎还没有讲到使用 Envoy 部署吧... 自己的尝试出现报错,就需要自己进行解决。另外,我不明白你说的完整的 Laravel 项目是指的何种意义上的「完整」?使用官方的示例项目有什么「不完整」?或者你有什么项目推荐?

4个月前 评论

@Wi1dcard 就是加一些前端的工作流,然后在项目中加一点数据库的操作,看一下脱离了root用户后,数据库操作会不会出现权限问题等......我的意思是这个.

4个月前 评论

@Flourishing 数据库操作与系统 root 用户无关,这一点可以肯定。关于前端工作流,我对这方面不太熟悉(长时间处于前后端分离的工作状态,前端代码直接部署在独立的对象存储内)所以暂时没有深究,如果你对这方面比较有经验的话,可以提交 PR 或给出一些最佳实践。

另外,我刚刚重新梳理了一下整个课程「权限」相关的思路,对一部分内容作出了修改,你可以看一下:

https://github.com/wi1dcard/laravel-deploy...

注意看一下提交信息,如果已经按照之前的步骤操作,你可以执行以下命令来确保与现有教程一致:

$ su -c 'usermod -g www-data deployer'
$ cd /var/www/deployment
$ php artisan optimize:clear
$ chmod -R 750 .
$ chmod -R 770 storage bootstrap/cache

执行完成后你再试试看 Envoy,或许有可能直接解决。

4个月前 评论

请问在 将远端的 HTTPS 协议地址修改为 SSH 协议地址 这个步骤之后就可以了么?

还是必须要做 git reset 回滚啊?

我是在更改了协议地址后,直接 git pull 更新的。

3个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
未填写
文章
55
粉丝
393
喜欢
934
收藏
698
排名:27
访问:9.14 万+
私信
所有博文