Docker 下搭建 Spug,容器里面的执行 docker 命令 作者: Chuwen 时间: 2021-10-28 分类: Docker 评论 ## 序言 由于前端打包?环境多变,可能有以下情况: - 有的项目需要 `node:12.0` 才能 `build` 成功 - 有的项目需要 `node:16.0` 才能 `build` 成功 - ... 这些环境多变,在使用 Docker 部署的 `Spug` 时,我们希望的是在容器里还想再使用 Docker,需要什么环境拉**对应的镜像**就可以 ## 过程 ### Docker 部署 Spug > Docker 的安装过程不再过多赘述,主要的 `Docker` 映射就是在第 5、6 行 > > 这样就实现了“套娃”:`Docker` 容器里,使用 `Docker`。 > > 需要⚠️:容器里使用的 `Docker` 是宿主机的 `Docker`,所以容器里使用 Docker 的路径映射映射的是宿主机里的,**这个下面会讲到** ```shell docker run -d \ --restart=always --name=spug \ -p 80:80 \ -v /data/spug/:/data \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ openspug/spug ``` ### Spug 部署前端(Node.js)项目(如 Vue.js、React) #### 2. 构建配置 | `Spug 环境变量` | 容器 | 宿主机 | | ---------------- | ----------------- | ------------ | | `SPUG_REPOS_DIR` | /data/spug/repos/ | /data/repos/ | **文件过滤规则(包含模式):** ```tex dist/* ``` **代码检出前执行:** ```shell echo "代码检出前执行" echo $SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules mkdir -p $SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules ``` **代码检出后执行:** > 注意 Docker 映射的路径,Docker 容器里调用 Docker(这个 Docker 是在宿主机里面的,所以路径映射一定要正确) ```shell # 软链接 node_modules,因为这个不会怎么改变的 ln -s $SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules . WORK_DIR=$(pwd) # 宿主机里面的 repos 路径 HOST_REPOS_DIR=/data/spug/repos # 这个操作就是替换为在宿主机真实工作路径 TARGET_WORK_DIR=${WORK_DIR/${SPUG_REPOS_DIR}/${HOST_REPOS_DIR}} echo "当前工作目录:$WORK_DIR" echo "宿主机目录:$HOST_REPOS_DIR" echo "目标路径:$TARGET_WORK_DIR" # 安装依赖包 docker run --rm \ -v $HOST_REPOS_DIR/$SPUG_DEPLOY_ID:/usr/src/app \ -w /usr/src/app \ node:16.0.0 \ yarn # 执行 build # 注意下映射路径 docker run --rm \ -v $HOST_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules:$SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules \ -v $TARGET_WORK_DIR:/usr/src/app \ -w /usr/src/app \ node:16.0.0 \ yarn build ``` #### 3. 发布配置: **部署路径:** > 这个指的是部署到**目标服务器**的路径,而不是 `Spug` 的路径哦 > > 这个路径一定不能有文件夹,因为 Spug 会自动创建(软链接) **存储路径:** > 用以存储历史版本的数量的路径 **应用发布前执行:** ```shell mv dist/* . rm -rf dist ``` **应用发布后执行:** ```shell # 例如执行一些重启、清理缓存操作 ```
Composer install/require/update 忽略内存限制 作者: Chuwen 时间: 2021-10-25 分类: PHP 评论 ```shell php -d memory_limit=-1 /usr/local/bin/composer update --no-dev ```
Laravl 在 Mailer 类里获取渲染后的模版内容 作者: Chuwen 时间: 2021-10-21 分类: Laravel,PHP 评论 ## 序言 因为在项目中需要保存下发送的邮件内容,以便后续查看 ## 代码 通过以下代码就会获取到: ```php return Container::getInstance()->make('mailer')->render( $this->buildView(), $this->buildViewData() ); ``` 完整代码实例: ```php queue = 'account-send-email'; } /** * Build the message. * * @return $this */ public function build(): static { // 存放你的逻辑代码 return $this->view('emails.account.insufficient_quota_reminder'); } /** * 处理任务成功 * * @param \Illuminate\Contracts\Mail\Factory|\Illuminate\Contracts\Mail\Mailer $mailer */ public function send($mailer) { parent::send($mailer); $model = MailSendLog::whereId($this->mailSendLogId)->first(); if (is_null($model)) return; try { $model->content = $this->getRender(); } catch (BindingResolutionException | ReflectionException) { } $model->status = 1;//发送成功 $model->save(); } /** * 处理任务失败。 * * @param \Throwable $exception * * @return void */ public function failed(Throwable $exception) { $model = MailSendLog::whereId($this->mailSendLogId)->first(); if (is_null($model)) return; try { $model->content = $this->render(); } catch (ReflectionException) { } $model->exception = $exception->getMessage(); $model->status = 2;//发送失败 $model->save(); } /** * 获取渲染后的邮件模版 * * @return string * @throws \Illuminate\Contracts\Container\BindingResolutionException * @throws \ReflectionException */ private function getRender(): string { return Container::getInstance()->make('mailer')->render( $this->buildView(), $this->buildViewData() ); } } ```
Laravel 模型使用观察者(Observer) 作者: Chuwen 时间: 2021-10-20 分类: Laravel,PHP 评论 参考:https://segmentfault.com/a/1190000012292973
PHP 对象动态传参数(反射) / Laravel Cast 的相关使用用例 作者: Chuwen 时间: 2021-10-20 分类: Laravel,PHP 评论 ## 序言 主要在用到 Laravel Cast,所以有了这个想法,暂时记录下用法,后面再慢慢解释(如果有空 哈哈哈哈) ## 代码 `MailSendLogComment.php` ```php $this->test ]; } } ``` `MailSendLogCommentCast.php`: ```php newInstanceArgs(json_decode($value, true)); } return $value; } /** * Prepare the given value for storage. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param mixed $value * @param array $attributes * * @return array */ public function set($model, $key, $value, array $attributes): array { if ($key === 'comments') { // 如果给的值不是 MailSendLogComment 对象就报错 if ($value instanceof MailSendLogComment) { throw new InvalidArgumentException('The given value is not an ' . MailSendLogComment::class . ' instance.'); } $attributes['comments'] = json_encode($value->toArray(), JSON_UNESCAPED_UNICODE); } return $attributes; } } ``` `MailSendLog.php` ```php MailSendLogCommentCast::class, 'type' => MailSendLogTypeEnum::class// 限定必须使用此枚举类型 ]; } ``` ## 用法 ```php // 查询数据 use App\Models\MailSendLog; dump(MailSendLog::first()->comments);// 返回的是 \App\Casts\Manage\MailSendLogComment 对象 dump(MailSendLog::first()->comments->test);// 返回的是 \App\Casts\Manage\MailSendLogComment 对象 test 属性的值 // 新增数据 $M = new MailSendLog(); $M->title = '邮件标题'; $M->content = '邮件内容'; $M->comments = new MailSendLogComment('邮件备注'); //必须传入这个类型,否则将会报错 $M->exception = '错误日志'; $M->save();// 保存 ```