关于 Docker 思源笔记使用 Docker-compose 更改授权码的问题

私有化部署

按照 思源笔记 docker 部署及第三方同步 做的 docker 私有化部署。

yml 文件如下:

version: '3'

services:
  siyuan:
    image: b3log/siyuan:latest
    container_name: fllsiyuan
    restart: always
    volumes:
      - /siyuan:/root/document/fllsynote
    command: [--workspace=/root/document/fllsynote,--lang=zh_CN,--accessAuthCode=88888888]
    ports:  
      - "7777:6806"

更改授权码

长期使用后,授权码 8 个 8 太长,想修改为 11。

使用命令


docker-compose stop siyuan

然后修改 yml 文件中授权码为 11,如下。

version: '3'

services:
  siyuan:
    image: b3log/siyuan:latest
    container_name: fllsiyuan
    restart: always
    volumes:
      - /siyuan:/root/document/fllsynote
    command: [--workspace=/root/document/fllsynote,--lang=zh_CN,--accessAuthCode=11]
    ports:  
      - "7777:6806"

然后

docker-compose start siyuan

经测试授权码未更改为 11,原先的思源笔记数据还在。

使用新的命令

docker-compose up -d

经测试授权码更改为 11,原先的思源笔记数据丢失(提前已备份)。

问题

请教各位贤达,这是怎么回事?如何达到目的(docker-compose 修改授权码,思源笔记数据不丢失)?

还是 docker-compose 不能实现?

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22345 引用 • 89404 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • docker-compose start 是不会更新 yml 文件的修改的,up 才会,所以你 start 之后访问授权码没有变化是正常的。

    至于数据丢失,不太清楚什么问题。如果你没有修改过 volumes 的绑定,应该不会数据丢失才对。请检查宿主机的 /siyuan 目录里面有没有内容。现在看你这个设置我感觉你是不是把宿主机和容器内的路径搞反了。

  • daziduan
    作者

    /root/document/fllsynote

    这个目录里面什么也没有。

    怎么进行 VPS 宿主目录和 docker 容器的对应?有没有参考文件?

    另外,谢谢 @muxue!

    1 回复
  • 你搞错了!是检查本地的 /siyuan 路径。

    对于 docker 而言,volumes 和 ports 配置项目中冒号左侧的是宿主机,右侧的是容器内,你现在是把容器内的 /root/document/fllsynote 映射到宿主机的 /siyuan 路径了。

    正如我上一条留言所说,我觉得你搞反了,果不其然,是真搞反了……

  • daziduan
    作者

    @ muxue

    你好。
    按你说的更改 yml

    version: '3'

    services:
    siyuan:
    image: b3log/siyuan:latest
    container_name: fllsiyuan
    restart: always
    volumes:

    • /root/document/fllsynote:/siyuan
      command: [--workspace=/root/document/fllsynote,--lang=zh_CN,--accessAuthCode=11]
      ports:
    • "7777:6806"

    启动之后。

    使用 docker-compose logs 之后显示下面信息:

    fllsiyuan | W 2024/07/24 19:23:09 file.go:210: determines whether [/root/document/fllsynote] is a directory failed: [lstat /root/document/fllsynote: permission denied]
    fllsiyuan | W 2024/07/24 19:23:09 working.go:258: use the default workspace [/home/siyuan/SiYuan] since the specified workspace [/root/document/fllsynote] is not a dir
    fllsiyuan | I 2024/07/24 19:23:09 working.go:147:

    我看显示错误,怎么修正错误?

    进容器之后
    /opt/siyuan/guide/20240530133126-axarxgx $ ls
    20240530101000-3xv6jjr.sy 20240530101000-bgv304g.sy 20240530101000-hkgs92c 20240530101000-mpln2lp.sy storage
    20240530101000-4qitucx 20240530101000-e6z5okf.sy 20240530101000-hkgs92c.sy 20240530101000-znj103k.sy
    20240530101000-4qitucx.sy 20240530101000-flot1gj.sy 20240530101000-jp793ic.sy assets

    请贤达指教。

    1 回复
  • muxue 1 赞同

    你这样改没有意义啊。你的本地 /root/document/fllsynote 里面没有数据啊,你直接给她改了不还是没有数据吗……?现在的问题是权限不够,因为这是一个 root 用户下的路径,容器内没有办法访问。解决办法如下

    chgrp 1000 /root/document/fllsynote
    chown 1000 /root/document/fllsynote
    

    但是这并没有解决你的问题,因为你的问题是你之前容器的文件全都存放在宿主机的 /siyuan 里面了,这已经是我说的第三遍了,请检查宿主机的 /siyuan 路径有没有文件!!!

    现在你在容器里面 ls 的目录文件压根不是工作目录,里面的文件我猜是思源官方的使用指南文件。


    另外,评论区也能发代码块的,请使用代码块框住你的 yml 和 log,现在一点排版都没有,阅读太不友好了。


    最后的最后,非常不建议各位在没有弄清楚 docker 运行的原理的情况下,就盲目上 docker……

    image.png

  • fradeet

    按你的情况还是搞个粗糙点的方法吧...在你原来有笔记的容器上

    docker cp fllsiyuan:/root/document/fllsynote/conf/conf.json ./conf.json
    

    拷贝出容器中的 JSON 文件,查找 accessAuthCode 并修改保存,拷贝回去,重启容器。

    docker cp ./conf.json fllsiyuan:/root/document/fllsynote/conf/conf.json
    
  • daziduan
    作者

    实践是检验真理的唯一标准

    非常非常感谢 @muxue ,你的材料给了我很多思考。

    先回复你一下,/siyuan 目录下没有任何文件,也就是说宿主文件和容器之间路径没有正确的映射关系

    从开头捋一下。

    下面是原先的 yml 文件

    version: '3'
    
    services:
      siyuan:
        image: b3log/siyuan:latest
        container_name: fllsiyuan
        restart: always
        volumes:
          - /siyuan:/root/document/fllsynote
        command: [--workspace=/root/document/fllsynote,--lang=zh_CN,--accessAuthCode=88888888]
        ports:  
          - "7777:6806"
    

    昨天,我把 Docker 删除了,重新安装。

    docker rm -f fllsiyuan
    docker-compose up
    

    之后出现的 logs 文件,如下:

    fllsiyuan | W 2024/07/24 19:23:09 file.go:210: determines whether [/root/document/fllsynote] is a directory failed: [lstat /root/document/fllsynote: permission denied]
    fllsiyuan | W 2024/07/24 19:23:09 working.go:258: use the default workspace [/home/siyuan/SiYuan] since the specified workspace [/root/document/fllsynote] is not a dir
    fllsiyuan | I 2024/07/24 19:23:09 working.go:147:
    

    经过研究,本段 logs 的意思是,在容器中[/root/document/fllsynote]访问?读写允许被拒绝,使用默认的容器目录[/home/siyuan/SiYuan]。(注意,此时容器中思源笔记还在正常运行!!这可能是一切问题的源头)(**所以,我不知道此种情况下宿主目录与容器目录的对应关系,一直运行至今 VPS 没敢关机!😭 **)

    那我把容器目录改为[/home/siyuan/SiYuan]是不是就可行了?也不行

    fllsiyuan  | E 2024/07/25 14:16:34 working.go:280: create os tmp dir [/home/siyuan/SiYuan/temp/os] failed: mkdir /home/siyuan/SiYuan/temp: permission denied
    

    今天验证了一下,也是会出错的,denied。

    其实是权限的问题,根据 @mexue 的提示,使用

    chgrp 1000 /siyuan
    chown 1000 /siyuan
    
    

    下面我把在 final shell 中的 log 文件贴出来,大家看下。

    root@dazi:/# cd siyuan
    root@dazi:/siyuan# docker-compose up
    [+] Running 1/1
     ⠿ Container fllsiyuan  Created                                                                                                         0.2s
    Attaching to fllsiyuan
    fllsiyuan  | E 2024/07/25 14:40:55 working.go:280: create os tmp dir [/home/siyuan/SiYuan/temp/os] failed: mkdir /home/siyuan/SiYuan/temp: permission denied
    fllsiyuan exited with code 0
    fllsiyuan  | E 2024/07/25 14:40:56 working.go:280: create os tmp dir [/home/siyuan/SiYuan/temp/os] failed: mkdir /home/siyuan/SiYuan/temp: permission denied
    fllsiyuan exited with code 0
    fllsiyuan  | E 2024/07/25 14:40:57 working.go:280: create os tmp dir [/home/siyuan/SiYuan/temp/os] failed: mkdir /home/siyuan/SiYuan/temp: permission denied
    fllsiyuan exited with code 25
    fllsiyuan  | E 2024/07/25 14:40:58 working.go:280: create os tmp dir [/home/siyuan/SiYuan/temp/os] failed: mkdir /home/siyuan/SiYuan/temp: permission denied
    fllsiyuan exited with code 25
    ^Z
    [1]+  Stopped                 docker-compose up
    root@dazi:/siyuan# docker rm -f fllsiyuan
    fllsiyuan
    root@dazi:/siyuan# chgrp 1000 /siyuan
    root@dazi:/siyuan# chown 1000 /siyuan
    root@dazi:/siyuan# docker-compose up
    [+] Running 1/1
     ⠿ Container fllsiyuan  Created                                                                                                         0.1s
    Attaching to fllsiyuan
    fllsiyuan  | I 2024/07/25 14:41:46 working.go:147: 
    

    此时在 /siyuan 目录下生成了如下图片的数据文件:

    1.png

    OK! 至此,总算是宿主机和容器路径能正确映射了。

    这下,我的 VPS 可以重启了,即使是意外断电也不怕资料丢失了。😄


    此时使用下列命令可更改授权码且资料不丢失

    docker-compose stop fllsiyuan
    #此时使用nano更新授权码为11
    docker-compose up
    

    总结

    其实本问题是两个问题

    1、更改授权码。

    2、为什么资料会丢失。

    关键是我在 docker 安装思源笔记时就错了,没有正确映射宿主机和容器正确路径,所以糅合成了一个问题。

    鸣谢

    感谢 @muxue 的回复。

    另,@fradeet ,你的方案我后续会进行验证,谢谢你。

    保留

    对 @muxue "最后的最后,非常不建议各位在没有弄清楚 docker 运行的原理的情况下,就盲目上 docker……"的说法我不赞同。

    我认为:在做好备份的情况下,即使没有彻底弄懂 docker 运行的原理,也勇敢的去尝试吧,上 docker 本来就是弄懂 docker 运行原理的过程。

    回忆过往时,人们从来因为没做过什么而遗憾,而不是为做过什么而遗憾!

    1 回复
  • daziduan
    作者

    @fradeet

    你好,整个实验过程如下图

    2.png

    根据你的回复

    首先我用命令停止 fllsiyuan

    docker stop fllsiyuan
    

    然后下载在本地修改授权码。
    15.37,我将授权码更改为 22 后传到本地目录下 conf.json。

    使用下面命令拷贝到容器。

    docker cp ./conf.json fllsiyuan:/root/document/fllsynote/conf/conf.json
    

    我再次使用命令从容器下载到宿主机来验证。

    docker cp fllsiyuan:/root/document/fllsynote/conf/conf.json ./conf111.json
    

    如图片 conf111.json,下载到本地查看授权码为 22。

    使用命令启动 fllsiyuan

    docker start fllsiyuan 
    

    验证发现,授权码没变更为 22。

    我再次下载 conf.json,如图 15.42 的 conf222.json 结果授权码还是 11。

    docker cp fllsiyuan:/root/document/fllsynote/conf/conf.json ./conf222.json
    

    另外使用

    docker-compose up
    

    也按预想的一样,没有更改授权码,因为这个命令是以 yml 文件信息启动的。我们没有更改 yml 文件中的信息。所有当然,授权码不会变更。

    请教一下,是我方法错误还是那里步骤不对?🙏

    1 回复
  • fradeet

    你需要在容器开着的时候执行修改操作。重启只是为了让文件生效。

  • daziduan
    作者

    @fradeet

    你好。我确实想搞明白,这种方法是否可行。

    我按你的建议,容器开着时候执行拷贝,修改,再拷贝回去,restart。如下。

    3.png

    能够看到执行命令后有,successfully 的反馈。

    但是授权码没有更改。

    docker inspect fllsy_c
    

    看到的授权码也是以前的授权码。

    请帮忙看下,哪里出问题了?🙏

    1 回复
  • fradeet

    听你说不行个人去试了一遍,发现这个方法确实是已经被修复不能用了。Docker 版本目前只能使用命令参数去配置授权码。

    另外,从该版本开始通过 Docker 部署时必须设置访问授权码命令行参数 --accessAuthCode,不设置的话无法正常启动。

    思源笔记 v2.10.8 发布,修复缺陷 - 链滴 (ld246.com)

    个人忘记了这回事,非常抱歉。

  • 首先,您发的评论都没有回复别人,对方是收不到通知的。

    其次,我说的不了解 docker 运行原理说的是 docker 技术层面的东西。像这里的 volumes 设置和 ports 设置还有 command,全都是和 dockerfile 以及 docker 容器是如何被 build、run 息息相关的,虽然不是说你不懂 docker 技术架构就不能用 docker。但是会给你带来很多麻烦,比如您现在做的一堆错误尝试都是能避免的……

    不过有一点您说的很对,那就是做这些操作之前一定要备份好笔记。

    举个例子,最好的试错和学习方式,是拿一个 demo 镜像来看看这些 volumes 设置和 ports 设置还有 command 到底是什么东西,而不是拿需要特殊配置的思源容器来实验。

    最后,我看了您引用的那个教程,那个教程里面写的也有点误导人,容器里面用的反而是 root 路径,容器外面用的是 /siyuan,很容易产生误解。因为一般情况下都是不建议直接在 linux 宿主机的 / 根路径下创建文件夹存放数据的。这就好比你在 Windows 电脑上专门分了个盘作为思源的工作空间路径,很容易出现问题。

    1 回复
    1 操作
    muxue 在 2024-07-25 19:41:58 更新了该回帖
  • daziduan
    作者

    @muxue 谢谢,和你沟通学习了很多。

    首先

    look,我会用回复了。😄

    其次

    我明白你的意思了。要系统的学习,东一抓西一抓的零碎,不系统。

    我找了一个系统讲解 docker 的教程。

    最后

    对于你说的我引用的教程。确实,你能从教程里看到我犯错的痕迹。但我依然感谢这个教程。

    PS:我也感谢 this 教程 😄

  • kangopen

    访问授权码,我这边在飞牛 OS 的 docker 里,停止服务,修改命令栏内容保存,开启服务就修改完成了

请输入回帖内容 ...