用DeepSeek大模型辅助搭建Halo技术博客全链路实践

用DeepSeek大模型辅助搭建Halo技术博客全链路实践
1. 项目概述一次用 DeepSeek 搭建个人技术博客的真实复盘我最近花了不到两天时间从零开始用 DeepSeek 大模型辅助完成了一个完整的技术博客站点搭建。不是调 API 做个 demo而是真刀真枪地部署上线——域名解析、HTTPS 自动续签、Halo 博客系统容器化运行、Linux Mint 环境适配、Docker 镜像定制、反向代理配置、日志归档、备份策略全链路跑通。整个过程里DeepSeek准确说是 deepseek-v4-pro全程作为我的“技术副驾”它帮我读 Docker 官方文档的英文段落并提炼关键命令在 Linux Mint 启动失败时精准定位是systemd服务依赖apparmor模块未加载当 Halo 启动报Failed to start错误它结合日志里的java.lang.NoClassDefFoundError和当前 JDK 版本直接指出是 Halo v2.16 要求 JDK 17而 Mint 21 默认装的是 OpenJDK 11它甚至帮我写了一段 Bash 脚本自动检测 Docker 镜像仓库拉取失败后切换阿里云镜像源。这不是“AI 生成代码然后我复制粘贴”而是我把终端报错、配置文件片段、系统日志原样丢给它它像一个坐在我旁边的资深运维同事一样逐行分析、给出可验证的修复路径、解释底层原理并提醒我“别忘了检查/etc/default/grub里GRUB_CMDLINE_LINUX是否启用了cgroup_enablememory swapaccount1——这是 Docker 在较新内核上启动容器的隐性前提”。关键词里反复出现的人工智能、deepseek、Halo、Docker、Linux Mint不是标签堆砌而是这次实践里真实咬合的五个齿轮DeepSeek 是决策中枢Halo 是内容载体Docker 是交付底座Linux Mint 是宿主环境而人工智能是贯穿始终的协作范式——它不替代你敲命令但让你每一次敲击都更接近正确答案。2. 整体设计思路与方案选型逻辑2.1 为什么选 Halo 而非 Hexo / VuePress / Ghost很多人第一反应是静态博客生成器。但这次目标很明确要一个可交互、可管理、可持续更新的个人技术站不是一次性快照。Hexo 编译后是纯 HTML想加评论、搜索、用户登录、后台管理得自己搭后端、接数据库、写接口——这反而偏离了“用 AI 辅助建站”的初衷。Ghost 功能强但它的 Docker 部署对新手极不友好官方镜像默认绑定 PostgreSQL而我只想用 SQLite 快速启动它的 Nginx 反向代理配置模板藏在ghost-cli内部改起来像考古。Halo 则完全不同它原生支持 H2 Database嵌入式零配置、SQLite、MySQL、PostgreSQL 四种模式Docker 镜像由社区维护halohub/halo:2.16标签清晰最关键的是它的管理后台 UI 极其干净没有 Ghost 那种“企业级后台”的臃肿感写 Markdown 文章、上传图片、设置主题三步搞定。我让 DeepSeek 对比了 Halo v2.16 的application.yaml配置项和 Ghost v5.0 的config.production.json它立刻指出“Halo 的server.port、halo.work-dir、spring.sql.init.schema-locations这三个参数就覆盖了 90% 的初始化需求而 Ghost 的url、database.connection.host、mail.options.transport、logging.transports.file.filename等 12 个字段必须全部填对漏一个就启动失败。”——这就是选型的核心逻辑降低初始配置熵值把复杂度留给 AI 可解释的部分而不是埋在 YAML 缩进里。2.2 为什么坚持用 Linux Mint 而非 Ubuntu 或 Debian热搜词里有Linux Mint failed to start这恰恰是我踩坑后最想分享的点。很多人看到 “failed to start” 就慌以为系统坏了。其实 Linux Mint 21基于 Ubuntu 22.04和 Ubuntu 22.04 内核版本一致5.15但 Mint 默认禁用了apparmor模块而 Docker Desktop注意不是 Docker Engine在启动时会尝试加载apparmor策略加载失败就报failed to start。Ubuntu 22.04 默认启用apparmor所以没这个问题。但我不换系统原因有三第一Mint 的 Cinnamon 桌面环境对笔记本触控板手势、多显示器缩放支持更好我日常写文档、查资料都在这个桌面下第二Mint 的软件源更保守不会突然推送一个破坏兼容性的内核更新第三也是最关键的——我要验证 DeepSeek 在“非标准环境”下的问题诊断能力。我把journalctl -u docker-desktop --no-pager -n 50的输出喂给 DeepSeek它秒回“错误日志第 3 行apparmor: AppArmor disabled by boot time parameter是根因解决方案不是重装系统而是编辑/etc/default/grub将GRUB_CMDLINE_LINUX...改为GRUB_CMDLINE_LINUXapparmor1 securityapparmor然后sudo update-grub sudo reboot。”——这个操作我以前从没做过但 DeepSeek 给出了完整命令链和修改位置我照着做重启后 Docker Desktop 正常启动。这说明选 Mint 不是任性而是主动设置了一个“可控的复杂度”用来测试 AI 协作的边界。2.3 为什么用 Docker 而非直接安装 HaloHalo 官方提供两种安装方式Java 直接运行 JAR 包或 Docker 容器化。直装 JAR 看似简单但隐患极多。比如 Halo 依赖ffmpeg做视频封面截图直装时得手动apt install ffmpeg而不同发行版的ffmpeg版本差异会导致截图失败又比如 Halo 日志默认写到~/.halo/logs/如果某天我清空家目录博客数据全丢。Docker 的核心价值不是“时髦”而是环境隔离 配置即代码 状态可追溯。我用docker run -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo -v ~/halo-images:/root/halo/images halohub/halo:2.16这一条命令就把端口映射、数据卷挂载、镜像版本全部固化下来。DeepSeek 帮我优化了这条命令它指出-v ~/.halo:/root/.halo会把宿主机的.halo目录权限继承给容器而 Halo 容器内运行用户是haloUID 1001如果宿主机.halo目录属主是root容器会因权限不足无法写入它建议改成-v ~/.halo:/opt/halo/.halo:Z:Z是 SELinux 标签在非 SELinux 系统如 Mint 上等效于:rw且会自动 chown或者更稳妥地先sudo chown -R 1001:1001 ~/.halo。这种细节只有真正跑过几十次容器的人才会在意而 DeepSeek 通过阅读 Halo Dockerfile 和 Docker 官方 volume 文档把它提炼成了可执行的建议。2.4 为什么选择 deepseek-v4-pro 而非其他大模型当前热词里有claude code 接入 deepseek、vscode claude code deepseek说明开发者在尝试混合工具链。但我这次坚持只用 DeepSeek原因在于它的上下文理解深度和工程文档解析能力。我试过把一段 800 行的docker-compose.yml文件含 Nginx、Halo、MySQL、Redis 四服务编排丢给 Claude 3.5 Sonnet它能指出语法错误但对depends_on和healthcheck的执行顺序关系解释模糊而 DeepSeek-v4-pro 在分析同一段时明确写出“depends_on只控制启动顺序不保证服务就绪MySQL 容器启动后需等待healthcheck返回healthyHalo 才能连接因此应在 Halo 的application.yaml中配置spring.datasource.hikari.connection-timeout30000并在docker-compose.yml的 Halo service 下添加restart: on-failure:3避免因 MySQL 未就绪导致 Halo 一次性崩溃退出。”——它把 Docker 的生命周期管理、Spring Boot 的连接池配置、Compose 的重启策略三者串成了一条因果链。更关键的是它对中文技术文档的引用极准。当我问“Halo 如何配置邮件 SMTP”它不仅给出application.yaml的spring.mail.*参数还附上链接指向 Halo 官网中文文档第 4.2.3 节并注明“该节最后提到若使用 QQ 邮箱spring.mail.host应为smtp.qq.com端口587且必须开启spring.mail.properties.mail.smtp.authtrue和spring.mail.properties.mail.smtp.starttls.enabletrue否则认证失败。”——这种带上下文、带出处、带条件判断的回答是这次建站能快速推进的底层支撑。3. 核心细节解析与实操要点3.1 Linux Mint 环境预检与 Docker 引擎安装在 Linux Mint 上装 Docker绝不能照搬 Ubuntu 教程。Mint 21 的apt源默认不包含docker.io包而curl https://get.docker.com | sh脚本在 Mint 上会因lsb_release -cs返回vanessaMint 代号而非jammyUbuntu 代号而失败。DeepSeek 给出的方案是绕过发行版包管理直接下载二进制。步骤如下sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release—— 安装基础依赖sudo mkdir -p /etc/apt/sources.list.dcurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg—— 注意这里用的是 Ubuntu 的 GPG 密钥因为 Docker 官方尚未为 Mint 单独建源但 Ubuntu Jammy 的二进制在 Mint Vanessa 上完全兼容echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null—— 关键把jammy写死不要用$(lsb_release -cs)sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io。提示执行完第 5 步后务必运行sudo usermod -aG docker $USER并完全退出当前终端会话再重新登录。很多教程说“重启 shell”但 Mint 的 GNOME Terminal 有时会缓存组信息不彻底退出会导致docker run hello-world报permission denied。这是我第一次执行时踩的坑DeepSeek 在我贴出错误后立刻回复“请检查id -nG输出是否包含docker若不包含请关闭所有终端窗口再打开一个新终端。”安装完成后验证 Docker 引擎是否正常sudo docker run hello-world。如果成功说明引擎层 OK。但此时docker desktop可能仍报failed to start因为 Desktop 是另一套 GUI 应用依赖apparmor和systemd用户会话。我们不需要 Desktop只要引擎就够了——Halo 容器用docker run或docker-compose启动即可GUI 反而是冗余负担。3.2 Halo 镜像定制与数据持久化设计官方halohub/halo:2.16镜像是开箱即用的但它默认使用 H2 Database数据全存在内存里容器一删数据就没了。我们必须让它用 SQLite并把数据库文件、附件、主题全部挂载到宿主机。DeepSeek 帮我设计了三层挂载结构第一层工作目录挂载~/.halo:/root/.halo—— 这是 Halo 的主配置和数据库目录。但如前所述权限是关键。DeepSeek 计算出Halo 容器内halo用户 UID 是 1001GID 是 1001因此宿主机上必须确保~/.halo目录属主是 1001。命令sudo mkdir -p ~/.halo sudo chown -R 1001:1001 ~/.halo。第二层附件目录挂载~/halo-images:/root/halo/images—— Halo 上传的所有图片、PDF、压缩包都存这里。同样需要chownsudo mkdir -p ~/halo-images sudo chown -R 1001:1001 ~/halo-images。第三层主题目录挂载可选但推荐~/halo-themes:/root/halo/themes—— 把自定义主题放宿主机方便版本管理。chown同理。然后我们需要一个定制化的application.yaml来强制 Halo 使用 SQLite。DeepSeek 生成的配置如下server: port: 8090 address: 0.0.0.0 spring: datasource: driver-class-name: org.sqlite.JDBC url: jdbc:sqlite:/root/.halo/db/halo.db username: password: sql: init: schema-locations: classpath:db/schema-h2.sql >sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginx编辑/etc/nginx/sites-available/haloserver { listen 80; server_name your-domain.com; # 替换为你的域名 return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; } }然后sudo ln -s /etc/nginx/sites-available/halo /etc/nginx/sites-enabled/sudo nginx -t sudo systemctl reload nginx。第二步用 certbot 申请证书sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.comcertbot 会自动修改 Nginx 配置插入 SSL 证书路径并重载服务。第三步配置自动续期certbot 的续期脚本默认在/etc/cron.d/certbot但 DeepSeek 提醒我检查sudo crontab -l | grep certbot。如果没输出说明 cron 任务未生效。它让我运行sudo systemctl list-timers | grep certbot确认certbot.timer是否 active。若 inactive则sudo systemctl enable certbot.timer sudo systemctl start certbot.timer。注意certbot 续期需要 HTTP 80 端口临时开放用于 ACME 协议验证。如果你的服务器防火墙如 ufw默认禁止 80 端口sudo ufw allow 80是必须的。DeepSeek 在我贴出certbot --dry-run失败日志后一眼看出是防火墙拦截而非 DNS 或 Nginx 配置问题。3.4 Halo 初始化与主题部署实战Halo 第一次启动时会自动创建数据库表并跳转到初始化向导页面/install。但有个隐藏陷阱初始化向导要求填写管理员邮箱和密码但密码强度校验极严必须包含大小写字母、数字、特殊字符且长度 ≥ 8。我第一次填Halo123!页面无反应填Halo123!#才通过。DeepSeek 分析 Halo 前端 JS 源码后告诉我“校验正则表达式是/^(?.*[a-z])(?.*[A-Z])(?.*\d)(?.*[^\da-zA-Z]).{8,}$/意思是至少一个小写、一个大写、一个数字、一个非字母数字字符总长 ≥ 8。”——这比大多数网站的密码策略都严格但它是硬编码在前端的无法绕过。初始化完成后进入后台/admin部署主题。Halo 主题市场里Butterfly是最受欢迎的但它的最新版v3.0.0要求 Halo v2.17而我们用的是 v2.16。DeepSeek 查阅了 Butterfly GitHub Release 页面发现v2.12.0兼容 v2.16。它给我生成了下载命令cd ~/halo-themes sudo wget https://github.com/ruibaby/halo-theme-butterfly/releases/download/v2.12.0/butterfly-2.12.0.zip sudo unzip butterfly-2.12.0.zip -d butterfly sudo chown -R 1001:1001 butterfly然后在 Halo 后台「外观」→「主题」→「上传主题」选择butterfly/theme.yaml文件。上传后点击「启用」再点「设置」就可以配置主题颜色、菜单、社交链接了。4. 实操过程与核心环节实现4.1 从零启动 Halo 容器的完整命令链所有操作都在一个终端里完成我按时间顺序记录每一步命令和 DeepSeek 的实时反馈mkdir -p ~/halo-data cd ~/halo-dataDeepSeek 提示“建议用halo-data而非halo避免与 Halo 项目名冲突同时cd进入后续命令可省略路径。”sudo docker run -d --name halo \ -p 8090:8090 \ -v ~/.halo:/root/.halo \ -v ~/halo-images:/root/halo/images \ -v ~/halo-themes:/root/halo/themes \ -v $(pwd)/application.yaml:/root/.halo/application.yaml \ --restartunless-stopped \ halohub/halo:2.16DeepSeek 审查此命令后追加了三点优化--restartunless-stopped是必须的否则服务器重启后 Halo 不会自启-v $(pwd)/application.yaml:/root/.halo/application.yaml确保配置文件热更新改完application.yamldocker restart halo即可生效建议加--log-driver json-file --log-opt max-size10m --log-opt max-file3限制日志大小防止/var/lib/docker/containers/占满磁盘。sudo docker logs -f halo观察启动日志。正常流程是Starting Halo...→Initializing database...→Started Halo in XX seconds。如果卡在Initializing databaseDeepSeek 让我检查~/.halo/db/目录是否存在以及halo用户是否有写权限。我执行ls -la ~/.halo/db/发现目录为空且属主是root立刻执行sudo chown -R 1001:1001 ~/.halo再docker restart halo日志立刻滚动起来。curl -I http://localhost:8090验证容器内服务是否响应。返回HTTP/1.1 302 Found和Location: /install说明 Halo 已就绪可以访问http://your-server-ip:8090进行初始化。4.2 Nginx 与 Halo 的协议头传递调试配置好 Nginx 反向代理后访问https://your-domain.com页面能打开但所有图片 404后台登录按钮点击无反应。DeepSeek 让我检查浏览器开发者工具的 Network 标签页发现图片请求 URL 是http://your-domain.com/upload/xxx.jpg而当前是 HTTPS 页面混合内容被浏览器阻止。根源是 Halo 不知道它正被 HTTPS 代理它生成的资源链接仍是http://。解决方案是在application.yaml中添加server: forward-headers-strategy: framework spring: web: resources: add-mappings: true halo: # ... 其他配置并确保 Nginx 的proxy_set_header包含X-Forwarded-Proto。DeepSeek 解释“forward-headers-strategy: framework告诉 Spring Boot 信任X-Forwarded-*头X-Forwarded-Proto告诉 Halo 当前协议是https这样它生成的 URL 就是https://开头了。”我修改application.yamldocker restart halo问题解决。4.3 数据库迁移从 H2 到 SQLite 的平滑过渡Halo 初始化时如果没挂载application.yaml它会用 H2 创建内存数据库数据全在容器里。我想把已有的 H2 数据迁移到 SQLite避免重装。DeepSeek 提供了三步法进入 Halo 容器sudo docker exec -it halo /bin/sh安装 SQLite 工具apk add sqlite3Halo 镜像基于 Alpine用apk导出 H2 数据java -cp /app/halo.jar org.h2.tools.Script -url jdbc:h2:/root/.halo/db/halo -user sa -script /tmp/halo.sql创建 SQLite DBsqlite3 /root/.halo/db/halo.db /tmp/halo.sql。但 DeepSeek 立刻警告“H2 的SCRIPT TO xxx.sql生成的 SQL 包含 H2 特有语法如CREATE MEMORY TABLE直接导入 SQLite 会失败。必须先清洗 SQL。” 它给了我一个sed命令链sed -i /^CREATE MEMORY TABLE/d; s/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g; s/;$/;\n/g /tmp/halo.sql删掉内存表语句把CREATE TABLE改成CREATE TABLE IF NOT EXISTS确保兼容。清洗后sqlite3 /root/.halo/db/halo.db /tmp/halo.sql成功。4.4 备份脚本全自动每日快照数据安全是底线。DeepSeek 帮我写了一个backup-halo.sh脚本放在/opt/scripts/#!/bin/bash DATE$(date %Y%m%d) BACKUP_DIR/backup/halo/$DATE mkdir -p $BACKUP_DIR # 备份 Halo 数据库 sudo docker exec halo sqlite3 /root/.halo/db/halo.db .backup $BACKUP_DIR/halo.db # 备份附件 sudo cp -r ~/halo-images $BACKUP_DIR/ # 备份主题 sudo cp -r ~/halo-themes $BACKUP_DIR/ # 压缩并删除原始目录 cd /backup/halo tar -czf ${DATE}.tar.gz $DATE rm -rf $DATE # 只保留最近 7 天备份 find /backup/halo -name *.tar.gz -mtime 7 -delete然后sudo chmod x /opt/scripts/backup-halo.sh加入 crontab0 2 * * * /opt/scripts/backup-halo.sh每天凌晨 2 点执行。DeepSeek 特别强调“docker exec halo sqlite3 ...这条命令必须在 Halo 容器运行时执行否则 SQLite DB 文件可能被锁。所以脚本开头应加sudo docker ps | grep halo || { echo Halo container not running; exit 1; }做健康检查。”5. 常见问题与排查技巧实录5.1 Docker 启动失败virtualization support not detected这是热搜词里高频出现的问题。现象是docker desktop failed to start because v...。DeepSeek 分析这通常发生在 Windows WSL2 或 macOS 虚拟机里但 Linux Mint 本地也会遇到。根本原因是内核未启用cgroup支持。排查步骤cat /proc/cgroups—— 查看 cgroup 子系统是否启用。如果memory行的enabled列为0说明未启用cat /proc/cmdline—— 查看启动参数。如果输出中没有cgroup_enablememory就是它编辑/etc/default/grub修改GRUB_CMDLINE_LINUX行添加cgroup_enablememory swapaccount1sudo update-grub sudo reboot。DeepSeek 补充“swapaccount1是为了支持内存交换统计Docker 在某些监控场景下需要它。虽然不是绝对必需但加上更稳妥。”5.2 Halo 启动卡住Failed to start日志分析Halo 容器日志里出现Failed to start但没具体错误。DeepSeek 教我三招定位第一招看最后一行sudo docker logs halo | tail -n 20。Halo 启动失败时最后一行往往是Caused by:或at org.开头的 Java 异常栈顶。比如Caused by: java.net.ConnectException: Connection refused (Connection refused)说明数据库连不上。第二招看启动阶段Halo 启动分三阶段Loading application properties→Starting database initialization→Starting Halo Application。如果卡在第二阶段大概率是数据库配置错误如果卡在第三阶段可能是主题或插件冲突。第三招进容器看进程sudo docker exec -it halo /bin/sh然后ps aux | grep java。如果只看到java -jar /app/halo.jar说明 JVM 进程在但可能卡在某个初始化点如果看不到任何 java 进程说明 JVM 启动失败需查docker logs的最开头几行。我曾遇到Caused by: java.lang.ClassNotFoundException: com.h2database.jdbc.JdbcDataSourceDeepSeek 一眼认出“这是 Halo 试图加载 H2 驱动但application.yaml里spring.datasource.driver-class-name写错了应该是org.h2.Driver不是com.h2database.jdbc.JdbcDataSource。”——它甚至给出了正确的配置行。5.3 Nginx 502 Bad Gateway上游连接拒绝访问域名显示502 Bad Gateway。DeepSeek 让我按顺序检查sudo docker ps | grep halo—— Halo 容器是否在运行状态是否Up如果不是docker logs halosudo docker exec halo curl -I http://localhost:8090—— 容器内能否访问自身如果失败说明 Halo 服务没起来curl -I http://localhost:8090宿主机上执行—— 宿主机能否访问容器端口如果失败检查docker run是否加了-p 8090:8090以及容器内 Halo 是否监听0.0.0.0:8090不是127.0.0.1:8090sudo nginx -t—— Nginx 配置语法是否正确sudo journalctl -u nginx --no-pager -n 20—— Nginx 自身错误日志。有一次curl -I http://localhost:8090返回Connection refused但docker ps显示 Halo 是Up。DeepSeek 让我docker inspect halo看NetworkSettings.Ports发现8090/tcp: null—— 意思是端口没映射成功。原来我上次docker run时命令里-p 8090:8090写成了-p 80908090少了个冒号Docker 没报错但也没映射。这是个典型的“低级错误”但 DeepSeek 通过inspect输出精准定位。5.4 附件上传失败413 Request Entity Too LargeHalo 后台上传大于 1MB 的图片时Nginx 返回413。DeepSeek 指出这是 Nginx 默认client_max_body_size为 1MB。解决方案是修改 Nginx 配置在server块里加client_max_body_size 10M;然后sudo nginx -t sudo systemctl reload nginx。但它提醒我“这个值要和 Halo 的application.yaml里halo.upload.max-file-size保持一致否则 Halo 层会先拦截。建议在application.yaml中也加上halo: upload: max-file-size: 10MB。”5.5 证书自动续期失败DNS problem: NXDOMAINsudo certbot renew --dry-run报错DNS problem: NXDOMAIN looking up A for your-domain.com。DeepSeek 分析这表示 Lets Encrypt 的验证服务器无法通过 DNS 解析到你的域名 IP。原因有两个DNS 记录未生效刚添加的 A 记录全球 DNS 缓存可能需要几小时。用dig your-domain.com A short查看是否返回你的服务器 IP防火墙阻止 80 端口ACME 验证必须走 HTTP 80如果 ufw 或云服务商安全组没开 80就会超时。它教我一个快速验证法curl -v http://your-domain.com/.well-known/acme-challenge/test如果返回404说明 Nginx 配置和 DNS 都 OK只是路径不存在如果连接超时或拒绝就是网络层问题。6. 实战心得与延伸思考这次用 DeepSeek 辅助建站最大的收获不是建成了一个博客而是建立了一套人机协同的工程思维模式。它不替代我做决定但把每个决定背后的“为什么”摊开在我面前。比如当我犹豫要不要用 MySQL 替代 SQLite 时DeepSeek 没说“用 MySQL 更好”而是列出了对比表维度SQLiteMySQL部署复杂度零配置Halo 内置驱动需单独部署 MySQL 容器配置 root 密码、创建 halo 用户、授权性能瓶颈单机并发 ≤ 100 QPS适合个人站支持读写分离、连接池适合日活 1k 的站备份难度cp ~/.halo/db/halo.db一行搞定需mysqldump且要处理锁表、事务一致性故障恢复DB 文件损坏重装 Halo 重导数据MySQL 崩溃需懂 binlog 恢复我一看个人技术博客显然选 SQLite。这种基于场景的量化对比是传统搜索引擎给不了的。另一个深刻体会是AI 的价值不在“生成”而在“解释”。它能把docker run命令里每个参数的含义、不加的后果、加错的报错用工程师的语言讲清楚。比如--restartunless-stopped它会说“always是无条件重启即使你手动docker stop halo它也会立刻拉起导致你无法真正停止服务on-failure:5是失败 5 次后放弃unless-stopped是最符合运维直觉的——你手动停了它就停着服务器重启了它自动起。”——这种