为什么你需要自建容器镜像仓库和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界面完成以下配置:
- 修改管理员密码 — 首次登录强制修改
- 创建项目 — 点击「新建项目」,创建私有项目
1myapp
- 创建用户与权限 — 在「系统管理 → 用户」创建CI/CD专用账户
1drone-ci
,在项目中赋予该账户「开发者」角色
- 配置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环境足够)
- 域名填写
1git.yourdomain.com
- SSH端口填写
12222
- 管理员账户自行设定,记住用户名和密码
安装完成后,进入「管理后台 → 应用 → 管理 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调优 — 修改
1harbor.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 | 登录凭证过期或错误 |
后重新
|
||||
| Harbor磁盘满 | 镜像层未清理 | 执行GC并配置标签保留策略 | ||||
| Drone构建卡住 | Runner资源不足 | 增加DRONE_RUNNER_CAPACITY或部署额外Runner | ||||
| Gitea SSH无法连接 | SSH端口映射错误 | 确认2222端口映射和客户端SSH配置 | ||||
| 镜像扫描超时 | Trivy数据库下载慢 | 配置Trivy离线数据库或镜像源 | ||||
| Nginx 502错误 | 后端服务未启动 | 检查
并重启异常容器 |
总结:打造属于你的DevOps平台
通过本文的完整部署,你已经在VPS上搭建了一套生产级的DevOps工具链:
- Harbor 提供安全的私有镜像仓库,支持漏洞扫描和镜像治理
- Gitea 提供轻量的代码托管服务,完全掌控代码隐私
- Drone 提供与Gitea无缝集成的CI/CD流水线
整套系统在4GB内存的VPS上即可运行,月成本不到一杯咖啡的钱,却能获得与GitHub + Docker Hub + GitHub Actions同等甚至更强的能力。更重要的是,你的代码和镜像完全在自己的服务器上,不受任何第三方的使用条款和配额限制。
下一步可以探索的扩展方向:
- 接入 ArgoCD 实现GitOps持续部署
- 添加 MinIO 作为Harbor的S3存储后端
- 部署 Portainer 可视化管理Docker容器
- 集成 Slack/Telegram Bot 接收构建通知
从VPS到DevOps平台,只需要一次动手实践。希望本文能帮助你建立属于自己的完整开发运维体系。
汤不热吧