适用: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.json
  • source/相册/(相册页,本地跑过 node _album_gen.js 就有)
  • _config.butterfly.yml(要加相册入口)

第2步:手动传到 N1(FinalShell 拖拽上传)

  1. 打开 FinalShell,连接 N1(SSH 连接成功)

  2. 连接后进入 /root/hexo/文件列表

  3. 本地打开 hexo 目录,把这 5 个文件直接拖到 N1 的 /root/hexo/ 里:
    server.js、_album_gen.js、_gen_thumbs.js、_protected.json、_covers.json

  4. 把 source/相册 文件夹拖到 N1 的 /root/hexo/source/ 下
    (FinalShell 拖文件夹会整个传进去,覆盖同名文件夹)

  5. 把 _config.butterfly.yml 拖到 /root/hexo/ 里

  6. 弹出「文件已存在,是否覆盖」→ 点「是 / 覆盖」

看到这 5 个文件 + source/相册 文件夹就对了


四、第二部分:N1 生成相册页 + 构建 + 菜单入口

第3步:N1 重新生成相册页 + 构建

SSH 连上 N1(FinalShell),执行:

1
2
3
cd ~/hexo
MEDIA_ROOT=/mnt/usb node _album_gen.js
hexo clean && hexo g

看到「生成完成」和照片/视频数量就对了(脚本会扫描 /mnt/usb 下所有文件夹,每个文件夹生成一个相册)

第4步:菜单添加相册入口

编辑 ~/hexo/_config.butterfly.yml,menu 里加一行:

1
2
3
menu:
首页: / || fas fa-home
相册: http://[域名]:4000/相册/ || fas fa-images

例:相册: http://abc123.icu:4000/相册/ || fas fa-images

改完重新部署让 GitHub 上的博客生效:

1
hexo clean && hexo g && hexo d

五、第三部分:启动相册服务

第5步:pm2 启动(开机自启)

1
2
3
4
cd ~/hexo
pm2 start server.js --name hexo-album
pm2 save
pm2 startup

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 创建域名

  1. 打开 https://dynv6.com(可用 GitHub 账号直接登录)
  2. 创建域名:如 abc123-n1.dynv6.net(前缀可自定)
  3. 进入该域名管理页,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
2
cd /root
wget https://github.com/jeessy2/ddns-go/releases/latest/download/ddns-go_linux_arm64.tar.gz

GitHub 慢可加镜像前缀:https://gh-proxy.com/
下载慢点我下载

1
2
3
tar xzf ddns-go_linux_arm64.tar.gz
chmod +x ddns-go
./ddns-go -l :9876 -f 120

浏览器打开 http://[N1局域网IP]:9876 配置 Dynv6 → 保存,开机自启:

1
./ddns-go -s install -l :9876 -f 120

配置完成后到 dynv6 后台确认 AAAA 记录 = N1 当前 IPv6

方案二:自有域名(腾讯云 / 阿里云买的正规域名)

第7步:准备域名 + 获取 API 密钥

▍腾讯云域名(如 abc123.icu,DNS 在腾讯云)

获取密钥步骤:

  1. 浏览器登录腾讯云控制台:https://console.cloud.tencent.com
  2. 右上角头像 → 访问管理(CAM)
  3. 左侧菜单点「API 密钥管理」(或直接打开 https://console.cloud.tencent.com/cam/capi)
  4. 点「新建密钥」按钮
  5. 生成后得到两个值:
    • SecretId:显示在密钥列表里,随时可复制
    • SecretKey:只显示一次,点「显示」才能看到,立即复制保存
  6. 把 [SecretId] 和 [SecretKey] 填到 ddns-go

▍阿里云域名(DNS 在阿里云)

获取密钥步骤:

  1. 浏览器登录阿里云控制台:https://ram.console.aliyun.com/manage/ak
    (或右上角头像 → AccessKey 管理)
  2. 点「创建 AccessKey」(首次创建会要求短信验证)
  3. 验证通过后生成 AccessKey ID 和 AccessKey Secret
  4. AccessKey Secret 只显示一次,立即复制保存
  5. 把 [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/相册/

例:http://abc123.icu: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 部署了

十一、注意事项

  1. 端口三处要一致:server.js 启动参数、ufw 放行、菜单地址(都写 4000)
  2. dynv6 免费域名:一个域名同时只能指向一台设备,电脑版也做相册的话必须另建一个,不能共用
  3. 自有域名:域名和 DNS 必须在同一家(腾讯云域名配腾讯云密钥,阿里云域名配阿里云密钥),否则 ddns-go 更新不了
  4. 相册密码 / 输错锁定只在 server.js 上生效,GitHub 上的相册静态页没有密码(菜单已指向域名,正常走不到)
  5. 手机只能通过流量访问;想家里 WiFi 也能访问,需在路由器开启 IPv6 并放行对应端口
  6. 断电 / 断网 → 相册不可用(GitHub 博客不受影响),重要照片复用 N1 备份体系(/mnt/usb/_backup)
  7. 照片永远只放 /mnt/usb,不要推 GitHub(仓库建议 <1GB)