欢迎光临

VPS自建私有容器镜像仓库与CI/CD流水线:Harbor + Gitea + Drone生产级部署实战

为什么你需要自建容器镜像仓库和CI/CD?

在现代云原生开发中,容器镜像仓库和CI/CD流水线已经成为基础设施的核心组件。Docker Hub的免费额度一再缩减,GitHub Actions的私有仓库运行时间也有严格限制。对于追求代码隐私、构建速度和成本可控的团队来说,在VPS上自建一套完整的DevOps工具链是极具性价比的选择。

本文将带你在一台VPS上完整部署三大核心组件:

  • Harbor — 企业级容器镜像仓库,支持镜像扫描、签名、RBAC权限控制
  • Gitea — 轻量级自托管Git服务,替代GitHub/GitLab
  • Drone — 基于容器的CI/CD引擎,与Gitea深度集成

三者联动后,你将获得:代码推送 → 自动触发构建 → 镜像推送至Harbor → 自动部署的完整流水线。整套系统资源占用极低,2核4G的VPS即可流畅运行。

<imgsrc=”https://tbr8.org/wp-content/uploads/2026/09/article-img-6a187119-v2.jpg”alt=”CI/CD Pipeline Architecture” />

系统准备与架构设计

硬件与系统要求

推荐的VPS配置如下:

组件 最低配置 推荐配置
CPU 2核 4核
内存 4GB 8GB
磁盘 40GB SSD 100GB SSD
系统 Ubuntu 22.04/24.04 Ubuntu 24.04 LTS

Harbor是内存大户,建议至少4GB。如果你的VPS只有2GB内存,可以考虑使用Harbor的精简模式(不启用Trivy扫描和Notary签名)。

架构拓扑

整体架构如下:


1
2
3
4
5
6
7
8
9
10
Internet
    │
    ▼
Nginx Reverse Proxy (443/80)
    │
    ├── harbor.yourdomain.com → Harbor (8080)
    ├── git.yourdomain.com    → Gitea (3000)
    └── drone.yourdomain.com  → Drone (8000)
    │
Docker Network: devops-net

所有服务运行在Docker中,通过Nginx反向代理对外暴露。使用Let’s Encrypt自动签发TLS证书,确保全链路加密。

域名与DNS准备

你需要准备三个子域名,并指向你的VPS IP:


1
2
3
harbor.yourdomain.com   A记录 → VPS_IP
git.yourdomain.com      A记录 → VPS_IP
drone.yourdomain.com    A记录 → VPS_IP

如果你的DNS服务商支持泛域名,可以直接设置

1
*.yourdomain.com

指向VPS。

基础环境搭建:Docker + Nginx + Certbot

安装Docker Engine

首先清理系统上可能存在的旧版Docker,然后安装官方版本:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密钥和仓库
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
docker --version
docker compose version

配置Nginx反向代理

创建统一的Nginx配置,处理三个子域名的反向代理和TLS终止:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 安装Nginx和Certbot
sudo apt-get install -y nginx certbot python3-certbot-nginx

# 创建Nginx配置
cat > /etc/nginx/sites-available/devops << 'EOF'
# Harbor
server {
    listen 80;
    server_name harbor.yourdomain.com;
    client_max_body_size 0;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

# Gitea
server {
    listen 80;
    server_name git.yourdomain.com;
    client_max_body_size 100M;
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# Drone
server {
    listen 80;
    server_name drone.yourdomain.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
EOF

sudo ln -sf /etc/nginx/sites-available/devops /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

签发TLS证书

使用Certbot一键签发Let’s Encrypt证书并自动配置HTTPS:


1
2
3
4
sudo certbot --nginx -d harbor.yourdomain.com -d git.yourdomain.com -d drone.yourdomain.com --non-interactive --agree-tos -m your@email.com

# 设置自动续期
sudo systemctl enable certbot.timer

证书签发成功后,Nginx会自动配置443端口和SSL参数。你可以通过

1
sudo certbot certificates

查看证书状态。

<imgsrc=”https://tbr8.org/wp-content/uploads/2026/09/article-img-3ec05a67-v2.jpg”alt=”Server Infrastructure” />

部署Harbor企业级镜像仓库

下载与配置Harbor

Harbor是VMware开源的企业级Docker Registry,功能远超原生Registry:

  • 基于项目的RBAC权限管理
  • 镜像漏洞扫描(集成Trivy)
  • 镜像签名与内容信任(Notary)
  • 镜像复制与同步(跨仓库/跨云)
  • 操作审计日志
  • 垃圾回收与镜像清理

1
2
3
4
5
6
7
8
# 下载Harbor安装包
HARBOR_VERSION=2.11.0
wget https://github.com/goharbor/harbor/releases/download/v${HARBOR_VERSION}/harbor-online-installer-v${HARBOR_VERSION}.tgz
tar xzf harbor-online-installer-v${HARBOR_VERSION}.tgz
cd harbor

# 编辑配置文件
cp harbor.yml.tmpl harbor.yml

修改

1
harbor.yml

关键配置:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# harbor.yml
hostname: harbor.yourdomain.com

http:
  port: 8080

# 注释掉https段,TLS由Nginx处理
# https:
#   port: 443
#   certificate: /your/cert/path
#   private_key: /your/key/path

# 管理员初始密码
harbor_admin_password: YourStr0ngP@ssw0rd

# 数据存储路径
data_volume: /data/harbor

# 如果内存有限,禁用Trivy和Notary
# 在安装时使用: ./install.sh --with-trivy --with-notary
# 精简模式: ./install.sh (不带额外参数)

启动Harbor


1
2
3
4
5
6
7
8
9
10
11
# 标准安装(推荐,含漏洞扫描)
./install.sh --with-trivy

# 精简安装(内存不足时使用)
./install.sh

# 检查服务状态
docker compose ps

# 查看日志
docker compose logs -f

启动完成后,访问

1
https://harbor.yourdomain.com

,使用

1
admin / YourStr0ngP@ssw0rd

登录。

Harbor初始化配置

登录后在Web界面完成以下配置:

  1. 修改管理员密码 — 首次登录强制修改
  2. 创建项目 — 点击「新建项目」,创建私有项目
    1
    myapp
  3. 创建用户与权限 — 在「系统管理 → 用户」创建CI/CD专用账户
    1
    drone-ci

    ,在项目中赋予该账户「开发者」角色

  4. 配置Robot Account — 在项目设置中创建Robot Account,生成推送镜像的凭证(推荐用于CI/CD,而非使用真实用户密码)

客户端Docker登录配置

由于Harbor使用自签证书或通过Nginx代理,需要在Docker客户端配置信任:


1
2
3
4
5
6
7
8
9
10
11
# 方法1:通过Nginx代理(推荐,无需额外配置)
docker login harbor.yourdomain.com

# 方法2:如果直接暴露Harbor HTTPS端口
sudo mkdir -p /etc/docker/certs.d/harbor.yourdomain.com
# 将CA证书拷贝到上述目录

# 测试推送镜像
docker pull alpine:latest
docker tag alpine:latest harbor.yourdomain.com/myapp/alpine:latest
docker push harbor.yourdomain.com/myapp/alpine:latest

部署Gitea轻量级Git服务

Docker Compose部署Gitea

Gitea是一个用Go编写的轻量级Git服务,内存占用仅100MB左右,非常适合VPS环境:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mkdir -p /opt/gitea
cat > /opt/gitea/docker-compose.yml << 'EOF'
version: "3.8"

networks:
  devops-net:
    external: true

services:
  gitea:
    image: gitea/gitea:1.22
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__server__ROOT_URL=https://git.yourdomain.com/
      - GITEA__server__SSH_DOMAIN=git.yourdomain.com
      - GITEA__server__SSH_PORT=2222
      - GITEA__server__LFS_START_SERVER=true
      - GITEA__database__DB_TYPE=sqlite3
      - GITEA__security__INSTALL_LOCK=true
    volumes:
      - ./gitea-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:22"
    networks:
      - devops-net
    restart: always
EOF

# 创建网络并启动
docker network create devops-net 2>/dev/null || true
cd /opt/gitea
docker compose up -d

Gitea初始化配置

访问

1
https://git.yourdomain.com

,首次访问会进入安装页面:

  • 数据库类型选择SQLite3(VPS环境足够)
  • 域名填写
    1
    git.yourdomain.com
  • SSH端口填写
    1
    2222
  • 管理员账户自行设定,记住用户名和密码

安装完成后,进入「管理后台 → 应用 → 管理 OAuth2 应用」,创建一个OAuth2应用供Drone使用:


1
2
3
应用名称: Drone CI
重定向URI: https://drone.yourdomain.com/login
# 记录生成的Client ID和Client Secret

SSH克隆配置

使用非标准SSH端口时,客户端需要配置:


1
2
3
4
5
6
7
8
# ~/.ssh/config
Host git.yourdomain.com
    Port 2222
    User git
    IdentityFile ~/.ssh/id_ed25519

# 克隆测试
git clone git@git.yourdomain.com:username/myapp.git

<imgsrc=”https://tbr8.org/wp-content/uploads/2026/09/article-img-54629b4b-v2.jpg”alt=”Code Development” />

部署Drone CI/CD引擎

Drone Server与Runner

Drone采用Server + Runner分离架构。Server负责Web界面和API,Runner负责实际执行构建任务:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
mkdir -p /opt/drone
cat > /opt/drone/docker-compose.yml << 'EOF'
version: "3.8"

networks:
  devops-net:
    external: true

services:
  drone-server:
    image: drone/drone:2.25
    container_name: drone-server
    environment:
      - DRONE_GITEA_SERVER=https://git.yourdomain.com
      - DRONE_GITEA_CLIENT_ID=YOUR_GITEA_CLIENT_ID
      - DRONE_GITEA_CLIENT_SECRET=YOUR_GITEA_CLIENT_SECRET
      - DRONE_RPC_SECRET=$(openssl rand -hex 16)
      - DRONE_SERVER_HOST=drone.yourdomain.com
      - DRONE_SERVER_PROTO=https
      - DRONE_USER_CREATE=username:your-gitea-admin,admin:true
      - DRONE_GIT_ALWAYS_AUTH=false
    volumes:
      - ./drone-data:/data
    ports:
      - "8000:80"
    networks:
      - devops-net
    restart: always

  drone-runner:
    image: drone/drone-runner-docker:1.8
    container_name: drone-runner
    environment:
      - DRONE_RPC_PROTO=https
      - DRONE_RPC_HOST=drone.yourdomain.com
      - DRONE_RPC_SECRET=SAME_AS_ABOVE_RPC_SECRET
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=docker-runner
      - DRONE_RUNNER_NETWORK=devops-net
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - devops-net
    restart: always
EOF

# 生成RPC密钥并替换
RPC_SECRET=$(openssl rand -hex 16)
sed -i "s/\$(openssl rand -hex 16)/$RPC_SECRET/g" /opt/drone/docker-compose.yml
sed -i "s/SAME_AS_ABOVE_RPC_SECRET/$RPC_SECRET/g" /opt/drone/docker-compose.yml

# 填入Gitea OAuth信息
# 手动编辑替换 YOUR_GITEA_CLIENT_ID 和 YOUR_GITEA_CLIENT_SECRET

cd /opt/drone
docker compose up -d

Drone授权与仓库激活

访问

1
https://drone.yourdomain.com

,点击「继续」跳转至Gitea进行OAuth授权。授权后回到Drone,在仓库列表中找到你的项目,点击「ACTIVATE」激活。

激活后进入仓库设置,确认以下配置:

  • Trusted — 勾选(允许Pipeline使用挂载卷等特权操作)
  • Configuration — 默认
    1
    .drone.yml

Harbor凭证配置

在Drone仓库的Secrets中添加Harbor登录凭证,供Pipeline推送镜像时使用:


1
2
3
4
# 在Drone Web界面的仓库 Secrets 中添加:
# Name: harbor_username  Value: drone-ci
# Name: harbor_password  Value: your-harbor-password
# Name: harbor_registry  Value: harbor.yourdomain.com

编写CI/CD流水线:从代码到部署

完整的.drone.yml示例

以下是一个生产级的Drone流水线配置,涵盖构建、测试、安全扫描和推送全流程:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
kind: pipeline
type: docker
name: build-and-deploy

steps:
  # 1. 代码检查与单元测试
  - name: test
    image: golang:1.22-alpine
    commands:
      - go mod download
      - go vet ./...
      - go test -v -race -coverprofile=coverage.out ./...
      - go tool cover -func=coverage.out
    when:
      event:
        include: [push, pull_request]

  # 2. 构建Docker镜像
  - name: build
    image: plugins/docker
    settings:
      registry: harbor.yourdomain.com
      repo: harbor.yourdomain.com/myapp/myapp
      tags:
        - ${DRONE_COMMIT_SHA:0:8}
        - latest
      dockerfile: Dockerfile
      username:
        from_secret: harbor_username
      password:
        from_secret: harbor_password
    when:
      event: push
      branch: main

  # 3. 镜像漏洞扫描
  - name: scan
    image: aquasec/trivy:latest
    commands:
      - trivy image --exit-code 1 --severity HIGH,CRITICAL harbor.yourdomain.com/myapp/myapp:${DRONE_COMMIT_SHA:0:8}
    when:
      event: push
      branch: main

  # 4. 部署到目标服务器
  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host: your-server-ip
      username: deploy
      key:
        from_secret: deploy_ssh_key
      script:
        - docker pull harbor.yourdomain.com/myapp/myapp:latest
        - docker stop myapp && docker rm myapp
        - docker run -d --name myapp --restart always -p 8081:8080 harbor.yourdomain.com/myapp/myapp:latest
    when:
      event: push
      branch: main

trigger:
  branch:
    - main
    - develop

多环境流水线设计

对于需要区分开发/预发/生产环境的团队,推荐使用Drone的矩阵构建:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
kind: pipeline
type: docker
name: deploy-${DRONE_DEPLOY_TO}

steps:
  - name: build-and-push
    image: plugins/docker
    settings:
      registry: harbor.yourdomain.com
      repo: harbor.yourdomain.com/myapp/myapp
      tags:
        - ${DRONE_DEPLOY_TO}-${DRONE_COMMIT_SHA:0:8}
      username:
        from_secret: harbor_username
      password:
        from_secret: harbor_password

  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host:
        from_secret: ${DRONE_DEPLOY_TO}_host
      username: deploy
      key:
        from_secret: deploy_ssh_key
      script:
        - docker compose -f /opt/myapp/docker-compose.${DRONE_DEPLOY_TO}.yml up -d

trigger:
  event:
    - promote
  target:
    - staging
    - production

触发方式:在Drone Web界面点击「Promote」,选择目标环境即可触发对应部署。

Harbor高级配置:镜像安全与治理

漏洞扫描策略

Harbor集成的Trivy扫描器可以自动检测镜像中的已知漏洞(CVE)。在项目配置中设置扫描策略:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 在Harbor Web界面:项目 → 配置 → 漏洞扫描
# 设置自动扫描:推送时自动扫描
# 设置漏洞阈值:
#   - 严重(Critical)漏洞 → 阻止拉取
#   - 高危(High)漏洞 → 仅警告

# CLI方式配置(通过Harbor API)
curl -X PUT "https://harbor.yourdomain.com/api/v2.0/projects/myapp" \
  -H "Authorization: Basic $(echo -n 'admin:password' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "metadata": {
      "auto_scan": "true",
      "prevent_vul": "true",
      "severity": "critical"
    }
  }'

镜像标签保留策略

避免镜像无限膨胀,设置自动清理规则:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在Harbor Web界面:项目 → 标签保留
# 规则示例:
#   - 保留最近10个标签
#   - 保留匹配 v* 的所有标签(发布版本)
#   - 超过30天的无标签镜像自动清理

# 也可以通过API配置
curl -X POST "https://harbor.yourdomain.com/api/v2.0/retentions" \
  -H "Authorization: Basic $(echo -n 'admin:password' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "scope": {"level": "project", "ref": 1},
    "rules": [
      {
        "action": "retain",
        "params": {"latestK": 10},
        "scope_selectors": {"repository": [{"kind": "doublestar", "pattern": "**"}]},
        "tag_selectors": [{"kind": "doublestar", "pattern": "**"}]}
    ]
  }'

镜像复制(跨仓库同步)

如果你有多台VPS或需要同步到公有云仓库,Harbor的复制功能非常强大:


1
2
3
4
5
6
# 在Harbor Web界面:系统管理 → 复制 → 新建规则
# 示例:将myapp项目的main分支镜像同步到阿里云ACR
# 源:harbor.yourdomain.com/myapp/*
# 目标:registry.cn-hangzhou.aliyuncs.com/myapp/*
# 触发模式:事件驱动(推送即同步)
# 过滤:tag匹配 v*

<imgsrc=”https://tbr8.org/wp-content/uploads/2026/09/article-img-54629b4b-v2-1.jpg”alt=”Technology and Data” />

运维与监控最佳实践

Harbor垃圾回收

Docker镜像的层(Layer)是共享的,删除标签不会自动删除无引用的层。需要定期执行垃圾回收:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 手动触发GC(在Harbor Web界面:系统管理 → 垃圾回收)
# 或通过API:
curl -X POST "https://harbor.yourdomain.com/api/v2.0/system/gc/schedule" \
  -H "Authorization: Basic $(echo -n 'admin:password' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "schedule": {
      "type": "Hourly",
      "cron": "0 0 * * *"
    },
    "delete_untagged": true
  }'

# 查看GC状态
curl -s "https://harbor.yourdomain.com/api/v2.0/system/gc" \
  -H "Authorization: Basic $(echo -n 'admin:password' | base64)" | python3 -m json.tool

统一备份脚本

创建一个定时备份脚本,保护你的代码仓库和镜像仓库数据:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
# /opt/backup/devops-backup.sh
set -euo pipefail

BACKUP_DIR="/data/backups/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"

# 备份Gitea
echo "[1/3] Backing up Gitea..."
cd /opt/gitea
docker compose exec -T gitea gitea dump -c /data/gitea/conf/app.ini \
  > "$BACKUP_DIR/gitea-dump.tar.gz" 2>/dev/null || \
  tar czf "$BACKUP_DIR/gitea-data.tar.gz" ./gitea-data/

# 备份Harbor数据库和配置
echo "[2/3] Backing up Harbor..."
cp /opt/harbor/harbor.yml "$BACKUP_DIR/"
cd /opt/harbor && docker compose exec -T harbor-db \
  pg_dump -U postgres registry > "$BACKUP_DIR/harbor-db.sql" 2>/dev/null || \
  echo "Harbor DB backup skipped (SQLite mode)"

# 备份Drone数据
echo "[3/3] Backing up Drone..."
tar czf "$BACKUP_DIR/drone-data.tar.gz" -C /opt/drone drone-data/

# 清理7天前的备份
find /data/backups -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +

echo "Backup completed: $BACKUP_DIR"
du -sh "$BACKUP_DIR"

1
2
3
# 加入crontab,每天凌晨3点执行
crontab -e
# 添加:0 3 * * * /opt/backup/devops-backup.sh >> /var/log/devops-backup.log 2>&1

健康检查与告警

利用简单的健康检查脚本,当任一服务不可用时发送通知:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# /opt/monitor/devops-health.sh
SERVICES=(
  "Harbor|https://harbor.yourdomain.com/api/v2.0/systeminfo"
  "Gitea|https://git.yourdomain.com/api/v1/version"
  "Drone|https://drone.yourdomain.com/api/system/status"
)

ALERT_WEBHOOK="https://your-webhook-url"  # Telegram/Slack/DingTalk

for service in "${SERVICES[@]}"; do
  IFS='|' read -r name url <<< "$service"
  status=$(curl -sf -o /dev/null -w '%{http_code}' "$url" --max-time 10)
  if [ "$status" != "200" ]; then
    curl -sf -X POST "$ALERT_WEBHOOK" \
      -H 'Content-Type: application/json' \
      -d "{"text": "⚠️ $name 服务异常 (HTTP $status)"}"
  fi
done

性能调优与故障排查

Harbor性能优化

当镜像仓库使用量增大后,以下优化可显著提升性能:

  • Redis缓存 — Harbor默认使用本地Redis,确保分配足够内存(建议512MB以上)
  • PostgreSQL调优 — 修改
    1
    harbor.yml

    中的数据库连接池参数

  • 存储后端 — 默认文件系统存储。如需更高性能,可切换至S3/MinIO后端
  • 并发上传 — Docker客户端配置
    1
    --disable-content-trust

    加速推送


1
2
3
4
5
6
7
8
9
10
11
12
# Harbor docker-compose.override.yml 切换S3存储
cat > /opt/harbor/docker-compose.override.yml << 'EOF'
services:
  registry:
    environment:
      REGISTRY_STORAGE: s3
      REGISTRY_STORAGE_S3_REGION: us-east-1
      REGISTRY_STORAGE_S3_BUCKET: harbor-bucket
      REGISTRY_STORAGE_S3_ACCESSKEY: YOUR_ACCESS_KEY
      REGISTRY_STORAGE_S3_SECRETKEY: YOUR_SECRET_KEY
      REGISTRY_STORAGE_S3_REGIONENDPOINT: https://s3.us-east-1.amazonaws.com
EOF

常见问题排查

问题 原因 解决方法
Docker push报401 登录凭证过期或错误
1
docker logout

后重新

1
docker login
Harbor磁盘满 镜像层未清理 执行GC并配置标签保留策略
Drone构建卡住 Runner资源不足 增加DRONE_RUNNER_CAPACITY或部署额外Runner
Gitea SSH无法连接 SSH端口映射错误 确认2222端口映射和客户端SSH配置
镜像扫描超时 Trivy数据库下载慢 配置Trivy离线数据库或镜像源
Nginx 502错误 后端服务未启动 检查

1
docker compose ps

并重启异常容器

总结:打造属于你的DevOps平台

通过本文的完整部署,你已经在VPS上搭建了一套生产级的DevOps工具链:

  1. Harbor 提供安全的私有镜像仓库,支持漏洞扫描和镜像治理
  2. Gitea 提供轻量的代码托管服务,完全掌控代码隐私
  3. Drone 提供与Gitea无缝集成的CI/CD流水线

整套系统在4GB内存的VPS上即可运行,月成本不到一杯咖啡的钱,却能获得与GitHub + Docker Hub + GitHub Actions同等甚至更强的能力。更重要的是,你的代码和镜像完全在自己的服务器上,不受任何第三方的使用条款和配额限制。

下一步可以探索的扩展方向:

  • 接入 ArgoCD 实现GitOps持续部署
  • 添加 MinIO 作为Harbor的S3存储后端
  • 部署 Portainer 可视化管理Docker容器
  • 集成 Slack/Telegram Bot 接收构建通知

从VPS到DevOps平台,只需要一次动手实践。希望本文能帮助你建立属于自己的完整开发运维体系。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » VPS自建私有容器镜像仓库与CI/CD流水线:Harbor + Gitea + Drone生产级部署实战
分享到: 更多 (0)