aboutsummaryrefslogtreecommitdiffstats
path: root/DOCKER.md
blob: f39eb75effc14608f81c84984939ea72c1aa0e3c (plain)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# Docker Compose 部署

该部署包含四个服务:

- `tiddlywiki`:运行 TiddlyWiki 5.4.1,只在 Compose 内网监听 `8080`。
- `caddy`:唯一对外服务,提供内部 HTTPS、反向代理和 WebDAV。
- `authelia`:统一处理 Wiki 浏览器登录和 WebDAV Basic 认证。
- `redis`:保存 Authelia 登录会话。

默认局域网域名:

- Wiki:`https://wiki.tdwiki.home.arpa`
- WebDAV:`https://dav.tdwiki.home.arpa`
- 登录:`https://auth.tdwiki.home.arpa`

## 初始化

复制并按需修改环境配置:

```bash
cp .env.example .env
```

如果当前用户不是 UID/GID `1000`,修改 `.env` 中的 `PUID` 和 `PGID`:

```bash
id -u
id -g
```

`GOPROXY` 只在构建带 WebDAV 插件的 Caddy 时使用。无法访问默认镜像源时可以在 `.env` 中替换为其他可信 Go 模块代理。

运行初始化脚本,按提示设置个人用户名和密码:

```bash
./scripts/init-docker.sh
```

脚本会生成:

- `secrets/` 中的 Authelia 随机密钥。
- `docker/authelia/configuration.yml`。
- `docker/authelia/users_database.yml`,密码只保存为 Argon2id 哈希。

这些文件均被 `.gitignore` 排除。

## 局域网 DNS

在路由器、AdGuard Home、Pi-hole 或本机 hosts 中,将三个域名指向 Docker 主机 IP。

例如 Docker 主机地址为 `192.168.1.20`:

```text
192.168.1.20 wiki.tdwiki.home.arpa
192.168.1.20 dav.tdwiki.home.arpa
192.168.1.20 auth.tdwiki.home.arpa
```

每台客户端都必须能够解析这些名称。

## 启动

```bash
docker compose up -d --build
docker compose ps
```

仅 Caddy 暴露宿主机的 `8081`(HTTP)和 `443`(HTTPS)。TiddlyWiki、Authelia、Redis 均不能从宿主机端口直接访问。日常直接使用上述 HTTPS 地址;HTTP 跳转入口为 `http://域名:8081`。

## 信任内部证书

Caddy 首次启动后会生成内部 CA:

```text
data/caddy/data/caddy/pki/authorities/local/root.crt
```

该目录由容器中的 root 用户管理。启动后将根证书导出为当前用户可读取的文件:

```bash
docker compose cp \
  caddy:/data/caddy/pki/authorities/local/root.crt \
  data/caddy/root.crt
chmod 0644 data/caddy/root.crt
```

Linux 可以安装到系统信任库:

```bash
sudo cp data/caddy/root.crt \
  /usr/local/share/ca-certificates/tdwiki-caddy.crt
sudo update-ca-certificates
```

手机、Windows、macOS 和使用独立证书库的 Firefox 也需要导入该根证书。不要把 `root.key` 分发给任何客户端。

## 登录

访问 `https://wiki.tdwiki.home.arpa` 时会跳转到 Authelia。用户名和密码在同一个页面输入。

Wiki 与 WebDAV 都使用 `one_factor`,因此 WebDAV 客户端可以使用同一个个人用户名和密码:

```text
https://dav.tdwiki.home.arpa/
```

WebDAV 的 Basic 凭据只通过 HTTPS 传输。客户端必须先信任 Caddy 内部 CA。

可以使用 curl 验证:

```bash
curl --cacert data/caddy/root.crt \
  -u '用户名:密码' \
  -X PROPFIND \
  -H 'Depth: 0' \
  https://dav.tdwiki.home.arpa/
```

## 文件目录

`files/` 同时挂载到:

- Caddy:读写,作为 WebDAV 根目录。
- TiddlyWiki:只读,用于 `/files/...` 和 `/api/files`。

WebDAV 创建的文件可能由容器中的 root 用户持有。如果宿主机需要直接编辑,可在停止服务后修正权限:

```bash
sudo chown -R "$(id -u):$(id -g)" files
```

## 修改账户密码

重新生成用户数据库并重启 Authelia:

```bash
./scripts/init-docker.sh --force-user
docker compose restart authelia
```

## 更换域名

修改 `.env` 的 `BASE_DOMAIN`,然后重新运行初始化脚本:

```bash
./scripts/init-docker.sh
docker compose up -d --build
```

脚本会按新域名重新生成 Authelia 配置。对应 DNS 和客户端证书名称也必须同步更新。

## 备份

至少备份以下内容:

- `tiddlers/`
- `files/`
- `data/authelia/`
- `docker/authelia/users_database.yml`
- `secrets/`

`data/caddy/` 可以重新生成,但重新生成后客户端需要再次安装新的内部 CA。