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

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

用户权限

镜像中是使用默认创建的普通用户 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 部署一个)。

  • 思源笔记

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

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

    26332 引用 • 109505 回帖 • 1 关注
  • Q&A

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

    10124 引用 • 46010 回帖 • 63 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • @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

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

请输入回帖内容 ...

推荐标签 标签

  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 661 关注
  • OneDrive
    2 引用 • 5 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 409 关注
  • V2Ray
    1 引用 • 15 回帖 • 4 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 611 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 4 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 376 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 764 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 563 关注
  • Ruby

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

    7 引用 • 31 回帖 • 266 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 153 关注
  • JRebel

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

    26 引用 • 78 回帖 • 682 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 368 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖 • 1 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 29 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    346 引用 • 757 回帖 • 1 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 239 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 2 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 224 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    25 引用 • 248 回帖
  • Visio
    1 引用 • 2 回帖 • 2 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 186 关注
  • 印象笔记
    3 引用 • 16 回帖