本文最后更新于 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_SECRETPOSTGRES_PASSWORDMEILI_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 等)格式相同,全部留空即禁用

使用体验:


打开默认端口后进行注册即可