使用 Laravel Envoy 进行项目部署

6e6105f2289088e26d4c862e51620646

在大型企业当中,往往会有各种各样的 CI & CD 工作流来完成项目的部署,而对于我自己的项目而言,我也希望能够有这样顺畅的交付体验,因此,我也为自己的业务加上了类似的方案,以实现顺滑的开发体验。

不过,我没有做的那么重,没有上 Ansible,也没有封装 Docker,就是标准的 LNMP 环境。只不过,我在标准的环境上加入了 Laravel Envoy — 一个快速部署工具

什么是 Laravel Envoy

Envoy 是 Laravel 团队开发的一个在远程服务器上执行某些命令的工具,因为他同样使用 Blade 语法,因此在 Laravel 项目中接入非常方便。

如何使用 Laravel Envoy

1. 安装 Laravel Envoy

Envoy 有多种使用方式,一种是跟随项目的使用方式,即使用 composer require laravel/envoy --dev 来安装,并使用 php vendor/bin/envoy 的方式来运作,这样的好处是你无需污染顶级目录,只在项目层面使用 Envoy 来进行部署。

不过我因为有很多项目,所以我会更加倾向于直接在全局安装 envoy,执行 composer global requre laravel/envoy 实现在全局安装 Enovy。全局安装完成后,当你需要执行命令,只需要执行 envoy run deploy,就能执行当前目录下所定义的命令。

除了全局安装,你也可以考虑使用 Bash alias 来实现类似的效果,将 envoy alias 给 php vendor/bin/envoy 就可以实现即使没有全局安装,也可以实现不需要手动输入前缀的特性。

2. 初始化配置文件

当你需要配置时,你要做的很简单,只需要执行 envoy init 服务器地址/昵称就可以获得一个 Envoy.blade.php 文件,你可以通过修改这个文件的内容,来实现定义不同的工作。同样的,你可以将这个文件纳入到版本控制系统当中,从而实现部署脚本的跟踪和定义,对于后续的持续维护比较有帮助。

因为 Envoy.blade.php 也是采用了 Blade 的后缀,所以也同样适用了 Blade 引擎,你可以通过一个语意更加友好的方式来定义你的脚本。

@servers(['web' => '127.0.0.1'])

@task('deploy')
    cd /path/to/site
    git pull origin master
@endtask
Code language: PHP (php)

比如,上面的脚本就是一个最基础的脚本,首先定义了这个脚本的命令会在名为 web 的服务器上执行,而这个服务器的地址是 127.0.0.1;并定义了一个任务 deploy。

3. 执行部署命令

当你完成代码的编写,并提交了 Git 之后。执行命令 envoy run deploy ,就会自动的在 web 这个服务器上执行在 deploy 当中执行的命令。

deploy 的命令只要是正常的 bash 命令即可。

高级用法

1. 引入其他任务

因为 Envoy 使用 Blade 语法来编写,你也可以使用 Blade 语法中的命令来引入其他文件的中的任务。因此,你可以将自己常用的命令定义出来,并将其通过 Packagist 发布出去,并在实际应用过程中,引入对应的文件来使用。

@import('vendor/package/Envoy.blade.php')
Code language: JavaScript (javascript)

2. 处理多个服务器

Envoy 支持定义多个服务器以及并行执行,对于架构相对复杂的业务,你可以定义不同的 servers ,并在对应的 task 当中来设定需要在哪些 Server 上执行。定义任务时,如果你传入了 parallel 参数,则可以控制命令同时在多个服务器上并行(该属性为 false 时则是串行(

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])
 
@task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true])
    cd /home/user/example.com
    git pull origin {{ $branch }}
    php artisan migrate --force
@endtask
Code language: PHP (php)

3. 定义变量或引入其他功能函数

你可以在 Envoy.blade.php 中加入 @setup 来完成变量的定义,并在后续的代码中使用。

@setup
    $now = new DateTime;
@endsetup
Code language: CSS (css)

也可以直接使用 @include 来引入文件

@include('vendor/autoload.php')
 
@task('restart-queues')
    # ...
@endtask
Code language: PHP (php)

4. 使用命令行参数

在启动时,如果你使用诸如 --param=value这样的参数来调用,则可以在你的代码中直接读取对应的变量,从而实现执行时带入不同的参数。

更多用法

Envoy 当中还有更多的用法,这里不再一一列举,如果你感兴趣,可以直接参考其官方文档,了解如何使用 Envoy 达成你的部署目标。

总结

在你不是很着急使用 Ansible 或 更重的部署工具的时候, Envoy 是一个不错的选择。特别是你使用 Laravel 进行开发时,Envoy 就是一个有效的工具。

什么样的业务用什么样的架构

man in black long sleeve shirt sitting on black chair

多年来,我一直是 PHP 的拥趸,不论中间我写过多少编程语言,但我始终觉得,PHP 能从 2000 年活到现在,是有其意义和价值的。

而到了现在,我终于可以回答这个价值和意义到底是什么 —— 什么样的业务,使用什么样的架构

作为技术创业者,我们最常遇见的问题,便是过度设计技术方案:我的项目是不是应该做个数据库主从备份?我的项目是不是应该做 Kuberentes 集群来处理弹性?

但实际上,对于绝大多数的业务而言,这些问题都是根本不重要的 —— 如果没有 Kubernetes,我们能否保证我们的业务的稳定性?如果没有主动备份,我们能否保障我们的业务可以平稳运转?

技术在绝大多数的业务中,都是一个成本中心,是一个保障业务正常运转的基石。他应该被重视,但不应该被过度重视。一个创业公司可能会因为业务不够稳定而失去用户,但绝不会因为业务非常稳定而留住用户。用户在乎的是你为用户解决了什么样的问题,而不是用了什么样的架构。

过度(提前)优化是万恶之源。

摊销的魅力

ea3765a81c7a26a7864efdcf7c81ef7b

今天在和 @bobo 聊天的时候,讨论起了摊销这个话题,我觉得很有价值,因此记录下来。

事情的前提是出于控制开支的目的,我在 2022 年为自己定下了 10000 元的数码设备采购预算,这个预算是考虑到我不需要在 2022 年更换手机( 2021 年刚换了 iPhone 13 ,我的预期是用到 2024 年),我不需要在 2022 年购买新的相机(我已经有了 6400、ZV1、G7X3,主要的几个需求都满足了,唯一希望买的是 GR3/GR3X,但不是特别急),唯一想要买的就是 采用了 M2 的 Macbook Air(32G 内存,512 GB ~ 1TB 的 硬盘),但我不确定新的 Macbook Air 能够在我的预算内解决,所以其实一直比较忐忑是否能买。

不过,今晚和bobo聊的时候,他提出了一个方案,或许可以解决我的问题 —— 摊销

虽然我今年给自己定的数码设备的预算是有可能无法满足我的采购诉求,但我可以借助于信用卡本身的 24 期分期付款的方式,来实现需要单次支出的成本被摊销到接下来的 24 个月里,这样虽然我支付的钱没有变少,但却将整体的记账周期拉长,从而实现了我在今年的预算不会超出预期。

通过摊销,我超期消费了明年的预算,解决了今年的问题,确实是一个很好的解决方案(当然,也是信用卡分期的意义)。不过,这也反过来让我思考企业的预算和摊销体系,可能作为一个员工,我们会认为思考预算是有点奇怪的,业务随时可能增长,预算必然被打破,但换个角度来看,如果我们的预算在可控范围内进行增长,就可以在享受到摊销带来的价值的同时,不至于过度消费未来。

我近几年一直在用 MoneyWiz 在记账,之前也写过一些关于关于 MoneyWiz 的文章

得益于 Moneyiwz 的预定功能,摊销也可以以一个十分轻量的方式来完成,现在,我更期待今年的发布会了!。

写在 26 岁(下)

happy birthday sign

在农历生日的时候,我为自己写下了「写在 26 岁」,而今天,是我的阳历 26 岁。

在上一篇文章当中,写的很丧气,我自己都很焦虑。在这一篇文章,希望能给自己打打气。

26岁在人生漫长的八十多年里,并不能算得上特殊。不过,自己选择的路线确实会让这一年显得特殊一些。新的一年,祝你能够心想事成。在做的事情能够有一个好的结果。

如果可以的话,今年做一个大胆的选择,去试一试过去可能没试过的东西,体验一个不一样的生活。

别浪费了自己的 26 岁。

理性感性与生活

silhouette of person's hands forming heart

最近观察到一个现象,我认为一个非常「理性」,拥有着「理工科思维」的前辈,他的配偶却显得「贪小利」、「情绪不稳定」,这似乎是很奇怪的事情。难道「理工科思维」、「沉稳」的前辈不应该是找一个很稳重的配偶么?

但随时时间的流逝,我又有了新的看法。

作为一个普通人,当我们掌握了「理工科思维」和使用理性指导生活的方式和方法后,我们的生活可以非常容易走上正轨。我们在做各种选择会比依靠「情绪」来指导我们的生活的人会更加稳健、更加轻松、更加富有确定性。

但理工科思维未免过于范式固定,在这种情况下,我们的生活可能是一成不变的,朝着一个确定的目标上走着,在一个明确的轨道上行驶。

一个不那么稳定的配偶,可以为他的生活中添加一些变量和变化,让生活变得不那么枯燥。从这个角度来说,也挺好的。

这篇文章也是在试图用理性的逻辑来分析一个现实生活中的问题。但可能我说的全都是错的。

找到对的问题

woman holding camera standing near people

最近在读《如何成为顶级记者》,总体来说,不同的记者有不同的切入视角,但如果要找一个能够综述所有人的关键点就是 —— 「离事情发生的地点足够近」。无论是通过自己的数据分析找到真正的事情发生点,还是和当事人建立更加友好、更加深入的联系,都是为了达成「离事情发生的地点足够近」这个诉求。

而当我总结到这里时,我突然在思考一个问题:我的问题真的是如何成为一个顶级记者么?

显然不是,我必然是会在编程和工程师的路上越走越远的,我的目的其实是:「如何录制好一档访谈类型的播客」,而这个问题如果细化的话,其实真正的问题应该是「如何提出一个正确的问题」

当我明确了正确的问题之后,那就知道正确的 Action 应该是什么 —— 「学习提出正确的问题」

回到这个事情本身,我其实在初期也进行了思考:从做一个好的访谈播客出发,推导出我需要具备优秀的访谈能力,而优秀的访谈能力往往出现在优秀的主持人和优秀的记者身上,因此我推导出了需要去学习顶级记者的思路。但是,问题的思考还不够深入,如果进一步推导和抽象,才能得到正确的答案 — 「提出一个正确的问题」。

Gutenberg 编辑器带来的模式变更

silver mercedes benz emblem on blue surface

自 WordPress 5.0 开始, Gutenberg 编辑器(后文称为古腾堡编辑器)开始存在于 WordPress 当中,为普通用户所用。而得益于古腾堡编辑器带来的卓越的使用体验(用户不需要再记录晦涩难懂的短代码、无须忍受 TinyMCE 的界面),用户使用 WordPress 的方式也开始变得多种多样。

如果你还没有用过古腾堡编辑器,那你可以访问 WordPress 官方提供的在线预览工具来试用:https://wordpress.org/gutenberg/

体验的变革

古腾堡的出现,让作者可以更加接近于我一直描述的 WordPress 所能够提供的最大的价值 —— 让写作变得更加简单,易实现。不仅如此,古腾堡带来的新的编辑体验,让除了工程师、Geek 以外的人也可以很轻松的实现一个更好看、更易读、更加丰富的界面。

而从 WordPress 开发团队的态度来看,也是更加推荐作者们更多的使用古腾堡编辑器:从Twenty Nineteen 开始,古腾堡的支持就成为了默认,并不断的通过官方主题的用法,让作者们看到 WordPress 原来还可以是这样。今年的 Twenty Twenty Two 更是从写作者变为了艺术家 —— 你可以十分简单的建造一个线上的画廊。

开发模式的变更

过去,WordPress 开发整体来说,可以分为两条线:一条是主题开发,你需要与 PHP、HTML、CSS、Javascript 共同战斗;另一条线则是插件开发,你需要与PHP 为伍。

搞插件开发的,你对于前端开发不甚了解也无所谓。WordPress 提供了大量的 helper function 。比如,我在「开发一个短代码插件」中,不使用一行前端代码就实现了 TinyMCE 的功能新增。

而在新的古腾堡编辑器生态下,开发者如果希望对于古腾堡进行拓展,一方面依然可以使用之前的方式,接入各种短代码来实现各种不同的用户体验,另一方面,则可以借助与前端技术栈来实现一个更加丰富的用户体验。

你可以使用 JQuery 和 WordPress 为你绑定的全局对象来修改古腾堡编辑器实现你的目标,更是可以借助前端的开发体系,诸如 Webpack、React 来开发一个强交互,体验佳的用户体验。

WordPress 的开发不再是 PHP 工程师自己的事情,它将更多的人卷入 WordPress 的开发过程中。而对于 WordPress 开发工程师来说,则有了更高的要求,来完成插件的开发、主题的开发。

总结

自古腾堡的推出,这样的趋势就开始渐显。但直到我真正开始开发一款古腾堡插件,我才真正意识到 —— WordPress 在内容创作领域的价值,无可替代。纵然他有众多的历史包袱,但对于每一个创作者来说,他都是最好的选择。

为什么不买 NFT?

0b3832798a78a661095ac5785ca4370b

从去年开始,我就开始定投 Crypto 领域的主流货币,比如 BTC、ETH 等,每月少量入金,用一笔不会影响我正常生活的钱来完成 Crypto 领域的投入。

而最近大火的 NFT,我除了参与一些 NFT 的开发意外,并没有参与市场化的交易。

对我来说,原因其实非常简单:

  1. 我认可数字藏品有价值,但数字藏品很多时候是在赌喜好,相比于主流币的价值增长(随着共识和稀缺提升),数字藏品往往会出现非常典型的「接盘」的情况出现。如果你看好的藏品没有人喜欢,则很难产生流通。这一点 NFT 有典型的弱点。
  2. 基于结论 1 ,就会推导出结论 2 :一个流通比较困难的产品,就需要你更加在乎时机,你只有在卖出的时机卖出,才能获得收益。这会要求你「盯盘」,时刻关注交易信息,及时将你自己的藏品卖出去。

虽然 NFT 确实可以一夜暴富( 0.1 Eth 入,5 个 Eth 出)也是很正常的,但对于身在其中的玩家来说,消耗的精力也是 BTC、ETH 等主流币的定投者无法比拟的。

至少,买 BTC 和 ETH 我可以每天安稳的睡觉,不用担心需要实时盯盘,在一个好的时候卖出。

拥抱不确定性

Funko Superman in shallow focus

最近又进行了一次播客录音。刚好又收到了协作者的邀请,在听两个月前自己的录音。

莫名的感觉到,我可能在成长了。

两个月前的我,对于录音过程中的节奏要求非常高,如果我发现情况不对,就一定要强行扭转回去。但这并没有意义,反而会让大家觉得很生硬。

如今的我,可以坦然的面对节奏的消失,坦然面对冷场的局面。

大概是我正视了,录播的压力就是可以很小,就算我的顺序有问题,只要大方向不出错,那就不会在后续成片造成太大的影响。后续逐步调整即可。

微信公众号付费与 GitChat

d2b5ca33bd970f64a6301fa75ae2eb22 19

GitChat 是一个定位于工程师知识付费的平台。由现图灵社区负责人谢工于 2018 年时推出,后为 CSDN 所收购。GitChat 的特点是众筹文章 & 读者按照文章付费。

我是 GitChat 平台的老用户,从 GitChat 刚刚开始推广就加入到 GitChat 当中,也是广泛的使用了 GitChat 的平台,其推出的文章、专栏我基本上都有试过。

到了 2022 年,GitChat 已经风光不再,而微信公众号也推出了其付费产品 —— 微信公众号付费阅读。

那我们要问一个问题了:是微信公众号的付费阅读干掉了 GitChat 么?

从最基础的功能表现上来看,GitChat 的核心是用户按照文章付费,而不是按视频付费;微信公众号的付费阅读功能同样支持按文章付费。从功能的层面,似乎 GitChat 已经完全被微信公众号的付费阅读功能所替代。

但在实际上,二者提供的价值完全不同。

微信公众号的付费阅读功能是提供给创作者的创收工具,作者可以在已有的用户基础之上,进行部分内容的付费,从而解决内容变现的问题。

d2b5ca33bd970f64a6301fa75ae2eb22 19
GitChat 的众筹功能

GitChat 则在提供了创收工具以外,还提供了平台的流量,不记得之前在哪里看到过,大致是这么一句话:“在线课程的核心不是课程质量,而是课程流量”。在在线视频课程的场景下,每一个做课程的老师都不过是流水线上可以替换的工人,而更重要的是读者从何而来。不仅如此,GitChat 还提供了众筹的功能,对于创作者来说,可以按需生产内容,从而避免产出的内容无人付费。

从这个角度来思考的话,对于素人(彼时的我也是个素人)来说,GitChat 是比微信公众号更好的平台与工具。

做把咖啡杯带走的观影人

man in black long sleeve shirt sitting on black chair

昨晚去看了《这个杀手不太冷静》,在看完电影后,发现不少人留下了自己的水杯。

在我看来,这是「举手之劳」。作为消费者,我们当然可以不把水杯带走,毕竟影院确实也安排了打扫阿姨来做打扫。不过对于我来说,我会觉得这是我们人的面貌的一个细节的展现。

细节中展现人的面貌,如果你发现一个绅士所有的行为都很绅士,但他却随地吐痰,你觉得这个人绅士么?

我们或许依然会因为别的因素和他合作,但你一定不会希望自己成为他这样的人。既然如此,那就不要做这样的人好了。

如果你只是差了一个灵感,

灵光一闪

灵感对于我来说,并不是一个什么稀缺的时候,我随时会发现有空缺,以及对应的灵感,对应的机会。我放弃了很多在我看来值得做,但收益率很低的灵感。

但并不是对每个人都是这样的,我曾经也属于写作苦手,很难写出哪怕每天 300 字的文章(300字是微信公众号的原创的最低标准),不过,经过一番辛苦的训练,如今的我,灵感和写作不再是困惑我自己的点,甚至于实际上我经常会把写好的文章定时在未来的某个时间点发布(因为我写的很多的内容并不具备时效性)。

而对于缺乏灵感的人而拥有技术的人来说,一个灵感或许就可以帮助他走出当前的困境(我自己对此抱有疑问,但不影响我写这篇文章)。

而如果你是这样的一个人,那么下面这个信息可以帮到你:

在 Reddit 上有一个特殊的分区叫 —— SomebodyMakeThis 
这个分区是用来让人将自己的奇思妙想发布在其中,从而让有能力有技能的人可以去从中摘取合适的灵感来实现的。
这个分区的地址如下:https://www.reddit.com/r/SomebodyMakeThis/

我之前就想过这样的一个事情,提供一个渠道,用来收集灵感,当我不知道要做什么的时候,就随便挑一个灵感来做试试看。

除了上面的这个 Subreddit ,我还觉得 V2ex 的奇思妙想分类,也是一个不错的灵感发现地点。

为什么你应该自建图床?

black flat screen tv turned on near green plant

我最近对博客做了个整体架构优化(或者其实说是重建了一次),在重建完成后,为了确保我的重建是成功的,我安装了 Broken Link Checker 来进行网站链接检查。经过插件的检查后,发现了不少我在迁移的时候出现问题的点。不过,在这个过程中,也注意到了我过去自己的问题。

首当其冲的是我在早期大量的应用了来自微博的图床,但随着后续微博图床的失效,我无法再使用这些图片,在读者访问的时候,就会相应的出现错误。我不得不针对这些图片一个个手动处理。

d2b5ca33bd970f64a6301fa75ae2eb22 22

好在是后来 iPic 的出现,我得以从新浪图床迁移到如今自建的又拍云图床中。

d2b5ca33bd970f64a6301fa75ae2eb22 23

而随着 WordPress 插件生态的丰富,如今我在 WordPress 上写作插图更加的方便。

自建图床和自建博客、自建网站等等的原因几乎是一样的 —— 只有你自己维护的,才是真正属于你的,别人维护的,都有可能在某个时刻不让你使用。那个时候,你的成本会骤增。比如现在的我,就在苦逼的一个个的修改图片的地址。

为什么大咖愿意将机会共享给你?

ef40166b49d33480283739fdc5bb384f

我在「生财有术」的星球呆了差不多三年了,在里面看到了不少有意思的赚钱的方法和机会。不过,过去的很多时间里,我其实都无法理解,为什么大家愿意把自己赚钱的方法介绍出来。

前些日子和芦笋的创始人晓力在线下聊天的时候,我才真正意识到「为什么大咖愿意将机会共享给你」

我们两个人在聊天时,提到了我之前做的一件事,当时是我发现了格雷厄姆的博客可以被翻译,我就发了一个朋友圈说,大家可以自己注册一个格雷厄姆的域名,并对格雷厄姆的文章进行翻译,将自己的链接发送给格雷厄姆,请他帮忙加上对应的链接。

我们在讨论的过程中,我们有共同的意识,可以看到这件事背后的价值,比如:

  1. 你和格雷厄姆有了沟通,甚至是有了合作,本身是比较难得的。
  2. 你通过这个翻译和建站的过程,证明了你自己的能力,完全可以联系出版社,去进行更加正规的出版工作。
  3. 你可以在后续的求职过程中,将这个网站作为一个个人项目进行展示。
  4. 你可以阅读格雷厄姆的内容,并写出你自己的内容。

我们可以看到,我们都能看到这些优势和这个事情所带来的收益,但对于年轻人来说,这个可能就是他们看不到的机会和方式。

而这个事情放在我和晓力身上,就是不会去做的事情,因为这个事情虽然我们看起来值得做,收益也还不错,但问题在于这个收益对于现在的我们来说,是没有价值的,我们需要用我们的时间做更多更有价值的事情。

而从这个逻辑去推断,我们当然可以认为是「没有人会分享自己的赚钱的机会」,但换个角度来看,这也可能是你和他们的差异实在太大,你无法理解他们对于你所看重的东西其实根本不在意。

视野不同,使我们患得患失。我们看重的,可能是那些前辈所无视的。

为什么放弃 WordPress 的 2022 主题

b29692084bbb

近几年,我基本上是保持着跟随官方的步伐,使用当年的默认主题,比如 2021 出了,我就用 2021 主题,当 2022 出了,我就用了 2022 主题。

前几天我也还在使用 WordPress 2022 主题,今天恰逢得空,我就还是把主题切换回了更加古老的 2012 主题。

聊聊为什么吧。

为什么要放弃 WordPress 2022 主题?

实际上,从 2020 开始,你就会发现,WordPress 的主题设计就会逐渐的倾向于「个人主义」的主题,增加了大量的展示自己的主题,包括我自己,也在过去的一年里,大量的使用了 2021 这个主题。

d2b5ca33bd970f64a6301fa75ae2eb22 8
2021 年我的博客的样子

但是,当我在 Beta 版试用 WordPress 的 2022 主题时,我发现这样的情况愈发的明显,甚至对于我来说,超出了我的能力范围。

2022 主题相比于 2021 主题,提供了更多的编辑的能力,用户可以用一个可视化的编辑界面,去修改你的网站的任何一个位置。从一个普通的用户者的角度来看,它赋予了用户更多的能力,可以去实现任何一个想要的效果。但从一个专业的开发者的角度来看,他从某种程度上束缚住了我的手脚,我再也不能对 WordPress 主题做任何修改(你只会获得一个「编辑器」)。此外,对于一个「不那么有审美」的人(比如我),可拖拽意味着你会拖拽出一个完全不合理的界面。

So,我放弃了2022 主题

为什么是 2012 ?

2012 是我最近在看 HappyXiao 的博客 注意到的,我发现 2012 这个 10年前的主题在处理不同设备之间的响应式、清爽感等方面做的非常好,作为一个阅读者,我的体验极佳。

而我同样希望给我的读者提供更多更加友好的阅读体验,于是,我就选择了 2012 来作为当下我的主题。

当然,这个主题并不一定完全符合我的要求,因此,我也做了一些基本的改进,这些改进,后续我会单独写一篇文章来说明。