diff --git a/.gitea/workflows/beszel-agent-gpu.yml b/.gitea/workflows/beszel-agent-gpu.yml new file mode 100644 index 0000000..e1ae739 --- /dev/null +++ b/.gitea/workflows/beszel-agent-gpu.yml @@ -0,0 +1,70 @@ +name: beszel-agent-gpu image + +on: + push: + paths: + - beszel-agent-gpu/** + schedule: + - cron: '30 2 * * 0' # 02:30 sáng Chủ nhật (UTC), lệch giờ với gitea-mcp + workflow_dispatch: # Cho phép chạy tay nếu cần + +env: + IMAGE_REPO: git.thuanle.me/public/beszel-agent-gpu + IMAGE: beszel-agent-gpu + +jobs: + build: + strategy: + matrix: + arch: + # GPU NVIDIA chỉ có trên máy amd64 (server ta) + - amd64 + runs-on: ${{ matrix.arch }} + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Login to Docker Registry + uses: docker/login-action@v4 + with: + registry: git.thuanle.me + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build Docker images + run: | + echo "Building image ${{ env.IMAGE }} for architecture: ${{ matrix.arch }}" + + # --pull: luôn lấy binary / base image mới nhất, đây là cơ chế + # update hàng tuần của image này + docker build \ + --pull \ + -f ${{ env.IMAGE }}/Dockerfile \ + -t ${{ env.IMAGE_REPO }}:${{ matrix.arch }}-latest \ + --label "build_date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ + --label "commit_sha=${{ github.sha }}" \ + ${{ env.IMAGE }} + + docker push ${{ env.IMAGE_REPO }}:${{ matrix.arch }}-latest + + amend-manifest: + runs-on: linux + needs: [build] + steps: + - name: Login to Docker Registry + uses: docker/login-action@v4 + with: + registry: git.thuanle.me + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Push Docker manifest + run: | + echo "Delete existing manifest" + docker manifest rm ${{ env.IMAGE_REPO }}:latest || true + + echo "Create new manifest" + docker manifest create ${{ env.IMAGE_REPO }}:latest \ + ${{ env.IMAGE_REPO }}:amd64-latest + + docker manifest push ${{ env.IMAGE_REPO }}:latest diff --git a/.gitea/workflows/02-gitea-mcp.yml b/.gitea/workflows/gitea-mcp.yml similarity index 81% rename from .gitea/workflows/02-gitea-mcp.yml rename to .gitea/workflows/gitea-mcp.yml index 17b99fd..c6b35c5 100644 --- a/.gitea/workflows/02-gitea-mcp.yml +++ b/.gitea/workflows/gitea-mcp.yml @@ -1,13 +1,16 @@ -name: docker-node image +name: gitea-mcp image on: - push: + push: + paths: + - gitea-mcp/** schedule: - - cron: '0 2 * * 0' # 00:00 sáng Chủ nhật (UTC) + - cron: '0 2 * * 0' # 02:00 sáng Chủ nhật (UTC) workflow_dispatch: # Cho phép chạy tay nếu cần env: IMAGE_REPO: git.thuanle.me/public/gitea-mcp + IMAGE: gitea-mcp jobs: build: @@ -30,15 +33,15 @@ jobs: - name: Build Docker images run: | - echo "Building image ${{ env.IMAGE_REPO }} for architecture: ${{ matrix.arch }}" + echo "Building image ${{ env.IMAGE }} for architecture: ${{ matrix.arch }}" docker build \ - -f gitea-mcp.Dockerfile \ + -f ${{ env.IMAGE }}/Dockerfile \ --build-arg TARGETARCH=${{ matrix.arch }} \ -t ${{ env.IMAGE_REPO }}:${{ matrix.arch }}-latest \ --label "build_date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ --label "commit_sha=${{ github.sha }}" \ - . + ${{ env.IMAGE }} docker push ${{ env.IMAGE_REPO }}:${{ matrix.arch }}-latest @@ -62,4 +65,4 @@ jobs: docker manifest create ${{ env.IMAGE_REPO }}:latest \ ${{ env.IMAGE_REPO }}:arm64-latest - docker manifest push ${{ env.IMAGE_REPO }}:latest \ No newline at end of file + docker manifest push ${{ env.IMAGE_REPO }}:latest diff --git a/README.md b/README.md index 99bf24e..1787e54 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,36 @@ Repo này nhằm để build lại các Docker image hay dùng, đồng thời tự động cập nhật theo lịch hàng tuần. +## Cấu trúc + +Mỗi image nằm trong một thư mục riêng, kèm workflow riêng build khi có thay đổi liên quan: + +- Dockerfile: `/Dockerfile` (chi tiết xem `/README.md`) +- Workflow: `.gitea/workflows/.yml` — chạy khi push thay đổi `/**` và theo lịch cron hằng tuần + ## Images ### gitea-mcp -Registry: `git.thuanle.me/public/image:gitea-mcp-latest` - -Image chạy [gitea-mcp](https://gitea.com/gitea/gitea-mcp) — MCP server cho Gitea. - -- Base: `alpine:latest` -- Tự động lấy phiên bản mới nhất từ Gitea releases khi build -- Hỗ trợ kiến trúc: `amd64`, `arm64`, `i386` +- Registry: `git.thuanle.me/public/gitea-mcp:latest` +- Dockerfile: [gitea-mcp/Dockerfile](gitea-mcp/Dockerfile) +- Image chạy [gitea-mcp](https://gitea.com/gitea/gitea-mcp) — MCP server cho Gitea. +- Base: `alpine:latest`, tự động lấy phiên bản mới nhất từ Gitea releases khi build +- Hỗ trợ kiến trúc: `arm64` - Build tự động mỗi Chủ nhật lúc 02:00 UTC -**Chạy:** - ```bash -docker run --rm git.thuanle.me/public/image:gitea-mcp-latest --help +docker run --rm git.thuanle.me/public/gitea-mcp:latest --help ``` +### beszel-agent-gpu + +- Registry: `git.thuanle.me/public/beszel-agent-gpu:latest` +- Dockerfile: [beszel-agent-gpu/Dockerfile](beszel-agent-gpu/Dockerfile) +- [beszel-agent](https://github.com/henrygd/beszel) chạy trong môi trường glibc để thu thập GPU stats NVIDIA (image chính thức là distroless nên không chạy được `nvidia-smi`). +- Chỉ build cho `amd64` (dành cho server có GPU NVIDIA, hiện là `ta`) +- Build lại mỗi Chủ nhật lúc 02:30 UTC với `--pull` để lấy binary agent mới nhất; server tiêu thụ qua watchtower + +## Update + +- Repo được build lại hàng tuần theo cron của từng workflow. diff --git a/beszel-agent-gpu/Dockerfile b/beszel-agent-gpu/Dockerfile new file mode 100644 index 0000000..78a6e62 --- /dev/null +++ b/beszel-agent-gpu/Dockerfile @@ -0,0 +1,21 @@ +# beszel-agent chính thức chạy trong môi trường có glibc. +# +# Tại sao không dùng henrygd/beszel-agent trực tiếp: image chính thức là +# distroless (không có glibc / dynamic linker) nên nvidia-smi được NVIDIA +# Container Toolkit inject vào container (binary link glibc) không thể exec, +# và binary phát hành build không có tag `glibc` nên NVML chỉ là stub — +# GPU NVIDIA do đó không bao giờ được báo cáo. Ubuntu cung cấp glibc cho +# phép nvidia-smi chạy để agent thu thập GPU stats. +FROM ubuntu:24.04 + +# TLS: image ubuntu gốc không kèm CA bundle, thiếu nó agent không verify được +# chứng chỉ của hub (x509: certificate signed by unknown authority). +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Binary Go tĩnh từ image chính thức + bảng id GPU AMD (giữ parity). +COPY --from=henrygd/beszel-agent /agent /agent +COPY --from=henrygd/beszel-agent /usr/share/libdrm/amdgpu.ids /usr/share/libdrm/amdgpu.ids + +ENTRYPOINT ["/agent"] diff --git a/beszel-agent-gpu/README.md b/beszel-agent-gpu/README.md new file mode 100644 index 0000000..f879dca --- /dev/null +++ b/beszel-agent-gpu/README.md @@ -0,0 +1,41 @@ +# beszel-agent-gpu + +[beszel-agent](https://github.com/henrygd/beszel) chạy trong môi trường glibc để thu thập được GPU stats NVIDIA, thay cho image distroless chính thức (xem chú thích trong [Dockerfile](Dockerfile)). + +## Tags + +- `git.thuanle.me/public/beszel-agent-gpu:latest` — manifest trỏ `amd64-latest` +- `git.thuanle.me/public/beszel-agent-gpu:amd64-latest` + +## Sử dụng (server có NVIDIA GPU) + +```yaml +services: + beszel-agent: + image: git.thuanle.me/public/beszel-agent-gpu:latest + container_name: beszel-agent + restart: unless-stopped + labels: + - com.centurylinklabs.watchtower.enable=true + network_mode: host + # GPU: agent chạy nvidia-smi do NVIDIA Container Toolkit inject + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./beszel_agent_data:/var/lib/beszel-agent + environment: + LISTEN: 45876 + KEY: '' + HUB_URL: https://bz.thuanle.me +``` + +## Update + +- Build lại tự động mỗi Chủ nhật 02:30 UTC với `--pull` — luôn lấy binary agent mới nhất từ `henrygd/beszel-agent`. +- Server tiêu thụ (ta) chạy watchtower `--label-enable`, nên container tự update sau khi image mới được push. diff --git a/gitea-mcp.Dockerfile b/gitea-mcp/Dockerfile similarity index 100% rename from gitea-mcp.Dockerfile rename to gitea-mcp/Dockerfile diff --git a/gitea-mcp/README.md b/gitea-mcp/README.md new file mode 100644 index 0000000..7edf22a --- /dev/null +++ b/gitea-mcp/README.md @@ -0,0 +1,12 @@ +# gitea-mcp + +Image chase [gitea-mcp](https://gitea.com/gitea/gitea-mcp) — MCP server cho Gitea. + +- Base: `alpine:latest`, tự tải binary phiên bản mới nhất từ Gitea releases khi build +- Hỗ trợ kiến trúc: `arm64` +- Tags: `git.thuanle.me/public/gitea-mcp:latest`, `:arm64-latest` +- Build tự động mỗi Chủ nhật lúc 02:00 UTC + +```bash +docker run --rm git.thuanle.me/public/gitea-mcp:latest --help +```