基地的git仓库发生了一些变动,只有一个gitea仓库留下来了,博客仓库还在,故此番折腾完成从仓库自动更新博客网页

请自行安装dockerdocker-compose,遇上了几个大坑,费我一天时间,气死了气死了气死了

一、部署gitea

1.启用ssh支持

你可以参看官方教程SSH 容器直通或者直接使用下面的指令

  • 创建一个名叫git的账户

    sudo adduser git
    
  • 查看USER_UIDUSER_GID的值

    id git
    
  • 创建 SSH 密钥对

    sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
    
  • 打开/usr/local/bin/gitea写入以下内容 sudo vim /usr/local/bin/gitea

    ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
    
  • 添加权限

    sudo chmod +x /usr/local/bin/gitea
    
  • sudo -i进入管理员输入下面的指令

    echo "$(cat /home/git/.ssh/id_rsa.pub)" >> /home/git/.ssh/authorized_keys
    

    ctrl+D退出管理员模式

2.docker 启动

docker-compose.yml文件

  • USER_UID/USER_GID按上面查询的修改

  • 注意./gitea是放置gitea数据文件的地方,如果基地有遗传数据,修改路径即可

version: "3"

networks:
  gitea:
    external: false

services:
   server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1001  # 这是git用户的uid,详见https://docs.gitea.cn/installation/install-with-docker/#ssh-%E5%AE%B9%E5%99%A8%E7%9B%B4%E9%80%9A
      - USER_GID=1001  # 这是git用户组的gid
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /home/git/.ssh/:/data/git/.ssh
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "8080:3000"
      - "127.0.0.1:2222:22"

启动docker

docker-compose up -d

需要用ngix反代域名到8080端口

3.修改参数

配置文件在/gitea/conf/app.ini里面加入

[webhook]
ALLOWED_HOST_LIST = *

[sever]字段中含有域名的填写,如果后续有域名一直对不上的情况,请检查一下

二、启动Drone CI

1.在gitea中获得参数

像如下生成ID和密钥

drone.png

生成会得到ID和密钥

ID就是DRONE_GITEA_CLIENT_ID

密钥是DRONE_GITEA_CLIENT_SECRET,后面会用

Linux下使用openssl rand -hex 16可获得一个32位的token,就是DRONE_RPC_SECRET

2.启动Drone

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITEA_SERVER={你的gitea地址,如https://git.gitea.cn} \
  --env=DRONE_GITEA_CLIENT_ID={上面生成的ID} \
  --env=DRONE_GITEA_CLIENT_SECRET={上面生成的密钥} \
  --env=DRONE_RPC_SECRET={上面生成的32位token} \
  --env=DRONE_SERVER_HOST={drone的地址,如drone.drone.cn} \
  --env=DRONE_SERVER_PROTO={协议,如https} \
  --env=DRONE_GIT_ALWAYS_AUTH=true \
  --publish=6080:80 \
  --publish=6443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2

所有字段不需要引号,直接写

如果出现了什么错误需要删除重启,建议sudo rm -rf /var/lib/drone 清一下之前产生的东西

需要用ngix反代域名到6080端口,用HTTPS也是6080端口

3.启动drone-runner

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO={协议,如https} \
  -e DRONE_RPC_HOST={drone的地址,如drone.drone.cn} \
  -e DRONE_RPC_SECRET={上面生成的32位token} \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=blog_auto \
  -p 6030:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1

6030端口可以随便改

查看日志,正常运行

 ➜  ~ docker logs runner   
time="2024-03-22T11:17:25Z" level=info msg="starting the server" addr=":3000"
time="2024-03-22T11:17:25Z" level=info msg="successfully pinged the remote server"
time="2024-03-22T11:17:25Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="https://drone.xxxxx.cn" kind=pipeline os=linux type=docker

4.访问Drone

访问{drone的地址,如drone.drone.cn},会自动跳转到gitea进行鉴权,点击红色按钮授权即可

选择你的仓库点击ACTIVATE REPOSITORY即启动了工作流

5.编写脚本文件

在HEXO博客仓库根目录下提交.drone.yml文件,内容如下

kind: pipeline
type: docker
name: default

steps:
- name: Hexo Build
  image: node:12-alpine
  commands:
  - npm config set registry https://registry.npmmirror.com
  - npm install
  - npm run build

- name: SCP File Transfer
  image: appleboy/drone-scp
  settings:
    target: /home/blog/blog/
    source: ./public
    host: 
      from_secret: ssh_host
    port: 
      from_secret: ssh_port
    username: 
      from_secret: ssh_username
    password:
      from_secret: ssh_password
    rm: true
  when:
    branch:
    - master
    event:
      exclude:
      - pull_request
  
trigger:
  event:
  - push

target修改为服务器上的某一文件夹,ngix反代到博客网址即可

6.返回Drone配置参数

博客仓库->Settings->Secrets->New secret,勾选Allow Pull Repuest

配置ssh_hostssh_portssh_usernamessh_password四个参数

现在,当有推送时会编译博客,当pr成功时会将博客内容复制到目标文件夹,ngix反代完成实时更新

第一次点new build是会没有反应的,第一次启用后需要在仓库中添加.drone.yml后用个push,让自动完成更新一次

点击右上角new build可以测试

三、使用OwnCloud

顺便搭了个校园网局域网云盘,这玩意儿有点小坑,权限问题

这里我需要把一个机械硬盘持久化挂载在在某一目录并让 owncloud 使用

  • sudo vim /etc/fstab追加如下内容让硬盘挂载持久化

    UUID=7E524C65524C23ED /home/v5/disk_hdd ntfs defaults,utf8,uid=33,gid=33,dmask=007,fmask=007  0 2
    
    • /home/v5/disk_hdd:修改为你想挂载的路径
    • 33:修改为id www-data返回的值
    • 007:意味770,只允许www-data用户访问,不让其他用户访问(设置为770是他的要求,试了个网上的参数改为false也没作用只好按他说的做)
    • lldf -h可以查看权限和挂载结果
  • 启动docker

    docker run -p 7070:80 -d -v /home/v5/disk_hdd/owncloud:/var/www/html --name=owncloud --restart always owncloud
    
    • /home/v5/disk_hdd/owncloud:修改为owncloud使用的文件夹
    • 7070:需要ngix反代到域名
  • 如果直接操作文件夹owncloud/data/{user_name}/files增加文件,需要进行如下操作在网页中才能看见

    • docker exec -it owncloud /bin/bash进入容器
    • su www-data -s /bin/bash -c 'php occ files:scan --all'更新索引文件夹
    • ctrl+D退出容器

总结

我踩的第一个坑是docker run的时候每个字符串加了引号(或许是这个,不是很确定),然后域名当时改了要用git.,一直写的是gitea.,然后一直鉴权失败

第二个坑是gitea的app.ini,可恶,还是域名改了的问题,要从gitea.换成git.,当时就看到Drone运行的时候,我明明docker启动传的参是的git.,但是他就从gitea.仓库里面拉,一直鉴权失败

然后就是如果之前哪出问题了要重新run Drone一定要sudo rm -rf /var/lib/drone ,不然还是会和之前一样

参考教程:

https://blog.moon.re/2021/02/17/Hexo-on-CI-CD-%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E5%AE%9E%E6%88%98%E6%94%BB%E7%95%A5/

https://zhuanlan.zhihu.com/p/467226209

https://koomu.cn/fstab-mount-with-uid-gid-fmask-dmask/