linkwarden:书签&备份,替代shiori
本文最后更新于 2025-10-31,文章内容可能已经过时。
简介:
Linkwarden 是一个自托管、开源的协作书签管理器,用于收集、组织和存档网页。其目标是将你在网上找到的有用网页和文章组织在一个地方,并且由于有用网页可能会消失(参见链接腐烂的必然性),Linkwarden 还会为每个网页保存一个截图和 PDF 副本,确保即使原始内容不再可用,也能保持可访问性。此外,Linkwarden 的设计考虑了协作性,可以公开分享链接,或允许多个用户无缝协作。
部署:
1. Download the required files
1. 下载所需文件
mkdir linkwarden && cd linkwarden
curl -O https://raw.githubusercontent.com/linkwarden/linkwarden/refs/heads/main/docker-compose.yml
curl -L https://raw.githubusercontent.com/linkwarden/linkwarden/refs/heads/main/.env.sample -o ".env"
2. Configure the Environment Variables
2. 配置环境变量
nano .env
The required environment variables are:
所需的环境变量有:
NEXTAUTH_URL=http://localhost:3000/api/v1/auth
NEXTAUTH_SECRET=VERY_SENSITIVE_SECRET
MEILI_MASTER_KEY=VERY_SENSITIVE_MEILI_MASTER_KEY
POSTGRES_PASSWORD=CUSTOM_POSTGRES_PASSWORD
The only thing you MUST change here is NEXTAUTH_SECRET, POSTGRES_PASSWORD, and MEILI_MASTER_KEY, they all should be different secret phrases. The phrase should be wrapped in single or double quotes if any special characters are used.
这里你必须更改的是 NEXTAUTH_SECRET 、 POSTGRES_PASSWORD 和 MEILI_MASTER_KEY ,它们都应该是不一样的秘密短语。如果使用了特殊字符,短语应该用单引号或双引号括起来。
The NEXTAUTH_URL should be changed to your domain name only if you are hosting it somewhere else.
如果你在其他地方托管它, NEXTAUTH_URL 才需要更改为你的域名。
3. Run it! 3. 运行它!
In the main folder (where you created the .env file) simply run the following:
在主文件夹(你创建.env 文件的文件夹)中,只需运行以下命令:
docker compose up
After a few minutes (depending on your internet connection) you can access Linkwarden via http://localhost:3000 (or whichever hostname you deployed Linkwarden on).
几分钟后(取决于你的网络连接),你可以通过 http://localhost:3000(或你部署 Linkwarden 的任何主机名)访问 Linkwarden。
Enjoy! 享受!
yml与env
# Linkwarden for Win10 + Docker Desktop + WSL2
# 所有数据保存在 H:\docker\linkwarden
name: linkwarden
services:
# 1. PostgreSQL 数据库
postgres:
image: postgres:16-alpine
env_file: .env # 密码等变量放在同目录 .env
restart: always
volumes:
# 数据库文件 → H:\docker\linkwarden\pgdata
- /mnt/h/docker/linkwarden/pgdata:/var/lib/postgresql/data
# 2. Linkwarden 主程序
linkwarden:
env_file: .env
environment:
# 数据库连接串(变量来自 .env)
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
restart: always
image: ghcr.io/linkwarden/linkwarden:latest # 官方最新镜像
ports:
- 3000:3000 # 浏览器访问 localhost:3000
volumes:
# 用户上传的书签截图/PDF → H:\docker\linkwarden\data
- /mnt/h/docker/linkwarden/data:/data/data
depends_on:
- postgres
- meilisearch
# 3. Meilisearch 全文搜索引擎
meilisearch:
image: getmeili/meilisearch:v1.12.8
restart: always
env_file: .env
volumes:
# 搜索索引 → H:\docker\linkwarden\meili_data
- /mnt/h/docker/linkwarden/meili_data:/meili_data########## ① 必填(不填无法启动) ##########
# 浏览器访问的完整根地址(必须带端口)
NEXTAUTH_URL=http://localhost:3000/api/v1/auth
# 会话加密密钥,≥32 位随机串;生成命令:openssl rand -hex 32
NEXTAUTH_SECRET=请替换为随机字符串
# PostgreSQL 超级用户密码(只放字母数字)
POSTGRES_PASSWORD=请替换为数据库密码
# 容器内连接串,与上方密码保持一致
DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
########## ② 常用可选(建议填写) ##########
# Meilisearch 地址(容器内)
MEILI_HOST=http://meilisearch:7700
# Meilisearch 主密钥,生成同上
MEILI_MASTER_KEY=请替换为随机字符串
# 站点根 URL(邮件/预览用)
BASE_URL=http://localhost:7890
# 是否禁止公开注册(true|false)
NEXT_PUBLIC_DISABLE_REGISTRATION=false
# 是否允许账号密码登录(true|false)
NEXT_PUBLIC_CREDENTIALS_ENABLED=true
# 单用户最大书签数量
MAX_LINKS_PER_USER=10000
# 并行存档 worker 数(空=CPU 核心数)
MAX_WORKERS=
# 全局代理地址(如 Clash)示例:http://clash:7890
PROXY=
PROXY_USERNAME=
PROXY_PASSWORD=
PROXY_BYPASS=
# SMTP 发件人 & 服务器(留空则不发送邮件)
EMAIL_FROM=
EMAIL_SERVER=
########## ③ 高级可选 ##########
######## 分页与限制 ########
PAGINATION_TAKE_COUNT=20 # 每页条数
ARCHIVE_TAKE_COUNT= # 批量存档一次取多少
IMPORT_LIMIT=1000 # 一次导入上限
SEARCH_FILTER_LIMIT=1000 # 搜索过滤结果上限
INDEX_TAKE_COUNT= # 重建索引批次大小
######## 超时与缓存 ########
AUTOSCROLL_TIMEOUT=30 # 自动滚动截图超时(秒)
BROWSER_TIMEOUT=30 # 网页截图/存档超时(秒)
MEILI_TIMEOUT= # Meilisearch 请求超时
NEXT_PUBLIC_MAX_FILE_BUFFER= # 单文件最大内存缓冲(MB)
PDF_MAX_BUFFER= # PDF 生成最大内存(MB)
SCREENSHOT_MAX_BUFFER= # 截图最大内存(MB)
READABILITY_MAX_BUFFER= # 正文提取最大内存(MB)
PREVIEW_MAX_BUFFER= # 预览图最大内存(MB)
MONOLITH_MAX_BUFFER=100 # 单页快照最大内存(MB)
MONOLITH_CUSTOM_OPTIONS= # 自定义 monolith 参数
######## 功能开关 ########
DISABLE_PRESERVATION= # 关闭网页存档(true|false)
NEXT_PUBLIC_DEMO= # 开启演示模式(true|false)
NEXT_PUBLIC_DEMO_USERNAME= # 演示账号
NEXT_PUBLIC_DEMO_PASSWORD= # 演示密码
NEXT_PUBLIC_ADMIN= # 强制管理员邮箱
RSS_POLLING_INTERVAL_MINUTES= # RSS 轮询间隔(分)
RSS_SUBSCRIPTION_LIMIT_PER_USER=50 # 单用户 RSS 上限
TEXT_CONTENT_LIMIT=500000 # 单页正文最大字符数
######## 存储与路径 ########
STORAGE_FOLDER=/data/data # 用户文件存放路径(容器内)
IGNORE_UNAUTHORIZED_CA= # 忽略自签证书(true|false)
IGNORE_HTTPS_ERRORS= # 忽略 HTTPS 错误(true|false)
IGNORE_URL_SIZE_LIMIT= # 忽略 URL 长度限制(true|false)
######## PDF 页边距(mm) ########
PDF_MARGIN_TOP=
PDF_MARGIN_BOTTOM=
######## AI 功能(留空即关闭) ########
NEXT_PUBLIC_OLLAMA_ENDPOINT_URL= # 本地 Ollama 地址
OLLAMA_MODEL= # 模型名
OPENAI_API_KEY= # OpenAI 密钥
OPENAI_MODEL= # 模型名
CUSTOM_OPENAI_BASE_URL= # 第三方 OpenAI 兼容地址
CUSTOM_OPENAI_NAME= # 自定义名称
AZURE_API_KEY= # Azure OpenAI 密钥
AZURE_RESOURCE_NAME= # Azure 资源名
AZURE_MODEL= # Azure 部署名
ANTHROPIC_API_KEY= # Claude 密钥
ANTHROPIC_MODEL= # Claude 模型名
OPENROUTER_API_KEY= # OpenRouter 密钥
OPENROUTER_MODEL= # OpenRouter 模型名
######## AWS S3 兼容存储(留空即本地存储) ########
SPACES_KEY= # AccessKey
SPACES_SECRET= # SecretKey
SPACES_ENDPOINT= # 端点 URL
SPACES_BUCKET_NAME= # 存储桶名
SPACES_REGION= # 区域
SPACES_FORCE_PATH_STYLE= # 路径风格(true|false)
######## 单点登录(SSO)全部留空即仅账号密码登录 ########
# 下面只列出常用几个,其余同理填 ID/Secret/Issuer 即可
NEXT_PUBLIC_GITHUB_ENABLED= # GitHub 登录开关
GITHUB_ID= # GitHub OAuth App ID
GITHUB_SECRET= # GitHub OAuth App Secret
NEXT_PUBLIC_GOOGLE_ENABLED= # Google 登录开关
GOOGLE_CLIENT_ID= # Google OAuth Client ID
GOOGLE_CLIENT_SECRET= # Google OAuth Client Secret
NEXT_PUBLIC_DISCORD_ENABLED= # Discord 登录开关
DISCORD_CLIENT_ID= # Discord Application ID
DISCORD_CLIENT_SECRET= # Discord Application Secret
# ……其余 40+ 种 SSO(Authelia、Keycloak、Azure AD 等)格式相同,全部留空即禁用使用体验:
打开默认端口后进行注册即可
