N1 hexo Butterfly主题 5.7 相册部署 + IPv6/域名设置
适用:N1(斐讯N1 / Armbian)+ hexo + butterfly 主题
场景:N1 当相册服务器(低功耗 7×24 小时),手机流量访问
一、前提条件
- N1 已安装 Armbian + hexo,博客已部署 GitHub(https://xxx.github.io/ 可访问)
- 本地已准备相册系统文件(server.js、_album_gen.js、_gen_thumbs.js、_protected.json、_covers.json)点我查看
- 照片在 N1 外接盘 /mnt/usb(每个顶层文件夹 = 一个相册)
- 宽带已开启 IPv6(光猫/路由器)
- 手机用流量(移动/联通/电信 4G/5G)测试
二、需要替换的占位符
| 占位符 | 说明 |
|---|---|
[域名] |
你用的域名:dynv6 如 abc123.dynv6-n1.net,自有域名如 abc123.icu |
[DYNV6_TOKEN] |
dynv6 网站里该域名对应的 token(用 dynv6 时需要) |
[SecretId / SecretKey] |
腾讯云 API 密钥(用腾讯云域名时需要) |
[AccessKey ID / Secret] |
阿里云 API 密钥(用阿里云域名时需要) |
[N1局域网IP] |
N1 在路由器下的地址,如 192.168.2.15 |
三、第一部分:同步相册系统到 N1
第1步:本地准备文件
本地 hexo 目录确认有:
server.js/_album_gen.js/_gen_thumbs.js_protected.json/_covers.jsonsource/相册/(相册页,本地跑过 node _album_gen.js 就有)_config.butterfly.yml(要加相册入口)
第2步:手动传到 N1(FinalShell 拖拽上传)
打开 FinalShell,连接 N1(SSH 连接成功)
连接后进入
/root/hexo/文件列表本地打开 hexo 目录,把这 5 个文件直接拖到 N1 的
/root/hexo/里:server.js、_album_gen.js、_gen_thumbs.js、_protected.json、_covers.json把
source/相册文件夹拖到 N1 的/root/hexo/source/下
(FinalShell 拖文件夹会整个传进去,覆盖同名文件夹)把
_config.butterfly.yml拖到/root/hexo/里弹出「文件已存在,是否覆盖」→ 点「是 / 覆盖」
看到这 5 个文件 + source/相册 文件夹就对了
四、第二部分:N1 生成相册页 + 构建 + 菜单入口
第3步:N1 重新生成相册页 + 构建
SSH 连上 N1(FinalShell),执行:
1 | cd ~/hexo |
看到「生成完成」和照片/视频数量就对了(脚本会扫描 /mnt/usb 下所有文件夹,每个文件夹生成一个相册)
第4步:菜单添加相册入口
编辑 ~/hexo/_config.butterfly.yml,menu 里加一行:
1 | menu: |
例:相册: http://abc123.icu:4000/相册/ || fas fa-images
改完重新部署让 GitHub 上的博客生效:
1 | hexo clean && hexo g && hexo d |
五、第三部分:启动相册服务
第5步:pm2 启动(开机自启)
1 | cd ~/hexo |
pm2 startup会输出一条命令,按提示复制粘贴执行如果 N1 已有 hexo-album 进程,直接:
pm2 restart hexo-album
六、第四部分:IPv6 设置
第6步:确认 N1 有公网 IPv6
1 | ip -6 addr |
找 eth0 上 2409: 开头的全局 IPv6:
1 | inet6 2409:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global |
- ✅
2409:开头(电信/移动/联通公网 IPv6) - ❌
fe80:开头是链路本地地址,不能用
重启光猫/路由器后 IPv6 会变,靠 ddns 自动更新
七、第五部分:域名设置(两种方案二选一)
方案一:dynv6 免费域名(不想花钱,推荐先试这个)
第7步:dynv6 创建域名
- 打开 https://dynv6.com(可用 GitHub 账号直接登录)
- 创建域名:如
abc123-n1.dynv6.net(前缀可自定) - 进入该域名管理页,My Zones → Instructions → Benutzername,复制 token
保存好:[域名] 和 [DYNV6_TOKEN]。
⚠️ 一个 dynv6 域名同时只能指向一台设备,别和电脑版共用一个
第8步:ddns-go 配置 Dynv6
情况一:N1 已装过 ddns-go:
浏览器打开 http://[N1局域网IP]:9876 → 配置页点「添加」→ DNS 服务商选 Dynv6 → 填 [DYNV6_TOKEN] 和 [域名] → IPv6 获取方式:通过网卡获取(eth0)→ 保存
情况二:没装过(N1 是 arm64 架构):
1 | cd /root |
GitHub 慢可加镜像前缀:
https://gh-proxy.com/
下载慢点我下载
1 | tar xzf ddns-go_linux_arm64.tar.gz |
浏览器打开 http://[N1局域网IP]:9876 配置 Dynv6 → 保存,开机自启:
1 | ./ddns-go -s install -l :9876 -f 120 |
配置完成后到 dynv6 后台确认 AAAA 记录 = N1 当前 IPv6
方案二:自有域名(腾讯云 / 阿里云买的正规域名)
第7步:准备域名 + 获取 API 密钥
▍腾讯云域名(如 abc123.icu,DNS 在腾讯云)
获取密钥步骤:
- 浏览器登录腾讯云控制台:https://console.cloud.tencent.com
- 右上角头像 → 访问管理(CAM)
- 左侧菜单点「API 密钥管理」(或直接打开 https://console.cloud.tencent.com/cam/capi)
- 点「新建密钥」按钮
- 生成后得到两个值:
- SecretId:显示在密钥列表里,随时可复制
- SecretKey:只显示一次,点「显示」才能看到,立即复制保存
- 把
[SecretId]和[SecretKey]填到 ddns-go
▍阿里云域名(DNS 在阿里云)
获取密钥步骤:
- 浏览器登录阿里云控制台:https://ram.console.aliyun.com/manage/ak
(或右上角头像 → AccessKey 管理) - 点「创建 AccessKey」(首次创建会要求短信验证)
- 验证通过后生成 AccessKey ID 和 AccessKey Secret
- AccessKey Secret 只显示一次,立即复制保存
- 把
[AccessKey ID]和[AccessKey Secret]填到 ddns-go
密钥建议用子账号/最小权限,不要用主账号密钥;Secret 只显示一次,丢了只能删除重建
第8步:ddns-go 配置自有域名
情况一:N1 已装过 ddns-go:
浏览器打开 http://[N1局域网IP]:9876 → 配置页点「添加」→ DNS 服务商选:
- 腾讯云域名 → 选「腾讯云」
- 阿里云域名 → 选「阿里云」
→ 填对应 API 密钥 → Domains 填你的域名(如 abc123.icu,多域名每行一个)→ IPv6 获取方式:通过网卡获取(eth0)→ 保存
情况二:没装过,按方案一「情况二」的安装步骤装好再配置
配置完成后到云厂商的 DNS 解析管理页,确认该域名的 AAAA 记录 = N1 当前 IPv6(腾讯云:DNS 解析 DNSPod;阿里云:云解析 DNS)
八、第六部分:防火墙放行 + 验证
第9步:防火墙放行 4000 端口
1 | ufw allow 4000/tcp |
第10步:手机流量验证
手机关闭 WiFi,用流量打开:
1 | http://[域名]:4000/相册/ |
输入全局密码 → 相册列表(有封面)→ 点进相册 → 输入相册密码 → 照片正常显示 ✅
九、更换域名的方法(dynv6 ↔ 自有域名,或换个自有域名)
换域名只动 3 处,其他都不用改:
① ddns-go 配置页(http://[N1局域网IP]:9876)
- 把 DNS 服务商、密钥/token、Domains 里的域名改成新域名对应的 → 保存 → 确认显示「更新成功」
- 例:dynv6 换腾讯云 → DNS 服务商选腾讯云,填 SecretId/SecretKey,Domains 填 abc123.icu
② 博客菜单 _config.butterfly.yml
- 相册那行的地址域名换成新域名:
相册: http://新域名:4000/相册/ || fas fa-images - 重新部署:
1 | hexo clean && hexo g && hexo d |
③ 到新域名的 DNS 管理后台
- 确认 AAAA 记录 = N1 当前 IPv6(dynv6 后台 / 腾讯云 DNSPod / 阿里云云解析)
- 没自动出现就等 ddns-go 下次更新(每 5 分钟)
验证:手机流量打开 http://新域名:4000/相册/ 能出密码页就换好了,旧域名不用管,停用 ddns-go 里那条记录即可
十、常见问题排查
| 问题 | 排查方法 |
|---|---|
| 手机打不开域名 | ① 手机用流量不是 WiFi(家里 WiFi 一般没有公网 IPv6)② DNS 后台 AAAA 记录 = N1 当前 IPv6(ddns 每 5 分钟更新)③ N1 上先自测 curl http://localhost:4000/相册/ ④ 换个运营商流量测试 |
| 域名时好时坏 | ① ddns-go 是否显示「更新成功」② dynv6 域名检查是否和电脑版共用同一个(必须分开)③ 自有域名检查密钥是否填对、域名是否在 Domains 里 |
| 相册页打不开 | ① pm2 status 看 hexo-album 是否 online ② 端口是否 4000 ③ ufw status 看 4000 是否放行 |
| 菜单点了跳不过去 | ① _config.butterfly.yml 里域名和端口是否写对 ② 改完菜单是否重新 hexo d 部署了 |
十一、注意事项
- 端口三处要一致:server.js 启动参数、ufw 放行、菜单地址(都写 4000)
- dynv6 免费域名:一个域名同时只能指向一台设备,电脑版也做相册的话必须另建一个,不能共用
- 自有域名:域名和 DNS 必须在同一家(腾讯云域名配腾讯云密钥,阿里云域名配阿里云密钥),否则 ddns-go 更新不了
- 相册密码 / 输错锁定只在 server.js 上生效,GitHub 上的相册静态页没有密码(菜单已指向域名,正常走不到)
- 手机只能通过流量访问;想家里 WiFi 也能访问,需在路由器开启 IPv6 并放行对应端口
- 断电 / 断网 → 相册不可用(GitHub 博客不受影响),重要照片复用 N1 备份体系(/mnt/usb/_backup)
- 照片永远只放 /mnt/usb,不要推 GitHub(仓库建议 <1GB)


