轻松部署 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 完善,但至少... 速度飞快。

本作品采用《CC 协议》,转载必须注明作者和本文链接

Former WinForm and PHP Engineer. Now focus on #DevSecOps and global networking.

本帖由系统于 9个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 12

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

10个月前 评论

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

10个月前 评论

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

10个月前 评论

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

10个月前 评论

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

10个月前 评论

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

10个月前 评论

@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,或许有可能直接解决。

10个月前 评论

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

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

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

10个月前 评论

@Wi1dcard 您好,教程中一些图片无法显示

2个月前 评论

@Mengwei 我这边正常,请检查你的本地网络是否能正常访问 GitHub UserConetnt 域名 www.githubusercontent.com

2个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
未填写
文章
59
粉丝
496
喜欢
1114
收藏
872
排名:13
访问:15.2 万
私信
所有博文