求群晖 Docker 部署思源,PC 端 Drive 无法同步解决方案

本贴最后更新于 1266 天前,其中的信息可能已经水流花落

用户权限

镜像中是使用默认创建的普通用户 siyuan(uid 1000/gid 1000)来启动内核进程的,所以在宿主机创建工作空间文件夹时请注意设置该文件夹所属用户组:chown -R 1000:1000 /siyuan/workspace,在启动容器时需要带参数 -u 1000:1000

Docker 部署脚本

docker run -itd \ -u 1000:1000 \ -e TZ=Asia/Shanghai \ -e LANG=zh_CN.UTF-8 \ -e LC_ALL=zh_CN.UTF-8 \ -v <PATH_DIR>:/SiYuan/ \ --restart=always \ --network=host \ --name siyuan \ b3log/siyuan:latest -resident -workspace /SiYuan -accessAuthCode <YOUR_PASSWORD> -servePath <domain:port> -ssl
  • <PATH_DIR>:是在 Synology Drive 下建的文件夹,用来同步 PC 端的思源

问题

由于用户权限需要为 -u 1000:1000,故需要用 chown -r 1000:1000 设置 PATH_DIR 所属用户与用户组。这将导致 Synology Drive 识别该文件夹所属用户为 未知用户 且无法同步。

使用 Synology Drive 同步数据原由

Web 端缺少部分功能,如:导出 WordPDF...。PC 端软件为生产主力,移动端使用 Web 查看,避开安卓 data 权限不好获取问题(不要说 Folder Sync,需要 WebDav,群晖套件也没法添加额外目录,除非再 docker 部署一个)。

  • 思源笔记

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

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

    26125 引用 • 108472 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    10040 引用 • 45627 回帖 • 68 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • @88250 希望放开 Docker 用户权限,或则增加环境变量,可让用户自定义归属用户权限组

    1 回复
  • 你好,我不清楚通过环境变量要如何实现,麻烦指导一下。

    4 回复
  • 一、修改容器用户 UID 和 GID

    docker 容器内的用户也算是千奇百怪了……一般情况下是没有什么影响的,但是有时我们想通过 volume 把内容挂在出来的时候,就会出现权限的问题了。如果都改成 777 明显是不合适的。如 LinuxServer 提供的容器一般都会提供通过环境变量的方式来修改 UIDGID。当然如果你千年不变的用 root 那么当我什么也没说了……

    通过给 TiddlyWiki 制作 docker 镜像的时候,实现了一个动态修改 UIDGID 的方案。通过启动 entrypoint.sh 来修改容器内用户的信息达到和容器外用户一致的 UIDGID

    dockerfile

    FROM node:lts-alpine3.13 MAINTAINER liuwentao@gmail.com RUN \ echo "https://mirrors.cloud.tencent.com/alpine/v3.11/main/" > /etc/apk/repositories && \ echo "https://mirrors.cloud.tencent.com/alpine/v3.13/community/" >> /etc/apk/repositories && \ apk add shadow && \ useradd -u 666 -U -d /config -s /bin/false abc && \ usermod -G users abc && \ npm install -g tiddlywiki@5.1.23 --registry=https://registry.npm.taobao.org EXPOSE 8080 VOLUME [ "/app" ] WORKDIR /app COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh CMD [ "/entrypoint.sh" ]

    #!/usr/bin/env sh PUID=${PUID:-911} PGID=${PGID:-911} groupmod -o -g "$PGID" abc usermod -o -u "$PUID" abc groupmod -o -g "$PGID" abc usermod -o -u "$PUID" abc chown abc:abc /app if [ ! -f "/app/tiddlywiki.info" ]; then tiddlywiki /app --init server fi tiddlywiki /app --listen host=0.0.0.0

    核心是通过 groupmodusermod 修改用户 abcUIDGID。这两个软件在 alpine 中对应的软件包是 shadow

  • 二、# 如何优雅的在 Docker 容器中指定用户及组权限的三种方式

    如果平常有在玩 Docker 的用户肯定知道透过 docker command 启动的容器预设是使用 root 用户来当作预设使用者及群组的。这样就会遇到一个问题,当主机环境你拥有 root 权限时就没有此问题。如果你没有 root 权限,又有需求在 Docker 容器內挂上 Volume,会发现产生出来的文件皆会是 root 权限,这时候在主机完全是无法写入的。本篇文章将教大家三种方式来设定容器使用者权限,以解决上述遇到的问题。

    使用 docker 指令时指定使用者

    以进入一个 Ubuntu 容器为例,通过以下指令:

    $ docker run -ti ubuntu /bin/bash

    这时候我们可以通过 -u 方式将使用者 uid 及群组 gid 传入容器内。

    $ mkdir tmp $ docker run -ti -v $PWD/tmp:/test \ -u uid:gid ubuntu /bin/bash

    如何找到目前使用者 uid 及 gid 呢,可以通过下面的方式。

    $ id -u $ id -g

    为了更加方便,上述指令可以改成:

    $ docker run -ti -v $PWD/tmp:/test \ -u $(id -u):$(id -g) ubuntu /bin/bash

    使用 Dockerfile 指定使用者

    除了在 Docker 命令行指定外,你也可以在 dockerfile 内直接指定使用者。

    # Dockerfile USER 1000:1000

    我个人不是很推荐这方式,除非是在 container 内独立建立使用者,并且指定权限。

    通过 docker-compose 指定权限

    通过 docker-compose 可以一次启动多个服务。用 user 可以指定使用者权限来写入特定的 volume。

    services: agent: image: xxxxxxxx restart: always networks: - proxy logging: options: max-size: "100k" max-file: "3" volumes: - ${STORAGE_PATH}:/data user: ${CURRENT_UID}

    接着可以通过 .env 来指定变量的值。

    STORAGE_PATH=/home/deploy/xxxx CURRENT_UID=1001:1001

    总结

    以上场景通常会发生在有挂载主机 Volume 进入容器内,但是你又没有 root 用户权限时。如果此时不指定使用者权限,这样生成出来的文件都会是 root 权限,一般用户无法写入,只能读取。

  • 三、参考 Gitea Dockerfile

    环境变量

    您可以通过环境变量配置 Gitea 的一些设置:

    ################################### #Build stage FROM golang:1.17-alpine3.13 AS build-env ARG GOPROXY ENV GOPROXY ${GOPROXY:-direct} ARG GITEA_VERSION ARG TAGS="sqlite sqlite_unlock_notify" ENV TAGS "bindata timetzdata $TAGS" ARG CGO_EXTRA_CFLAGS #Build deps RUN apk --no-cache add build-base git nodejs npm #Setup repo COPY . ${GOPATH}/src/code.gitea.io/gitea WORKDIR ${GOPATH}/src/code.gitea.io/gitea #Checkout version if set RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \ && make clean-all build # Begin env-to-ini build RUN go build contrib/environment-to-ini/environment-to-ini.go FROM alpine:3.13 LABEL maintainer="maintainers@gitea.io" EXPOSE 22 3000 RUN apk --no-cache add \ bash \ ca-certificates \ curl \ gettext \ git \ linux-pam \ openssh \ s6 \ sqlite \ su-exec \ gnupg RUN addgroup \ -S -g 1000 \ git && \ adduser \ -S -H -D \ -h /data/git \ -s /bin/bash \ -u 1000 \ -G git \ git && \ echo "git:*" | chpasswd -e ENV USER git ENV GITEA_CUSTOM /data/gitea VOLUME ["/data"] ENTRYPOINT ["/usr/bin/entrypoint"] CMD ["/bin/s6-svscan", "/etc/s6"] COPY docker/root / COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini RUN ln -s /app/gitea/gitea /usr/local/bin/gitea

    entrypoint:

    #!/bin/sh if [ "${USER}" != "git" ]; then # rename user sed -i -e "s/^git\:/${USER}\:/g" /etc/passwd fi if [ -z "${USER_GID}" ]; then USER_GID="`id -g ${USER}`" fi if [ -z "${USER_UID}" ]; then USER_UID="`id -u ${USER}`" fi ## Change GID for USER? if [ -n "${USER_GID}" ] && [ "${USER_GID}" != "`id -g ${USER}`" ]; then sed -i -e "s/^${USER}:\([^:]*\):[0-9]*/${USER}:\1:${USER_GID}/" /etc/group sed -i -e "s/^${USER}:\([^:]*\):\([0-9]*\):[0-9]*/${USER}:\1:\2:${USER_GID}/" /etc/passwd fi ## Change UID for USER? if [ -n "${USER_UID}" ] && [ "${USER_UID}" != "`id -u ${USER}`" ]; then sed -i -e "s/^${USER}:\([^:]*\):[0-9]*:\([0-9]*\)/${USER}:\1:${USER_UID}:\2/" /etc/passwd fi for FOLDER in /data/gitea/conf /data/gitea/log /data/git /data/ssh; do mkdir -p ${FOLDER} done if [ $# -gt 0 ]; then exec "$@" else exec /bin/s6-svscan /etc/s6 fi
  • 感谢提供资料,等有空的时候我们学习一下。理论上目前可以考虑自己制作 Docker 镜像来解决这个问题,镜像所需的工件都可以在桌面端发布包里找到。

    1 回复
  • 可以给个 Dockerfile 么?

    1 回复
  • Dockerfile 是基于源码的,现在思源这部分没有开源,所以无法给出。但是可以试着基于桌面端发布包来自己制作镜像,只需包含桌面端安装后 resources 文件夹下面的这几个部分:

    • appearance
    • guide
    • stage
    • kernel

    其中 kernel 文件夹下面是内核可执行文件,启动传参可参考帮助文档。

    1 回复
  • nn200433 via iPad

    那能说下 Dockerfile 里的 Linux 系统时基于哪个 image 镜像么?
    比如 FROME centos:latest

    1 回复
  • FROM alpine:latest

  • joshuazm via macOS

    请问最后解决了吗?我这个问题就是在群晖上部署,访问群晖指定的网址进行创建或者修改的笔记无法,在本地进行同步,但是利用 synology Drive 可以同步 PC 端创建的笔记,也就是成了单向同步了。

    1 回复
  • nn200433 via Android

    把用户去掉就行了,看我主业的其他帖子

请输入回帖内容 ...

推荐标签 标签

  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 633 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    372 引用 • 1857 回帖 • 1 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 707 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    954 引用 • 944 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 671 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 1 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 818 回帖 • 1 关注
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 262 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 10 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 121 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 197 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 677 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 181 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖 • 2 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 3 关注
  • Follow
    4 引用 • 12 回帖 • 4 关注
  • 自由行
    2 关注