
















浏览器书签栏塞满了链接,想找的时候根本翻不到;换台电脑,书签全没了——有朋友遇到类似情况,可以试试 linkding。这是一款轻量、开源的自托管书签管理器,数据完全在自己手里。本文会介绍它的核心功能,并手把手教你在宝塔面板上完成部署。
说个真实场景:你在外面办事,突然需要查一个之前收藏过的链接——可能是某个系统的后台地址、某个工具的下载页、或者某个重要的文档。虽然 Edge 之类的浏览器收藏夹可以手机电脑自动同步,但实际用下来会遇到同步慢、同步不过去、甚至莫名其妙丢失的情况。关键时刻找不到东西。。。所以用linkding来解决这个问题——书签存在自己的服务器上,任何设备打开浏览器就能访问,不依赖任何浏览器的同步机制。
linkding 是一款开源的自托管书签管理器,技术栈是 Python + SQLite,没什么重依赖,极限一点 512MB 内存也行——随便一台低配机器都能跑得动。看了下项目从 2020 年发布v1.0后活跃至今,版本迭代挺频繁的。
简单说就是:你把书签数据全放在自己服务器上,不依赖任何第三方服务,想怎么管就怎么管。
Demo: https://demo.linkding.link/
自托管书签/阅读管理工具不止 linkding 一个,这里简单列几个常见的,方便你对比选择。不过本文的主角是 linkding,如果你对其他工具感兴趣,可以自行查阅了解。
| 工具 | 定位 | 技术栈 | 一句话点评 |
|---|---|---|---|
| linkding | 书签管理 | Python/Django | 轻量简洁,部署简单,适合个人书签管理 |
| Linkwarden | 书签 + 归档 + 协作 | TypeScript/Next.js | 功能最全,支持截图/PDF 归档、团队协作、AI 标签,但资源占用较高 |
| LinkAce | 链接归档 | PHP/Laravel | 支持多用户、链接监控、列表共享,功能丰富但部署稍复杂 |
| Wallabag | 稍后阅读 | PHP/Symfony | 专注"稍后阅读",自动提取文章正文,有手机 App,老牌项目 |
| Shaarli | 微型书签 | PHP | 极致轻量,无数据库(文件存储),适合技术用户,界面比较朴素 |
| Readeck | 稍后阅读 | Go | 新项目,支持标注、高亮、RSS、eBook 导出,界面现代 |
怎么选?简单给个参考:

打开 linkding 的第一感觉就是——干净。没有什么花里胡哨的动画,也没有一堆用不到的按钮,就是安安静静一个书签列表。页面加载也快,日常使用很流畅。
管理书签的方式跟传统文件夹不一样,linkding 用的是标签(Tags)。一个书签可以打好几个标签,比如一篇 Typecho 教程,你可以同时标上 #Typecho、#教程、#博客,不管从哪个角度搜都能找到,输入标签名还有自动补全。添加书签的时候也省心,粘贴个 URL 进去,标题、描述、图标全帮你抓好了,不用自己填一个字。另外每个书签都能写 Markdown 笔记,顺手还能记两句"这篇文章讲了啥"。


平时看到好文章但没空看?标个"稍后阅读",回头再统一处理就行。还有个功能我觉得特别实用——网页归档。它可以帮你把网页存成本地 HTML,或者归档到 Internet Archive。有些技术文章说没就没了,有归档在就不怕,原页面 404 了照样能看。
注意:网页归档功能需要使用latest-plus镜像(内置 Chromium),镜像体积和运行内存要求更高。本文教程安装的是latest版本,不包含此功能。如果需要网页归档,把docker-compose.yml中的镜像标签从latest改为latest-plus即可,更多详情可查阅官方文档。
多端方面,linkding 支持软件装到手机或电脑上,打开就是个独立窗口,日常使用足够方便。浏览器扩展也配齐了,Chrome 和 Firefox 都有,装上之后逛网页看到好内容,点一下图标即可保存。

社区生态也挺丰富,这里挑几个实用的:
更多社区项目可以查阅官方文档。
接下来是实操部分——如何在宝塔面板上部署 linkding。宝塔的 Docker 管理器支持图形化操作,大部分步骤直接在面板里点点就行;如果你更习惯命令行,我也一并附上。
宝塔面板安装(推荐)
装完之后,宝塔左侧菜单会出现 Docker 入口,后面所有操作都可以在这里完成。
命令行安装
# 一键安装 Docker
curl -fsSL https://get.docker.com | bash
# 启动 + 开机自启(这步别漏了)
systemctl start docker
systemctl enable docker
# 安装 Docker Compose
pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple注意:命令行安装的话,systemctl enable docker 一定要执行,不然服务器重启后容器不会自动启动。注意:如果你打算用下面的"宝塔图形化创建容器",可以跳过第二、三步的下载,直接到第四步。
宝塔文件管理
打开宝塔面板的 文件 管理,进入根目录,新建文件夹 /opt/linkding。
命令行
mkdir -p /opt/linkding两种方式效果一样,选你习惯的就行。
这一步需要准备两个文件:docker-compose.yml 和 .env(从 .env.sample 重命名而来)。官方都提供了现成的模板,直接下载就行。
提示:下面贴出了当前版本的文件内容供复制使用。不过官方可能会更新这些文件,建议同时前往上面的链接确认是否为最新版本。如果 raw.githubusercontent.com 访问慢,也可以直接从 GitHub 页面复制。
命令行下载
cd /opt/linkding
wget https://raw.githubusercontent.com/sissbruecker/linkding/master/.env.sample -O .env
wget https://raw.githubusercontent.com/sissbruecker/linkding/master/docker-compose.yml -O docker-compose.yml.env 文件内容(下载时已自动重命名)
# Docker container name
LD_CONTAINER_NAME=linkding
# Port on the host system that the application should be published on
LD_HOST_PORT=9090
# Directory on the host system that should be mounted as data dir into the Docker container
LD_HOST_DATA_DIR=./data
# Can be used to run linkding under a context path, for example: linkding/
# Must end with a slash `/`
LD_CONTEXT_PATH=
# Username of the initial superuser to create, leave empty to not create one
LD_SUPERUSER_NAME=
# Password for the initial superuser, leave empty to disable credentials authentication and rely on proxy authentication instead
LD_SUPERUSER_PASSWORD=
# Option to disable background tasks
LD_DISABLE_BACKGROUND_TASKS=False
# Option to disable URL validation for bookmarks completely
LD_DISABLE_URL_VALIDATION=False
# Enables support for authentication proxies such as Authelia
LD_ENABLE_AUTH_PROXY=False
# Name of the request header that the auth proxy passes to the application to identify the user
# See docs/Options.md for more details
LD_AUTH_PROXY_USERNAME_HEADER=
# The URL that linkding should redirect to after a logout, when using an auth proxy
# See docs/Options.md for more details
LD_AUTH_PROXY_LOGOUT_URL=
# Disables the login form, useful to enforce OIDC authentication
LD_DISABLE_LOGIN_FORM=False
# List of trusted origins from which to accept POST requests
# See docs/Options.md for more details
LD_CSRF_TRUSTED_ORIGINS=
# Database settings
# These are currently only required for configuring PostreSQL.
# By default, linkding uses SQLite for which you don't need to configure anything.
# Database engine, can be sqlite (default) or postgres
LD_DB_ENGINE=
# Database name (default: linkding)
LD_DB_DATABASE=
# Username to connect to the database server (default: linkding)
LD_DB_USER=
# Password to connect to the database server
LD_DB_PASSWORD=
# The hostname where the database is hosted (default: localhost)
LD_DB_HOST=
# Port use to connect to the database server
# Should use the default port if not set
LD_DB_PORT=
# Any additional options to pass to the database (default: {})
LD_DB_OPTIONS=上面内容比较多,大部分保持默认就行,你只需要改这几项:
# 管理员用户名(必填,否则无法登录)
LD_SUPERUSER_NAME=admin
# 管理员密码(必填,设一个靠谱的密码)
LD_SUPERUSER_PASSWORD=your_strong_password_here
# 服务器端口(默认 9090,可以改成你想要的)
LD_HOST_PORT=9090
# 数据存储目录(默认 ./data,一般不用改)
LD_HOST_DATA_DIR=./datadocker-compose.yml 文件内容(不需要改动)
说明:镜像地址使用了ghcr.io/sissbruecker/linkding:latest(GitHub Container Registry),这是官方文档提供的镜像源之一,国内访问更稳定。官方同时提供的还有 Docker Hub 源sissbruecker/linkding:latest,如果你网络环境没问题也可以用。
services:
linkding:
container_name: "${LD_CONTAINER_NAME:-linkding}"
image: ghcr.io/sissbruecker/linkding:latest
ports:
- "${LD_HOST_PORT:-9090}:9090"
volumes:
- "${LD_HOST_DATA_DIR:-./data}:/etc/linkding/data"
env_file:
- .env
restart: unless-stopped可以看到,端口、数据目录这些都由 .env 控制,所以只需要改 .env 就行。
需要改的地方汇总:
| 参数 | 在哪改 | 说明 |
|---|---|---|
LD_SUPERUSER_NAME | .env 文件 | 管理员用户名,改成你自己的 |
LD_SUPERUSER_PASSWORD | .env 文件 | 管理员密码,设一个靠谱的密码 |
LD_HOST_PORT | .env 文件 | 服务器端口,默认 9090,可改 |
| 其他参数 | .env 文件 | 不用动,保持默认即可 |
有两种方式,选你习惯的。注意:二选一,不要混用——宝塔方式的数据目录在宝塔管理的路径下,升级在面板操作;命令行方式的数据在 /opt/linkding/data,升级用命令。两者数据目录和升级方式各不相同,混用会导致数据对不上。
方式一:宝塔面板(推荐)
宝塔提供了两种操作方式,效果一样,选你喜欢的:
/opt/linkding,或者跳过第三步直接在表单中填写配置内容。操作:Docker → 容器编排 → 添加容器编排 → 名称填 linkding → 提交 → 启动
sissbruecker/linkding → 创建容器,填写端口映射(9090:9090)、目录映射(/opt/linkding/data → /etc/linkding/data)、环境变量(LD_SUPERUSER_NAME 和 LD_SUPERUSER_PASSWORD)、重启策略(unless-stopped)
注意:图形化创建容器没有配置文件存档,后续升级或迁移时需要重新填写参数,建议记下来。推荐使用容器编排方式。
方式二:命令行
cd /opt/linkding
docker-compose up -d看到 Creating linkding ... done 就说明跑起来了。


如果你打算直接通过IP http://服务器IP:9090 访问 linkding,查看第五步、第六步,否则跳过。
需要在宝塔面板中放行端口:
如果使用的是阿里云、腾讯云等云服务器,还需要在云控制台的安全组中放行该端口。
注意:如果你后续会配置反向代理(第七步),通过域名访问的话,走的是 80/443 端口,这一步可以跳过。本地测试环境(localhost)不需要配置。
浏览器访问:
http://你的服务器IP:9090用之前设置的管理员账号密码登录,看到书签管理界面就说明部署成功了。
注意:不建议在宝塔 Docker 管理器的"网站"板块直接添加域名代理,可能会遇到各种奇怪的问题。而且删除代理域名时往往删不干净——比如勾选了"删除目录"但实际并未删除,残留文件还会影响后续配置。建议按下面的方式操作。
方式一:独立子域名(如 bookmarks.yourdomain.com)

bookmarks.yourdomain.com)进入站点设置 → 反向代理 → 添加反向代理
linkdinghttp://127.0.0.1:9090
重要:宝塔默认用 Nginx 做反向代理,而 Nginx 默认会重写
Host头,这会导致 linkding 登录失败。需要在伪静态的配置中加上两行:proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;在宝塔中操作:站点设置 → 伪静态,把这两行加到里面,保存即可。
方式二:主域名的二级目录(如 yourdomain.com/bm/)
如果你的主域名已经有网站(比如 Typecho),想把 linkding 挂在二级目录下:
编辑 .env 文件,添加:
LD_CONTEXT_PATH=bm/注意末尾的 / 不能省略,且不要加前导 /。 然后重启容器。
在 include 伪静态规则之前,插入以下内容:
# 阻止伪静态规则拦截 /bm/ 请求
rewrite ^/bm/(.*)$ /bm/$1 break;
# linkding 二级目录代理(使用 ^~ 确保优先级高于静态文件规则)
location ^~ /bm/ {
proxy_pass http://127.0.0.1:9090/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
几个关键点:
location 前面加 ^~,否则会被 Nginx 的静态文件缓存规则(location ~ .*\.(js|css)?$ 等)截获,导致页面样式丢失proxy_pass 末尾要加 /,作用是去掉 /bm/ 前缀再转发给 linkdingLD_CONTEXT_PATH 不要加前导 /(写 bm/ 而不是 /bm/),否则内部路径会出错rewrite 规则必须放在 include 伪静态规则之前,否则 Typecho 的 rewrite 会先拦截请求nginx -t && systemctl reload nginx配置完成后,访问 https://yourdomain.com/bm/ 即可。
💡 踩坑实录(仅供参考,博君一笑)
别看上面就几步配置,实际调试的时候可是一波三折。记录一下,说不定能帮到同样在折腾的朋友:
第一关:Typecho 的"拦截"
配完 Nginx 后访问
/bookmarks/,结果出来的是 Typecho 的 404 页面——自己的博客把书签管理器给拦了。原因很简单:Typecho 的伪静态规则(通过include引入)是所有请求先过它那一遍,/bookmarks/直接被当成不存在的文章处理。解决办法是在include之前加一条rewrite ^/bookmarks/(.*)$ /bookmarks/$1 break;,告诉 Nginx"这个路径别动,直接放行"。第二关:前导斜杠的影响
伪静态搞定了,但 linkding 自己报 404。查了容器日志,发现内部路径变成了
//bookmarks/health——双斜杠!罪魁祸首是.env里LD_CONTEXT_PATH写成了/bookmarks/(带前导/),linkding 拼接路径时又加了一个/,直接把路由搞崩了。改成bookmarks/(不带前导/)就行。这一步没细看导致出错第三关:CSS 去哪了?
终于能访问了,但页面没样式、没图标,像回到了 1998 年。F12 一看,所有
.js、.css文件全是 404。原因是 Nginx 里有一条location ~ .*\.(js|css)?$的正则规则,优先级比普通location /bookmarks/高,把静态资源请求全截走了。加个^~前缀提升优先级就行。第四关:地址路径是/bookmarks/bookmarks?
一切就绪后,打开书签列表,地址栏赫然显示
/bookmarks/bookmarks/。没错,linkding 内部的书签路由就是/bookmarks/,套上二级目录前缀就变成了双重"bookmarks"。虽然功能完全正常,但看着有点别扭,就把路径改成了bm/——短小精悍。所以你现在看到教程里用的是
/bm/而不是/bookmarks/——这不是随便选的,是"实践出真知" 😂
linkding 更新挺频繁的,升级也很简单,数据不会丢(都存在数据卷目录里)。
宝塔面板(方式一)
命令行(方式二)
cd /opt/linkding
docker-compose pull
docker-compose up -d注意:如果是通过宝塔图形化创建容器(非容器编排)部署的,升级需要手动操作:先在镜像标签页拉取最新镜像,然后删除旧容器,再用新镜像重新创建容器(环境变量和目录映射要重新填写)。这也是为什么推荐使用容器编排方式——升级一条龙,不用反复填参数。
如果你在拉取镜像时遇到以下错误:
Image sissbruecker/linkding:latest Pulling
Image sissbruecker/linkding:latest Error
failed to resolve reference "docker.io/sissbruecker/linkding:latest": not found这是因为 Docker Hub(docker.io)在国内访问不稳定导致的。解决办法是把镜像地址换成 GitHub Container Registry(GHCR):
在 docker-compose.yml 中,把:
image: sissbruecker/linkding:latest改成:
image: ghcr.io/sissbruecker/linkding:latest然后重新执行 docker-compose up -d 即可。
注意:如果你是通过宝塔图形化拉取镜像(图形化创建容器方式),宝塔默认走镜像加速,一般不会遇到这个问题,直接搜索 sissbruecker/linkding 就能拉取。下载 Chrome 或 Firefox 扩展,打开开发者模式后拖入安装,(如果无法访问Chrome ,可以通过Crx直链下载)在扩展设置中填入你的 linkding 地址和 API Token(在用户设置页面获取)。之后浏览网页时点击扩展图标即可一键保存,体验会好很多。



如果之前使用浏览器书签,可以在浏览器书签管理器中导出为 HTML 文件,然后在 linkding 的设置页面直接导入,基本能无损迁移。
收藏书签时支持顺手写几句记录作为说明。
如果有需求的话:linkding 的所有数据存储在数据卷目录里(命令行方式默认是 /opt/linkding/data,宝塔容器编排方式在宝塔管理的路径下),定期备份这个目录即可。也可以通过宝塔面板的计划任务设置自动备份:
# 每天凌晨 3 点自动打包备份(请根据实际数据目录修改路径)
tar -czf /opt/backup/linkding-$(date +%Y%m%d).tar.gz /opt/linkding/data优点:
缺点:
写这篇文章时 linkding 最新版本为 v1.45.0,功能可能随版本更新有所变化,请以官方文档为准。
文章目录
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。