# 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@<IP>:/opt/

# 2. 安装基础环境
ssh root@<IP>
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@<IP>:/opt/

ssh root@<IP>

# 安装 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@<IP>:/opt/
ssh root@<IP>
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`，修改配置后第二次正式部署。
