diff --git a/apps/bichon/1.6.2/.env.sample b/apps/bichon/1.6.2/.env.sample new file mode 100644 index 000000000..eb3caad35 --- /dev/null +++ b/apps/bichon/1.6.2/.env.sample @@ -0,0 +1,6 @@ +CONTAINER_NAME=bichon-compose-check +PANEL_APP_PORT_HTTP=15630 +APP_DATA_DIR=./data +BICHON_ENCRYPT_PASSWORD=replace-with-a-long-random-encryption-password +BICHON_PUBLIC_URL= +BICHON_LOG_LEVEL=info diff --git a/apps/bichon/1.6.2/data.yml b/apps/bichon/1.6.2/data.yml new file mode 100644 index 000000000..bc72c36f8 --- /dev/null +++ b/apps/bichon/1.6.2/data.yml @@ -0,0 +1,95 @@ +additionalProperties: + formFields: + - default: 15630 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: APP_DATA_DIR + labelEn: Data Directory + labelZh: 数据目录 + label: + en: Data Directory + zh: 数据目录 + zh-Hant: 資料目錄 + ja: データディレクトリ + ko: 데이터 디렉터리 + ru: Каталог данных + ms: Direktori data + pt-br: Diretorio de dados + required: true + type: text + - edit: true + envKey: BICHON_ENCRYPT_PASSWORD + labelEn: Encryption Password + labelZh: 加密密码 + label: + en: Encryption Password + zh: 加密密码 + zh-Hant: 加密密碼 + ja: 暗号化パスワード + ko: 암호화 비밀번호 + ru: Пароль шифрования + ms: Kata laluan penyulitan + pt-br: Senha de criptografia + random: true + required: true + rule: paramComplexity + type: password + - default: "" + edit: true + envKey: BICHON_PUBLIC_URL + labelEn: Public URL + labelZh: 公开访问地址 + label: + en: Public URL + zh: 公开访问地址 + zh-Hant: 公開存取位址 + ja: 公開 URL + ko: 공개 URL + ru: Публичный URL + ms: URL awam + pt-br: URL publico + required: false + type: text + - default: info + edit: true + envKey: BICHON_LOG_LEVEL + labelEn: Log Level + labelZh: 日志级别 + label: + en: Log Level + zh: 日志级别 + zh-Hant: 日誌層級 + ja: ログレベル + ko: 로그 수준 + ru: Уровень журнала + ms: Tahap log + pt-br: Nivel de log + required: true + type: select + values: + - label: trace + value: trace + - label: debug + value: debug + - label: info + value: info + - label: warn + value: warn + - label: error + value: error diff --git a/apps/bichon/1.6.2/data/.gitkeep b/apps/bichon/1.6.2/data/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/bichon/1.6.2/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/apps/bichon/1.6.2/docker-compose.yml b/apps/bichon/1.6.2/docker-compose.yml new file mode 100644 index 000000000..ad8307231 --- /dev/null +++ b/apps/bichon/1.6.2/docker-compose.yml @@ -0,0 +1,24 @@ +services: + bichon: + image: "rustmailer/bichon:1.6.2" + container_name: ${CONTAINER_NAME} + restart: always + user: "1000:1000" + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:15630" + environment: + - BICHON_ROOT_DIR=/data + - BICHON_ENCRYPT_PASSWORD=${BICHON_ENCRYPT_PASSWORD} + - BICHON_PUBLIC_URL=${BICHON_PUBLIC_URL} + - BICHON_LOG_LEVEL=${BICHON_LOG_LEVEL} + - BICHON_ANSI_LOGS=false + volumes: + - "${APP_DATA_DIR}:/data" + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/bichon/1.6.2/scripts/init.sh b/apps/bichon/1.6.2/scripts/init.sh new file mode 100755 index 000000000..7437617b3 --- /dev/null +++ b/apps/bichon/1.6.2/scripts/init.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" +ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}" + +read_env_value() { + local key="$1" + local value + [[ -f "$ENV_FILE" ]] || return 0 + value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)" + value="${value%$'\r'}" + case "$value" in + \"*\") value="${value#\"}"; value="${value%\"}" ;; + \'*\') value="${value#\'}"; value="${value%\'}" ;; + esac + printf '%s\n' "$value" +} + +DATA_DIR="${APP_DATA_DIR:-}" +if [[ -z "$DATA_DIR" ]]; then + DATA_DIR="$(read_env_value APP_DATA_DIR)" +fi +DATA_DIR="${DATA_DIR:-./data}" + +if [[ "$DATA_DIR" = /* ]]; then + RESOLVED_DATA_DIR="$(realpath -m -- "$DATA_DIR")" + if [[ -L "$DATA_DIR" ]]; then + printf 'APP_DATA_DIR must not be a symbolic link\n' >&2 + exit 1 + fi + if [[ -e "$RESOLVED_DATA_DIR" ]]; then + [[ -d "$RESOLVED_DATA_DIR" ]] || { + printf 'APP_DATA_DIR must refer to a directory\n' >&2 + exit 1 + } + [[ "$(stat -c '%u:%g' "$RESOLVED_DATA_DIR")" == '1000:1000' ]] || { + printf 'Existing absolute APP_DATA_DIR must be owned by UID/GID 1000:1000\n' >&2 + exit 1 + } + else + install -d -m 0750 -- "$RESOLVED_DATA_DIR" + if [[ "$(id -u)" -eq 0 ]]; then + chown 1000:1000 -- "$RESOLVED_DATA_DIR" + fi + fi +else + RESOLVED_DATA_DIR="$(realpath -m -- "$ROOT_DIR/${DATA_DIR#./}")" + case "$RESOLVED_DATA_DIR" in + "$ROOT_DIR"/*) ;; + *) + printf 'Relative APP_DATA_DIR must remain inside the application version directory\n' >&2 + exit 1 + ;; + esac + install -d -m 0750 -- "$RESOLVED_DATA_DIR" + if [[ "$(id -u)" -eq 0 ]]; then + chown 1000:1000 -- "$RESOLVED_DATA_DIR" + fi +fi diff --git a/apps/bichon/1.6.2/scripts/uninstall.sh b/apps/bichon/1.6.2/scripts/uninstall.sh new file mode 100755 index 000000000..c6af20129 --- /dev/null +++ b/apps/bichon/1.6.2/scripts/uninstall.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +docker-compose down --volumes --remove-orphans diff --git a/apps/bichon/1.6.2/scripts/upgrade.sh b/apps/bichon/1.6.2/scripts/upgrade.sh new file mode 100755 index 000000000..5ec28d784 --- /dev/null +++ b/apps/bichon/1.6.2/scripts/upgrade.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)" +exec "$SCRIPT_DIR/init.sh" diff --git a/apps/bichon/README.md b/apps/bichon/README.md new file mode 100644 index 000000000..b1b999db7 --- /dev/null +++ b/apps/bichon/README.md @@ -0,0 +1,58 @@ +# Bichon + +## 产品介绍 + +Bichon 是使用 Rust 构建的自托管邮件归档服务,可从多个 IMAP 账户下载邮件,在本地建立全文索引,并通过内置 Web 界面和 REST API 提供统一检索。它是归档工具,不是用于撰写或发送邮件的客户端。 + +## 主要功能 + +- 多账户 IMAP 增量归档与定时同步 +- 邮件、附件和联系人全文检索 +- 内嵌元数据、索引和压缩对象存储,无外部数据库依赖 +- 多用户 RBAC、账户级权限和 API token +- EML、MBOX、Thunderbird 和 PST 导入工具 + +## Features + +- Incremental archiving and scheduled synchronization for multiple IMAP accounts +- Full-text search across messages, attachments, and contacts +- Embedded metadata, index, and compressed object stores with no external database +- Multi-user RBAC, account-level permissions, and API tokens +- Import tools for EML, MBOX, Thunderbird, and PST data + +## Introduction + +Bichon is a self-hosted email archiving service written in Rust. It downloads mail from multiple IMAP accounts, builds local full-text indexes, and exposes a unified WebUI and REST API. It is an archive, not a mail client for composing or sending messages. + +## 访问说明 + +安装后通过 `http://<服务器 IP>:15630` 访问,实际端口以安装表单中的 `PANEL_APP_PORT_HTTP` 为准。首次登录用户名为 `admin`,密码为 `admin@bichon`。请登录后立即在设置页面修改默认密码,并通过 1Panel 网站反向代理启用 HTTPS 后再向不受信任网络开放服务。 + +## 参数说明 + +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| `PANEL_APP_PORT_HTTP` | Web 界面和 API 的 HTTP 端口 | `15630` | 是 | +| `APP_DATA_DIR` | 元数据、全文索引和邮件对象存储目录 | `./data` | 是 | +| `BICHON_ENCRYPT_PASSWORD` | 用于加密保存的 IMAP/OAuth 凭据 | 安装时随机生成 | 是 | +| `BICHON_PUBLIC_URL` | OAuth 回调和文档使用的公开 URL | 空 | 否 | +| `BICHON_LOG_LEVEL` | 服务日志级别 | `info` | 是 | + +## 数据与安全 + +- 使用 Bichon 官方单服务镜像,容器按上游要求以 UID/GID `1000:1000` 运行。 +- `APP_DATA_DIR` 必须位于本地文件系统;上游明确不支持 NFS、CIFS/SMB 等网络文件系统作为数据目录。 +- `BICHON_ENCRYPT_PASSWORD` 用于派生 AES-256-GCM 加密密钥。上游当前不支持直接轮换该口令后重新加密已有凭据,因此应妥善保管,并在恢复备份时使用相同值。 +- 可选 SMTP 接收器、TLS 文件和高级存储拆分未在默认安装中启用,可在确认上游配置与端口策略后手工扩展。 + +## 备份与升级 + +升级或迁移前,应停止 Bichon 并备份 `APP_DATA_DIR` 指向的完整目录以及安装时使用的加密口令。默认 `./data` 位于 1Panel 应用版本目录内,卸载时会随应用目录移除;若需要跨卸载保留归档,请选择独立绝对路径,并预先保证其所有权为 UID/GID `1000:1000`。 + +本应用只打包稳定版 `1.6.2`。截至本批次适配时,上游 `latest` 已指向 `2.0.0-alpha.1` 预发布镜像,因此没有将 `latest` 作为稳定版本交付。 + +## 参考资料 + +- 项目仓库: +- Docker 安装说明: +- API 文档: 安装后访问 `/api-docs` diff --git a/apps/bichon/data.yml b/apps/bichon/data.yml new file mode 100644 index 000000000..d0240d0cd --- /dev/null +++ b/apps/bichon/data.yml @@ -0,0 +1,31 @@ +name: Bichon +tags: + - Tool +title: 自托管邮件归档与全文检索服务 +description: 自托管邮件归档与全文检索服务 +additionalProperties: + key: bichon + name: Bichon + tags: + - Tool + shortDescZh: 自托管邮件归档与全文检索服务 + shortDescEn: A self-hosted email archiving and full-text search service + description: + en: A self-hosted email archiving and full-text search service + zh: 自托管邮件归档与全文检索服务 + zh-Hant: 自託管郵件封存與全文檢索服務 + ja: セルフホスト型のメールアーカイブおよび全文検索サービス + ko: 자체 호스팅 이메일 보관 및 전문 검색 서비스 + ru: Самостоятельно размещаемый сервис архивации и полнотекстового поиска почты + ms: Perkhidmatan arkib dan carian teks penuh e-mel hos sendiri + pt-br: Servico auto-hospedado de arquivamento e busca textual de emails + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/rustmailer/bichon + github: https://github.com/rustmailer/bichon + document: https://github.com/rustmailer/bichon#quick-start + architectures: + - amd64 + - arm64 diff --git a/apps/bichon/logo.png b/apps/bichon/logo.png new file mode 100644 index 000000000..5ef735e51 Binary files /dev/null and b/apps/bichon/logo.png differ