自己手动版适用:Typecho 博客从一个虚拟主机搬到另一个虚拟主机;也含「网站突然坏了要恢复」的应急流程更新时间:2026-10-07(第 2 版,新增星辰云主机恢复经验)一、开工前:先要齐这些信息...全文
自己手动版适用:Typecho 博客从一个虚拟主机搬到另一个虚拟主机;也含「网站突然坏了要恢复」的应急流程更新时间:2026-10-07(第 2 版,新增星辰云主机恢复经验)一、开工前:先要齐这些信息
新主机那边要问客服/在面板里找到:
项目例子在哪找FTP 地址 + 端口mf.iqy.im 21主机开通邮件 / 面板FTP 账号 / 密码ocjffuda / xxx同上面板地址 + 账号密码https://xxx/qingyun/index.php同上数据库地址/名/账号/密码localhost / ocjffuda / …同上数据库管理入口https://xxx:4413/mysql/同上站点根目录名/wwwroot(也可能是 /htdocs、/public_html)面板文件管理里看一眼能不能选 PHP 版本要能选到 7.4面板「PHP 版本」页主机平台类型荧控制台(星辰云/轻云)还是标准 cPanel/DirectAdmin看面板界面(见下面「平台类型」)
⚠️ 三个必查项,少一个都可能白搬:
FTP 能不能连上(有些主机只给网页文件管理器)要不要备案(国内主机没备案 = 绑不了域名)PHP 版本能不能选到 7.4(Typecho 1.3 在 7.2 下会全站白屏)⭐ 先认清你的主机是哪种平台(很重要)
荧控制台(星辰云 aspanel.starzv.com、轻云 mf.iqy.im/qingyun 都是这套)有个特殊规矩:
FTP 里传上去的文件,网站读不到;必须用面板的「文件管理」上传才算数。
所以:
如果面板地址是 /vhost/ 或 /qingyun/ 这种 → 属于荧控制台 → 文件一律走面板「文件管理」上传标准 cPanel/DirectAdmin 类 → FTP 直接传就行
判断方法很简单:用 FTP 传个小文件上去,浏览器访问一下;能访问就是普通平台,404 就是荧控制台。
二、搬家六步第 1 步:备份现在的网站(两个东西)
① 网站文件:用 FTP 工具(FileZilla)把站点根目录整个下载到本地
② 数据库:
打开现在的数据库管理页(phpMyAdmin)登录左侧点一下自己的数据库名(⚠️ 千万别选「整个服务器」)顶部点「导出」→ 选 「快速」 → 格式 SQL → 点「执行」下载得到一个 .sql 文件
③ 顺手清理 SQL(很重要,不然到新主机会报错):用记事本打开这个 .sql,删掉这两类行:
CREATE DATABASE IF NOT EXISTS `旧库名` ... ; ← 整行删掉
USE `旧库名`; ← 整行删掉
另外如果文件里还有别的数据库的段落(比如别人的 test 库),从那一行开始后面的全删。
第 2 步:文件放到新主机面板 → 文件管理 → 进 wwwroot 目录
把本地下载的网站文件全部上传
普通平台(cPanel):用 FileZilla 把文件夹内容拖进 /wwwroot荧控制台:必须用面板的「文件管理」上传(FTP 传的不生效)上传完检查:/wwwroot 里应该直接是 admin、usr、var、index.php、config.inc.php⚠️ 不要出现多一层文件夹(比如 /wwwroot/wwwroot/)
如果用 zip 上传,注意两件事:
一定要用没问题的 zip。Windows 自带压缩工具打的包在 Linux 面板解压会坏(文件名变成带 \ 的一坨)。判断方法:解压后如果看到 var\Typecho\Db.php 这种名字,就是坏了,删掉重来。⚠️ 面板自动解压会「跳过已存在的文件」!所以整包传完解压后,必须把 config.inc.php 再单独上传一次覆盖掉旧的(这一步最常被漏,漏了网站就报数据库错误)。第 3 步:数据库导进去打开新主机的 phpMyAdmin,登录左侧点新主机的数据库名顶部「导入」→ 选择第 1 步那个清理好的 .sql拉到底点「执行」看到 「导入成功,执行了 XX 条语句」 就对了第 4 步:改 config.inc.php(关键!)
网站根目录的 config.inc.php 里存着旧主机的数据库信息,必须改成新主机的:
$db->addServer(array (
'host' => 'localhost', ← 一般不用改
'port' => 3306,
'user' => '新主机数据库用户名', ← 改
'password' => '新主机数据库密码', ← 改
'charset' => 'utf8mb4',
'database' => '新主机数据库名', ← 改
'engine' => 'InnoDB',
...
改完传回 /wwwroot/config.inc.php 覆盖(荧控制台走面板上传)。
第 5 步:绑域名 + PHP 版本
在新主机面板里:
域名绑定 → 添加你的域名 → 目录选 wwwroot → 记下面板给出的解析要求(A 记录 IP 或 CNAME)PHP 版本 → 选 7.4 → 保存第 6 步:改域名解析
在 Cloudflare(或你域名的 DNS 服务商):
找到 blog 那条记录按第 5 步面板给的解析要求修改建议先把小云朵点灰(DNS only)验证,正常了再开橙云三、搬完检查清单
打开你的域名,逐项确认:
[ ] 首页能打开,标题正确[ ] 随便点开 2~3 篇文章,正文、图片正常[ ] 封面图能显示[ ] 后台能登录:你的域名/admin/[ ] 后台 → 外观,主题配置还在(封面图地址池、摘要字数这些)[ ] 速度实测:手机流量 + 电脑都打开试试,明显卡的话考虑换主机
出问题对照表:
现象原因怎么办全站白屏 / 500PHP 版本不是 7.4面板切成 7.4403 / 目录列表文件没传全重新传,检查有没有多一层文件夹样式全乱、图片不显示主题目录没传全检查 /wwwroot/usr/themes/主题名/页面报 Error establishing a database connectionconfig.inc.php 还是旧主机的(解压时被跳过没覆盖)单独上传一次 config.inc.php 覆盖面板显示「空间占用 0 MB」+ 网站 503平台的「已发布内容」被删了(≠ 磁盘文件)走面板文件管理重新上传整包导入 SQL 报 #1044 Access deniedSQL 里带了 CREATE DATABASE删掉那行重新导导入 SQL 报 #1064 语法错误SQL 文件被改坏了重新导出,别用编辑软件乱存刚传的文件访问 404荧控制台的 FTP 文件不生效改用面板「文件管理」上传四、网站突然坏了怎么恢复(应急)
网站打不开时,先分两种情况:
情况 A:面板显示「空间占用 0 MB」或明显偏小→ 平台的「已发布内容」被删了(很可能是删文件时把 wwwroot 整个选上删了)恢复步骤:
面板 → 文件管理 → 进 wwwroot上传网站整包 zip → 解压再单独上传一次 config.inc.php 覆盖(关键,别漏)等 1 分钟,访问网站验证
情况 B:面板有占用,但网站报数据库错误→ 多半是 config.inc.php 里的数据库信息不对恢复步骤:单独上传正确的 config.inc.php 覆盖即可
情况 C:网站 200 但样式乱 / 图片不显示→ 主题文件没传全,检查 /wwwroot/usr/themes/主题名/
五、注意事项旧主机先别退!等新站全部验证 OK 再处理(最好观察一周)搬家期间不要在任何一边写新文章,不然会漏删文件时只删文件夹里面的,别把文件夹本身选了——选的时候特别容易连带,一旦把 wwwroot 一起删掉,网站立刻 503荧控制台特有:FTP 里能看到的文件 ≠ 网站实际用的文件;面板的「文件管理」才是权威换主题相关:主题目录名不能随便改,Typecho 是按目录名存配置的,改名会丢主题设置如果新主机访问慢,先试试手机流量(有的香港线路对某些运营商不友好);联通能开不代表移动能开六、当前站点信息(2026-10-07)项目值博客地址https://blog.syicxh.cc.cd程序Typecho 1.3 + SuNexmoe 主题(PHP 7.4)现用主机星辰云(香港):面板 https://aspanel.starzv.com/vhost/,站点根 /wwwroot备用主机轻云互联(香港):面板 https://mf.iqy.im/qingyun/index.php,站点根 /wwwroot(文件和数据库都已部署好,随时可切)域名解析Cloudflare,指向星辰云七、不想自己弄怎么办
把这份手册 + 密码信息给 AI 助手(WorkBuddy 之类),让它按《给 AI 版手册》操作;或者你自己用 FTP + phpMyAdmin 两块界面手工做,最稳。
AI执行版适用:Typecho 1.3 + SuNexmoe 主题,虚拟主机 → 虚拟主机迁移;含「主机故障恢复」流程沉淀时间:2026-10-07(第 2 版:基于星辰云 → 轻云迁移 + 星辰云恢复两次实战)使用前提:先读「用户偏好与硬性规则」,再按 S0~S7 执行〇、用户偏好与硬性规则(必读)
文件存放:
工作文件(中间产物、脚本、解压目录)→ D:\ProgramData\workbuddy-data\workfiles-<任务名>\交付物(备份、文档、最终包)→ D:\Susuisuinian\博客备份\<分类>\禁止把文件散落在 D:\Xtemp(Bash 的 /tmp)或 C 盘临时目录删除纪律:只删自己明确知道来历的文件;绝不按修改时间批量删共享临时目录(曾误删用户的 QQ 截图,不可恢复)。删除优先用回收站:D:\Program Files\WorkBuddy\resources\app.asar.unpacked\cli\vendor\genie-trash\win32-x64.exe <绝对路径>(输出 OK 在 stderr)用户观感:用户可能全程旁观,喜欢「先给结论、再给数据」;不要长时间静默;长任务必须报进度;卡住要早说,不要闷头试一小时(曾因平台怪架构卡了整晚,用户很不满)。用户明确说「不要动我网站」时,只做本地文件操作。交付物最小化:只交付用户点名要的东西;中间物不要塞给用户看。一、开工前必须向用户索取的信息项目用途旧主机 FTP 地址/端口/账号/密码备份文件旧主机数据库面板地址 + 账号密码导出 SQL新主机 FTP 地址/端口/账号/密码上传文件新主机面板地址 + 账号密码绑域名、改 PHP 版本、传文件新主机数据库地址/库名/账号/密码导入 SQL、改 config新主机站点根目录名通常 /wwwroot,进面板文件管理确认主机平台类型荧控制台?(决定文件怎么传,见 S0)域名 DNS 在哪(Cloudflare?)最后切换解析二、环境与工具(本机已验证可用)工具说明C:/Users/ASUS/.workbuddy/binaries/node/versions/22.22.2-6/node.exeNode(写 CDP 脚本)C:/Users/ASUS/.workbuddy/binaries/python/envs/default/Scripts/python.exePython(含 Pillow)curl(Git Bash 自带)FTP 上传/下载/列目录、HTTP 请求Python ftplib批量 FTP 首选(单连接复用,618 文件约 15 分钟)Edge + CDP面板自动化:msedge.exe --remote-debugging-port=PORT --user-data-dir=独立目录 <url>回收站工具见「硬性规则」第 2 条
⚠️ Bash 里调 cmd/powershell 会被安全策略拦(词面命中即拦),需要 PowerShell 就直接用 PowerShell 工具。
三、执行流程(S0~S7)S0 勘察(5 分钟,必做)# FTP 是否可用
curl -s -u "user:pass" "ftp://host/" --list-only | head
# 端口扫描(Bash 内建,无需 nmap)
for p in 21 22 80 443; do timeout 5 bash -c "echo > /dev/tcp/IP/$p" && echo "$p 开放"; done
# 站点根目录(FTP 根看到 wwwroot?还是就是站点?)
curl -s -u "user:pass" "ftp://host/wwwroot/" --list-only | head
# 判断面板是什么系统(看 HTML 特征)
curl -s "https://面板地址/" | grep -oP '<title>[^<]*'
决策:
荧控制台(面板 URL 含 /vhost/ 或 /qingyun/)→ 文件必须走面板 WebFTP,FTP 传的不发布标准平台 → FTP 路线(最稳)判断方法:FTP 传一个小文件,浏览器访问;404 = 荧控制台S1 备份旧站# 1) 文件:Python ftplib 递归(探测目录 + 下载),或
curl -T / -u "..." "ftp://host/path" # 单文件上传
curl -u "..." "ftp://host/path" -o 本地 # 下载
# 2) 数据库:见下方「phpMyAdmin 坑」
phpMyAdmin 导出坑(重要):
POST route=/export 走 curl / 自动化常只返回 AJAX 外壳(页面提示 Javascript must be enabled)→ 导出让用户手动在浏览器点(快速 → SQL → 执行),最省事用户导出后务必检查 SQL 头部,清理:CREATE DATABASE、USE、以及别人的库的整段(见 S3)也可用面板自带「数据库备份」(?c=shell&a=mysqldumpout,body passwd=),但可能因缺 PROCESS 权限失败S2 准备上传包# ⚠️ 必须用 Python zipfile(正斜杠)!Windows 自带压缩工具打的包在 Linux 面板解压会变成
# "var\Typecho\Db.php" 这种带反斜杠的扁平文件名
import zipfile, os
with zipfile.ZipFile(OUT, 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as z:
for dirpath, _, filenames in os.walk(SRC):
for fn in filenames:
full = os.path.join(dirpath, fn)
rel = os.path.relpath(full, SRC).replace('\\', '/')
z.write(full, rel)
必须校验:'\\' not in name、顶层结构(admin/、usr/、var/、index.php…)、testzip() 通过、试解压文件数一致。
同时准备新 config.inc.php(数据库凭据换成新主机的,其余不动):
$db = new \Typecho\Db('Pdo_Mysql', 'typecho_');
$db->addServer(array('host'=>'localhost','port'=>3306,'user'=>'<新用户>','password'=>'<新密码>',
'charset'=>'utf8mb4','database'=>'<新库>','engine'=>'InnoDB','sslCa'=>NULL,'sslVerify'=>false),
\Typecho\Db::READ | \Typecho\Db::WRITE);S3 部署到新主机# 普通平台:FTP 上传 zip + 面板解压
curl -T site.zip --connect-timeout 20 -u "user:pass" "ftp://newhost/wwwroot/site.zip"
# 荧控制台:必须走面板 WebFTP(见 S8 面板操作速查)
# 备选:Python ftplib 直接建目录 + 传 618 个文件(ftp.mkd 建目录)
⭐ 荧控制台部署的关键两条:
整包解压后会「跳过已存在的文件」 → config.inc.php 等旧文件不会被覆盖 → 必须再单独上传一次 config.inc.php(漏了就会 Error establishing a database connection)传完等 20~30 秒让平台发布,再用「直连源站 IP + Host 头」验证
SQL 清理与导入:
curl -k -b ck.txt -F "token=$TOKEN" \
-F "import_file=@clean.sql;filename=clean.sql;type=text/plain" \
-F "is_js_confirmed=0" -F "allow_interrupt=1" -F "import_type=database" \
-F "format=sql" -F "sql_compatibility=NONE" -F "skip_queries=0" \
"https://<dbhost>/mysql/index.php?route=/import&db=<新库>&lang=en&server=1"
# 登录 phpMyAdmin(curl):先 GET 取 token/set_session → POST route=/ 带 pma_username/pma_password
# 验证:SELECT 统计 contents / options / 表数量,并核对关键文章标题
SQL 清理规则(Python,按字节处理更安全):
截掉其他数据库段落(找第二个 -- 数据库: 或 CREATE DATABASE 处截断)删除 CREATE DATABASE ...;、USE ...;⚠️ 读文件用 open(..., encoding='utf-8', errors='ignore') 会静默丢字节,破坏转义 → 涉及 SQL 处理一律字节级操作('rb')老主机的 dump 可能夹杂「CR 被转义、LF 是真实换行」的混合格式,某些 MySQL 会报 #1064 → 用新鲜导出替换导出若勾了「整个服务器」,文件里会混进别人的库(如 test)→ 按段落截掉S4 域名 + PHP 版本面板「域名绑定」:域名 → 目录 wwwroot → 记下解析要求(A 记录 IP / CNAME 目标)面板「PHP 版本」:必须 7.4(Typecho 1.3 在 7.2 下全站白屏 500)荧系面板 API 参考:?c=domain&a=add(body domain=xxx&subdir=wwwroot)、?c=index&a=phpset(GET 看版本)/ ?c=index&a=phpset&op=change(POST v=php74)域名解析由用户在 Cloudflare 手动改(AI 无权限);建议先灰云(DNS only)验证S5 验证# 1) 走域名
curl -sI https://域名/ -o /dev/null -w "%{http_code}\n"
# 2) 绕过 CDN 直连源站(CDN 线路抖动时很有用)
curl -s -H "Host: 域名" "http://<源站IP>/" -o /dev/null -w "%{http_code}\n"
# 3) 逐项:首页标题、文章页、/admin/(302=正常)、静态资源
# 4) 数据库:表数、文章数、关键文章标题
# 5) 速度:手机流量 + 电脑实测,卡就如实告诉用户(曾有主机"能开但更慢"被弃用)S6 收尾归档备份到 D:\Susuisuinian\博客备份\(分类:网站文件 / 主题 / 插件 / 数据库 / 旧站全量 / 文章文档 / 脚本 / 邮件模板 / 迁移手册)更新日记与 MEMORY.md提醒用户:旧主机先别退,验证一周后再处理S7 主机故障恢复(应急)
触发:网站 503 / 白屏 / 报 Error establishing a database connection诊断顺序:
直连源站 IP + Host 头看真实响应(绕 CDN 抖动)
登录主机面板看「空间占用」:
0 MB → 平台「已发布内容」被删(FTP 里可能还有旧文件,但网站不认)→ 走恢复上传正常 → 查 config.inc.php 数据库凭据传 dbtest.php(token 保护,用完删)直接测 DB 连接、PHP 版本、pdo_mysql;能顺便打印 config 里的 user/host 帮你定位恢复动作:面板 WebFTP 上传整包 → 解压 → 单独再传一次 config.inc.php → 等 30 秒验证 → 删诊断脚本⭐ 教训:站点「数据库连不上」经常不是数据库的错,而是解压跳过文件导致 config 没被覆盖。四、荧控制台面板操作速查(星辰云/轻云,CDP 自动化,已验证)
登录:
curl -c ck.txt "https://<面板域名>/vhost/?c=session&a=loginForm"
curl -b ck.txt -c ck.txt -L --data "username=<账号>&passwd=<密码>" \
"https://<面板域名>/vhost/index.php?c=session&a=login"
(轻云是 /qingyun/index.php?c=session&a=login,同一套程序)
面板 WebFTP 上传文件(可靠流程):
点 #fileBtn 打开发文件管理器,等约 16 秒让 iframe 加载⚠️ 文件管理器默认停在根目录 /,不是 /wwwroot
进目录:双击目录项(触发 openDir('wwwroot'))
❌ 不要直接调 loadDir('/wwwroot') —— 会被环境改写成奇怪本地路径(如 D:/Program Files/.../PortableGit/wwwroot)导致上传落到错处校验 #location 字段(注意末尾斜杠,比对时要 normalize)确认已进入 /wwwroot/打开上传对话框 dialog('webftpUpload') → 取 #webftpUploadInput 的 objectId → DOM.requestNode → DOM.setFileInputFiles → 点「开始上传」
面板删除文件:
iframe.contentWindow.selFile('<文件名>', true);
iframe.contentWindow.doCommonOperation('rm'); // 跳过 confirm 弹窗
面板数据库备份:?c=shell&a=mysqldumpout(POST body passwd=),轮询 ?c=shell&a=query&session=<返回的 session> 看结果;可能因缺 PROCESS 权限失败。
五、关键坑与对策(血泪表)坑现象对策荧控制台:FTP 文件不发布FTP 传上去的文件磁盘上有、FTP 能列出,但网站 404(连老文件也 404)文件走面板 WebFTP 上传面板「空间占用」≠ 磁盘文件面板显示 0 MB + 网站 503,但 FTP 里文件还在平台只认「面板上传的发布内容」;重新走面板上传zip 自动解压跳过已存在文件传整包后 config.inc.php 没被覆盖 → 报 Error establishing a database connection整包传完再单独上传一次 config.inc.php面板文件管理器默认不在站点根上传的文件落到根目录而不是 /wwwroot双击目录项 openDir('wwwroot') 并校验 #location;别用 loadDir('/wwwroot')Windows 压缩包解压后出现 var\Typecho\Db.php 这类文件名用 Python zipfile 重新打包(正斜杠)Cloudflare 不代理 FTP用域名连 21 端口必超时用源站 IP 连 FTPTypecho 在 PHP 7.2 白屏全站 500、无错误信息面板切 PHP 7.4主题目录名改目录名 → 主题配置丢失(options 表 theme:目录名)目录名保持一致;要改就同步改数据库phpMyAdmin 导出curl/自动化拿到的是 JS 空壳让用户手动导出;或用面板备份功能导出带了 CREATE DATABASE导入新主机报 #1044 Access denied清理 SQL导出勾了「整个服务器」文件里混进别的库(如 test)只导出自己的库;已混入的按段落截掉CDN → 源站线路抖动请求 20~45s 超时、时好时坏用直连源站 IP + Host 头做验证;告知用户是线路问题站点"能开但更慢"换到新主机后用户实测更慢迁移前后都测速;用户以体感为准,别只看状态码长任务卡死bash 循环探测 FTP 目录 1.5h 无进展批量 FTP 用 Python ftplib 多线程;单条命令设 --max-time;发现卡住立刻换方案并告知用户curl -o 的转义\\$f 被 bash 转义成字面量,路径拼接失败用 'C:\path\'"$f" 或改用 Python后台登录自动化登录成功会 302 到 /,只看 URL 会误判登录后跳 dashboard 验证;textarea 写入长度用 JSON.stringify 校验(换行符规范化允许 ±10 误差)清理误删按 mtime 批量删共享 temp → 删掉用户文件只删自己创建的;先列清单再删;用回收站面板里删文件选文件时连带把 wwwroot 文件夹本身选上删了明确只选 wwwroot 里面的内容;删前看清单六、类型化检查表(可复用)
迁移前
[ ] 旧站:FTP 可用?面板可用?数据库可导出?[ ] 新站:FTP 可用?站点根目录名?PHP 版本可切 7.4?要备案吗?平台是不是荧控制台?[ ] 用户提供的凭据齐全?DNS 在谁手上?
迁移中
[ ] 文件包用 Python zipfile 打包并校验(无反斜杠、试解压通过)[ ] SQL 已清理(无 CREATE DATABASE / USE / 别人的库)[ ] config.inc.php 已指向新库,且单独上传覆盖过(荧控制台)[ ] 数据库导入后核对行数与关键文章[ ] 域名绑定 + PHP 7.4[ ] 荧控制台:文件是走面板传的,不是 FTP
迁移后
[ ] 首页 / 文章 / 后台 / 静态资源 全部 200[ ] 主题配置、插件、评论通知 正常[ ] 速度实测(手机流量 + 电脑)[ ] 备份归档到统一路径[ ] 提醒用户旧主机暂缓退订七、站点现状(2026-10-07 更新)项目值博客https://blog.syicxh.cc.cd(Typecho 1.3 + SuNexmoe 主题,PHP 7.4)现用主机星辰云(香港) — 面板 https://aspanel.starzv.com/vhost/(账号 svh_wlrijbq);FTP 23.238.119.210:21(账号 s1260391);集群 IP 149.104.21.22 / 149.104.21.25;站点根 /wwwroot;数据库面板 https://amysql.starzv.com/mysql/(库 svh_wlrijbq)备用主机轻云互联(香港)— 面板 https://mf.iqy.im/qingyun/index.php(ocjffuda);FTP mf.iqy.im:21;站点根 /wwwroot;数据库 mf.iqy.im:4413/mysql/(库 ocjffuda);IP 104.233.187.187。文件与数据库都已部署并验证正常,只是用户觉得访问更慢而弃用域名解析Cloudflare,blog 记录指向星辰云(未动过)插件5 个(CommentNotifier、FuckAdComment、Links、ThemeSwitcher、TypechoHighLight)已废弃三丰云(备案卡死)、AWS 悉尼(无 FTP)、最早美国主机(数据已迁出)恢复包(可直接重传)D:\Susuisuinian\博客备份\01-网站文件-当前\星辰云恢复包-含星辰云数据库配置.zip备份归档D:\Susuisuinian\博客备份\(01~09 分类)工作目录D:\ProgramData\workbuddy-data\workfiles-轻云迁移\
收起