本文来自于轻量应用服务器征文活动用户投稿,已取得用户(昵称:为之工作室)受权公布。

我是西安电子科技大学为之工作室的运维负责人,为之工作室致力于互联网人才的造就,波及到很多我的项目的部署及运维。这类我的项目的特点是并发量较小,资源占用低,内部组件依赖简略。本文会介绍这些我的项目的运维模式及相干实际分享,为相似的我的项目运维提供参考。

一、架构设计

出于节省成本的思考,心愿能够将多个我的项目部署在同一个服务器上。此外,对于中小型我的项目,尽管对于高并发的需要可能并不是十分大,然而依然须要高可用性。本人进行服务器硬件保护的老本和精力是微小的,所以必须充分利用云厂商的服务器资源,咱们抉择的是技术当先、产品欠缺的阿里云。

咱们的我的项目都是前后端拆散的,为了节俭带宽,将前端部署在 OSS 上,服务器上只用部署后端即可,这样整个工作室只须要一台轻量应用服务器及多个 OSS 实例。其中 OSS 实例的费用是能够忽略不计的,而轻量应用服务器的理论破费,均匀下来也只须要 1 个月 10 元。

轻量应用服务器 ,是可疾速搭建且易于治理的轻量级云服务器;提供基于单台服务器的利用部署,平安治理,运维监控等服务,一站式晋升服务器应用体验和效率。
对象存储OSS,是一款海量、平安、低成本、高牢靠的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性;多种存储类型供选择,全面优化存储老本。

下图为运维架构图,服务器应用 Ubuntu + Docker 部署根底服务及业务后端,而 MySQL 和 Redis 等依赖则应用阿里云提供的服务。

二、网关配置

选用 Traefik 作为网关。相比 Nginx,Traefik 对 Docker 容器具备更好的支持性,且集成 Let's Encrypt 主动申请、保护 HTTPS 证书。

首先创立网络 :
docker network create traefik

文件中的 ${} 须要依据本人理论状况编写

~/.docker/compose/traefik/docker-compose.yml
YAMLversion: "3.3"services:  traefik:    image: traefik    ports:      -   "443:443"    volumes:      -   /var/run/docker.sock:/var/run/docker.sock      -   ./traefik.yml:/etc/traefik/traefik.yml      -   ./dynamic_conf.yml:/root/dynamic_conf.yml      -   ~/.docker/volume/traefik/crt:/root/crt      -   ~/.docker/volume/traefik/log:/root/log    restart:   unless-stopped    networks:      - traefik    environment:        ALICLOUD_ACCESS_KEY: ${AK}        ALICLOUD_SECRET_KEY: ${SK}    extra_hosts:      -   "host.docker.internal:172.18.0.1" # 172.18.0.1 是容器拜访宿主机的 ip,通过   docker inspect 获取    labels:      -   com.centurylinklabs.watchtower.enable=falsenetworks:  traefik:    external: true

请确保 *.be.wizzstudio.com 域名解析至这台服务器;配置中 "root:$2b$12$aur8GtnfMi" 是 Traefik Basic Auth 账号密码,请通过 https://doc.traefik.io/traefi... 门路生成。

/root/.docker/compose/traefik/dynamic_conf.yml
YAMLhttp:  middlewares:    basic-auth:      basicAuth:        users:          -   "root:$2b$12$aur8GtnfMi"  routers:    dashboard:      rule:   "Host(`traefik.be.wizzstudio.com`)"      service:   "api@internal"      middlewares:        - basic-auth      tls:          certResolver: myresolver        domains:        - main:   '*.be.wizzstudio.com'        - sans:   '*.be.wizzstudio.com'
/root/.docker/compose/traefik/traefik.yml
YAMLproviders:  docker:      exposedByDefault: false    network: traefik  file:    filename:   /root/dynamic_conf.yml    watch: trueapi:  dashboard: true  # insecure: trueentryPoints:  https:    address:   ":443"    http:      tls:          certresolver: myresolvercertificatesResolvers:  myresolver:    acme:      dnsChallenge:        provider:   alidns          delayBeforeCheck: 0      storage:   /root/crt/acme.json      # caserver:   "https://acme-staging-v02.api.letsencrypt.org/directory" # test   serveraccessLog:  filePath:   "/root/log/access.log.json"  format:   "json"

通过 docker-compose up -d 实现网关的部署;通过拜访 https://traefik.be.wizzstudio... 即可进入治理面板。

三、我的项目部署

以某一个后端的我的项目部署为例。

/root/.docker/compose/orientation-system-be/docker-compose.yml
Rubyversion: "3.3"services:  backend:    image:   registry.cn-chengdu.aliyuncs.com/wizz-project/orientation-system-be:latest    restart:   unless-stopped    # ports:    #   - "80:8080"    labels:      -   "traefik.enable=true"      -   "traefik.http.routers.orientation-system-be.rule=Host(`orientation-system.be.wizzstudio.com`)"      -   "traefik.http.routers.orientation-system-be.tls=true"      -   "traefik.http.services.orientation-system-be.loadbalancer.server.port=80"    networks:      - traefik    volumes:      -   /etc/timezone:/etc/timezone:ro      -   /etc/localtime:/etc/localtime:ro      -   ~/.docker/volume/orientation-system-be/lab.log:/root/lab.lognetworks:  traefik:    external: true# mkdir -p ~/.docker/volume/orientation-system-be   && touch ~/.docker/volume/orientation-system-be/lab.log

通过 labels 字段,定义了通过 https://orientation-system.be... 即可拜访到这个容器,不须要再去 Traefik 批改配置了。

四、CI/CD

CI/CD: 即继续集成与继续交付,用于实现利用开发过程中的高度继续自动化和继续监控。CI/CD的指标是:用户上传代码后,主动构建镜像,主动部署到服务器。应用 GitHub Action 实现此性能。

1、后端

首先在我的项目根目录筹备 Dockerfile, 将我的项目从源代码开始构建为二进制。

DockerfileFROM golang:1.18.0-alpine3.15 as buildLABEL maintainer="117503445"RUN apk add --no-cache gitWORKDIR /root/projectCOPY go.mod .COPY go.sum .RUN go mod downloadCOPY . .RUN go build -ldflags="-s -w" -o serverFROM alpine:3.15 as prodEXPOSE 8080WORKDIR /root#   https://stackoverflow.com/questions/66963068/docker-alpine-executable-binary-not-found-even-if-in-pathRUN apk add gcompatCOPY --from=build /root/project/server serverHEALTHCHECK --interval=5s --timeout=5s --retries=3 \    CMD wget -nv -t1   --spider 'http://localhost:8080/' || exit 1ENTRYPOINT ./server

编写 GitHub Action,并在 Repo 中的 secrets 填写 阿里云容器镜像服务的 AK 和 SK。这里通过批改,也能够变为上传至 Docker Hub。

.github/workflows/docker.yml

Perlname: Build and Deploy to ACKon:  push:    branches:      - main# Environment variables available to all jobs and steps in   this workflow.env:  REGION_ID:   cn-chengdu  REGISTRY:   registry.cn-chengdu.aliyuncs.com  NAMESPACE:   wizz-project  IMAGE:   experiment-helper-backend  TAG: ${{   github.sha }}jobs:  build:    runs-on:   ubuntu-latest    environment:   production    steps:      - name:   Checkout        uses:   actions/checkout@v2              # 1.1 Login to   ACR      - name: Login   to ACR with the AccessKey pair        uses:   aliyun/acr-login@v1        with:          region-id:   "${{ env.REGION_ID }}"            access-key-id: "${{ secrets.ACCESS_KEY_ID }}"            access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}"                  # 1.2 Buid and   push image to ACR      - name: Build   and push image to ACR        run: |          docker   build --tag "$REGISTRY/$NAMESPACE/$IMAGE:$TAG" .           docker   push "$REGISTRY/$NAMESPACE/$IMAGE:$TAG"          docker tag   "$REGISTRY/$NAMESPACE/$IMAGE:$TAG"   "$REGISTRY/$NAMESPACE/$IMAGE:latest"          docker   push "$REGISTRY/$NAMESPACE/$IMAGE:latest"

每次在 main 分支 commit 后, 都会触发 GitHub Action,并将镜像推送至阿里云容器服务。也能够依据 GitHub Flow 等分支管理策略,批改触发条件。

在实现 Docker 镜像的推送后,能够应用 Watchtower 实现镜像的主动拉取、更新。同样应用 docker-compose.yml 部署 Watchtower。

/root/.docker/compose/watchtower/docker-compose.yml
YAMLversion: "3.3"services:  watchtower:    image:   containrrr/watchtower    restart:   unless-stopped    volumes:      -   /var/run/docker.sock:/var/run/docker.sock      -   ~/.docker/config.json:/config.json    command:   --interval 60 --cleanup --debug

2、前端

同样应用 GitHub Action,每次产生代码提交后,都进行构建,再将 dist 文件夹上传至 OSS。

.github/workflows/oss.yml

HTTPname: osson:  push:    branches:      - mainjobs:  build:    runs-on:   ubuntu-latest    steps:      - name:   checkout        uses:   actions/checkout@v1      - name:   install node        uses:   actions/setup-node@v2        with:            node-version: "14"      - name: build   dist        run: |          npm   install -g yarn          yarn   install          yarn build      - name: upload   files to OSS        uses:   fangbinwei/aliyun-oss-website-action@v1        with:          accessKeyId:   ${{ secrets.ACCESS_KEY_ID }}            accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}          bucket:   experiment-helper-mobile          endpoint:   https://oss-cn-hangzhou.aliyuncs.com          folder:   ./dist/build/h5  

五、日志治理

对于更大规模的生产环境,可能须要ELK或者阿里云日志服务等业余的日志解决方案,然而这些解决方案对于本应用场景来说过重了。

咱们的指标为,每个利用的开发者都能够下载到本人利用的日志文件。作者开发过一个小工具,https://github.com/117503445/...。

GoWebDAV 能够将服务器上的文件夹以 WebDAV 的模式裸露进去,并反对浏览器在线拜访、挂载多个门路、门路粒度的 Basic Auth 及只读管制。对于这个场景,小工具也能够轻松解决需要。

在上述 orientation-system 我的项目的部署中,能够察看到将镜像内的 /root/lab.log 挂载到了宿主机的 ~/.docker/volume/orientation-system-be/lab.log;接着部署GoWebDAV。相干配置规定可查看 repo 上的 README。

/root/.docker/compose/watchtower/docker-compose.yml
YAMLversion: "3.3"services:  webdav:    image:   117503445/go_webdav    restart:   unless-stopped    volumes:      -   ~/.docker/volume/orientation-system-be:/root/orientation-system-be    environment:      -   dav=/orientation-system-be,/root/orientation-system-be,user1,pass1,true    networks:      - traefik    labels:      -   "traefik.enable=true"      -   "traefik.http.routers.webdav.rule=Host(`webdav.be.wizzstudio.com`)"      -   "traefik.http.routers.webdav.tls=true"      -   "traefik.http.services.webdav.loadbalancer.server.port=80"networks:  traefik:    external: true

通过这样配置,开发者就能够通过拜访 https://webdav.be.wizzstudio.... 拜访日志文件了。用户名 user1,明码 pass1,而且只具备只读权限。

同一个 GoWebDAV 镜像反对多个文件夹门路,因而服务器上只用部署 1 个 GoWebDAV 即可。

六、总结

本文给出了中小型我的项目的运维计划,介绍了架构设计的思路及我的项目施行部署,以及CI/CD、日志治理方面的实际分享,实用于集体开发者和小微公司高并发需要低、资源占用低的利用部署,心愿大家能有所播种。

点击这里,查看全新降级的轻量应用服务器征文活动,处分更丰盛,月月可投稿。