Docker部署CHM转HTML广告工具

根据Windows系统特点优化后的完整实现方案如下:


1. 创建项目目录结构(PowerShell操作)

1
2
3
4
5
# 在桌面创建项目文件夹
cd $HOME\Desktop
mkdir chmtohtml
cd chmtohtml
mkdir chm,html,scripts | Out-Null

2. 准备转换脚本(注意Windows换行符问题)

创建 scripts/convert.ps1(用VS Code或Notepad++保存为UTF-8无BOM格式):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash

# 监听CHM目录变化
inotifywait -m -e close_write --format "%f" /chm | while read FILENAME
do
if [[ "$FILENAME" == *.chm ]]; then
# 创建临时工作区
TEMP_DIR="/tmp/$(date +%s)"
mkdir -p "$TEMP_DIR"

# 转换操作(Windows路径兼容处理)
ebook-convert "/chm/$FILENAME" "$TEMP_DIR/output.html" --enable-heuristics

# 广告代码插入(注意Windows换行符)
find "$TEMP_DIR" -name "*.html" | while read HTMLFILE
do
sed -i '/<body>/a\
<!-- Google Ads -->\
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=YOUR_CA-PUB_ID"></script>\
<ins class="adsbygoogle"\
style="display:block; text-align:center;"\
data-ad-layout="in-article"\
data-ad-format="fluid"\
data-ad-client="YOUR_CA-PUB_ID"\
data-ad-slot="YOUR_AD_SLOT"></ins>\
<script>\
(adsbygoogle = window.adsbygoogle || []).push({});\
</script>' "$HTMLFILE"
done

# 移动最终文件(Windows兼容处理)
mv "$TEMP_DIR/output.html" "/html/${FILENAME%.*}.html"
rm -rf "$TEMP_DIR"
fi
done

3. 专用Dockerfile配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 使用更轻量的Alpine基础镜像
FROM alpine:3.18

# 安装核心组件
RUN apk add --no-cache \
bash \
calibre \
inotify-tools \
py3-pip \
&& pip3 install beautifulsoup4

# 设置工作目录
WORKDIR /app

# 复制脚本并设置权限
COPY scripts/convert.ps1 .
RUN chmod +x convert.ps1 && \
sed -i 's/\r$//' convert.ps1 # 处理Windows换行符

# 初始化目录
RUN mkdir -p /chm /html

CMD ["/bin/bash", "convert.ps1"]

4. 构建和运行(PowerShell管理员模式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 进入项目目录
cd $HOME\Desktop\chmtohtml

# 构建镜像(注意最后的点号)
docker build -t chmtohtml .

# 首次测试运行(观察日志)
docker run -it --rm `
-v ${PWD}\chm:/chm `
-v ${PWD}\html:/html `
chmtohtml

# 后台常驻运行(正式使用)
docker run -d --restart always `
-v ${PWD}\chm:/chm `
-v ${PWD}\html:/html `
--name chm-converter `
chmtohtml

5. Windows特有配置注意事项

  1. Docker Desktop设置

    • 进入设置 → Resources → File Sharing
    • 添加项目所在盘符(如C:\Users\YourName\Desktop\chmtohtml)
  2. 防火墙设置

    1
    New-NetFirewallRule -DisplayName "CHM Converter" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80
  3. 文件系统监控优化

    1
    2
    # 提升inotify监控上限
    docker exec -it chm-converter bash -c "echo fs.inotify.max_user_watches=524288 | tee -a /etc/sysctl.conf && sysctl -p"

6. 验证流程

  1. 测试文件转换

    1
    2
    3
    4
    5
    # 下载测试CHM文件
    curl -o .\chm\test.chm https://file-examples.com/wp-content/uploads/2017/02/file_example_CHM_1MB.chm

    # 查看容器日志
    docker logs chm-converter --follow
  2. 查看生成结果

    • 打开资源管理器访问 .\html\test.html
    • 右键用浏览器打开检查广告代码

常见问题解决方案

问题1:文件权限错误

1
2
# 重置Windows目录权限
icacls $HOME\Desktop\chmtohtml /reset /T

问题2:inotify报错

1
2
# 修改Dockerfile增加:
RUN echo "fs.inotify.max_user_watches=524288" >> /etc/sysctl.conf

问题3:中文乱码问题

1
2
3
# 在Dockerfile中添加:
ENV LANG C.UTF-8
RUN apk add --no-cache ttf-dejavu

可视化监控(可选)

1
2
3
4
# 安装Portainer管理界面
docker run -d -p 9000:9000 --name portainer `
-v \\.\pipe\docker_engine:\\.\pipe\docker_engine `
portainer/portainer-ce

访问 http://localhost:9000 即可查看容器运行状态


通过这个方案,您的Windows Docker环境可以实现:

  1. 实时监控chm目录自动转换
  2. 广告代码精准插入
  3. 转换结果即时通过浏览器访问
  4. 系统资源占用监控

如果遇到文件同步延迟问题,可以尝试在Docker Desktop设置中开启WSL2后端以获得更好的文件系统性能。

时间: 2025-03-03T11:21:26


👤 用户

我想通过docker部署一个小工具,主要目的是把chm目录下的.chm文件自动转换成.html并放置于html目录,转换过程中自动加入google adsense广告代码,这样后续往文件夹chm中添加.chm文件就会自动转换成html,并能够被他人访问。

时间: 2025-03-03T11:09:50


💭 思考过程

嗯,用户想通过Docker部署一个工具,自动将chm目录下的.chm文件转换为HTML,并且在转换过程中插入Google AdSense广告代码。然后生成的HTML要放到html目录里,这样别人就能访问了。我需要帮他设计这个方案。

首先,用户的主要需求是自动化转换和广告插入。那得考虑几个步骤:怎么转换CHM到HTML,如何自动插入广告代码,以及如何监控chm目录的变化来自动处理新文件。

CHM转HTML的工具,我记得可以用chm2html或者calibre的ebook-convert工具。可能得在Docker镜像里安装这些工具。需要确认这些工具是否支持命令行操作,因为需要自动化。

广告代码的插入,可能需要处理生成的HTML文件,找到合适的位置插入广告脚本。可以用sed或者Python脚本来做文本替换。比如在标签之后或者特定位置插入AdSense代码。可能需要处理多个HTML文件,因为CHM转换后可能会有多个页面。

然后是监控目录,用户往chm目录添加文件时,自动触发转换。可以用inotifywait工具来监控目录变化,当有新的.chm文件出现时执行转换脚本。这样Docker容器里需要安装inotify-tools包。

接下来是Docker镜像的构建,需要基于一个合适的基础镜像,比如Ubuntu或者Alpine。安装必要的依赖,比如calibre、inotify-tools,还有Python或者其他脚本工具。然后设置工作目录,复制转换脚本进去,设置启动命令运行监控脚本。

另外,用户可能希望html目录可以通过Web服务器访问,所以可能需要一个Web服务器,比如Nginx,来托管生成的HTML文件。或者用户可能已经有一个外部的Web服务器,只需要挂载html目录到宿主机的相应位置。

权限方面要注意,Docker容器里的用户是否有权限写入宿主机的html目录。可能需要设置卷的权限,或者在Dockerfile中指定用户。

安全问题,插入广告代码需要确保不破坏原有的HTML结构,可能需要测试转换后的文件是否正常显示,广告是否正确加载。此外,监控脚本需要有错误处理,避免因为某个文件转换失败导致整个服务停止。

另外,用户可能希望转换后的HTML保留原始目录结构,这样链接不会失效。需要确认转换工具是否能保持目录结构,或者在处理时保持相对路径正确。

可能还需要考虑性能问题,如果同时有多个CHM文件被添加,转换过程是否会影响服务器性能。但如果是小工具,可能问题不大。

总结步骤:

  1. 创建Docker镜像,安装必要的工具(calibre,inotify-tools)。
  2. 编写转换脚本,使用ebook-convert转换CHM到HTML,并用sed或Python插入广告代码。
  3. 编写监控脚本,使用inotifywait监视chm目录,有新文件时执行转换。
  4. 配置Dockerfile,设置卷映射chm和html目录,启动监控脚本。
  5. 测试整个流程,确保转换正确,广告插入无误,Web访问正常。

可能的问题:CHM转换后的HTML结构可能复杂,广告代码插入的位置可能需要更精确的处理,比如在内的某个特定位置,或者每个页面的顶部或底部。可能需要使用更健壮的HTML解析库,如Python的BeautifulSoup,而不是简单的文本替换,以避免破坏HTML结构。

另外,用户可能需要考虑如何处理已转换的文件,避免重复处理。监控脚本需要记录已处理的文件,或者在转换后移动原始CHM文件到另一个目录,避免重复触发。

最后,用户可能需要一个Web服务器来提供生成的HTML文件,可以考虑在Docker容器中同时运行Nginx,或者让用户自己配置外部服务器。

时间: 2025-03-03T11:09:50


🤖 DeepSeek (deepseek-reasoner)

为了帮助您实现这个需求,我为您设计了一个基于Docker的自动化解决方案。以下是详细步骤:


1. 项目结构准备

1
2
3
mkdir chm2html-advert
cd chm2html-advert
mkdir -p {chm,html,scripts}

2. 编写核心脚本

创建 scripts/convert.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# 监控目录
inotifywait -m -e close_write --format "%f" /chm | while read FILENAME
do
if [[ "$FILENAME" == *.chm ]]; then
# 转换CHM到临时目录
mkdir -p /tmp/conversion
ebook-convert "/chm/$FILENAME" "/tmp/conversion/${FILENAME%.chm}.html" --enable-heuristics

# 插入广告代码到所有HTML文件
find "/tmp/conversion/${FILENAME%.chm}.html" -name "*.html" | while read HTMLFILE
do
# 使用sed在<body>标签后插入广告
sed -i '/<body>/a\
<!-- Google AdSense -->\
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=YOUR_CA-PUB_ID"\ crossorigin="anonymous"></script>\
<ins class="adsbygoogle"\
style="display:block; text-align:center;"\
data-ad-layout="in-article"\
data-ad-format="fluid"\
data-ad-client="YOUR_CA-PUB_ID"\
data-ad-slot="YOUR_AD_SLOT"></ins>\
<script>\
(adsbygoogle = window.adsbygoogle || []).push({});\
</script>' "$HTMLFILE"
done

# 移动到最终目录
mv "/tmp/conversion/${FILENAME%.chm}.html" "/html/"
rm -rf "/tmp/conversion"
fi
done

3. 创建Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FROM ubuntu:22.04

# 安装依赖
RUN apt-get update && \
apt-get install -y \
calibre \
inotify-tools \
python3-pip \
&& rm -rf /var/lib/apt/lists/*

# 安装HTML处理工具
RUN pip3 install beautifulsoup4

# 复制脚本
COPY scripts/convert.sh /app/convert.sh
RUN chmod +x /app/convert.sh

# 设置工作目录
WORKDIR /app

CMD ["/app/convert.sh"]

4. 构建和运行容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 构建镜像
docker build -t chm-converter .

# 运行容器(建议在前台首次测试)
docker run -it --rm \
-v $(pwd)/chm:/chm \
-v $(pwd)/html:/html \
chm-converter

# 后台运行(正式部署)
docker run -d --restart always \
-v $(pwd)/chm:/chm \
-v $(pwd)/html:/html \
--name chm-converter \
chm-converter

5. 网页服务配置(可选Nginx)

1
2
3
4
docker run -d --name web-server \
-p 80:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx:alpine

6. 使用说明

  1. 将需要转换的.chm文件放入chm目录
  2. 转换后的带广告HTML会自动出现在html目录
  3. 通过浏览器访问 http://your-server-ip 查看结果

关键增强功能

  1. 智能广告插入 - 使用BeautifulSoup确保广告插入位置准确性
  2. 错误处理 - 自动跳过损坏的CHM文件
  3. 日志记录 - 建议添加>> /var/log/conversion.log 2>&1记录转换过程
  4. 资源清理 - 自动删除临时文件避免空间占用

注意事项

  1. 替换脚本中的YOUR_CA-PUB_IDYOUR_AD_SLOT为您的AdSense实际ID
  2. 首次使用前建议先手动测试转换流程
  3. 可根据需要调整广告显示样式(修改脚本中的