A ClamAV container with crontab-tasking available.
2.5K
ClamAV-Web 将 ClamAV 的扫描能力、定时任务和结果处理整合为一个浏览器可用的管理界面。它以单个 Docker 镜像运行:内含 ClamAV、Go 后端、React 前端和 cron 调度服务,适合家庭服务器、小型团队与NAS场景。
本项目负责管理、编排与展示;病毒检测和病毒库更新仍由上游
clamav/clamav完成。
![]() ClamAV 状态与扫描统计 | ![]() 文件浏览与扫描提交 |
![]() cron 规则管理 | ![]() 历史任务记录 | ![]() 隔离区 |
| 模块 | 能力 |
|---|---|
| 状态面板 | 查看 ClamAV 连通性、运行状态、最近扫描结果与统计;管理员可休眠或唤醒引擎。 |
| 手动扫描 | 在 /scan 中安全浏览并多选文件/目录,提交串行扫描任务。 |
| 定时任务 | 可视化创建、编辑、启停和重载五段 cron 规则。 |
| 任务与历史 | 调整等待队列、取消未开始任务;异步查询历史、日志、检出详情与统计。 |
| 文件处置 | 支持仅告警、移动至隔离区、直接删除;隔离文件可恢复或永久清理。 |
| 信任区 | 以 SHA-256 生成 ClamAV allow-list,支持文件与目录递归加入。 |
| 多用户 | 内置 admin / user、Argon2id 密码哈希、Cookie session,以及用户间业务数据隔离。 |
| TimeDock 模式 | 适配拾光坞 NAS 的用户空间隔离机制,可将每个账号限制在指定的 /scan 子目录,避免越权浏览和提交路径。 |
浏览器
│ React + Vite 构建的单页界面
▼
Go HTTP 服务(认证、权限、队列、API、SQLite 索引)
├── /scan_once.sh ──► clamd / ClamAV
├── /cron.sh ───────► Debian cron
├── /config ──► 规则、白名单、服务配置
└── /data /state /log /quarantine ──► 持久化数据与运行产物
生产构建会先编译 ClamAV-Web/,再将静态文件嵌入 Go 可执行程序;容器启动后由 startup.sh 协调 ClamAV、cron 和 Web 服务。扫描全局串行执行,防止多个任务同时挤占扫描引擎。
docker build -t tinkerbell37745/clamav-timedock .
mkdir -p config data scan quarantine log state
将需要扫描的内容放入 scan/。默认情况下,Web 界面只能浏览和操作容器内的 /scan;文件浏览会隐藏符号链接,相关 API 也会拒绝包含符号链接的路径。
首次注册管理员必须设置一个非空的 ADMIN_REGISTER_TOKEN。请替换示例中的随机值,并妥善保管。
docker run -d \
--name clamav-web \
--restart unless-stopped \
-p 8080:8080 \
-e TZ=Asia/Shanghai \
-e ADMIN_REGISTER_TOKEN='replace-with-a-long-random-token' \
-v "$(pwd)/config:/config" \
-v "$(pwd)/data:/data" \
-v "$(pwd)/scan:/scan" \
-v "$(pwd)/quarantine:/quarantine" \
-v "$(pwd)/log:/log" \
-v "$(pwd)/state:/state" \
tinkerbell37745/clamav-timedock
访问 http://<主机地址>:8080。首次打开时,使用你设置的令牌注册首个账户;该账户会自动成为管理员。完成首次运行流程后,管理员可在界面中创建其他账户。
六个目录都建议挂载到宿主机;容器需要读取 /scan,而隔离、删除和恢复还需要对它写入。
| 容器路径 | 用途 |
|---|---|
/scan | 可浏览、扫描和处置的目标数据根目录 |
/quarantine | 隔离文件与其原始路径记录 |
/config | 定时规则、信任区、服务配置 |
/data | 用户、会话和历史索引 SQLite 数据库 |
/state | 扫描任务 JSON、状态文件和锁 |
/log | Go 后端、启动、cron、扫描与检出日志 |
HttpOnly、SameSite=Strict 的 Cookie session。move、remove、清空历史与清空隔离区会修改或删除数据。建议先使用“仅告警”,并使用 EICAR 等安全测试样本验证流程。如在 HTTPS 反向代理后部署,请设置 SCANNER_COOKIE_SECURE=true;若需要读取真实客户端 IP,只能在可信代理前提下配置 SERVER_TRUSTED_REVERSEPROXY。完整语义见 服务端配置。
| 配置 | 默认值 | 说明 |
|---|---|---|
SCANNER_ADDR | :8080 | Web 服务监听地址。 |
ADMIN_REGISTER_TOKEN | 无 | 首次管理员注册的必填令牌;推荐通过 Docker secret 注入。 |
SCANNER_COOKIE_SECURE | false | HTTPS 反向代理后设为 true。 |
IS_TIMEDOCK | N | Y 时启用 TimeDock 模式。 |
TZ | 镜像默认值 | 页面时间与 cron 时区。 |
SCAN_WAIT_INTERVAL | 30 | 定时任务等待扫描锁的重试间隔(秒)。 |
SCAN_WAIT_MAX_SECONDS | 0 | 定时任务最大等待时间;0 为不限制。 |
USER_DATABASE_FILE | /data/users.db | 用户与 session 数据库。 |
HISTORY_DATABASE_FILE | /data/history.db | 历史任务索引数据库。 |
CLAMAV_SLEEP_TIMER | 3600 | ClamAV 自动休眠间隔(秒);配置文件或 API 设为 0 可关闭。 |
LOG_FILE_MAX_SIZE | 5242880 | /log/clamavweb.log 单文件最大字节数。 |
LOG_FILE_NUM | 5 | Go 后端日志文件总数(包含当前文件)。 |
LOG_LEVEL | warn | Go 后端最低日志等级。 |
服务配置保存在 /config/clamavweb.conf,管理 API 可调整登录限制、历史索引间隔和 ClamAV 自动休眠时间,供前端设置页接入;日志配置需手工修改并重启服务,不通过界面或 API 暴露。配置项范围、默认值及反向代理规则见 server/server_conf.md。
warn 只记录威胁;move 移至隔离区并可恢复;remove 直接删除,不能恢复。前端源码位于 ClamAV-Web/,后端源码位于 server/。本地前端开发服务器监听 http://127.0.0.1:5174,并默认将 /api 代理到 http://127.0.0.1:8080。
cd ClamAV-Web
npm ci
npm run dev
cd server
go test ./...
更完整的架构、开发流程、测试与扩展约定,请阅读 DEV.md。请求与响应详情请阅读 server/api.md。
本项目开发中使用到了以下数个项目/开源仓库,致谢
本项目采用 MIT License。
Content type
Image
Digest
sha256:f37a5de54…
Size
91.2 MB
Last updated
about 1 month ago
docker pull tinkerbell37745/clamav-timedock