- 后端
- 数据工程
【免费下载链接】ArchiveBox
🗃 Open source self-hosted web archiving. Takes URLs/browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more...
ArchiveBox 是一个开源的自托管互联网存档工具(self-hosted internet archive),它可以把任意 URL、浏览器历史、书签以及 Pocket、Pinboard 等服务的导出数据保存为 HTML、JS、PDF、媒体文件等静态快照。本文以官方文档首页 docs/index.rst 为骨架,完整展开其快速上手流程中的每一条命令,并结合仓库源码剖析init、install、add、status的底层实现,最后给出官方文档的完整导航地图,帮助读者从零开始搭建并理解自己的私有网页档案馆。
项目定位:面向个人与团队的自托管网页存档
正如文档首页所声明的,ArchiveBox 的定位是 "The open-source self-hosted internet archive"(开源的自托管互联网档案馆)。它与在线存档服务的关键区别在于:
- 数据自持:所有存档内容保存在你自己的目录与数据库中,不依赖任何第三方托管服务;
- 格式开放:每个 URL 的存档结果以标准文件形式(HTML、PDF、截图、warc 等)落在文件系统中,可通过 docs/Publishing-Your-Archive.md 介绍的方式对外发布;
- 输入广泛:既支持直接传入 URL,也支持从文本文件、RSS 订阅源、浏览器书签导出、Pocket/Pinboard 等服务的导出数据导入。
仓库根目录 README.md 中对项目的功能描述也与此一致:它接收 URL、浏览器历史、书签、Pocket/Pinboard 等输入,保存 HTML、JS、PDF、媒体等各类存档产物。这意味着 index.rst 首页所呈现的,是整个项目"自托管、可保存、可检索、可发布"能力的入口。
五分钟快速上手:从零到第一个存档
index.rst 首页给出了一条完整的快速上手命令序列,它覆盖了"安装 → 初始化 → 装依赖 → 添加链接 → 查看状态"的完整闭环:
mkdir my-archive; cd my-archive/ uv tool install --python 3.13 --prerelease explicit --upgrade 'archivebox>=0.9.0rc0,<0.10' archivebox init archivebox install archivebox add https://example.com archivebox status下面逐条展开说明,并结合源码解释每一条命令背后实际发生了什么。
1. 用 uv 安装 ArchiveBox(0.9.x 预发布版本)
uv tool install --python 3.13 --prerelease explicit --upgrade 'archivebox>=0.9.0rc0,<0.10'这条命令使用uv将 ArchiveBox 安装为全局工具(tool):
--python 3.13:要求使用 Python 3.13 作为运行环境;--prerelease explicit:明确允许安装预发布版本(因为 0.9 尚未正式发布,需要 rc 版本);--upgrade:如果已安装旧版本则升级到满足版本约束的最新版;'archivebox>=0.9.0rc0,<0.10':版本区间约束在 0.9.0 的候选发布版与 0.10 之间,确保使用的是 0.9 系列。
安装完成后,archivebox命令即进入 PATH,可在任意目录执行。官方文档 docs/Install.md 与 docs/Docker.md 分别介绍了原生安装与 Docker / Docker Compose 部署的更多细节(macOS 与 Ubuntu 的amd64/arm64为官方支持平台,见 docs/Quickstart.md)。
注意:文档首页给出的安装命令面向 0.9.x 开发周期;对于正式发布版本,请以 docs/Install.md 中对应你平台的方式为准。
2.archivebox init:初始化集合
init是创建新 ArchiveBox 集合(collection)的入口,其命令行入口定义在 archivebox/cli/archivebox_init.py:
archivebox init # 可选参数: archivebox init --force # -f:忽略当前目录中的无关文件,强制初始化 archivebox init --quick # -q:快速模式,跳过对 snapshot 目录的重新检查 archivebox init --install # -s/--setup:初始化后自动调用 install 安装依赖从 archivebox/cli/archivebox_init.py 的init()实现可以还原它的完整工作流:
- 安全校验:调用
check_not_inside_source_dir()拒绝在源码目录内初始化,避免污染代码仓库; - 环境判断:检查当前目录是否为空、是否已存在
index.sqlite3(database_exists()),据此决定是"初始化新集合"还是"校验并升级已有集合";若目录中已有非 ArchiveBox 文件但无数据库,则会报错退出,只有加--force才继续; - 创建目录骨架:依次创建
archives/、sources/、users/、logs/目录,并按配置项OUTPUT_PERMISSIONS(8 进制权限字符串)设置权限位; - 生成集合标识与配置:创建
.archivebox_id文件写入该集合的唯一 ID;随后调用write_config_file({"SECRET_KEY": config.SECRET_KEY})生成ArchiveBox.conf配置文件(详见下文); - 准备数据库:
ensure_database_ready()确保 SQLite/PostgreSQL 可用,setup_django()完成 Django 初始化,随后apply_migrations()执行初始迁移建表; - 创建管理员账号:若配置中已设置
ADMIN_USERNAME与ADMIN_PASSWORD,则自动创建超级用户,免去后续手工操作; - 收尾提示:如果集合中链接少于 25 个,会打印后续操作提示——运行
archivebox server后访问 Admin UI 完成 Web 端设置,或用archivebox add < links.txt添加链接。
值得注意的是,初始化完成后init会明确提示:孤儿快照(orphaned snapshot directories)的导入与文件系统状态对账需要运行archivebox update。
3.archivebox install:安装存档所需的外部依赖
install负责探测并安装 ArchiveBox 进行网页存档所需的外部二进制依赖(Chromium、yt-dlp、wget 等),其实现位于 archivebox/cli/archivebox_install.py:
archivebox install # 探测并安装全部依赖 archivebox install wget curl # 只安装 wget 与 curl archivebox install --binproviders=pip yt-dlp # 只用 pip 提供者安装 yt-dlp archivebox install --binproviders=brew,apt # 只用 brew/apt 安装全部依赖 archivebox install --dry-run # 只展示将要执行的动作,不真正安装命令参数说明:
| 参数 | 说明 |
|---|---|
binaries(位置参数) | 要安装的插件名或二进制别名,可传多个;不传则安装全部 |
--binproviders/-p | 允许使用的安装提供者,逗号分隔:pip、npm、brew、apt、env、custom,默认*(全部) |
--dry-run/-d | 预演模式,只打印将要执行的动作 |
从源码看,其内部逻辑分两条路径执行:
- 插件路径:通过
_resolve_install_targets()将用户传入的名字解析为插件名与二进制别名,再经由 abx-dl 总线调用run_install()完成插件及其依赖的安装; - 裸二进制路径:
_install_raw_binary_names()会为当前机器创建/更新Binary记录(archivebox.machine.models.Binary),将其置为QUEUED状态并调用run_due_binary()立即执行安装。
同时,install要求必须先有可用的数据库(用于存储 Binary 记录),因此若尚未初始化,它会自动先执行init()。命令结束时还会调用archivebox version展示完整版本信息与已安装的二进制状态。archivebox init --install则把这两步合并为一条命令执行。
4.archivebox add:把 URL 加入存档队列
add是 ArchiveBox 最核心的日常命令,负责把 URL 列表加入新的 Crawl(抓取任务)并执行存档,入口在 archivebox/cli/archivebox_add.py:
archivebox add https://example.com # 直接传 URL archivebox add < your_urls.txt # 从 stdin 读入 URL 列表 archivebox add --depth=1 https://example.com # 递归抓取一层链接 curl -fsSL 'https://getpocket.com/users/USER/feed/all' | archivebox add # 从 RSS 流导入add支持从命令行参数与 stdin 两种方式收集输入:_collect_input_urls()通过read_args_or_stdin()统一解析,支持纯文本 URL、带#注释的行以及urls字段等格式;当没有位置参数且 stdin 非 TTY 时自动读取 stdin。每个 URL 都会经过validate_url()校验。
常用参数(均在 archivebox/cli/archivebox_add.py 的 CLI 定义中声明):
| 参数 | 默认值 | 说明 |
|---|---|---|
--depth/-d | 0 | 递归存档链接的跳数,仅允许 0–4 |
--max-urls | 0 | 本次抓取最多快照的 URL 数(0 为不限制) |
--crawl-max-size | 0 | 整个抓取任务的总大小上限,支持45mb、1gb等单位(0 不限制) |
--crawl-timeout | 0 | 抓取任务总运行时间上限(秒,0 不限制) |
--snapshot-max-size | 0 | 单个快照的大小上限(0 不限制) |
--crawl-max-concurrent-snapshots | 继承配置 | 单个抓取任务内并发快照数,最小为 1 |
--tag/-t | "" | 逗号分隔的标签,附加到每个快照上 |
--url-allowlist/--domain-allowlist | "" | 本次抓取的 URL/域名白名单 |
--url-denylist/--domain-denylist | "" | 本次抓取的 URL/域名黑名单 |
--parser | auto | 输入解析器:auto、txt、html、rss、json、jsonl、netscape等 |
--plugins/-p | "" | 逗号分隔的提取插件列表,如title,favicon,screenshot,singlefile |
--extract | "" | 按输出类型选择插件,如pdf、image等 |
--persona | Default | 存档时使用的认证档案(persona) |
--only-new/--no-only-new | 继承ONLY_NEW配置 | 是否跳过已存在的 URL;--overwrite/--update是其别名 |
--index-only | False | 只把 URL 写入索引,不立即存档 |
--bg | False | 后台模式:入队后立即返回,由后台 runner 处理 |
从源码可以看到,add的核心是创建一条Crawl记录并把相关运行参数冻结到crawl.config中(如CRAWL_MAX_URLS、CRAWL_MAX_SIZE、CRAWL_TIMEOUT、SNAPSHOT_MAX_SIZE、URL_ALLOWLIST、URL_DENYLIST、PARSER、ONLY_NEW等),然后由 runner 消费该 Crawl:先为所有 URL 创建 Snapshot,再运行提取插件,解析器插件发现的新 URL 会继续生成子 Snapshot,直到达到max_depth。
执行模式有三种:
- 前台模式(默认):
add进程直接接管前台 runner,循环执行run_runner_worker(["--crawl-id", str(crawl.id)], ...)直到 Crawl 封存(SEALED),期间会处理Ctrl+C中断并提示用archivebox run --crawl-id=<id>恢复; - 后台模式(
--bg):仅入队并通过ensure_background_runner()确保有后台 runner 在跑(如archivebox server或archivebox run --daemon); - 仅索引模式(
--index-only):只写入索引、不启动 runner。
前台模式结束后会打印本次抓取的摘要:crawl 输出目录(相对DATA_DIR)、Admin UI 管理链接、快照总数、总大小与总耗时。
5.archivebox status:查看集合健康与统计
status打印整个集合的信息与统计,实现见 archivebox/cli/archivebox_status.py:
archivebox status它依次输出以下几类信息:
- 主索引概况:
DATA_DIR下index.*文件的总大小与文件数; - 链接统计:SQL 主索引中的链接总数、
archives/*/index.json中的传统链接详情数;已索引 / 已存档(status 为sealed)/ 未存档的快照数; - 磁盘占用:递归扫描
archives/目录(含users/子目录)得到的总体积、文件数与目录数;当链接数超过常量MAX_STATUS_FS_DIR_SCAN = 5000时,自动改用数据库统计(对Snapshot.output_size求和、统计非空output_files的 ArchiveResult 数量),避免整盘递归扫描的性能问题; - 文件系统一致性:磁盘上存在的快照目录数(present)、与数据库记录匹配的目录数(valid)、以及没有对应数据库记录的孤儿目录数(orphaned)——出现孤儿目录时,
status会提示运行archivebox update自动导入; - 用户与最近动态:Admin UI 用户列表、最近登录时间、最近下载时间;
- 最近快照列表:按
downloaded_at倒序展示最近 10 个快照的下载时间、输出数量、存档状态、大小、标题与 URL。
status是日常巡检集合健康状态最直接的命令:索引是否损坏、磁盘占用是否异常、是否存在孤儿目录,一目了然。
集合的配置与磁盘布局:init 之后发生了什么
init完成后,当前目录会形成 ArchiveBox 的集合骨架,其目录结构与配置约定如下:
my-archive/ ├── ArchiveBox.conf # 集合配置文件(INI 格式,与数据库中的 Machine.config 双向同步) ├── index.sqlite3 # SQL 主索引(PostgreSQL 时替换为外部数据库) ├── .archivebox_id # 集合唯一标识 ├── archives/ # 存档产物目录(每个快照一个子目录) ├── sources/ # 导入的原始 URL 源文件 ├── users/ # 按用户组织的快照目录(当前布局位于 archives/users/ 之下) └── logs/ # 日志目录配置文件的读写逻辑集中在 archivebox/config/collection.py,几个值得注意的实现细节:
- INI 配置与数据库双向镜像:
ArchiveBox.conf与数据库中Machine.config保持 1:1 同步——write_config_file()写文件后会镜像到数据库,Machine.save()时又会调用mirror_machine_config_to_file()写回文件,并通过模块级_MIRROR_IN_PROGRESS标志防止循环回写; - 启动时对账:
sync_machine_and_file()在进程启动时合并文件与数据库两侧的配置,键冲突时以修改时间更新的那一侧为准(文件 mtime vs.Machine.modified_at); - 按语义分组:
_resolve_section_for_key()会把不同的配置键归类到对应 INI section(核心配置、服务器配置、PLUGINS等),未知键统一落入SERVER_CONFIG而不丢失; - 原子写入:
_write_file_if_changed()仅在内容变化时才原子重写文件,避免热循环中的无谓磁盘写; - 写前备份:
write_config_file()写新配置前会把旧内容备份为ArchiveBox.conf.bak,若新配置解析失败则自动回滚。
日常修改配置有两种方式:直接编辑ArchiveBox.conf,或运行archivebox config --set KEY=VALUE(配置文件头注释中明确指出了该命令)。完整配置项参考 docs/Configuration.md,存储与备份建议见 docs/Setting-Up-Storage.md。
官方文档导航:从首页出发的完整阅读路线
index.rst 通过 toctree 引入了 docs/Contents.rst,后者是整套官方文档的目录树。以仓库根目录为基准,这份文档地图整理如下:
Overview(概览)
| 文档 | 内容 |
|---|---|
| docs/Home.md | 项目主页文档 |
| README.md | 项目根 README,含功能特性与快速开始 |
Getting Started(入门)
| 文档 | 内容 |
|---|---|
| docs/Quickstart.md | 约 5 分钟的上手流程:安装、导出 URL 列表、添加链接、启动 Web UI |
| docs/Install.md | 各平台原生安装指南 |
| docs/Docker.md | Docker 与 Docker Compose 部署 |
| docs/Configuration.md | 全部配置项参考 |
| docs/Security-Overview.md | 安全模型与加固建议 |
| docs/Usage.md | CLI 与 Web UI 的完整用法 |
Guides(进阶指南)
| 文档 | 内容 |
|---|---|
| docs/Setting-Up-Storage.md | 存档目录、外部存储与备份 |
| docs/Setting-up-Authentication.md | 身份认证与用户管理 |
| docs/Setting-up-Search.md | 全文搜索(Sonic 等)配置 |
| docs/Publishing-Your-Archive.md | 对外发布你的档案馆 |
| docs/Scheduled-Archiving.md | 定时自动存档 |
| docs/Chromium-Install.md | Chromium 浏览器依赖安装 |
| docs/Upgrading.md | 版本升级说明 |
| docs/Upgrading-or-Merging-Archives.md | 升级或合并既有档案馆 |
| docs/Merging-Collections.md | 合并多个集合 |
| docs/Troubleshooting.md | 常见问题排查 |
Architecture(架构)
| 文档 | 内容 |
|---|---|
| docs/ArchiveBox-Architecture-Diagrams.md | 系统架构图与组件关系 |
API Reference(API 参考)
| 文档 | 内容 |
|---|---|
| docs/apidocs/index.rst | 由 Sphinx 生成的 Python API 文档,覆盖archivebox.api、archivebox.cli、archivebox.config、archivebox.core、archivebox.crawls、archivebox.machine、archivebox.services等全部子模块 |
| 文件系统布局 | 详见 Usage 文档中的 Disk Layout 章节 |
| SQL API | Usage 文档中的 SQL Shell Usage 章节 |
| REST API | 官方 Demo 站点/api端点 |
Meta(元信息)
| 文档 | 内容 |
|---|---|
| docs/Roadmap.md | 项目路线图 |
| docs/Changelog.md | 变更日志 |
| docs/Donations.md | 捐赠信息 |
| docs/Web-Archiving-Community.md | 网页存档社区资源 |
对于希望从源码层面继续深入本文所讲命令的读者,建议按以下路径阅读:
- CLI 入口与参数:
archivebox/cli/下的archivebox_init.py、archivebox_install.py、archivebox_add.py、archivebox_status.py、archivebox_run.py; - 配置系统:
archivebox/config/collection.py(文件-数据库双向镜像)、archivebox/config/common.py(配置模型与读取)、archivebox/config/constants.py(CONSTANTS路径常量); - 抓取任务模型:
archivebox/crawls/models.py(Crawl)、archivebox/core/models.py(Snapshot、ArchiveResult); - 服务层:
archivebox/services/runner.py(runner 与安装流程)、archivebox/services/crawl_service.py; - 对应测试:
archivebox/tests/test_cli_init.py、archivebox/tests/test_cli_add.py、archivebox/tests/test_cli_install.py、archivebox/tests/test_cli_status.py等。
下一步:从"能跑"到"用好"
走完init → install → add → status这四步,你已经拥有了一个可用的私有网页档案馆。接下来的进阶路径建议:
- 启动 Web UI:运行
archivebox server,按提示访问 Admin UI 完成首个管理员账号与BASE_URL的 Web 设置向导(见 docs/Quickstart.md); - 批量导入历史:把浏览器书签/历史、Pocket、Pinboard 等导出为 URL 列表后通过 stdin 导入,参见 docs/Quickstart.md 第 2 步;
- 配置存档行为:编辑
ArchiveBox.conf或用archivebox config --set调整SAVE_TITLE、ONLY_NEW、OUTPUT_PERMISSIONS等选项,完整清单见 docs/Configuration.md; - 定时自动存档:按 docs/Scheduled-Archiving.md 配置每日增量存档;
- 数据一致性巡检:定期运行
archivebox status检查孤儿目录,用archivebox update对账导入,再配合 docs/Setting-Up-Storage.md 做好备份。
至此,从官方文档首页出发,你已完整掌握 ArchiveBox 的安装、初始化、依赖管理、URL 添加与状态巡检的整条链路,并理解了这些命令背后基于Crawl/Snapshot/Binary模型与配置文件双向镜像机制的实现原理。
- 后端
- 数据工程
【免费下载链接】ArchiveBox
🗃 Open source self-hosted web archiving. Takes URLs/browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more...
相关推荐
Starship 跨 Shell 快速安装与初始化配置指南(官方首页文档解读)
Starship 跨 Shell 快速安装与初始化配置指南(官方首页文档解读) 本篇文章以 Starship 仓库中西班牙语官方首页文档 docs/es ES/
CLI开发工具ArchiveBox自托管网页归档完整指南:永久保存互联网内容的终极方案
ArchiveBox自托管网页归档完整指南:永久保存互联网内容的终极方案 在信息爆炸的互联网时代,重要网页随时可能消失或改变。ArchiveBox作为开源自托管
后端数据工程ArchiveBox 五分钟快速上手:从零初始化、批量导入 URL 到启动 Web 归档服务
ArchiveBox 五分钟快速上手:从零初始化、批量导入 URL 到启动 Web 归档服务 本篇技术指南以 ArchiveBox 官方 Quickstart
后端数据工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考