DCT-Net GPU镜像保姆级教程:如何修改默认端口、添加HTTPS安全访问
1. 这不是普通卡通滤镜,而是一套可部署、可定制的AI人像生成系统
你可能用过手机里的卡通头像生成功能——点一下,几秒出图,但背后是黑盒服务,不能改参数、不能换域名、不能加密码,更别说部署到自己服务器上。而今天要讲的DCT-Net人像卡通化GPU镜像,完全不同。
它不是一个App,而是一个完整可运行的AI服务环境:上传一张照片,立刻生成高质量二次元风格人像;它不依赖云端API,所有计算都在你自己的显卡上完成;更重要的是——它完全开放、可配置、可集成。你可以把它变成公司内部员工形象管理系统的一部分,可以嵌入到客户网站里作为增值服务,甚至能配上自己的域名和HTTPS证书,对外提供专业级AI接口。
本教程不讲“怎么点按钮”,而是带你真正掌控这个镜像:
把默认的7860端口改成你想要的(比如8080或3000)
给Web界面加上HTTPS,让浏览器地址栏显示绿色小锁
避开常见坑:TensorFlow 1.15在40系显卡上的CUDA兼容问题、Gradio启动冲突、端口被占用、证书路径错误等
全程无需重装镜像,所有操作都在已启动的实例中完成,适合刚接触容器部署但想真正用起来的技术人员、AI应用开发者、中小团队运维同学。
2. 先搞懂它到底跑在哪儿、用什么跑
2.1 镜像底层结构:为什么它能在RTX 4090上稳稳运行
很多老项目卡在40系显卡上,根本原因是 TensorFlow 1.x 默认不支持 CUDA 11.8+,而40系显卡驱动强制要求 cuDNN 8.6+。本镜像做了关键适配:
- 使用CUDA 11.3 + cuDNN 8.2组合,这是目前唯一能同时满足 TensorFlow 1.15.5 和 RTX 4090 显存管理的稳定组合
- 所有依赖预编译进镜像,避免运行时编译失败
- Gradio 版本锁定为
3.41.0(非最新版),因为新版Gradio在TF1.15环境下会触发tf.keras.layers.Layer兼容报错
小提醒:别试图升级TensorFlow或Gradio——这不是bug,是技术代际兼容的现实约束。就像老车换不了新能源电池,但可以调好悬挂、换上新轮胎,照样跑得稳。
2.2 服务启动逻辑:Web界面不是“自动弹出来”的,而是有明确生命周期
很多人点“WebUI”按钮后发现打不开,第一反应是“镜像坏了”。其实真相是:
- 实例启动后,系统执行
/usr/local/bin/start-cartoon.sh脚本 - 该脚本先检查
nvidia-smi是否就绪,再加载模型权重(约8秒),最后用nohup gradio launch ... &后台启动 - 默认监听
0.0.0.0:7860,且不启用认证、不启用HTTPS、不绑定域名
所以,“改端口”和“加HTTPS”,本质就是修改这个启动命令的参数,并确保配套服务(如Nginx或Caddy)能正确代理。
3. 修改默认端口:三步搞定,拒绝端口冲突
3.1 查看当前端口占用情况(必做!)
登录实例终端后,第一件事不是改配置,而是确认7860是否真被占用了:
netstat -tuln | grep ':7860' # 或更直观的写法 lsof -i :7860如果返回空,说明端口空闲,可直接跳到3.3;如果看到类似python 1234 root ...的结果,说明Gradio已在运行,需先停掉:
pkill -f "gradio launch" # 等3秒再确认 lsof -i :7860 | grep -q "7860" || echo "端口已释放"3.2 修改启动脚本:把7860换成你想要的数字
打开启动脚本:
nano /usr/local/bin/start-cartoon.sh找到这一行(通常在文件末尾):
python /root/DctNet/app.py --share --server-port 7860把它改成(以8080为例):
python /root/DctNet/app.py --server-port 8080注意:
- 删除
--share参数(它会生成公网临时链接,与我们自建HTTPS冲突) - 不要加
--server-name 0.0.0.0,默认已是全网可访问 - 保存后退出(Ctrl+O → Enter → Ctrl+X)
3.3 重启服务并验证新端口
执行重启命令:
/bin/bash /usr/local/bin/start-cartoon.sh等待10秒,然后检查:
curl -s http://127.0.0.1:8080 | head -20 | grep -i "gradio" # 应返回含Gradio HTML的内容如果成功,现在点击控制台“WebUI”按钮会失效(因为按钮仍指向7860)。此时请手动访问:http://你的实例IP:8080
实测提示:如果你用的是云厂商控制台(如CSDN星图、阿里云ECI),记得在安全组规则中放行新端口(如TCP 8080),否则外网无法访问。
4. 添加HTTPS安全访问:用Caddy实现零配置自动证书
4.1 为什么不用Nginx?——选Caddy的真实理由
网上很多教程教用Nginx配HTTPS,但对本镜像来说,Nginx方案有3个硬伤:
❌ 需手动申请、下载、更新SSL证书(Let’s Encrypt流程复杂)
❌ 要额外配置反向代理规则,容易写错路径导致静态资源404
❌ Gradio的WebSocket连接(用于实时进度条)在Nginx下需特殊配置proxy_set_header Upgrade $http_upgrade,新手极易遗漏
而Caddy是专为现代Web设计的服务器,它能做到:
域名解析后,自动申请并续期Let’s Encrypt证书(无需手动操作)
一行配置完成反向代理 + HTTPS + WebSocket透传
配置文件极简,5行内搞定全部功能
4.2 安装Caddy并创建配置文件
在终端中执行:
# 下载并安装Caddy(官方一键脚本) curl https://getcaddy.com | bash -s personal # 创建Caddy配置目录 mkdir -p /etc/caddy # 编辑Caddyfile(替换 your-domain.com 为你的真实域名) nano /etc/caddy/Caddyfile填入以下内容(务必替换成你自己的域名):
your-domain.com { reverse_proxy http://127.0.0.1:8080 { transport http { keepalive 30s } } }关键点说明:
your-domain.com必须已解析到你的实例IP(A记录)reverse_proxy自动处理HTTP→HTTPS跳转、证书管理、WebSocket升级- 不需要写
tls指令——Caddy默认启用自动HTTPS
保存退出。
4.3 启动Caddy并设为开机自启
# 启动Caddy(后台运行) caddy run --config /etc/caddy/Caddyfile --adapter caddyfile & # 设为系统服务(使用systemd) cat > /etc/systemd/system/caddy.service << 'EOF' [Unit] Description=Caddy After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/caddy run --config /etc/caddy/Caddyfile --adapter caddyfile Restart=on-failure [Install] WantedBy=multi-user.target EOF # 启用并启动 systemctl daemon-reload systemctl enable caddy systemctl start caddy等待约60秒(Caddy首次申请证书需DNS验证),然后访问:https://your-domain.com
你应该看到绿色小锁,且Gradio界面完全正常——上传图片、点击转换、进度条实时刷新,一切如初,只是多了HTTPS。
验证是否生效的小技巧:
在浏览器按F12 → Network标签页 → 刷新页面 → 查看所有请求的Protocol列,应全为h2(HTTP/2 over HTTPS)
5. 进阶技巧:让卡通化服务更专业、更可控
5.1 加访问密码:防止未授权使用(可选但推荐)
即使加了HTTPS,如果服务暴露在公网上,仍可能被爬虫或恶意用户反复调用。Caddy支持一行加密码:
修改/etc/caddy/Caddyfile,在域名块内加入:
basicauth /* { your_username JDJiJDEwJE9vZGZkLmVzYy5QaU5uLjRrT2ZoLk5KZ2ZkLk5KZ2ZkLk5KZ2ZkLk5KZ2ZkLk5KZ2ZkLk5KZ2Zk }密码哈希生成方式(在终端执行):
# 安装工具(如未安装) apt-get update && apt-get install -y apache2-utils # 生成密码(示例:用户名admin,密码mypass123) htpasswd -nb admin mypass123 # 输出类似:admin:$apr1$...(复制整行,粘贴到Caddyfile中)重启Caddy生效:
systemctl restart caddy下次访问https://your-domain.com就会弹出登录框。
5.2 自定义Logo和标题:告别“Gradio默认页”
打开主程序文件:
nano /root/DctNet/app.py找到gr.Interface(...)这一行(通常在文件末尾),在其参数中加入:
title="我的二次元工坊", description="上传人像照片,10秒生成专属动漫形象", theme="default", examples=["/root/DctNet/examples/1.jpg", "/root/DctNet/examples/2.jpg"], allow_flagging="never"title和description会显示在页面顶部examples指向镜像内置的示例图路径(确保该路径存在)allow_flagging="never"关闭Gradio默认的“标记问题”功能,更干净
保存后重启服务:
pkill -f "gradio launch" && /bin/bash /usr/local/bin/start-cartoon.sh5.3 日志与监控:知道谁在用、用了多少次
Gradio本身不记录访问日志,但我们可以通过Caddy补上:
在/etc/caddy/Caddyfile的域名块内,追加:
log { output file /var/log/caddy/access.log format json }创建日志目录并授予权限:
mkdir -p /var/log/caddy chown -R root:root /var/log/caddy重启Caddy后,日志将自动写入/var/log/caddy/access.log,可用以下命令实时查看调用:
tail -f /var/log/caddy/access.log | jq '.request.uri' 2>/dev/null # 显示所有访问的URL路径6. 总结:你已掌握一套可商用的AI图像服务部署能力
6.1 本教程你实际掌握了什么
- 端口自由切换:不再被
7860束缚,可根据团队规范、安全策略、现有服务布局灵活调整 - HTTPS一键落地:用Caddy替代复杂Nginx配置,自动证书管理,省去每月手动续期烦恼
- 安全边界加固:通过基础认证(Basic Auth)控制访问权限,避免服务被滥用
- 品牌化定制能力:修改页面标题、描述、示例图,让AI服务真正成为你产品的一部分,而非一个“第三方工具”
- 可观测性建设:接入访问日志,为后续用量分析、性能优化、成本核算打下基础
6.2 下一步建议:让这套服务走得更远
- 对接企业微信/钉钉机器人:当有人上传图片并生成成功后,自动推送结果图到指定群聊
- 批量处理接口化:修改
app.py,暴露/api/cartoonizePOST接口,支持JSON传图Base64,供其他系统调用 - 增加GPU显存监控:在Web界面右上角嵌入实时显存使用率(用
nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits) - 模型热更新机制:不重启服务,动态加载新训练的卡通化模型权重(需少量代码改造)
你不需要成为DevOps专家,也能把AI模型变成稳定、安全、可管理的生产服务。真正的技术价值,不在于“能不能跑”,而在于“能不能控、能不能管、能不能融”。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。