VPS Docker 部署完整指南

基于 NAT VPS 的全 Docker 化部署方案 - 稳定、易迁移、可备份

2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/image-4d73d9322-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/image-e0b6cd43


服务器配置

硬件资源

  • 内存: 4GB (当前仅用 175MB,资源充足)
  • 架构: x86_64 (兼容性极佳)
  • 系统: Ubuntu 22.04 LTS

配置远超"中转站"需求,完全可以作为轻量级云端应用中心


核心理念

为什么选择 Docker 化?

  1. 方便迁移: 所有配置都在文件夹里,打包即可换服务器
  2. 环境隔离: 不污染系统,不会依赖冲突
  3. 快速恢复: 备份 + 一行命令 = 原地复活
  4. 资源高效: 容器共享内核,比虚拟机轻量

NAT VPS 生存法则

  1. 数据挂载: 必须把数据目录挂载到宿主机
  2. 自动备份: 定期备份到云盘,防止商家跑路
  3. 避免高带宽应用: 不跑影视库、大流量下载器
2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767450816879-1671aae5 2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767450958591-e962fa93

基础环境搭建

1. 换源并安装 Docker

# 换源 (一路回车)
bash <(curl -sSL https://linuxmirrors.cn/main.sh) --source aliyun

# 强制改成阿里云源
cat > /etc/apt/sources.list <<EOF
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF

# 修复 DNS
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 1.1.1.1" >> /etc/resolv.conf

# 测试网络
ping -c 3 archive.ubuntu.com

# 更新软件源
apt update

# 安装 Docker
apt install -y ca-certificates curl gnupg lsb-release

mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

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

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

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

# 启动并设置开机自启
systemctl start docker
systemctl enable docker

2. 配置 Docker 镜像加速

mkdir -p /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io",
    "https://docker.fxxk.dedyn.io",
    "https://huecker.io"
  ]
}
EOF

# 重启 Docker
systemctl daemon-reload
systemctl restart docker

3. 创建数据目录

mkdir -p /opt/docker_data
mkdir -p /opt/dockge
cd /opt/dockge

Cloudflare Tunnel 看门狗

2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767450443119-da2b4175

为什么需要看门狗?

Cloudflare Tunnel 可能会因为网络波动、VPS 重启等原因断开连接,导致所有服务无法访问。看门狗机制会每 5 分钟自动检测隧道状态,发现异常时自动重启服务。

1. 创建看门狗脚本

nano /opt/check_tunnel.sh

写入内容:

#!/bin/bash

# ================= 配置 =================
# 填一个你比较稳定的服务地址(用来测试通不通)
# 建议用 note 或者 docker,因为它们响应快
TEST_URL="https://note.hxnppll.top"

# 日志文件路径
LOG_FILE="/var/log/tunnel_watchdog.log"
# =======================================

# 获取当前时间
NOW=$(date +"%Y-%m-%d %H:%M:%S")

# 发送请求检测
# -s: 静默模式
# -o /dev/null: 不输出内容
# -w "%{http_code}": 只输出状态码
# --max-time 10: 超过10秒没反应就算死
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$TEST_URL")

# 判断逻辑
# 000 = 无法连接 / DNS解析失败 / 超时
# 502 = Cloudflare 连不上 VPS (Bad Gateway)
# 503 = 服务不可用
# 530 = Origin DNS Error
if [ "$HTTP_CODE" == "000" ] || [ "$HTTP_CODE" == "502" ] || [ "$HTTP_CODE" == "503" ] || [ "$HTTP_CODE" == "530" ]; then
    echo "[$NOW] ⚠️ 检测到故障 (状态码: $HTTP_CODE),正在重启 cloudflared..." >> $LOG_FILE

    # 重启服务
    systemctl restart cloudflared

    # 等待 10 秒再次检查
    sleep 10
    NEW_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$TEST_URL")
    echo "[$NOW] ✅ 重启完成,当前状态码: $NEW_CODE" >> $LOG_FILE
else
    # 正常情况下不写日志,以免撑爆硬盘
    :
fi

2. 赋予执行权限

chmod +x /opt/check_tunnel.sh

3. 手动测试

/opt/check_tunnel.sh
  • 无输出: 网站正常运行
  • 有输出: 脚本正在尝试重启服务

4. 加入定时任务

每 5 分钟自动检查一次:

crontab -e

在文件最后添加:

*/5 * * * * /opt/check_tunnel.sh

保存退出 (Ctrl+X → Y → Enter)

5. 查看日志

查看看门狗的工作记录:

cat /var/log/tunnel_watchdog.log

效果: 当网站无法访问时,最多等待 5 分钟,看门狗会自动重启 Cloudflare Tunnel 服务

2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449055454-a55bc9b1

三件套部署

「三件套」即 极简三剑客 篇的三位主角(Dockge + FileBrowser + Uptime Kuma),本节为部署完成后的汇总参考版;当时的逐步实操记录见三剑客篇。

1. Dockge (容器管理)

特点: 将 docker-compose.yml 可视化,方便管理和迁移

cd /opt/dockge

# 下载配置
curl -L https://ghproxy.net/https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml

# 启动
docker compose up -d

Cloudflare Tunnel 配置:

  • Subdomain: docker
  • URL: 10.10.10.1:5001
  • 访问: https://docker.hxnppll.top

登录信息:

  • 账号: wei
  • 密码: zw200495

2. FileBrowser (文件管理)

特点: Web 端管理 VPS 所有文件,支持上传/下载/编辑

在 Dockge 中新建 Stack,Name: filebrowser

version: '3.3'
services:
  filebrowser:
    image: filebrowser/filebrowser:latest
    container_name: filebrowser
    user: 0:0  # root权限
    ports:
      - 8081:80
    volumes:
      - /:/srv  # 挂载整个根目录
      - /opt/docker_data/filebrowser/filebrowser.db:/database.db
      - /opt/docker_data/filebrowser/settings.json:/.filebrowser.json
    restart: unless-stopped

Cloudflare Tunnel 配置:

  • Subdomain: file
  • URL: 10.10.10.1:8081
  • 访问: https://file.hxnppll.top

初始密码:

docker logs filebrowser  # 查看初始密码

修改为: zw200495200495


3. Uptime Kuma (系统监控)

特点: 监控服务存活状态,SSL 证书过期提醒

在 Dockge 中新建 Stack,Name: uptime-kuma

version: '3.3'
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    volumes:
      - /opt/docker_data/uptime-kuma:/app/data
      - /var/run/docker.sock:/var/run/docker.sock  # 监控容器状态
    ports:
      - 3001:3001
    restart: always

Cloudflare Tunnel 配置:

  • Subdomain: status
  • URL: localhost:3001
  • 访问: https://status.hxnppll.top

登录信息:

  • 账号: wei
  • 密码: zw200495

备份与恢复

2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449918508-fe1d5f76

备份架构

每天 21:00 自动执行
    ↓
打包 /opt/stacks + /opt/dockge + /opt/docker_data
    ↓
通过 Rclone 同步到家庭 Alist
    ↓
清理 7 天前的旧备份

1. 部署 Rclone

在 Dockge 中新建 Stack,Name: rclone-backup

version: '3.8'
services:
  rclone:
    image: rclone/rclone:latest
    container_name: rclone
    restart: unless-stopped
    volumes:
      - /opt/docker_data/rclone/config:/config/rclone
      - /opt/backup:/data/backup
    environment:
      - PHP_TZ=Asia/Shanghai
      - PUID=0
      - PGID=0
    command: rcd --rc-web-gui --rc-addr :5572 --rc-user admin --rc-pass admin
    ports:
      - 5572:5572

2. 配置 Rclone (连接家庭 Alist)

# 进入容器配置
docker exec -it rclone rclone config

# 交互配置步骤
n                           # 新建
home_alist                  # 名称
webdav                      # 类型
http://10.10.10.2:5244/dav # URL (EasyTier内网)
other                       # Vendor
[输入Alist用户名]           # User
y → [输入密码]              # Password
n                           # 跳过高级配置
y                           # 确认
q                           # 退出

# 验证连接
docker exec rclone rclone lsd home_alist:/

3. 创建备份脚本

nano /opt/backup_docker.sh

写入内容:

#!/bin/bash

# 配置区
BACKUP_DIR="/opt/backup"
DATE=$(date +%Y%m%d)
FILENAME="docker_backup_$DATE.tar.gz"
RCLONE_REMOTE="home_alist"
REMOTE_DIR="/D:/vps_backup"

# 准备目录
mkdir -p $BACKUP_DIR
echo "[$(date)] 开始备份..."

# 打包核心数据
echo "[$(date)] 正在打包文件..."
tar -czf $BACKUP_DIR/$FILENAME /opt/stacks /opt/dockge /opt/docker_data

# 检查打包结果
if [ $? -eq 0 ]; then
    echo "[$(date)] 打包成功: $FILENAME"
else
    echo "[$(date)] 打包失败!"
    exit 1
fi

# 同步到远程
echo "[$(date)] 正在同步到远程家庭主机..."
docker exec rclone rclone copy /data/backup/$FILENAME $RCLONE_REMOTE:$REMOTE_DIR

# 清理 7 天前的旧备份
echo "[$(date)] 清理旧备份..."
find $BACKUP_DIR -name "docker_backup_*.tar.gz" -mtime +7 -exec rm {} \;

echo "[$(date)] 全部完成!"

赋予权限并测试:

chmod +x /opt/backup_docker.sh
/opt/backup_docker.sh

4. 设置定时任务

# 编辑定时任务
crontab -e

# 添加每天 21:00 执行
0 21 * * * /opt/backup_docker.sh

# 修正时区 (可选)
sudo timedatectl set-timezone Asia/Shanghai

5. 灾难恢复流程

当 VPS 损坏或更换服务器时:

# 1. 新 VPS 安装 Docker
curl -fsSL https://get.docker.com | bash
apt install tar

# 2. 上传备份文件到根目录后解压
tar -xzf docker_backup_xxx.tar.gz -C /

# 3. 启动 Dockge
cd /opt/dockge
docker compose up -d

# 4. 在 Dockge 面板中点击 Update 或 Start 恢复所有容器

静态网页托管

2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767450333348-ed2d52c2

核心理念

不需要安装 Nginx 软件,而是用 Nginx Docker 容器托管网页

角色分工:

  • Cloudflare Tunnel: 对外大门 (域名、SSL、端口转发)
  • Docker Nginx: 内部文件分发

目录结构

/opt/docker_data/nginx_pro/
├── conf/
│   └── default.conf      # 核心配置
└── html/                 # 网页仓库
    ├── love/             # 站点1
    └── resume/           # 站点2

Nginx 配置 (default.conf)

# 站点 1: Love
server {
    listen 80;
    server_name love.hxnppll.top;

    location / {
        root /usr/share/nginx/html/love;
        index index.html index.htm;
    }
}

# 站点 2: Resume
server {
    listen 80;
    server_name resume.hxnppll.top;

    location / {
        root /usr/share/nginx/html/resume;
        index index.html index.htm;
    }
}

# 默认兜底
server {
    listen 80 default_server;
    server_name _;
    return 404;
}

Dockge 部署

Name: nginx-pro

version: '3.8'
services:
  nginx-pro:
    image: nginx:alpine
    container_name: nginx-pro
    restart: always
    ports:
      - 8037:80
    volumes:
      - /opt/docker_data/nginx_pro/html:/usr/share/nginx/html
      - /opt/docker_data/nginx_pro/conf/default.conf:/etc/nginx/conf.d/default.conf

Cloudflare Tunnel 配置

所有子域名都指向同一端口,让 Nginx 自己分拣:

Subdomain Service URL 说明
love http://nginx-pro:80 Love 主页
resume http://nginx-pro:80 简历页

维护命令

# 修改 HTML 文件: 无需重启,刷新浏览器即可

# 修改 default.conf 后重载配置
docker exec -it nginx-pro nginx -s reload

扩展应用

镜像导入流程 (国内网络限制)

# Windows 下载并打包
docker pull [镜像名]
docker save -o D:\xxx.tar [镜像名]

# 上传到 VPS 后导入
docker load -i /opt/xxx.tar

# Dockge 配置中添加
pull_policy: never  # 强制使用本地镜像

1. Homarr (个人仪表盘)

特点: 漂亮的导航页,集成 Docker 容器状态

Windows 下载:

docker pull ghcr.io/ajnart/homarr:latest
docker save -o D:\homarr.tar ghcr.io/ajnart/homarr:latest

VPS 终端:

homarr.tar 上传到 VPS 的 /opt

docker load -i /opt/homarr.tar

Dockge 配置:

services:
  homarr:
    image: ghcr.io/ajnart/homarr:latest
    pull_policy: never
    container_name: homarr
    volumes:
      - /opt/docker_data/homarr/configs:/app/data/configs
      - /opt/docker_data/homarr/icons:/app/public/icons
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 7575:7575
    restart: unless-stopped
  • Cloudflare: home -> localhost:7575
  • 玩法:以后浏览器主页就设成 https://home.hxnppll.top,一站式直达所有服务。

2. Linkding (书签管理)

特点: 极简书签服务,支持标签和稍后阅读

Windows 下载:

docker pull sissbruecker/linkding:latest
docker save -o D:\linkding.tar sissbruecker/linkding:latest

VPS 终端:

linkding.tar 上传到 VPS 的 /opt

docker load -i /opt/linkding.tar

Dockge 配置:

services:
  linkding:
    image: sissbruecker/linkding:latest
    pull_policy: never
    container_name: linkding
    volumes:
      - /opt/docker_data/linkding:/etc/linkding/data
    ports:
      - 9090:9090
    restart: unless-stopped

Cloudflare: mark -> localhost:9090

访问: mark.hxnppll.top


3. Excalidraw (在线画图 可多人同步协作)

概述:

  • 功能:手绘风格白板工具,支持多人实时协作。
  • 架构:前端 (绘图界面) + 后端 (Room 协作服务)。
  • 局限:开源版默认不带数据库存储,刷新后数据丢失,需手动保存 .excalidraw 文件到本地。

第一步:获取源码 (在 Windows 本地)

你需要先有 git 环境,或者直接去 GitHub 下载 ZIP 包。

克隆仓库: 打开 gitbash:

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
git clone https://github.com/excalidraw/excalidraw.git
cd excalidraw

第二步:修改配置文件 (最关键的一步)

在项目根目录下,修改 .env.production为:

文件内容 (.env.production):

# 1. 生产模式
MODE="production"
NODE_ENV="production"

# 2. 你的后端协作地址 (WebSocket) - 必须填对
# 这是实现“看着别人画”的关键
VITE_APP_WS_SERVER_URL=wss://draw-room.hxnppll.top

# 3. 存储后端 (HTTP)
# 虽然 excalidraw-room 镜像存不了文件,但填上你自己的地址
# 可以防止前端去请求官方服务器报错跨域
VITE_APP_BACKEND_V2_GET_URL=https://draw-room.hxnppll.top/api/v2/room
VITE_APP_BACKEND_V2_POST_URL=https://draw-room.hxnppll.top/api/v2/room

# 4. 禁用 Firebase (彻底切断 Google 依赖)
VITE_APP_FIREBASE_CONFIG=

# 5. 其他杂项 (保持默认或关闭)
VITE_APP_ENABLE_TRACKING=false
VITE_APP_ENABLE_SENTRY=false

注意: 必须使用 VITE_ 开头,Excalidraw 现已全面迁移到 Vite 构建工具。

域名替换成你自己的将要设置的

第三步:构建 Docker 镜像

Excalidraw 根目录自带了 Dockerfile,我们直接用它构建。

excalidraw 文件夹下执行:

# -t 后面是你给镜像起的名字,点(.)代表当前目录
docker build -t my-excalidraw:latest .

提示:这一步会比较慢(大约 5-10 分钟),因为它需要下载 Node.js 依赖并进行编译(Nginx + 静态资源打包)。请耐心等待直到出现 Successfully tagged my-excalidraw:latest

第四步:导出并上传到 VPS

构建完成后,这个镜像现在只存在于 Windows 电脑上。需要把它搬运到 VPS。

另外,后端也需要拉取,由于网络原因,建议在本地下载好镜像后上传至 VPS。

1. Windows 终端 (PowerShell)

# --- 1. 导出前端 ---
docker save -o D:\my-excalidraw.tar my-excalidraw:latest

# --- 2. 下载并导出后端 (协作服务) ---
docker pull excalidraw/excalidraw-room:latest
docker save -o D:\draw-room.tar excalidraw/excalidraw-room:latest

2. VPS 终端 (SSH)D:\my-excalidraw.tarD:\draw-room.tar 上传到 VPS 的 /opt 目录,然后导入:

docker load -i /opt/my-excalidraw.tar
docker load -i /opt/draw-room.tar

第五步:Dockge 配置

version: '3.8'
services:
  # --- 1. 你的专属前端 ---
  excalidraw-frontend:
    # 必须填你刚才构建的名字
    image: my-excalidraw:latest
    #告诉 Docker 不要去网上拉,只用本地导入的这个
    pull_policy: never
    container_name: excalidraw-web
    restart: unless-stopped
    ports:
      # 左边是 VPS 端口,可以根据需要修改,比如 5002
      - 5002:80
    depends_on:
      - excalidraw-room

  # --- 2. 协作后端 (不需要自己构建,用官方的即可) ---
  excalidraw-room:
    image: excalidraw/excalidraw-room:latest
    # 后端我们也导入了,也设置 never 防止它去网上乱拉
    pull_policy: never
    container_name: excalidraw-room
    restart: unless-stopped
    ports:
      # 左边是 VPS 端口,对应 Nginx 反代的目标端口
      - 5003:80
    environment:
      - ALLOWED_ORIGINS=*

点击 Deploy。

第六步:配置 Cloudflare (两个域名)

需要两个子域名,一个给界面看,一个给协作数据走。

  1. 界面域名 (draw.hxnppll.top):

    • Subdomain: draw
    • URL: localhost:5002
  2. 后端域名 (draw-room.hxnppll.top)

    • Subdomain: draw-room
    • URL: localhost:5003

第七步:测试协作

  1. 用浏览器打开 https://draw.hxnppll.top
  2. 点击左上角的“协作”按钮(两个人头图标)。
  3. 点击“开始会话”。
  4. 如果没有报错,且生成了一个链接,说明连接后端成功!
  5. 把链接发给手机或者另一个浏览器,试试能不能看到对方的鼠标移动。
2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/PixPin_2026-01-04_03-52-11-cb7682be

4. Stirling-PDF (PDF 工具箱)

特点: 支持合并、拆分、转 Word、OCR 等

Windows 下载:

docker pull frooodle/s-pdf:latest
docker save -o D:\spdf.tar frooodle/s-pdf:latest

VPS 导入:

spdf.tar 上传到 VPS 的 /opt

docker load -i /opt/spdf.tar

Dockge 配置:

services:
  stirling-pdf:
    image: frooodle/s-pdf:latest
    pull_policy: never
    ports:
      - 8087:8080
    environment:
      - DOCKER_ENABLE_SECURITY=false
    restart: unless-stopped

Cloudflare: pdf -> localhost:8087

访问: pdf.hxnppll.top


5. IT-Tools (开发工具集)

Windows 下载:

docker pull corentinth/it-tools:latest
docker save -o D:\it-tools.tar corentinth/it-tools:latest

VPS 导入:

it-tools.tar 上传到 VPS 的 /opt

# 导入 IT-Tools
docker load -i /opt/it-tools.tar

Dockge 配置:

services:
  it-tools:
    image: corentinth/it-tools:latest
    pull_policy: never
    container_name: it-tools
    restart: unless-stopped
    ports:
      - 8085:80

Cloudflare: tools-> localhost:8085

访问: tools.hxnppll.top


6. Pingvin Share (文件分享)

Windows 下载:

docker pull stonith404/pingvin-share:latest
docker save -o D:\pingvin.tar stonith404/pingvin-share:latest

VPS 导入:

pingvin.tar 上传到 VPS 的 /opt

# 导入 Pingvin Share
docker load -i /opt/pingvin.tar

Dockge 配置:

services:
  pingvin-share:
    image: stonith404/pingvin-share:latest
    pull_policy: never
    restart: unless-stopped
    ports:
      - 3000:3000
    volumes:
      - /opt/docker_data/pingvin/data:/opt/app/backend/data
      - /opt/docker_data/pingvin/images:/opt/app/frontend/public/img

Cloudflare: share-> localhost:3000

访问: share.hxnppll.top


7. VoceChat (私人聊天室)

特点: 超轻量,支持文字、图片、文件、语音

Windows 下载:

docker pull privoce/vocechat-server:latest
docker save -o D:\vocechat.tar privoce/vocechat-server:latest

VPS 导入:

vocechat.tar 上传到 VPS 的 /opt

docker load -i /opt/vocechat.tar

Dockge 配置:

services:
  vocechat:
    image: privoce/vocechat-server:latest
    pull_policy: never
    container_name: vocechat
    ports:
      - 3009:3000
    volumes:
      - /opt/docker_data/vocechat:/home/vocechat-server/data
    restart: unless-stopped

Cloudflare: chat-> localhost:3009

访问: chat.hxnppll.top


8. MicroBin (极简剪贴板)

Windows 下载:

docker pull danielszabo99/microbin:latest
docker save -o D:\microbin.tar danielszabo99/microbin:latest

VPS 导入:

microbin.tar 上传到 VPS 的 /opt

 docker load -i /opt/microbin.tar

Dockge 配置:

services:
  microbin:
    image: danielszabo99/microbin:latest
    pull_policy: never
    container_name: microbin
    ports:
      - 8086:8080
    volumes:
      - /opt/docker_data/microbin:/app/microbin_data
    restart: unless-stopped

Cloudflare: paste -> localhost:8086

访问: paste.hxnppll.top


9. EasyImage (简单图床)

特点: 轻量、无需数据库、支持 WebP 转换

Windows 下载:

# 1. 拉取镜像
docker pull ddsderek/easyimage:latest

# 2. 导出
docker save -o D:\easyimage.tar ddsderek/easyimage:latest

VPS 导入:

easyimage.tar 上传到 VPS 的 /opt

docker load -i /opt/easyimage.tar

Dockge 配置:

version: '3.3'
services:
  easyimage:
    image: ddsderek/easyimage:latest
    pull_policy: never
    container_name: easyimage
    ports:
      - 8091:80
    environment:
      - TZ=Asia/Shanghai
      - PUID=0
      - PGID=0
    volumes:
      - /opt/docker_data/easyimage/config:/app/web/config
      - /opt/docker_data/easyimage/i:/app/web/i
    restart: unless-stopped

Cloudflare: img-> localhost:8091

访问: img.hxnppll.top

10.Navidrome (音乐流媒体服务器)

用途: 自建音乐库,支持 Subsonic/Airsonic API

Windows 下载:

docker pull deluan/navidrome:latest
docker save -o D:\navidrome.tar deluan/navidrome:latest

VPS 导入:

navidrome.tar 上传到 VPS 的 /opt

docker load -i /opt/navidrome.tar

Dockge 配置:

services:
  navidrome:
    image: deluan/navidrome:latest
    pull_policy: never
    container_name: navidrome
    ports:
      - 4533:4533
    volumes:
      - /opt/docker_data/navidrome:/data
      # 需要挂载你的音乐目录
    environment:
      - ND_LOGLEVEL=info
    restart: unless-stopped

Cloudflare: music.hxnppll.toplocalhost:4533

11.Vaultwarden (密码管理器)

用途: Bitwarden 的轻量级替代,全平台密码同步

Windows 下载:

docker pull vaultwarden/server:latest
docker save -o D:\vaultwarden.tar vaultwarden/server:latest

VPS 导入:

vaultwarden.tar 上传到 VPS 的 /opt

docker load -i /opt/vaultwarden.tar

Dockge 配置:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    # 强制使用默认网桥,不创建新网络,节省 IP 资源
    network_mode: bridge
    ports:
      - 8098:80
    volumes:
      - /opt/docker_data/vaultwarden:/data
    environment:
      - WEBSOCKET_ENABLED=true
      - SIGNUPS_ALLOWED=true

Cloudflare: password.hxnppll.toplocalhost:8080

重要: 注册完账号后建议关闭注册(SIGNUPS_ALLOWED=false)

12.ChatGPT-Next-Web (AI 聊天 UI)

  • 作用: 一个漂亮的网页版 ChatGPT 客户端。
  • 优势: 只需要填 Key,数据存在浏览器本地,支持预设面具(翻译官、润色师),支持多端同步。
  • 架构特点: 针对 NAT VPS 网络环境优化,使用 Host 模式 + 优化 API 线路。

Windows 下载:

# 拉取镜像
docker pull yidadaa/chatgpt-next-web:latest

# 导出为 tar 包
docker save -o D:\chatgpt-next-web.tar yidadaa/chatgpt-next-web:latest

VPS 导入:

chatgpt-next-web.tar 上传到 VPS 的 /opt

# 导入 ChatGPT 镜像
docker load -i /opt/chatgpt-next-web.tar

部署配置 (Dockge):

  • network_mode: host: 解决容器在 NAT VPS 无法连接外网的问题。
  • HOSTNAME=0.0.0.0: 解决 Ubuntu 系统下 Host 模式监听 IP 异常导致 Cloudflare 连不上的问题。
  • BASE_URL: 更换为 apic1.ohmycdn.com,解决 VPS IP 被 API 服务商阻断/超时的问题。
version: "3.9"
services:
  chatgpt-next-web:
    image: yidadaa/chatgpt-next-web:latest
    container_name: chatgpt-next-web
    pull_policy: never
    # 使用 host 模式,解决网络连通性问题
    network_mode: host

    environment:
      - HOSTNAME=0.0.0.0
      - OPENAI_API_KEY=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
      - CODE=zw200495
      # 去掉结尾的 /v1,防止出现双重 /v1/v1 路径
      - BASE_URL=https://apic1.ohmycdn.com
      - CUSTOM_MODELS=-all,+gpt-5.2,+claude-opus-4-5,+claude-haiku-4-5,+claude-sonnet-4-5,+grok-4-fast,+gemini-3-pro-preview
      - DEFAULT_MODEL=gpt-5.2
      # 因为用了 host 模式,默认是 3000。如果需要改为 3030,必须用环境变量
      - PORT=3030
    restart: always
networks: {}

Cloudflare: ai.hxnppll.toplocalhost:3030

URL: localhost:3030

  • 注:这里填 localhost 或 127.0.0.1 均可,因为 docker 已配置监听 0.0.0.0。

访问: ai.hxnppll.top

跑通了 但意义不大 国内的vps通常网络限制很严 不稳定 还不如网页或客户端使用

2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/image-b6ba8173

13.Dozzle (实时日志查看器)

  • 痛点: 每次看日志都要 docker logs -f xxx,很麻烦。
  • 作用: 一个网页,实时展示所有容器的日志,支持搜索、过滤、下载。

Windows 下载:

# 拉取镜像
docker pull amir20/dozzle:latest

# 导出为 tar 包
docker save -o D:\dozzle.tar amir20/dozzle:latest

VPS 导入:

dozzle.tar 上传到 VPS 的 /opt

# 导入 Dozzle 镜像
docker load -i /opt/dozzle.tar

部署配置 (Dockge):

version: "3"
services:
  dozzle:
    container_name: dozzle
    image: amir20/dozzle:latest
    # 关键:强制使用本地导入的镜像
    pull_policy: never
    volumes:
      # 必须挂载 docker.sock 才能读取日志
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8888:8080
    restart: unless-stopped
    network_mode: bridge
    environment:
      # 设置登录账号密码,保护日志安全
      - DOZZLE_AUTH_USERNAME=wei
      - DOZZLE_AUTH_PASSWORD=zw200495
networks: {}

Cloudflare: log.hxnppll.toplocalhost:8888

访问: log.hxnppll.top

系统维护增强 (防爆盘配置)

这步非常重要,我们需要修改 Docker 的配置文件。由于你之前可能已经配过镜像源,我们需要小心地合并配置。

1. 修改 daemon.json

在 VPS 终端执行编辑命令:

nano /etc/docker/daemon.json

将文件内容修改为以下格式(注意 JSON 格式,逗号不能少):

{
  "registry-mirrors": [
    "https://docker.1panel.dev",
    "https://docker.fxxk.dedyn.io",
    "https://docker.vhx.cloud",
    "https://registry.dockermirror.com",
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io",
    "https://huecker.io"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

解释:这表示保留之前的镜像加速,同时限制每个容器的日志文件最大 10MB,最多保留 3 个文件(即每个容器最多占用 30MB 空间)。

保存退出:按 Ctrl+O -> Enter -> Ctrl+X

2. 重启 Docker 生效

注意:重启 Docker 会导致所有容器短暂离线。

systemctl daemon-reload
systemctl restart docker
3. 设置定时清理任务

编辑定时任务:

crontab -e

在文件末尾添加一行(每周日凌晨3点清理无用的镜像、缓存和停止的容器):

0 3 * * 0 docker system prune -af --volumes > /dev/null 2>&1

服务汇总表

2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449218164-1d3eea0e 2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449589964-ad9c02ef 2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767451024198-58343075

VPS 服务 (10.10.10.1)

域名 端口 服务 作用
docker.hxnppll.top 5001 Dockge 容器管理
file.hxnppll.top 8081 FileBrowser 文件管理
status.hxnppll.top 3001 Uptime Kuma 系统监控
rclone.hxnppll.top 5572 Rclone Web 备份管理
home.hxnppll.top 7575 Homarr 个人仪表盘
draw.hxnppll.top 5002 Excalidraw 在线画图
draw-room.hxnppll.top 5003 Excalidraw-room 实时协作服务器
pdf.hxnppll.top 8087 Stirling-PDF PDF 工具
tools.hxnppll.top 8085 IT-Tools 开发工具
share.hxnppll.top 3000 Pingvin 文件分享
chat.hxnppll.top 3009 VoceChat 私人聊天
paste.hxnppll.top 8086 MicroBin 剪贴板
img.hxnppll.top 8091 EasyImage 图床
mark.hxnppll.top 9090 Linkding 书签
music.hxnppll.top 4533 Navidrome 音乐管理
password.hxnppll.top 8098 Vaultwarden 密码管理
ai.hxnppll.top 3030 ChatGPT-Next-Web 网页AI
log.hxnppll.top 8888 Dozzle 日志管理
love.hxnppll.top 8037 Nginx Love 主页
resume.hxnppll.top 8037 Nginx 简历页

家庭主机服务 (10.10.10.2)

域名 端口 服务 作用
note.hxnppll.top 37840 Trilium 笔记系统
alist.hxnppll.top 5244 Alist 文件列表
vue.hxnppll.top 5173 Vue Dev 开发环境

其他主机服务 (10.10.10.3)

域名 端口 服务 作用
xinnian.hxnppll.top 37840 Trilium 笔记分享

安全建议

Cloudflare Access (双重保护)

对敏感服务 (Dockge, FileBrowser) 建议启用:

  1. Cloudflare Dash → Zero Trust → Access → Applications
  2. Add application → Self-hosted
  3. Application domain: docker.hxnppll.top
  4. Identity providers: One-time PIN
  5. Policy:
    • Action: Allow
    • Include: Emails → [你的邮箱]

效果: 即使密码泄露,没有邮箱验证码也无法访问


总结

这套方案的核心优势:

  1. 全 Docker 化: 环境干净,迁移方便
  2. 自动备份: 数据安全有保障
  3. Cloudflare 加持: 免费 SSL,高可用
  4. 资源高效: 4GB 内存跑 10+ 服务绰绰有余
  5. 易于维护: 可视化管理,小白友好

记住三个核心原则:

  • 数据挂载: 所有容器数据都要挂载到宿主机
  • 定时备份: 每天自动备份到云盘
  • 避免高带宽: NAT VPS 不适合跑影视库和下载器

⬅️ 迁移 🏠 00-网络与项目 ➡️ 拓展局域网思路