使用第三方网盘接管思源笔记静态文件同步

0.缘起

近两年双链笔记和在线协作平台大火,国内外各类新兴笔记应用如雨后春笋般的冒了出来,包括但不限于国外的 rome research、notion、obsidian 和国产的 wolai、飞书、语雀等。作为一个大部分时间都在时间管理、大部分笔记都是记笔记软件技巧的跟风小能手,自然也是第一时间比较了各种软件,选择上车 wolai 作为主力。其丝滑的使用体验随着出国来到了霓虹戛然而止。在忍受了因网络延迟造成的图片上传丢失、打开笔记加载缓慢、图片反复加载失败、阿里云海外节点网络波动需要反向回国将近大半年后,配合麦库云笔记删库跑路的骚操作,让我重新审视“云端存储,永不丢失”这句宣传语,并决心把主力转向本地笔记。用云平台进行协作和使用本地保证笔记随时可用并不冲突。

在选择软件时,重新思考一下自己的需求:

  1. 要保证有本地客户端且数据存在自己的电脑上,即使软件开发跑路了也能继续使用。
  2. 需要有跨设备同步的能力,方便家里-研究所-手机上的同步修改与查看,同步服务价格不宜太贵,控制在百元以内为佳。
  3. 保留双链笔记这一核心特性,来保证能方便的组织联系散落在各处的文献阅读笔记中的相似点。以方便后续的论文梳理与写作。
  4. 编辑器最好不要太丑且要所见即所得(个人并不太习惯 typora 和 obsidian 的源码编辑与预览切换模式),并且能支持界面内跟 vscode 一样自由分屏与多开界面(也忍了 wolai 的单一侧边栏很久了,且完全看不到相关计划)
  5. 不一定非要以 markdown 存储文本(你会纠结 OneNote),但要支持导出为 markdown 格式。
  6. 拥抱开源,可以不完全公开源代码,但至少提供 API 或可访问的数据库,让我能根据自己的需求写点趁手的小程序交互。

能满足以上要求的不多,思源笔记成功入围。初次尝试了一些基本功能后,发现网友戏谑的离线版 wolai 这个称号所言非虚,虽然部分 UI 操作和布局思路不太一样,但是基本上符合之前的使用习惯。思源的部分功能如容器块和块属性,配合内部的 SQL 筛选块,能达到更灵活的组合效果。充值上车官方同步功能后,遇到了同样的问题:与国内服务器连接龟速的同步速度(亲测约 5kb/s),而且云空间只有 8GB,当后期笔记图片与附件增长起来后一定会是一个大问题(PS:参考下面背景知识的 6 和 7,也可以完全不使用官方同步来实现跨设备同步功能)。

所幸在入坑的第二天,思源就发布了 v1.3.7 支持添加同步忽略文件。由于思源的图片与附件等静态资源都是固定放在 工作空间/data/assets 文件夹下,因此只要将这个文件夹屏蔽,思源就只会同步纯文本信息,极大地减轻同步压力与空间占用。然后配合使用 OneDrive 等第三方同步盘,专门用来高速地同步大量静态资源。

由于功能刚刚发布,刚开始操作就在踩了几个雷,在连续提交了同步屏蔽列表对软连接的兼容问题不同步符号链接两个 bug 后,思源笔记终于在 v1.3.9 版本中,稳定支持了该特性,特此记录以供参考。笔者水平有限,如有疏漏错误之处,还恳请指正。

1.背景知识

  1. OneDrive 只会同步 OneDrive 文件夹下的所有内容,并不能指定同步该目录外的文件夹,大部分同步盘也是这个思路,这是万恶之源。
  2. 符号链接 (软连接、symbolic link)是指一类特殊文件,用来指向其它文件或者目录。以实现在不同的文件夹内可以包含完全相同的文件或文件夹。Windows 下使用 mklink /J 软连接文件 原文件夹,mac/linux 下使用 ln -s 原文件夹 软连接文件 来创建
    或者也可以使用本地版本对比软件来让两个文件夹保持一致,但不如符号链接来得方便
  3. 安卓设备 上则相反,建议使用上述软件代替符号链接,以实现 OneDrive 内文件夹与手机内指定文件夹的数据同步。
  4. 多设备同步 时,需要将要同步的文件夹置于 OneDrive 内,然后使用符号链接去映射到外部需要同步的文件夹(即需要把外部的文件夹先剪切到 OneDrive 内,然后使用符号链接映射到原先的位置),方向反过来不可行,这样 OneDrive 只会同步“符号链接”本身这个特殊文件,而非其包含的内容。
  5. 思源同步屏蔽列表 的详细语法请参考思源帮助-云端-数据同步-忽略文件,这边需要屏蔽 assets 文件夹的话,只需要在 工作空间/data/.siyuan/syncignore 文件中(没找到就新建一个,如果 mac 上找不到.siyuan 这个隐藏文件夹,使用显示隐藏文件 command+shift+.)添加一行 assets/**/*
  6. 也可以不使用思源官方的 Pro 账号同步功能(该软件的唯一氪金点),使用第三方网盘直接同步或备份 工作空间/data 下的所有文件,但是在笔记编辑的过程中,思源会锁住个别文件无法同步,只有完全退出之后第三方同步盘才会工作
  7. 当需要跨设备协作时,除了可以使用第三方/官方同步之外,当需要协作的设备处在同一个局域网中,可以使用“思源伺服”功能,相当于把一个设备当做服务器,另一台设备直接使用浏览器协作,而且逆天的是,这个当服务器的设备,可以是随身带的安卓手机,硬是用离线笔记实现了类似云笔记的效果,教程视频:https://www.bilibili.com/video/BV1YP4y147mU?t=660
  8. 思源笔记的开发人员只有两个人而且是两口子,纯兴趣使然并非以盈利为目标,即使不使用官方同步功能,也欢迎在能力范围内上车 Pro,支持软件的后续开发。也欢迎上车时使用我的神秘代码 FgJw6sG,附赠 0.5GB 的云空间。

2.实际操作

2.1 主力机的设置

所有设备 上更新到思源 v1.3.9(下面部分截图来自旧版本,请一定要更新到 v1.3.9 及以上版本),然后全部关闭启用同步后退出,并且确保之后不进行任何笔记编辑修改操作(最后留一台主力机)

image.png

(请务必确保设置-外观最下面,退出界面时关闭内核 选项点开,这样才是彻底退出应用

image.png

在主力机上(数据最全的那个上面),找到思源的数据目录,打开对应文件夹后也退出思源应用

image.png

编辑 工作空间/data/.siyuan 下面的 syncignore 文件(如果没有就新建一个),添加一行 assets/**/* 屏蔽静态文件目录

在 OneDrive 的适当位置建立思源备份文件夹,如 OneDrive/SiYuanNote.data,将思源的数据目录下的 工作空间/data/assets 文件夹剪切到 OneDrive/SiYuanNote.data/assets

请阅读并理解上面的背景知识的 2.符号链接 后,再进行下面的操作

Windows 上,使用 Win+R,输入 cmd 后回车,打开 CMD 命令行建立软连接:mklink /J 工作空间/data/assets OneDrive/SiYuanNote.data/assets(请根据自己的实际情况适当修改),此时查看 工作空间/data/assets 文件夹,assets 应该有个符号链接角标:

image.png

如果是 Mac,那就打开终端,输入如下的代码:ln -s OneDrive/SiYuanNote.data/assets 工作空间/data/assets

image.png

重新打开主力机上面的思源,新建 一个云端同步空间 ,选上之后开启同步 → 立即同步;等待同步结束后,对比一下前后数据盘应该大约少了 assets 文件夹的大小,然后一定要把同步间隔改成每 12 个小时 ,放弃他的自动同步改用手动点击按钮同步,不然极易发生软件崩溃,这个 bug 目前尚未根治。

image.png

此时主力机的设置已经完成,请等待 OneDrive 和思源笔记同步完成后,再进行后续的操作

2.2 非主力机的设置

打开各个需要同步机器的 OneDrive,先把始终同步给勾选上,等待数据同步完成

image.png

打开思源软件,切换到上面新建的云端同步空间 (如上图中的 OneDrive_new),把同步间隔改为每 12 个小时 ,点击立即同步(以便把 syncignore 配置同步过来),完成后(不转圈了)再次退出思源软件

image.png

然后跟上面一样的操作,将思源工作空间的 assets 文件夹剪切的别的地方以防万一,随后建立 OneDrive 指向思源工作空间的符号链接,确认 assets 文件夹下面有符号链接的角标,并且点进去可以看到相应的文件。

然后再次运行思源软件,点击同步,确认无误并且所有图片都能正常显示,配置完成。

2.3 安卓手机的同步设置

首先,安装思源的安卓 APP,然后启动,选择 OneDrive_new 新建的云端同步空间,同步间隔调整为 12 个小时,点击立即同步,进行基础的数据同步。此时同步完图片显示不出来时正常的,因为图片这类静态文件没有被同步过来

image.png

然后在手机的文件管理器中,找到 assets 的文件目录,在 sdcard(我的手机)/Android/data/org.b3log.siyuan/files/siyuan/data/assets 中,然后使用 OneSync(第三方 OneDrive 双向同步软件,免费版只能同步一个文件夹,Pro 收费版可以同步多个文件夹),切换到“同步文件夹”选项卡

image.png

点击右下角的加号,建立同步文件夹:

image.png

立即同步,把所有的静态文件都下载下来,就可以正常使用了。

image.png

也可以使用其他的软件(如 FolderSync,可在这个链接里找到下载的百度云),只要能保证安卓的 assets 文件夹内能及时更新网盘对应的 assets 文件夹内容即可

2.4 检测未使用资源

使用这个方法有个后遗症,那就是软件本身无法检测已经在笔记中未使用的资源了,会造成一定的空间浪费(不过都用 OneDrive 了也不差那点空间)

image.png

如果是在是精神洁癖,不能容许任何空间的浪费(比如像我这样)由于思源拥抱开源,跟开发的 V 大聊了聊,简单写了个 Python3 代码 siyuan_clear.py,可以用来找到没用上的静态资源数据:

import os
import datetime
import sqlite3
from shutil import copyfile, move

with open("siyuan_cache.txt", "r", encoding="utf-8") as f:
    siyuan_data = f.readline()

siyuan_db = f"{siyuan_data}/temp/siyuan.db"
os.remove("siyuan.db")
copyfile(siyuan_db, "siyuan.db")

assets_folder = f"{siyuan_data}/data/assets"

# get siyuan used file list
con = sqlite3.connect("siyuan.db")
cur = con.cursor()
siyuan_used_file = [r[6] for r in cur.execute("SELECT * FROM assets")]
con.close()

# get assets all files
all_assets_file = os.listdir(assets_folder)

rm_list = [k for k in all_assets_file if k not in siyuan_used_file]

if ".siyuan" in rm_list:
    rm_list.remove(".siyuan")

for k in rm_list:
    print(k)

if len(rm_list) == 0:
    print("尚未找到未使用的资源文件")
else:
    ans = input("找到以上未使用的资源,是否删除?[y/n]")
    if ans in ["y", "yes"]:
        # get current time and 
        del_time = datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')
        trash_folder = f"{assets_folder}/.siyuan/history/{del_time}-delete/assets"
        os.makedirs(trash_folder)
        for d in rm_list:
            move(f"{assets_folder}/{d}", f"{trash_folder}/{d}")
        print(f"已将上述文件移动到{trash_folder}回收站内")

软件运行前需要新建一个 siyuan_cache.txt 文件,把自己的思源工作空间绝对路径写进去,如 D:/xxxxxx/工作空间,不需要精确到 assets 文件夹中,然后程序会复制一份思源的数据库 siyuan.db 到程序文件夹内,并进行对比

image.png

最终的效果如下:

image.png

3. 后记

我这里只是记录一下为了实现自己的需求,所进行的一些折腾操作,以节省有同样需求的人的摸索时间。

但是,请不要没有需求也要创造需求的,从一个完全不用 OneDrive 的人,为了这篇博客而从头折腾到尾,做任何事情之前,先想想是真的有必要这么做,还是一时兴起的跟风?

在此摘录一下“无离线不笔记”为什么我要放弃 wolai,选择思源笔记?最后几段话,给自己也给那些纠结或跟风各类软件的人:

在使用笔记软件之前,请多问问自己 why、what 和 how,搞清楚自己的需求和目的很重要,不是看见大家都在使用 notion、语雀、OneNote、印象、wolai、飞书以及各种双链笔记(ob、rr、re、logseq、葫芦笔记等等),大吹特吹,声称笔记软件是第二大脑,卡片笔记写作有多好、双链软件神乎其神,你就去用。我在这里推荐“思源笔记”,仅仅是希望一款优秀的软件能被人看到,希望真正有此需求的人能恰好使用到这款软件。
人类很擅长使用工具,但是最怕的是, 你,仅仅只会使用工具 。
只是毫无创造的模仿、拷贝,随波逐流
我希望你能善用工具,努力提升自我,实现自己的愿望,
而不是为了记笔记而记笔记、为了合群而磨灭个性
我希望你学会找到自己最好的学习和生活方式
而不是被营销号的各种最佳学习方法、最佳笔记软件搞得晕头转向

广告 我要投放

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • Lchen09
    支持者 订阅者

    啊,我觉得同步没啥必要,因为图片等静态资源我全部使用图床,而 PDF 使用 BookxNote Pro 的外链功能,我的笔记已经有 4 万字左右,而笔记文件夹主体不过 10M,定期压缩备份,反正几秒钟。

    笔记这种私密的东西不放心走云。

    2 回复
  • Yanareat
    订阅者

    我和你的情况差不多,要是思源支持修改上传的图床,我就可以丢掉 picgo 了。还有就是我主力设备上同步功能一直不好用,现在勉强用用备份

    1 回复
  • HowcanoeWang
    订阅者 作者

    主要是家里、学校、实验室三个地方来回跑,所以方便的跨设备同步对我还是挺重要的。私密的东西确实走云没那么放心,但是 OneDrive 比起国内的哪些云厂商,吃像还是好的 😳

  • HowcanoeWang
    订阅者 作者

    看开发进度,之后肯定会支持的。我之前用的是自建图床,流量费用有点顶我就放弃了,白嫖过其他的图床,但是网络波动 + 整体备份不方便,最后还是发现落在自己的硬盘里最有保障 😄