笔记
0工具
0此页用于记录用户反馈问题后的每一次改进
关于
“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
不想公开、只想临时给人看:点“分享”生成一条带密码和有效期的链接,到期自动失效,你也能随时撤销。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
趋势
备份 docker 命名卷别再 cp -r:一条 tar 管道最省心
之前备份容器数据,图省事直接去 /var/lib/docker/volumes/ 底下 cp -r,几次都出问题:一是容器还在跑的时候硬拷,文件可能拷到一半正在写,备份出来是坏的;二是直接翻 /var/lib/docker 这层目录本身就不被官方支持,路径随存储驱动变,升级 Docker 版本后甚至可能找不到。后来统一改成"起一个临时容器挂卷,用 tar 打包导出来"的做法,稳很多。
备份一个命名卷最标准的写法:
docker run --rm -v 卷名:/data -v $(pwd):/backup alpine \
tar czf /backup/卷名-$(date +%F).tgz -C /data .
原理就是临时起个 alpine,把要备份的卷挂到 /data,当前目录挂到 /backup,tar 把 /data 里的内容打成一个包。--rm 用完即焚,不留垃圾容器。还原反着来:
docker run --rm -v 卷名:/data -v $(pwd):/backup alpine \
tar xzf /backup/卷名-xxx.tgz -C /data
tar 是在容器里以 root 跑的,打出来的包会保留文件原来的 uid/gid,还原回去属主不乱。这一点比直接在宿主机 cp 强:宿主机上看到的 uid 在容器里可能映射的是另一个用户,直接 cp 会把属主搞乱,容器里应用起来权限各种报错。
数据库这类有自己一致性要求的,光打卷文件不够。MySQL、Postgres 最好是停掉容器(docker compose stop)再打卷,或者干脆用它们自己的导出工具 mysqldump、pg_dump 导出逻辑备份,再另存一份卷文件做物理备份,两层都留。我吃过亏:MySQL 容器没停直接 tar 卷,恢复出来的库 InnoDB 说损坏,因为 redo log 和数据文件不一致,后来老老实实先 stop 再打。
换机器迁移的场景用管道最方便,两个机器之间不用先落盘:
docker run --rm -v 卷名:/data alpine tar -C /data -czf - . \
| ssh 新机器 'docker run --rm -i -v 卷名:/data alpine tar -xz -C /data'
前提是卷在新机器上已经存在,没有的话先 docker volume create 卷名。管道传输中途断了不好续,大卷还是建议先打成包 scp 过去再解,别贪这个省事。
还有两个顺带要留意的:命名卷第一次挂载时,如果镜像里对应路径有内容,Docker 会把镜像里那份内容拷进空卷(匿名卷也有这行为),所以别指望"挂个空卷就干净";反过来,备份完恢复到一个刚 create 的空卷是对的,恢复到一个已经带镜像初始内容的卷会把新内容盖在旧内容上,反而混了。打包之前先验证卷名没写错很关键:docker volume ls 看全量列表,compose 起的卷名一般是 项目名_卷名 这种带下划线的格式,直接 docker run -v 指定时用的是不含前缀的裸名,别搞混,挂错卷等于备份了个寂寞。打完的包随手验一下完整性,tar tzf 备份包.tgz | head 能列出内容说明包结构正常,想更严谨就 tar 完再算个 sha256 存旁边,恢复前对一下,能防备份包在传输中损坏。压缩格式上,默认 gzip 通用性最好,但数据量大的场景 zstd 压缩率高还快,tar --use-compress-program zstd 就行,恢复端得有 zstd 命令。内网传输大包我一般先本地 tar 好再传,比边 tar 边走 ssh 稳,断了能续传。
再补一个批量场景:compose 一个项目挂了七八个命名卷,一个个手动 tar 太蠢,我写了个小循环,docker compose config 里 volumes 段列出来,逐个 docker run --rm -v 卷:/data -v $(pwd)/backup:/backup alpine tar czf ...。恢复时反过来循环解包,注意顺序:先把要恢复的卷删掉重建空的(docker volume rm 再 create),再解包,避免旧数据残留和新数据混一起。删卷前务必确认没有容器在用,docker ps -a 里停着的容器也可能占着卷,docker rm 的时候带 -v 才会把它的匿名卷一起删,命名卷不受影响,这也是命名卷比匿名卷好管理的地方——匿名卷容器一删就没法按名字定位了。
数据库冷备那部分我再说细点:MySQL 用 mysqldump 导出的是逻辑备份,体积大恢复慢,但跨版本恢复友好;直接 tar 数据目录是物理备份,恢复快,但要求 MySQL 大版本一致、且必须停实例保证一致性。我两个都留,物理包保证能快速恢复,逻辑包当兜底保险。Postgres 类似,pg_dump 逻辑备份 + 停实例 tar 数据目录。文件类应用(比如存上传图片、sqlite 文件)反而简单,sqlite 最好用 sqlite3 .backup 或者先让应用把连接关了再 tar,直接 tar 正在写的 sqlite 大概率备份出来是坏的,我踩过,恢复时 PRAGMA integrity_check 全是错。备份脚本里建议每次打两个时间点的包、留最近 N 份轮转,别只留一份,真有损坏还能找回上一版。这套方法对 docker run 和 compose 都适用,compose 里卷名带项目前缀,docker volume ls 先看清楚再操作。