# wxcloud-crmeb **Repository Path**: sonss/wxcloud-crmeb ## Basic Information - **Project Name**: wxcloud-crmeb - **Description**: 把crmeb迁移到微信云托管 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2023-06-18 - **Last Updated**: 2023-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 云托管体验——部署ThinkPHP商城后台到微信云托管(含本地云调试配置) > 2022年的今天,云计算蓬勃发展,除了强大的云平台建设经验的支持外,差异化竞争也很重要。微信云托管背靠腾讯云,坐拥微信生态的优势使其在同类云容器托管产品中让人眼前一亮,以微信为接入点的业务向微信云托管靠拢在安全、用户体验、运维、开发上都具备优势。微信云托管的能力已经上线不少,趁着最近云托管有活动,不花钱体验一下云托管的魅力。 > > **本文包括两方面内容:** > > **(1) Thinkphp项目容器构建思路及实践 ** > > **(2)在本地搭建调试容器模拟云环境完成调试** > > **开始前请在本地开发环境部署好Docker与VsCode** ## 一、开通云服务 ### (一)云环境开通 > 系统响应一般比较快,遇到转圈圈超过1分钟可以直接刷新页面。 #### 在[微信云托管 (qq.com)](https://cloud.weixin.qq.com/cloudrun/)里,扫码登录,选择自己所需要的账号进行开通 ![image-20211220155202406](https://cdn.notcloud.net/static/typora-user-images/image-20211220155202406.png) #### 选择自定义部署 ![image-20211220155329984](https://cdn.notcloud.net/static/typora-user-images/image-20211220155329984.png) #### 点击确定或者绑定腾讯云账号 ![image-20211220155457437](https://cdn.notcloud.net/static/typora-user-images/image-20211220155457437.png) #### 如果需要绑定腾讯云账号,绑定授权完成后跳转回来可以先点一下取消,再点“自定义”部署 > 一般来说,点一次确定即可,如果响应慢可以等一下,避免造成环境重复创建 ![image-20211220155823833](https://cdn.notcloud.net/static/typora-user-images/image-20211220155823833.png) ![image-20211220160150566](https://cdn.notcloud.net/static/typora-user-images/image-20211220160150566.png) ### (二)数据库创建 #### 创建数据库并创建子账号 ![image-20211220160735745](https://cdn.notcloud.net/static/typora-user-images/image-20211220160735745.png) ![image-20211220161341749](https://cdn.notcloud.net/static/typora-user-images/image-20211220161341749.png) ## 二、容器构建 > 如果您已经打包成容器,请跳过这一步~这一步主要是根据项目本身的需求去对运行环境作相应的配置,这里列举了本次项目所需依赖,记得最后记录一个清单。 ### (一)收集待迁移项目所需依赖 > 所需依赖的话,如果是新建项目的话可以从文档去找 #### 1、项目所需运行环境 - 操作系统:这里因为需要作PHP的版本适配,选择了Alpine:3.10 - Nginx/Apache:本次项目选择了engineX; - PHP: 7.1 ~ 7.3; - PHP-FPM:配套即可; - PHP插件:如` php7-pcntl php7-posix `等等,这里比较多,详细插件会放在Dockerfile #### 2、 项目所需数据库 - MySQL:因为云环境提供了数据库,我们就不在本地部署数据库了~ - Redis:因为当前云托管还没推出,如果是不是测试,强烈建议使用云Redis数据库! #### 3、项目运行脚本 - Nginx启动脚本: `nginx -g 'daemon off;'` - 文件目录权限: ```shell chmod -R 777 /app/runtime \ chmod -R 777 /app/public \ chmod -R 777 /app/ \ ``` - Redis启动脚本: ```shell EXEC=/usr/bin/redis-server CLIEXEC=/usr/bin/redis-cli /usr/bin/redis-server /etc/redis.conf ``` - PHP-FPM启动脚本: ``` php-fpm -D ``` - Think的Workerman和 Timer ``` /usr/bin/php /app/think workerman start --d /usr/bin/php /app/think timer start --d ``` ### (二)检查依赖 > 在构建之前,我们还需要检查一下这些依赖是否能够轻松引入,方法很简单,去Alpine依赖包管理搜索对应依赖,并记录一下他们的一些必要信息:在容器内安装位置、配置文件位置,方便后续覆盖容器内的配置文件 #### 1、前往[Alpine依赖包管理](https://pkgs.alpinelinux.org/packages?name=php7**&branch=v3.10) 依次搜索所需插件 ``` nginx php php-fpm # 此处省略... php7-gd \ ``` ![image-20211220164136014](https://cdn.notcloud.net/static/typora-user-images/image-20211220164136014.png) #### 2、 搜索Nginx、PHP、PHP-FPM、Redis的软件内容 > 别忘了看一看软件在文件内的安装目录,以及一些配置文件的地址,覆盖默认配置的时候会用到。同时,里面包含一些软件所依赖的包,因为本次所选用的Alpine体积很小,如果缺少了依赖包导致无法安装的话,可以安装一下 ![image-20211220164351640](https://cdn.notcloud.net/static/typora-user-images/image-20211220164351640.png) ## 三、本地测试及云发布 ### (一)本地测试 #### 1、拉取待迁移项目源码,准备配置文件 > 本次需要两个项目的源码,一个是[微信云托管官方的ThinkPHP+Nginx示例项目](https://github.com/WeixinCloud/wxcloudrun-thinkphp-nginx),另一个是[电商项目-CRMEB (gitee.com)](https://gitee.com/ZhongBangKeJi/CRMEB)的源码。 ![image-20211220170936739](https://cdn.notcloud.net/static/typora-user-images/image-20211220170936739.png) > 需要自己的配置文件有:redis.conf,百度一下redis-5.0的配置文件即可,其余的话放在官方项目里面的conf目录里。因为篇幅原因,源码会放在附录的仓库里。***然后*导入一下项目并打开Dockerfile** ![image-20211220171737122](https://cdn.notcloud.net/static/typora-user-images/image-20211220171737122.png) #### 2、制作Dockerfile及启动脚本 ##### (1)添加redis.conf到`/conf`、增加nginx反向代理规则 > 该步主要是为了让redis-server以守护模式去运行,配置文件在dockerfile中被指定去覆盖掉redis原有的配置 ![image-20211220204321003](https://cdn.notcloud.net/static/typora-user-images/image-20211220204321003.png) > 依照商城要求,在`/conf/nginx.conf`中加入反向代理的配置,主要是为了即时通讯模块 ```nginx location /notice { proxy_pass http://127.0.0.1:20002/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; } #提示:v4.3.0 以前版本,可不用配置一下代码 location /msg { proxy_pass http://127.0.0.1:20003/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; } ``` ##### (2)**Dockerfile**制作 > - 更改基础镜像`alpine`至`3.10`版本 > - 在php7插件添加的地方,补充了待移植项目特定的一些依赖 > - (可选)添加redis > - 配置redis的文件覆盖 > - 按照商城的要求更改特定目录的权限 ```dockerfile # 为了兼容php7.3,alpine更改为3.10 FROM alpine:3.10 # 安装依赖包,如需其他依赖包,请到alpine依赖包管理(https://pkgs.alpinelinux.org/packages?name=php7**&branch=v3.10)查找。 RUN apk add --update --no-cache \ nginx \ # php及其插件 php7 \ php7-fpm \ php7-json \ php7-ctype \ php7-exif \ php7-pdo \ php7-pdo_mysql\ # =======商城所需依赖========= php7-pcntl\ php7-posix\ php7-mysqli \ php7-pecl-redis\ php7-fileinfo \ php7-curl \ php7-bcmath \ php7-gd \ # =======END========== # ====(可选)Redis==== redis \ # =======END========== # 结束后清空缓存 && rm -f /var/cache/apk/* # 设定工作目录 WORKDIR /app # 将当前目录下所有文件拷贝到/app COPY . /app # 替换nginx、fpm、php配置 RUN cp /app/conf/nginx.conf /etc/nginx/conf.d/default.conf \ && cp /app/conf/fpm.conf /etc/php7/php-fpm.d/www.conf \ && cp /app/conf/php.ini /etc/php7/php.ini \ # =======redis配置覆盖========== && cp /app/conf/redis.conf /etc/redis.conf \ # =======END========== && mkdir -p /run/nginx \ && chmod -R 777 /app/runtime \ # =======商城要求的特定目录权限======= && chmod -R 777 /app/public \ && chmod -R 777 /app/ \ # =======END========== && mv /usr/sbin/php-fpm7 /usr/sbin/php-fpm # 暴露端口 EXPOSE 80 # 容器启动执行脚本 CMD ["/bin/sh", "/app/run.sh"] ``` > 然后在同目录下新增`.dockerignore`文件,用于忽略无需构建的东西 ```dockerignore .git .dockerignore Dockerfile* composer* container.config.json LICENSE README.md ``` ##### (3)启动脚本run.sh制作 > 也就是把刚刚我们在找出来的脚本粘贴进去即可 ```bash #!/bin/sh # 后台启动 php-fpm -D # 关闭后台启动,hold住进程 nginx -g 'daemon off;' #Think Workerman /usr/bin/php /app/think workerman start --d /usr/bin/php /app/think timer start --d EXEC=/usr/bin/redis-server CLIEXEC=/usr/bin/redis-cli /usr/bin/redis-server /etc/redis.conf ``` #### 3、(可选)composer依赖处理 去找个`composer.phar`放在根目录,然后更新一下即可,然后可以看到`/vendor`里面有新装的包 ```cmd php composer.phar update ``` #### 4、构建镜像 > 首先请确保你的开发环境有Docker 在根目录上,使用命令行运行 `docker build -t crmeb-on-wxcloud:1.0 . ` ![image-20211220213613877](https://cdn.notcloud.net/static/typora-user-images/image-20211220213613877.png) 大概一分钟后,构建完成,跑一下 `docker run -p 80:80 -d crmeb-on-wxcloud:1.0` 全绿!过关 ![image-20211220213746485](https://cdn.notcloud.net/static/typora-user-images/image-20211220213746485.png) #### 5、(额外)如果是第一次创建,可以在微信云托管连接控制台,然后把示例数据创建在云数据库上 ![image-20211220214213167](https://cdn.notcloud.net/static/typora-user-images/image-20211220214213167.png) 可以看到,数据库连接成功,如果不成功,检查一下数据库外网是否放开,是否为非Root账号。 ![image-20211220214331587](https://cdn.notcloud.net/static/typora-user-images/image-20211220214331587.png) ### (二)云发布 #### 1、发布前的测试 成功创建演示数据后,我们需要在上线前清空`/public/install`目录,最后在目录 建立`install.lock`,并在根目录下创建`.env`环境配置文件。 ![image-20211220232013466](https://cdn.notcloud.net/static/typora-user-images/image-20211220232013466.png) 配置文件里面,把我们一些数据库连接写好,但这次数据库主机地址写在云环境中的内网数据库地址的即可 ``` APP_DEBUG = true [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = 10.0.224.16 HOSTPORT = 3306 USERNAME = crmeb PASSWORD = xeWmJ466f3 DATABASE = crmeb PREFIX = eb_ CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn [REDIS] REDIS_HOSTNAME = 127.0.0.1 PORT = 6379 REDIS_PASSWORD = SELECT = 0 [QUEUE] QUEUE_NAME = 322f1860c16e7 ``` 然后再次重复镜像构建过程,确保能跑即可,然后准备发布! #### 2、上云托管! 这里是大伙各显神通的地方了 - 你可以在本地构建并发布镜像到镜像仓库 - 不在本地构建,通过Git仓库建立工作流或者直接压缩文件上传 ##### 直接上传 这里演示直接压缩文件上传 ![image-20211220223429663](https://cdn.notcloud.net/static/typora-user-images/image-20211220223429663.png) 进入云托管控制台,点击左侧“服务管理-服务列表”,新建服务,打开公网访问,然后选择“版本列表-新建版本”,选择一个自己喜欢的方式,这里选择“上传代码包” ![image-20211220223822938](https://cdn.notcloud.net/static/typora-user-images/image-20211220223822938.png) ##### 通过Git仓库构建流水线 > 第一次选择仓库时,可能需要授权,授权后返回即可 > > 建议勾选发布策略中的通过webhook触发构建,这样每次Git推送到仓库的时候就会触发构建 ![image-20211220225514438](https://cdn.notcloud.net/static/typora-user-images/image-20211220225514438.png) ##### 发布版本 服务构建完成后,直接发布版本,全量发布 ![image-20211220224205390](https://cdn.notcloud.net/static/typora-user-images/image-20211220224205390.png) ##### 两端同时跑通,大功告成! ![image-20211221001733960](https://cdn.notcloud.net/static/typora-user-images/image-20211221001733960.png) #### 3、(非必要仅为拓展)本地云调试开放接口服务 在Vscode里安装两款插件,下面会从安装到配置再到使用进行介绍: > [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker):Docker插件 > > [Weixin Cloudbase Docker Extension - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=weixin-cloudbase.vscode-docker-wx-cloudbase):微信云托管本地调试插件 ##### 配置微信云托管调试插件 打开设置,搜索"wxcloud"进入配置页面,按照上面的信息进行配置 ![image-20211220215943743](https://cdn.notcloud.net/static/typora-user-images/image-20211220215943743.png) ##### 前往微信云托管控制台打开及配置云调试 ![image-20211220220137456](https://cdn.notcloud.net/static/typora-user-images/image-20211220220137456.png) 安装完后重启vscode,在左侧栏打开Docker ![image-20211220221640477](https://cdn.notcloud.net/static/typora-user-images/image-20211220221640477.png) 然后我们进入**业务容器**的命令行体验一下无需鉴权信息`cloudbase_access_token`的请求!(这边偷懒,就从DockerDesktop进了敲指令也可) ![image-20211220221903398](https://cdn.notcloud.net/static/typora-user-images/image-20211220221903398.png) > 开放接口调用成功! > > 这里如果调用失败,请返回上一步,检查控制台检查一下接口是否在云调用的白名单内 ![image-20211220222039192](https://cdn.notcloud.net/static/typora-user-images/image-20211220222039192.png)