本文测试的是旧版本 v2.11.4
的部署方式,实测当前(2024.08.15)最新的 v3.1.3
版本也可以用相同的方式部署。本文的部署方式共写了三种,非 qnap 的 linux 系统也可以参考本文部署思源笔记。
阅读本文之前,先明确两个名词:
- “宿主机”指的是部署 docker 服务的主机,本文所述是 qnap 的 nas 本体;
- “容器内”是思源 docker 容器内部的路径或端口;
这是部署 docker 服务时最常遇到的两个描述,写在这里避免大家对基本概念不了解而导致的误操作。另外,强烈建议您在学习了 docker 容器化的基本配置逻辑和 docker 的基本技术概念之后,再去使用 docker。这会对您理解和配置所有 docker 容器服务都会有很大的帮助!您可以阅读本站的编程学习/docker 学习专栏,有任何问题都可评论区提出。
思源的论坛中隔三岔五就会有人因为不理解 docker 的配置几何导致出现种种问题,其中因为宿主机路径映射失败导致所有笔记文件丢失还不做备份的也不在少数!
1. 部署容器
1.1. 在威联通 container-station3 上部署
这个版本是我从 2024 年年初一直用到现在的版本,没遇到过任何问题,个人感觉没有必要升级。如果你想部署其他版本,可以修改冒号右侧的版本号。
b3log/siyuan:v2.11.4
拉取镜像后,创建容器。这里我使用的是最新的 container station 3
。
先配置容器的端口,主机端口设置为一个未被使用的端口即可,重启策略改成始终重启。
添加存储映射,在 nas 上新建一个文件夹来存放思源笔记的数据。冒号左侧是你的 qnap 上的共享文件夹路径,必须新建一个文件夹作为宿主机路径进行映射。
/Public/docker/data/synote/data:/home/siyuan/sy
然后是修改启动命令,在命令中选择覆盖,然后键入如下内容。如果你的 docker 需要外网访问,则一定要把 accessAuthCode 密码设置的复杂一些!
--workspace=/home/siyuan/sy --lang=zh_CN --accessAuthCode=你的密码
然后创建容器就可以了。
创建完毕容器一定要去检查日志,看工作空间有没有问题。如下所示,日志的路径中提到了 /home/siyuan/sy
,即代表当前使用的就是我们设置好的路径,那就是没有问题的。
包括检查本地的映射路径中是否有对应的文件,如果没有下面的这些文件,一定要去确认你的 docker 路径映射有没有问题!
最终访问本地 IP:端口,显示下面的内容,就是部署成功了。
1.2. 使用 docker-cli 命令部署
使用 docker 命令部署参考如下设置,最新版本 3.1.0 也是一样的命令,我已经测试过了,修改镜像的 tag 就可以了。其中你可以修改的是 -v
选项冒号左侧的宿主机目录,以及 -p
选项后冒号左侧的宿主机端口号。
sudo docker run -d \
--name siyuan \
-v 你需要绑定的宿主机目录:/home/siyuan/sy \
-p 你需要绑定的宿主机端口:6806 \
--restart=always \
b3log/siyuan:v2.11.4 \
--workspace=/home/siyuan/sy \
--lang=zh_CN \
--accessAuthCode=123456
部署完毕后,一定要检查你绑定的宿主机目录下是否有文件!没有文件是有问题的!比如我使用 -v /home/wsl/synote/data:/home/siyuan/sy
命令创建了思源容器,此时 ls -l
查看宿主机该路径下会有如下文件,这才是正常情况。
❯ ls -l /home/wsl/synote/data
total 12K
drwxr-xr-x 3 wsl wsl 4.0K May 25 18:23 conf
drwxr-xr-x 11 wsl wsl 4.0K May 25 18:23 data
drwxr-xr-x 4 wsl wsl 4.0K May 25 18:21 temp
1.3. 使用 docker-compose 部署
在威联通 container-station-3 中支持 docker-compose,就是界面中的 应用程序
这一栏。真的得吐槽一下 qnap 的国内翻译组,一股机翻的味道,你还不如不翻译,直接用 stack 或者 docker-compose 还更好让人理解一些,最开始我都不知道应用程序是嘛玩意,还以为 container-station 从 2 变成 3 后不支持 docker-compose 了。
这里给出 qnap 可以使用的 docker-compose.yml
,其实也是所有 Linux 通用的。
该 yml 文件的注意事项在注释里面提到了。其中 volumes 的配置一定要注意,我们在 container-station-3 里面可以选择我们的文件夹,但是这些我们创建的共享文件夹的绝对路径都是在 /share
下的,比如我的共享文件夹名称为 Public,那么最终需要在 docker-compose 里面写的绝对路径就是 /share/Public
。如果你不注意这一点,直接从 /Public
开始写,就会发现无论如何配置,思源容器都无法启动,会提示权限不够。说白了还是宿主机目录映射错位置了。
version: '3'
services:
siyuan_compose:
image: b3log/siyuan:v2.11.4
container_name: siyuan-compose
restart: unless-stopped
environment:
PGID: 1000
PUID: 1000
TZ: "Asia/Shanghai"
ports:
# 本地端口改冒号左边的。
- "20000:6806"
volumes:
# 本地映射路径改冒号左边的。
# 注意qnap的docker-compose采用绝对路径,需要在前面加上/share才是共享文件夹!
- /share/Public/docker/data/synote/data:/home/siyuan/sy
# 登录密码改最后一个accessAuthCode命令等号之后的,其他的别改。
command: ["--workspace=/home/siyuan/sy","--lang=zh_CN","--accessAuthCode=123456"]
stdin_open: true ## 相当于 -i
tty: true ## 相当于 -t
写进去后点击创建,即可创建思源容器。
请进入容器日志检查是否成功启动,以及进入本地映射的目录检查是否有文件!一定要检查一定要检查,不要等你到时候容器出问题了发现本地目录没有文件!
比如日志中不应该出现报错,工作空间路径和我们配置的一致,以及 /share/Public/docker/data/synote/data
路径下应该出现 conf、data、temp 等文件夹。
如果是其他 Linux 主机,将上述内容修改成你的配置之后,在你的 linux 主机上将上述内容写入一个 docker-compose.yml
文件,然后使用如下方式启动思源容器
sudo docker-compose up -d
如果提示 docker-compose
命令不存在,可以试试 docker compose
命令,如果还是提示不存在,则需要去安装 docker-compose
,本站有相关博客。
2. 如何设置镜像源?
PS: 因为一些原因,各大服务商提供的公开 docker 镜像源都下架了,您可以尝试自建镜像源或百度一下目前仍然可用的免费公开镜像源。注意,目前可用的公开镜像源大多是互联网用户主动提供的,可能会存在安全风险!
2.1. contianer station3 如何添加镜像源?
默认情况下 dockerhub 的连通性并不是很好,可能没有办法 pull 镜像,所以需要设置 docker 的镜像源。
设置方法如下。
点击添加存储库,提供商选择其他,然后 URL 是填镜像源的名称。
推荐使用南京大学的镜像 https://docker.nju.edu.cn
,速度不错。
填好了之后点击测试链接,成功就 OK 了,点击应用。
设置了之后,在映像中就可以使用这个镜像源来 pull 容器了。
不过没有办法通过镜像源来搜容器,自带的搜索只能使用 dockerhub 来 pull 镜像。每次需要镜像的时候,都得去找容器的镜像名字是什么,还是有点不方便。
2.2. docker 命令行如何添加镜像源?
docker 的命令行需要修改系统的配置来设置镜像源,对应的文件是 /etc/docker/daemon.json
。修改这个文件之前,建议先备份一份(如果原本有这个文件的话)
sudo cp /etc/docker/daemon.json ./docker-daemon.json.bak
然后使用 nano 或 vim 编辑器修改这个文件
sudo vim /etc/docker/daemon.json
往文件中复制粘贴如下内容
{
"registry-mirrors": ["https://docker.nju.edu.cn"]
}
随后重启 docker 服务就可以了,如果无法重启 docker 服务,也可以直接重启整个主机。
sudo systemctl restart docker
3. 部署思源后可能遇到的问题
3.1. 工作空间不一致问题
在下面的这个命令中,我们将使用 -v
命令映射的容器内的目录(冒号右侧)和 --workspace
的选项都设置为了 /home/siyuan/sy
。在部署的时候一定要确认二者的设置是一致的,否则思源会因为找不到容器内的目录,而采用默认的工作空间。相当于路径映射失败。
docker run -d \
--name siyuan \
-v 你需要绑定的宿主机目录:/home/siyuan/sy \
-p 你需要绑定的宿主机端口:6806 \
--restart=always \
b3log/siyuan:v2.11.4 \
--workspace=/home/siyuan/sy \
--lang=zh_CN \
--accessAuthCode=123456
对于不太了解 docker 机制的用户而言,此时删除了该容器,你的数据就很难找回来了!!这也是为什么前文一直强调,创建了容器后,要去检查自己的本地路径中是否有对应的文件。
比如你使用了如下映射,那么在创建容器后,一定、一定、一定要去宿主机本地的 /home/mu/synote
路径下检查是否多出了思源创建的文件!!!!验证方法很简单,你可以给思源单独创建一个新的文件夹,当思源容器启动后,这个文件夹里面多出了 repo、data、temp 等目录,那么就是映射成功了。
-v /home/mu/synote:/home/siyuan/sy
如果没有出现新的目录,那就需要去检查思源容器日志,看看工作空间是否正常,以及宿主机目录是否有权限问题导致容器内无法访问。
3.2. 权限问题
思源容器是使用 1000 用户来创建和访问文件的,所以如果你映射的宿主机路径无法被 1000 用户或用户组访问,此时日志中就会出现 Permission Deny
字眼,代表思源缺少权限,没有办法在你映射的工作空间中创建和访问文件。
你可以通过 docker logs
命令查看容器的日志。
docker logs 思源容器名字
下面是一个思源的日志,来源于社区帖子。在这个日志中出现了 [lstat /root/document/fllsynote: permission denied]
的输出,代表当前思源没有办法访问 /root/document/fllsynote
这个路径,因为它是一个 root 用户的路径,权限组不是 1000,无法被思源容器的 1000 用户组访问。
然后日志中的第二行输出的意思是,思源发现你提供的工作路径 /root/document/fllsynote
压根没有办法访问,不是个路径(因为思源没有权限访问),所以它会去使用默认的工作路径 /home/siyuan/SiYuan
。这个时候问题就来了,如果你没有去检查容器日志和本地文件,你会发现思源是正常启动且可以使用的,但它把你的笔记都写入了容器内部,如果后续你的 docker 出现问题或者你想升级思源镜像版本的时候,把当前容器删除了,数据就丢了!
sudo chown -R 1000 文件夹
sudo chgrp -R 1000 文件夹
比如我使用了 -v /root/siyuan:/home/siyuan/sy
进行映射,此时我映射的宿主机目录是在 root 用户下,大概率是没有办法被容器内直接访问的。此时思源日志中就会出现 Permission Deny
错误
这样操作了之后,这个文件夹就可以被容器内访问了,不过你还是需要去检查日志或该文件夹判断是否成功。
还是那句话,创建了容器后,一定要去检查自己的本地路径中是否有对应的文件!
4. 写在最后
不管你采用什么方式部署的容器,请一定要确认你映射的本地路径中有对应的文件!数据无价哦!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于