--- { title: "补档 Uni运维小记", description: "作者在Docker中配置ChronoCat QQ框架时遇到困难,包括版本兼容、VNC显示问题及冻号风险。部分API测试成功,基于Satori协议调用方便。后续计划提供JSON格式的API供其他容器使用,示例包含来源、目标和信息内容。环境问题尚未解决。", draft: false, type: "article", created_at: "2024-03-29T10:30:00+08:00", published_at: "2024-03-29T11:18:00+08:00", updated_at: [ "2024-03-29T11:18:00+08:00"], category: 'Uni', tags: [ "运维" ], tech_stack: [ "Docker", "Nginx", "MariaDB", "Azure Devops" ], tech_stack_percent: [ 40,30,20,50 ], tech_stack_icon_names: [ "mdi:docker","simple-icons:nginx", "simple-icons:mariadb", "simple-icons:azuredevops" ], tech_stack_theme_colors: [ "#1c90ed","#109748","#c0765a","#2b99e2" ], } --- !!!warning Legacy Article 过时的文章 此文章从旧博客迁移而来,编写时技术水平有限,仅供参考 !!! #运维 运维的主要任务有:部署代码,配置和维护服务器上的nginx,Docker和mariaDB服务。~~还有背锅~~ 运维技术路线: ##Docker 学习[Docker](https://docker-practice.github.io/zh-cn/)会是你的第一课。几乎全部的后端代码都运行在Docker中,Docker提供了服务管理,自动化部署和端口映射功能你需要学习的有关知识有: Image、Container的概念及相关操作 从Image构建Container,端口映射相关配置 导出Container Log, 进入运行的Container进行检查 从 DOCKERFILE 文件构建Container 从 DockerCompose 构建Container ##nginx nginx维护的关键是:看懂学长留下的配置文件。然后在其基础上堆上自己的文件,同时保持nginx不崩 目前笔者nginx技术有限。不过多赘述 ##mariaDB mariaDB和Mysql语法略有区别。但大部分都是一致的。作为运维,你需要为后端代码建立所需的数据库。建立数据库,配置用户并不困难。去bing或者谷歌花点时间就能做好。 但是关键是,把带有帐号,密码,地址的字符串传递给后端代码。我将在后续提到。 ##Azure 你有很大概率在Azure中看到这份指导文件,但你大概率还不会使用Azure进行代码管理和部署配置。 这里不会讲Commit PR 或是 Branch相关的概念。如果你不了解,你需要去学习Git相关知识。在很大程度上,Azure和Github类似,只是这里不会从搜索引擎中搜到。接下来,我会假设你了解相关概念。 这里主要讲Azure Pipelines的配置 在左侧,你能找到Pipelines。你可以右键,在新窗口中打开。这样就可以不退出本指导。 你可以看到很多Pipeline在其中。排在前面的可能是IWutApi,或是其他什么东西。它们在进行**自动化部署**的工作。每个Pipeline都在持续监测某个仓库的的某个分支,如果发生改变,它会把代码传到制定的服务器,构建,运行。这样,后端开发者就能在第一时间对最新的代码进行测试,并且把最新的代码上线,供用户使用。 这一近乎神奇的操作的关键,是仓库中的一个yml文件,它通常被命名为 ***-pipeline.yml 关于yml文件的配置,我的建议是:抄 ```yml trigger: - main resources: - repo: self variables: projectName: iwut-api-prod stages: - stage: Deploy displayName: 部署到服务器 jobs: - deployment: VMDeploy displayName: 部署到Uni服务器 environment: name: JP-tencent resourceType: VirtualMachine strategy: runOnce: deploy: steps: - checkout: self fetchDepth: 1 displayName: 切换到目标仓库分支 - bash: |- docker compose -p $(projectName) -f docker-compose.yml up --build -d env: DeployPort: 5003 ConnectionStrings__App: $(ConnectionStrings__App) displayName: 运行 docker compose 命令 ``` 这是目前正在运行的一份pipeline文件。我们来简单分析一下,如果要改在其他工程上,需要改什么。 trigger:规定正在监测的分支名字是什么 projectName:项目名字,改成对应的 stages里,第一个可能要改的是environment,你要部署到哪个服务器。在Pipeline-Environments中,可以看到现在可用的服务器。这个大概率会有人告诉你。但以防万一,这里简单叙述目前的情况。 如果你要部署的是一个需要Debug,后端还在开发的代码,放在uni-tencent上,并且只部署dev分支。 如果你要上线一个供用户使用的新功能,那么JP-tencent是更好的选择,只部署main(或master?)分支 下一个要改的是steps中的bash 这是一行从Docker-Compose启动docker container指令,关于Docker Container创建和端口转发,在Docker-Compose文件中。 然后是env, DeployPort和ConnectionStrings__App env是环境变量,这里创建了两条环境变量,部署端口和连接字符串。 这里容我粘贴DockerCompose.yml(也能在仓库找到)文件,插入的讲解一下 ```yml version: '3.8' services: iwut-api: #目标Contaienr 名字 image: iwut-api:prod #镜像名字 build: context: . dockerfile: IWutApi/Dockerfile #DockerFile文件位置,需要修改 args: BuildConfig: Release #发行环境 environment: TZ: Asia/Shanghai ASPNETCORE_ENVIRONMENT: Production #发行环境 ConnectionStrings__App: ${ConnectionStrings__App:?} #数据库连接串 ports: - ${DeployPort}:80 #端口 extra_hosts: - "host.docker.internal:host-gateway" ``` 这个文件中,发行环境可能会改成Debug或Development,这个看后端需求。 你可以看到 数据库连接串和端口使用了${something} 的形式,这里就是在读取环境变量。 回到之前的Pipeline文件,端口没什么说的了,现在聊聊ConnectionStrings_App 该环境变量 在构建Pipeline过程中加入,如图。![Screenshot_2024-03-25-15-29-23-111_com.realvnc.viewer.android.jpg][1] 右侧添加名字和值,由于该字符串包括密码,所以需要**勾上Keep this value secret** 问题出现了,你 ~~,一个刚准备接锅的运维,~~ 怎么知道这个值怎么填,因为过往的Pipeline这里都是**** 两个办法: 如果是新的项目,直接问后端,直接问他怎么填,要个示例。 如果是老项目 还记得之前Docker要求你学习怎么进入容器内部吗? ``` Bash docker exec -it (DockerID) bash echo $ConnectionStrings__App ``` 当然还有第三个办法,反正代码就在这,不如发挥主观能动性,学习后端。 祝你好运 [1]: https://typecho.lichx.top/usr/uploads/2024/03/1075500197.jpg