From b8f261c099bc50cedf32e4060ae2da5df741c235 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Wed, 23 Jul 2025 13:58:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20ArchiveB?= =?UTF-8?q?ox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- apps/archivebox/0.7.3/data.yml | 67 +++++++++++++++++++++ apps/archivebox/0.7.3/docker-compose.yml | 57 ++++++++++++++++++ apps/archivebox/0.7.3/envs/default.env | 2 + apps/archivebox/0.7.3/envs/global.env | 2 + apps/archivebox/0.7.3/scripts/init.sh | 17 ++++++ apps/archivebox/0.7.3/scripts/uninstall.sh | 10 +++ apps/archivebox/0.7.3/scripts/upgrade.sh | 17 ++++++ apps/archivebox/README.md | 23 +++++++ apps/archivebox/data.yml | 14 +++++ apps/archivebox/logo.png | Bin 0 -> 10717 bytes 10 files changed, 209 insertions(+) create mode 100644 apps/archivebox/0.7.3/data.yml create mode 100644 apps/archivebox/0.7.3/docker-compose.yml create mode 100644 apps/archivebox/0.7.3/envs/default.env create mode 100644 apps/archivebox/0.7.3/envs/global.env create mode 100644 apps/archivebox/0.7.3/scripts/init.sh create mode 100644 apps/archivebox/0.7.3/scripts/uninstall.sh create mode 100644 apps/archivebox/0.7.3/scripts/upgrade.sh create mode 100644 apps/archivebox/README.md create mode 100644 apps/archivebox/data.yml create mode 100644 apps/archivebox/logo.png diff --git a/apps/archivebox/0.7.3/data.yml b/apps/archivebox/0.7.3/data.yml new file mode 100644 index 000000000..8cb57dd82 --- /dev/null +++ b/apps/archivebox/0.7.3/data.yml @@ -0,0 +1,67 @@ +additionalProperties: + formFields: + - default: "/home/archivebox" + edit: true + envKey: ARCHIVEBOX_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "archivebox" + edit: true + envKey: ADMIN_USERNAME + labelZh: 管理员用户名 + labelEn: Admin Username + required: true + type: text + - default: "archivebox" + edit: true + envKey: ADMIN_PASSWORD + labelZh: 管理员密码 + labelEn: Admin Password + required: true + type: password + - default: "True" + edit: true + envKey: PUBLIC_INDEX + labelZh: 是否公开快照列表 + labelEn: Whether to make the snapshot list public + required: true + type: select + values: + - label: 公开 + value: "True" + - label: 私密 + value: "False" + - default: "True" + edit: true + envKey: PUBLIC_SNAPSHOTS + labelZh: 是否公开快照内容 + labelEn: Whether to make snapshot content public + required: true + type: select + values: + - label: 公开 + value: "True" + - label: 私密 + value: "False" + - default: "False" + edit: true + envKey: PUBLIC_ADD_VIEW + labelZh: 是否允许匿名用户提交存档 + labelEn: Whether to allow anonymous users to submit archives + required: true + type: select + values: + - label: 允许 + value: "True" + - label: 禁止 + value: "False" diff --git a/apps/archivebox/0.7.3/docker-compose.yml b/apps/archivebox/0.7.3/docker-compose.yml new file mode 100644 index 000000000..60d51a9a0 --- /dev/null +++ b/apps/archivebox/0.7.3/docker-compose.yml @@ -0,0 +1,57 @@ +networks: + 1panel-network: + external: true + +services: + archivebox: + image: archivebox/archivebox:0.7.3 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8000 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${ARCHIVEBOX_ROOT_PATH}/data:/data + environment: + - TZ=Asia/Shanghai + - ALLOWED_HOSTS=* + - CSRF_TRUSTED_ORIGINS=http://localhost:8000 + - SEARCH_BACKEND_ENGINE=sonic + - SEARCH_BACKEND_HOST_NAME=archivebox-sonic + - SEARCH_BACKEND_PASSWORD=${ADMIN_PASSWORD:-} + + archivebox-scheduler: + image: archivebox/archivebox:0.7.3 + container_name: scheduler-${CONTAINER_NAME} + command: schedule --foreground --update --every=day + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${ARCHIVEBOX_ROOT_PATH}/data:/data + environment: + - TZ=Asia/Shanghai + - TIMEOUT=120 + - SEARCH_BACKEND_ENGINE=sonic + - SEARCH_BACKEND_HOST_NAME=archivebox-sonic + - SEARCH_BACKEND_PASSWORD=${ADMIN_PASSWORD:-} + + archivebox-sonic: + image: archivebox/sonic:latest + container_name: sonic-${CONTAINER_NAME} + expose: + - 1491 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${ARCHIVEBOX_ROOT_PATH}/sonic:/var/lib/sonic/store + environment: + - TZ=Asia/Shanghai + - SEARCH_BACKEND_PASSWORD=${ADMIN_PASSWORD:-} diff --git a/apps/archivebox/0.7.3/envs/default.env b/apps/archivebox/0.7.3/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/archivebox/0.7.3/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/archivebox/0.7.3/envs/global.env b/apps/archivebox/0.7.3/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/archivebox/0.7.3/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/archivebox/0.7.3/scripts/init.sh b/apps/archivebox/0.7.3/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/archivebox/0.7.3/scripts/init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/archivebox/0.7.3/scripts/uninstall.sh b/apps/archivebox/0.7.3/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/archivebox/0.7.3/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/archivebox/0.7.3/scripts/upgrade.sh b/apps/archivebox/0.7.3/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/archivebox/0.7.3/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/archivebox/README.md b/apps/archivebox/README.md new file mode 100644 index 000000000..dd664b203 --- /dev/null +++ b/apps/archivebox/README.md @@ -0,0 +1,23 @@ +# ArchiveBox + +开源自托管网页存档。支持 URL、浏览器历史记录、书签、Pocket、Pinboard 等,保存 HTML、JS、PDF、媒体等 + +![ArchiveBox](https://file.lifebus.top/imgs/archivebox.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 简介 + +ArchiveBox 是一款自托管应用程序,可让您以多种格式保存网站内容。 + +我们的目标是让您的数据立即可用,并以其他程序可直接读取的格式保存。输出格式包括标准 HTML、PNG、PDF、TXT、JSON、WARC 和 +SQLite,保证在未来数十年内均可读取。ArchiveBox 还支持 CLI、REST API 和 Webhook,方便您与其他服务集成。 + +如果不进行积极的保护,互联网上的一切最终都会消失或退化。 + +ArchiveBox 是一款开源工具,可帮助组织和个人归档公共和私人网络内容,同时保留对数据的控制权。它可用于保存书签副本、保留法律案件证据、备份 +Facebook/Insta/Flickr 上的照片或 YouTube/Soundcloud 等媒体资源、保存研究论文等等。 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/archivebox/data.yml b/apps/archivebox/data.yml new file mode 100644 index 000000000..acfed497c --- /dev/null +++ b/apps/archivebox/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: archivebox + name: ArchiveBox + tags: + - WebSite + - Local + shortDescZh: 开源自托管网页存档 + shortDescEn: Self-hosted web page archiving + type: website + crossVersionUpdate: true + limit: 0 + website: https://archivebox.io/ + github: https://github.com/ArchiveBox/ArchiveBox/ + document: https://github.com/ArchiveBox/ArchiveBox/ diff --git a/apps/archivebox/logo.png b/apps/archivebox/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..04462b21cc1c72de4fba6a6534103e0805c2879c GIT binary patch literal 10717 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