Rokcso's Blog

部署书签管理工具 Linkding 的三种方案

Linkding 是一个自托管的书签管理工具,主打极简、快速、易部署,支持自动获取网页标题/描述/图标、批量编辑、多用户共享、浏览器插件等功能,非常适合追求轻量化的用户。

部署 Linkding 是我第一次接触 Docker,这个过程踩了一些坑,但是对 Docker 的理解加深了不少。

在 macOS 本地部署

这种方式部署的服务提供公网访问会比较麻烦,也不见得安全,我仅作为本地测试和学习研究使用。

我选择使用 OrbStack 来代替 Docker Desktop,首先下载安装 OrbStack,即可实现 Docker 开箱即用。

打开终端执行下列命令来下载 Linkding 的 Docker 镜像文件。

docker pull sissbruecker/linkding:latest

这一步如果遇到网络问题导致 Docker 镜像文件下载失败,可以参考 使用 Cloudflare 部署 Docker 镜像代理 解决。

创建一个卷(Volume),用于单独存储 Linkding 的数据,可以避免后续容器万一被删除导致数据丢失。

docker volume create linkding

启动一个 Linkding 容器:

docker run --name linkding -p 9090:9090 -v linkding:/etc/linkding/data -d sissbruecker/linkding:latest

由于 Linkding 不提供初始化用户,所以需要先注册一个超级用户:

docker exec -it linkding python manage.py createsuperuser --username=[username] --email=[email]

根据提示输入两次密码。由于终端中输入密码不可见,如果总是设置错误,可以先设置一个简单的密码,在登录 Linkding Web 后台后再重设密码。

通过 OrbStack 一键访问 Linkding Web 后台:

后续也可以在 OrbStack 中管理、操作 Docker 的 Image、Volume 和 Container,会比使用命令方便不少。

在 Zeabur 部署

Zeabur 是一个简单易用的云服务平台,帮助开发者快速部署和管理应用,支持多种编程语言和框架,提供一键部署、自动扩缩容等功能。使用 Zeabur 部署 Docker 也非常简单。

首先注册登录 Zeabur 后点击「New Project」,选择想要部署服务的地区。没有付费订阅的 Free Trial Plan 账户能选择的地区应该很受限,按需选择即可。

Zeabur 会以一个随机的名称(后续可修改)创建空白项目。在项目内选择「Deploy New Service」,在搜索框输入 Linkding,社区提供了 Linkding 模板,所以直接点击「Deploy」即可。然后等待一段时间即可部署成功。

而 Zeabur 的 Free Trial Plan(我还不打算仅为了部署 Linkding 而付费订阅 Zeabur)在我实际体验过程中服务不是很稳定,部署经常遇到 Queued 几个小时在执行构建,配置的域名也出现了长时间 PROVISIONING。

在云服务器部署 😎

所以还是在云服务器上部署是相对较为靠谱的方案。

在云服务部署 Linkding 的流程和 在 macOS 本地部署 完全一致,依然是下载镜像、创建 Volume、启动容器、注册用户这 4 大步即可。不过由于云服务器部署后我希望能通过我的域名访问到服务,并且走 HTTPS,所有还有一些额外的步骤。

要支持 HTTPS 首先得有 SSL 证书,选择使用 Certbot 获取,Certbot 是 Let‘s Encrypt 的官方客户端,支持自动签发免费的 SSL 证书。考虑到未来还会在这台云服务器上部署更多服务,所以直接使用 Nginx 进行反向代理,方便以后管理多个服务。

虽然大部分服务会考虑使用 Docker 部署,但是 Nginx 还是选择传统方式安装部署,复杂度会低于 Docker 方案,更简单。

本章节所有命令仅在 Ubuntu Server 22.04 LTS 64bit 环境下测试通过。

配置 Nginx

在云服务器上安装 Nginx:

sudo apt update
sudo apt install nginx -y

启动 Nginx 并设置开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

验证 Nginx 运行状态:

sudo systemctl status nginx

如果 Nginx 运行正常,直接在浏览器访问云服务器公网 IP,可以看到 Nginx 欢迎页:

创建 Nginx 配置文件:

sudo nano /etc/nginx/sites-available/linkding.rokcso.com

写入以下配置内容:

server {
    listen 80;
    server_name linkding.rokcso.com;
    location / {
        proxy_pass http://localhost:9090;  # 转发到 Linkding 容器
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

启用配置:

sudo ln -s /etc/nginx/sites-available/linkding.rokcso.com /etc/nginx/sites-enabled/
sudo nginx -t  # 检查语法是否正确
sudo systemctl reload nginx

此时访问 http://linkding.rokcso.com 就能正常访问到 Linkding 了。

启用 HTTPS

在云服务器上安装 Certbot:

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

获取证书并自动配置 Nginx:

sudo certbot --nginx -d linkding.rokcso.com

Certbot 会:

  1. 自动验证域名所有权(需确保 linkding.rokcso.com 解析正确);
  2. 签发 Let’s Encrypt SSL 证书;
  3. 修改 Nginx 配置,强制 HTTP 跳转到 HTTPS。

此时访问 https://linkding.rokcso.com 就能正常访问到 Linkding 了。

由于 Let‘s Encrypt 的 SSL 证书有效期为 90 天,可以设置一个自动续期。首先模拟 SSL 证书续订过程(不会实际更新证书),测试 Certbot 的自动续订功能是否能正常工作:

sudo certbot renew --dry-run

添加定时任务(Crontab):

sudo crontab -e

添加任务配置,每天 00:00 静默执行 Certbot 续订命令(当证书有效期 ≤ 30 天时,才会实际更新证书):

0 0 * * * /usr/bin/certbot renew --quiet

Certbot 续订证书之后会自动执行 nginx -s reload 重启 Nginx。


最后,欢迎访问我的 Linkding Share Page 看看吧。

#skill