Skip to content
赞赏-微信扫码

代码仓库 gitea

没有用 gitlab,那个太吃资源了。

直到某天无聊翻群晖的应用市场,看到了 gitea,我才开始有属于自己的 git 仓库。所以我的 gitea 是在群晖应用市场安装的,没有装在 k8s 集群内(当然,它的官方文档里有关于在 k8s 集群里安装的方法)。

对于没有安装在 k8s 集群内的应用,为了能享受到集群里全自动 https 的福利,专门在集群里启了个 nginx 做代理。cicd 相关的服务也很需要 https,不然要到处配置允许访问 http 的服务。

nginx 相关配置
client_max_body_size 1G;
large_client_header_buffers 4 16k;

gzip on;
gzip_min_length 1k;
gzip_vary on;
# gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/html text/css text/javascript application/javascript application/json text/xml application/xml application/xml+rss image/svg+xml application/font-sfnt;

server {
    listen 80;
    server_name git.apihub.net;
    if ($http_user_agent ~* "bot|facebook") {
        return 403;
    }
    location /robots.txt {
        return 200 'User-agent: *\nDisallow: /';
    }
    location / {
        proxy_pass http://10.168.1.100:8418;
        
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
server {
    listen 80;
    server_name hb.apihub.net;
    location /v2/ {
        proxy_pass http://10.168.1.100:15000;
    }
    location / {
        proxy_pass http://hb-web:8080;
    }
}
server {
    listen 80;
    server_name mirrors.apihub.net;
    location / {
        proxy_pass http://10.168.1.100:8081;
    }
}

软件源 nexus3

nexus3 不止是 mvn 的镜子仓库,也可以做 npm、pypi 的加速。推荐 B站上的这个up主 的视频,里面有个 nexus3 系列。

这种 重网络和存储、轻计算、还只是内网访问自己一个人用的 应用,我也没有部署在集群里,安装到 群晖 docker 里了。

好的习惯,肯定要把 docker hub + github 里的介绍说明完整看一遍再动手。注意下面这个权限问题。

容器仓库 docker-registry

没有用 harbor。我只是要推拉一下镜像而已。同样是 重网络和存储、轻计算、一个人用 的应用。registry 安装到了 群晖 docker 里。

后来给它配了一个 web 页面,用的 klausmeyer/docker-registry-browser

打包构建 buildkit

没有用 jekins。它是一个功能很庞大的软件。HomeLab 场景下,没有运维团队帮忙,“点一下就构建完成”的背后,感觉需要巨量的运维领域知识的学习成本,很不值得。

HomeLab 场景下,也没有团队协作的负担。我用的 docker 底层的镜像构建工具 buildkit。用 Dockerfile 和 Makefile 实现一个命令行完成打包构建并推送容器镜像。可以复用很多开发岗已有的知识储备。

k8s 里部署 buildkitd

sh
# 容器镜像
moby/buildkit:master

# 参数
--addr tcp://0.0.0.0:1234

# 容器安全上下文
privileged=true

# service 开放端口
1234

不用挂载持久化存储。没事别瞎搞服务器,就一年都不会被重启一次。构建过程中的缓存文件,直接让容器重启后丢失就行了,有 nexus3 内网软件源的加速,已经很快了。

使用 buildkitd

首先,需要写一个 Dockerfile,比如:

Dockerfile
# 使用一个基础镜像
FROM hb.apihub.net/nginx:stable

# 将当前目录下的所有文件复制到镜像的指定路径
COPY ./dist /usr/share/nginx/html

COPY nginx.conf.template /etc/nginx/templates/default.conf.template

# 暴露容器的端口
EXPOSE 80

# 启动Nginx服务器
CMD ["nginx", "-g", "daemon off;"]

然后,要有个 Makefile:

Makefile
build: 
	npm run docs:build
	
	buildctl \
	--addr tcp://buildkitd.cicd.svc.cluster.local:1234 \
	build \
	--frontend dockerfile.v0 \
	--local context=. \
	--local dockerfile=. \
	--output type=image,name=hb.apihub.net/feling.net/pages:1.0.0,push=true

最后,运行 make build 命令就行了。

上面的例子中,make build 先执行了 npm run docs:build 命令,对一个前端项目进行构建,然后 buildctl 命令负责请求集群内的 buildkitd 服务执行 打包构建并推送镜像。

当然不止这一种写法,可以把整个流程都写到 Dockerfile 里。FROM node:22 as builderRUN git clone xxx、再 FROM nginx:stableCOPY --from=builder xx xx

我们需要深入掌握的,只有各种类型项目 Dockerfile 的写法,这可以是研发应具备的技能。Makefile 和 buildctl 命令,都只需要几分钟的时间入门,甚至看完上面那个 Makefile 的例子,就已经入门完了。

todo

buildkitd 实例内部,支持翻墙。FROM hb.apihub.net/nginx:stable 为什么是 hb.apihub.net,因为目前拉不到 docker hub 的镜像。