Merge pull request #5401 from okxlin/adapt/bichon-20260731

feat: add Bichon
This commit is contained in:
okxlin
2026-07-31 07:59:16 +08:00
committed by GitHub
10 changed files with 284 additions and 0 deletions
+6
View File
@@ -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
+95
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
+24
View File
@@ -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
+60
View File
@@ -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
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
docker-compose down --volumes --remove-orphans
+5
View File
@@ -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"
+58
View File
@@ -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` 作为稳定版本交付。
## 参考资料
- 项目仓库: <https://github.com/rustmailer/bichon>
- Docker 安装说明: <https://github.com/rustmailer/bichon#docker-recommended>
- API 文档: 安装后访问 `/api-docs`
+31
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB