# Docker 服务部署集合 一套完整的自托管服务部署方案,适用于阿里云等国内服务器环境。 ## 服务列表 | 服务 | 说明 | 端口 | |------|------|------| | [base/](base/) | 公共基础设施(Docker + Nginx + Certbot + 防火墙) | — | | [gitea/](gitea/) | Git 代码托管(Gitea + MySQL 8.4) | 443, 2222 | | [certd/](certd/) | SSL 证书自动化管理(Certd) | 443 | | [vaultwarden/](vaultwarden/) | 密码管理器(Vaultwarden / Bitwarden 兼容) | 443 | | [joplin/](joplin/) | 笔记同步服务器(Joplin Server + PostgreSQL) | 443 | | [siyuan/](siyuan/) | 知识管理笔记(思源笔记 SiYuan) | 443 | | [portainer/](portainer/) | Docker 可视化管理(Portainer CE) | 443 | | [rustdesk/](rustdesk/) | 自托管远程桌面服务器(RustDesk) | 21115-21117, 443 | ## 架构概览 ``` ┌─────────────┐ │ Nginx │ ← 统一 HTTPS 入口 │ (系统包) │ ← Let's Encrypt 证书 └──────┬──────┘ │ ┌──────────┬──────────┬───────┼───────┬──────────┬──────────┐ │ │ │ │ │ │ │ ┌──▼───────┐ ┌▼───────┐ ┌▼─────┐ ┌▼─────┐ ┌▼────────┐ ┌▼────────┐ │ Gitea │ │ Certd │ │Joplin│ │SiYuan│ │Vaultwar.│ │Portainer│ │:3000(内) │ │ :7001 │ │:22300│ │:6806 │ │ :8080 │ │ :9000 │ │+MySQL 8.4│ │ │ │+PgSQL│ │ │ │ │ │ │ └──────────┘ └────────┘ └──────┘ └──────┘ └─────────┘ └─────────┘ Docker Docker Docker Docker Docker Docker ┌─────────────────────────────────┐ │ RustDesk (hbbs + hbbr) │ │ TCP 21115/21116/21117(外网直达)│ │ WS 21118/21119(Nginx 代理) │ └─────────────────────────────────┘ Docker ``` 所有服务通过 Nginx 反向代理提供 HTTPS 访问,容器端口仅监听 `127.0.0.1`。 ## 目录结构 ``` docker/ ├── README.md # 本文件 ├── base/ # 公共基础设施 │ ├── setup.sh # 安装脚本(Docker/Nginx/Certbot/防火墙) │ ├── .env.example # Docker 镜像加速配置 │ └── README.md ├── gitea/ # Gitea 代码托管 │ ├── docker-compose.yml # Gitea + MySQL 容器编排 │ ├── deploy.sh # 一键部署脚本(自包含) │ ├── backup.sh # 备份脚本 │ ├── upgrade.sh # 升级脚本 │ ├── migrate.sh # 迁移脚本 │ ├── nginx/gitea.conf # Nginx 配置模板 │ └── README.md ├── certd/ # Certd 证书管理 │ ├── docker-compose.yml │ ├── deploy.sh # 部署脚本(依赖 base/) │ ├── backup.sh │ ├── nginx/certd.conf │ └── README.md ├── joplin/ # Joplin Server 笔记同步 │ ├── docker-compose.yml # Joplin Server + PostgreSQL 容器编排 │ ├── deploy.sh # 部署脚本(依赖 base/) │ ├── backup.sh │ ├── nginx/joplin.conf │ └── README.md ├── vaultwarden/ # Vaultwarden 密码管理 │ ├── docker-compose.yml │ ├── deploy.sh # 部署脚本(依赖 base/) │ ├── backup.sh │ ├── nginx/vaultwarden.conf │ └── README.md ├── siyuan/ # SiYuan 思源笔记 │ ├── docker-compose.yml │ ├── deploy.sh # 部署脚本(依赖 base/) │ ├── backup.sh │ ├── nginx/siyuan.conf │ └── README.md ├── portainer/ # Portainer CE Docker 管理 │ ├── docker-compose.yml │ ├── deploy.sh # 部署脚本(依赖 base/) │ ├── backup.sh │ ├── nginx/portainer.conf │ └── README.md └── rustdesk/ # RustDesk 自托管远程桌面 ├── docker-compose.yml # hbbs + hbbr 容器编排 ├── deploy.sh # 部署脚本(依赖 base/) ├── backup.sh ├── uninstall.sh ├── nginx/rustdesk.conf # Nginx WebSocket 代理配置 └── README.md ``` ## 快速开始 ### 场景一:全新服务器部署所有服务 ```bash # 1. 上传所有文件到服务器 scp -r base/ gitea/ certd/ joplin/ vaultwarden/ siyuan/ portainer/ rustdesk/ root@:/opt/ # 2. 安装基础环境 ssh root@ cd /opt/base cp .env.example .env bash setup.sh # 3. 部署 Gitea cd /opt/gitea bash deploy.sh # 首次生成 .env,修改配置后再次运行 vi .env bash deploy.sh # 4. 部署 Certd cd /opt/certd bash deploy.sh vi .env bash deploy.sh # 5. 部署 Joplin Server cd /opt/joplin bash deploy.sh vi .env bash deploy.sh # 6. 部署 Vaultwarden cd /opt/vaultwarden bash deploy.sh vi .env bash deploy.sh # 7. 部署 SiYuan cd /opt/siyuan bash deploy.sh vi .env bash deploy.sh # 8. 部署 Portainer(Docker 可视化管理) cd /opt/portainer bash deploy.sh vi .env bash deploy.sh # 9. 部署 RustDesk(自托管远程桌面) cd /opt/rustdesk bash deploy.sh vi .env bash deploy.sh ``` ### 场景二:已有 Gitea 的服务器,追加部署 Certd ```bash # 上传新服务文件(base 是新增的公共依赖) scp -r base/ certd/ root@:/opt/ ssh root@ # 安装 base(会检测已安装的组件并跳过) cd /opt/base cp .env.example .env bash setup.sh # 部署 Certd cd /opt/certd bash deploy.sh vi .env bash deploy.sh ``` ### 场景三:只部署单个服务 每个服务的 `deploy.sh` 会自动调用 `base/setup.sh` 安装缺失的基础环境,无需手动运行 base。 ```bash scp -r base/ vaultwarden/ root@:/opt/ ssh root@ cd /opt/vaultwarden bash deploy.sh vi .env bash deploy.sh ``` ## 域名规划示例 | 服务 | 域名 | DNS 记录 | |------|------|----------| | Gitea | `git.example.com` | A → 服务器 IP | | Certd | `cert.example.com` | A → 服务器 IP | | Joplin | `joplin.example.com` | A → 服务器 IP | | Vaultwarden | `vault.example.com` | A → 服务器 IP | | SiYuan | `note.example.com` | A → 服务器 IP | | RustDesk | `rustdesk.example.com` | A → 服务器 IP | ## 日常运维 ### 查看各服务状态 ```bash # Gitea cd /opt/gitea && docker compose ps # Certd cd /opt/certd && docker compose ps # Joplin cd /opt/joplin && docker compose ps # Vaultwarden cd /opt/vaultwarden && docker compose ps # SiYuan cd /opt/siyuan && docker compose ps # RustDesk cd /opt/rustdesk && docker compose ps ``` ### 备份所有服务 ```bash cd /opt/gitea && bash backup.sh cd /opt/certd && bash backup.sh cd /opt/joplin && bash backup.sh cd /opt/vaultwarden && bash backup.sh cd /opt/siyuan && bash backup.sh cd /opt/rustdesk && bash backup.sh ``` ### SSL 证书续期 所有服务共享 Certbot,证书自动续期(每天 03:00 检查)。 ```bash # 查看所有证书 certbot certificates # 手动测试续期 certbot renew --dry-run ``` ## 注意事项 - **Gitea 的 deploy.sh 是自包含的**,不依赖 base/(历史兼容)。Certd、Joplin、Vaultwarden、SiYuan、Portainer 和 RustDesk 依赖 base/。 - **RustDesk 需额外开放防火墙端口** 21115/21116(TCP)、21116(UDP)、21117(TCP),这些端口需从外网可直接访问,不经过 Nginx。 - 所有容器端口仅监听 `127.0.0.1`,通过 Nginx 反向代理对外提供 HTTPS 服务。 - `.env` 文件包含敏感信息,不要提交到公开仓库。 - 首次部署每个服务时需要运行两次 `deploy.sh`:第一次生成 `.env`,修改配置后第二次正式部署。