Normal view

There are new articles available, click to refresh the page.
Before yesterdayBOXKS

使用群晖 Chat 实现多平台内容传递

By: Kaiyuan
8 November 2023 at 00:08

手机和电脑之间经常要传递文件或者文字,很多人都是用微信或者 QQ 之类的软件,大部分软件体验过后发现群晖 Chat 十分好用!

我使用的是 iPhone,电脑有 Windows 和 Mac OS X,还有备用机是 Android,所以我基本是常规平台都要用,如果要在设备之间传输内容就是个烦恼。

然后呢…我有黑群晖啊,直接用 Chat 在各个平台传输内容,几乎全部平台都有 Chat 客户端,而且就算用不了客户端也可以用网页版,我还有 Yubico,就算在陌生设备也能无密码的登录。

使用的前提是,有群晖 NAS,黑白都可以。然后安装好 Synology Chat Server 套件。手机也要安装好。详情参考我另一篇文章

iOS 上直接通过分享菜单就有 Chat 选项,我一般都是直接分享到『我的空间』就可以。

现在没有什么软件比这个好用了。


通过群晖 Chat 推送通知到 iPhone

By: Kaiyuan
24 February 2023 at 00:23

push messages to iPhone with synology chat如果你有这样需求,将 Android 短信和来电甚至应用消息推送到 iPhone 上,可以尝试以下使用群晖的 Chat 套件。

设备设置

准备

安装套件

1.先要在国际版的群晖网站下载中心找到你NAS型号的 Synology Chat Server 套件,下载保存好套件文件。

2.打开你 NAS 的页面,然后在桌面打开套件中心。

3.选择手动安装。

4.弹出的窗口找到刚才下载的套件文件选择下一步。

设置机器人

1.打开安装好的 Sunology Chat。

2.在右上角你的头像点击,然后选择『整合』。

3.弹出的菜单选择『机器人』。

4.弹出的窗口点击『+创建』。

5.填写机器人名称和设置以下照片,记得复制好 『传入 URL』。注意:你还没添加机器人之前不要勾选『在聊天机器人列表隐藏』!

6.退出到 Chat 界面,在左边的栏目中『机器人』一栏的右边加号点击并找到刚才新建的机器人点击。这样就成功添加机器人了。

推送内容

推送到机器人的内容可以参照群晖知识中心关于整合的说明

下面我们以文字内容为例,格式是 json

payload={"text": "这里是送内容的文字部分"}

使用 POST 方式推送到建立机器人时候的『传入 URL』。

iPhone 设置

在 AppStore 上搜索 Sunology Chat 并安装,如果国区找不到的话只能用其他区账号安装了。

安装后输入 NAS 地址和端口号或者用 QuickConnect 连接。

Android 手机设置

通过短信转发器 SmsForwarder 推送手机上的消息到 Chat。

先下载好 SmsForwarder 并在 Android 手机上安装,然后打开 App,在发送通道的界面点击右上角加号选择 Webhook

选择 POST,在Webhook Server 填入机器人频道的 URL, 消息模板中填入 payload={"text":"{msg}"} 然后保存。

在转发规则的短信页面右上角加号添加一项,发送通道下拉选择刚添加的通道,然后保存就好了。你也可以点『测试』来测试是否成功。


映泰J4125 自建 NAS

By: Kaiyuan
1 October 2022 at 00:06

终于要自己买硬件来装 NAS 了!选择低功耗平台,6盘位机箱。

硬件清单 2022-09

硬件价格
全汉 FSP Flex-350G 额定350W电源¥459.00
西部数据红盘Plus 8TB(WD80EFZZ)¥1,225.00
映泰J4125NHU主板¥565.00
金士顿 FURY 8GB DDR4 3200 Beast内存¥185.00
梵隆 6 盘位热插拔机箱¥448.00
佳翼5盘SATA阵列卡m.2 nvme to sata¥199.00
闪迪USB 32G USB3.1 U盘CZ74¥43.90
合计¥3,124.90
上面加个都是供应商低价入的全新有质保的价格,机箱是淘宝梵隆自己的店,电源和 USB 是京东下单,其他就是供应商进货。

系统

现在市面上各个能安装的 NAS 系统都折腾一遍了,综合起来只有 DSM 最好使,主要是手机 APP 最健全,设计也最直观,然后就是想办法安装了。

网上搜了好久都没有针对我这块主板的引导,只能自己编译了,然后在搜索编译 DSM 引导的,发现一篇直观简单的编译教程,照着一顿操作,OK!完美引导,M.2 转接卡也能识别使用,没问题。还是直接在线安装系统的。安装完之后没有任何问题,直接使用。


数据迁移

群晖的 DSM 数据迁移十分简单,就是在新的机器安装一个 Migration Assistant,打开之后选择旧的机器,然后输入旧机器的管理员账号密码,选择迁移那些东西,然后等完成就好了,我选择所有组件都迁移,1.3T 数据用了4个多小时才完成,因为是千兆局域网。

Docker 也完美迁移!

迁移后旧机器会停用所有组件,再登陆上去像是新机器一样,因为迁移到新机器了,所以要停用旧机器的组件才不会和新机器上的冲突。看一眼旧机器的磁盘,数据没删的!好评!

现在是一个 8T 硬盘,过几个月再买多个 8T 组 Raid1,这样就错开硬盘的批次了。其实可以买一个希捷的或者买个红盘Pro,也算是错开了,奈何…穷啊。


NAS 功能使用和玩法

我现在 NAS 主要是做数据备份,然后就是文件分享,平时出去装电脑,本地单位的电脑很多时候都要安装一些特定的软件,我就是用家里 NAS 作为分享服务器,需要时候直接从 NAS 下载。

列一份清单吧

套件

套件说明
Plex影视媒体中心,目前功能最完善,其他都不少问题。
Photos群晖的照片应用,功能也是目前相关应用最完善的。
Chat自建聊天软件,配合群晖的免密登陆在模式电脑需要传文件什么的很舒服
Note Station笔记应用,不是很好用,但是找不到其他满意的自建笔记就将就用
WebDAV在手机电脑外网直连 NAS 文件最方便了
Contacts通讯录,手机基本都支持连接,可以方便设置手机通讯录都存 NAS。
Office这个是群晖 Office 套件,需要 Drive 套件支持,但是格式不能直接打开微软 Office 格式,需要转换格式,但是还是能用的。
Active Backup for Business备份服务器到 NAS,支持整个分区备份,不错,服务器就 10G,就算备份几个版本都可以。
Cloud Sync网盘同步工具,挺满意的,都能同步。
Hyper Backup备份 NAS 文件或者设置等到远端服务器,我把笔记,密码库等文件加密备份到 TeraCLOUD 和 OneDrive 上做一个备份。

Docker

项目说明
finab/bark-server推送消息到 iOS Bark
homeassistant/home-assistant智能家庭中心,暂时只用 Docker 版,但是功能不全,要换其他版本才行
jeessy/ddns-goDDNS,目前最顺手了
meosmemo/memos轻笔记,一个不错的随手记
p3terx/aria2-pro下载工具
vaultwarden/serverBitWarden 的自建服务,我所有密码都用这个保存。
zerotier/zerotier-synology异地组网

硬件选择

电源

Flex-350G

选择台达这电源算是没得选,因为之前想要台达1U 额定 350W 电源,但是到处都没货,然后发现加点儿就买到个全模组的,然后就选择了京东买全汉的 Flex-350G 了。全模组好处是方便,要的线接上,不要的就不接,省点儿空间,毕竟机箱小。但是的 4Pin 接口没防呆,全部都是 CPU 4Pin 接口,我还插错过…

硬盘

red plus

看过希捷和西数,发现希捷寿命相对没西数好而且一直装机都用西数就选西数,红盘要 CMR 就只有红盘 Plus 和 Pro,Plus 便宜一点。就先买个红盘 Plus先。后来我又买多了一个红盘 Plus,组的 Raid1。

主板

j4125

之前看的时候映泰还是只有 J4105,然后最近出了 J4125,那就用 J4125 咯。这块主板有坑的,主要就是没有前置 USB 3.0 接口,主板上的风扇接口是3针不能调速,内存最高支持 8G,插两条 8G 能识别,不过我后来买多条 16G 内存接上去,完全可以识别24G。还有就是,主板说明上说到,当 M.2 接口接有 SATA 协议的时候会禁用一个 SATA 口…也就是说,我加了 M.2 转 SATA 之后主板的 SATA 口只能用一个…

内存

内存呢,就没什么的,平时装机用带马甲的都是这条,就用这条咯。先是买了条8G,后来加一条 16G。

机箱

NAS 6

机箱最开始我是想要买个 3U 或者 2U 的热插拔机柜机箱的,毕竟布局起来方便,能塞进家里的 6U 机柜。后来看到拓普龙的机箱,又想用这类 NAS 机箱,不过拓普龙的机箱硬盘笼背板不好,机箱风扇也不行,买回来还要自己改,然后在 B 站逛就发现又款梵隆的机箱,做工可以,背板也不错。不过外观真的难看…但是这价格没得选,就用吧。这机箱有一个很大的优点点,支持全高 PCI-E。

我心目中最好的 NAS 机箱是宝藏盒。所有我想要的设计,宝藏盒都实现了!不过就是价格太贵了。

SATA 扩展卡

m.2 to sata

因为映泰J4125只有两个 SATA 接口,这肯定是不够用的,所以必须想办法扩展,而主板只有一个 PCI-E 槽,所以就要用 M.2 转 SATA,看了几款,这个时间段只有看到佳翼的这款 M.2 转 SATA 转接卡不错,有外壳,看评论兼容性都不错。这个扩展卡在黑群晖下顺序是反过来的,就是5号口是1,1号口是5…

U盘

随便一个质量好的 U 盘都可以,这个一直用开就直接用这个了。


结语

2022年 618 在京东上群晖的 DS920+ 曾经 3000+ 就能买到,硬件也一样,但是还是贵,我现在加上硬盘都比白裙便宜。心心念念的独立 NAS 现在终于完成了!家庭数据中心完成建立,手机照片直接备份上去,不用愁。


自建 NAS(理论篇)

By: Kaiyuan
17 January 2022 at 21:24

现在用一个 3865u 的工控机做 All in one 主机,装了 PVE 然后 OpenWRT 和黑群晖,一个 128G 固态,2T 机械盘,8G 内存。但是我还是得分开来,准备另外组一台低功耗 NAS。

主板

映泰 J4105

主板现在(2022年1月)只能找到映泰 J4105的ITX主板是有牌子的主板,2022年5月出了 映泰J4125N5095 和 J4125 是很多电子厂自己出的板。

映泰J4105是比较『正规』的主板,两条台式机 DDR4 内存槽,一个 PCI-E 槽,一个 M.2 接口(不是 NVME),两个 SATA 接口,一个千兆网口。但是没有前置 USB 3 接口,看评论风扇是 3pin 的。如果做 NAS 则需要用 M.2 转 SATA

N5095

N5095 主板找到一个电子厂出的,内存槽是单个笔记本内存槽,一个 M.2 NVME,一个 M.2 网卡槽,单网卡口,单 SATA 口,4个 USB3.0 接口。没有 PCI-E 槽,就是没法扩展万兆网卡了,虽然很长时间都不会用到。

M.2转SATA

机箱

2U box

NAS 机箱一定要支持热插拔硬盘的!这个必须的,就算更换硬盘的机会不会太多,但是当你需要更换硬盘的时候,热插拔的话就不需要关机,不需要拆机箱,这是很重要的事情!

我家里有个 6U 机柜,多以我是可以选择一个 2U 或者 3U 的短款机柜机箱的,也就是深度不能超过40cm。

2U 6位热插拔的机箱也找到。前面板还有两个 USB 2.0 两个 USB 3.0 的接口,支持 ATX 电源。这个很重要,因为小电源的风扇的噪音很大!半夜的时候会影响睡眠。我的机柜是装在二楼楼梯间的,我妈房价门口就在那,现在一个机柜风扇多多少少还是有噪音的,所以不能再增加噪音。

如果不是放机柜,怎要买个 NAS 机箱,凯晶的机箱还不错。

2022年还有一个梵隆推出的 NAS 机箱

梵隆NAS

多盘位热插拔,但是只支持小电源,担心噪音

硬盘

NAS 的硬盘我是想要用 8T 两个的,而且最好不要同一时间买同一品牌和同一型号的硬盘,因为同一批次的硬盘同时出现问题的几率还是有的,一不小心两个硬盘同时坏,就算组 RAID1 也没用。还有就是不能买 SMR 堆叠硬盘!这种硬盘不适合 NAS 这种长时间运行的机器使用!数据一不小心出错就惨了!

我打算买一个希捷ST8000VN004,一个西部数据WD80EFBX。这样同时出问题的几率就没那么大了。

内存

内存其实没什么,价格差不多的情况下就看主板支持多少频率了。笔记本内存槽的话没多少选择,金士顿 FURY 8G。如果是台式机内存,我现在电脑用的是海盗船的内存,用着OK就继续买这个。我还是不要贪便宜了,老老实实选。我很想上 16G 内存,问题是害怕主板不支持,毕竟主板写着最高 8G。

电源

机箱可以的情况下,我选择振华全模组铜牌 450W 电源。毕竟电源很重要!选择一个质量有保证而且价格合理的电源。

成品 NAS

群晖 NAS 一直都是我最想入手的,但是价格实在是难以接受, DS920+ 在打折时候也三千多接近4千,性能只能算过得去而已。

凯晶也有成品 NAS,价格比自组稍微低一点点,但是也不是太喜欢。不过如果不想太折腾的话还是不错的选择的。

另类方案

现在有不少小主机也是用低功耗 CPU 的,可以自己用小主机和硬盘架魔改 NAS 的。或者有旧的低功耗CPU笔记本的话也可以

小主机

beelink N5095

我看到有Beelink11代N5095迷你主机,M.2 接口在顶部,这样可以在顶部开孔接上 M.2 转 SATA,外接一个热插拔硬盘笼,但是这个硬盘笼就要你买个电源给硬盘笼供电。找到的电源还不知道稳不稳定…这才是重点。

总结

想要组一台 NAS 最好是买群晖,自己组的话,主板是最难找的,毕竟低功耗 CPU 都是焊在主板的,大厂不怎么出,能找到都是小厂自己出的。再有就是可以选择一些圈里口碑比较好的厂来买,有几个视频博主有买相关硬盘的,口碑还算可以,也可以选择。

其实我还是想等等看 12 代的英特尔有什么低功耗方案。之前想要 4700U 的主板,但是现在都没见有工厂出。

树莓派 Zero W 使用微雪电子墨水屏

By: Kaiyuan
7 March 2020 at 08:29

一直想有一个电子墨水屏作为桌面提示器,显示一些信息提示。没有现成的产品,那么就想自己做一个。

用树莓派 Zero W 外接微雪的三色电子墨水屏制作一个小型的桌面提示器。

直接买微雪 2.13 寸带驱动板三色显示屏,这款直接接上树莓派就可以用了。我买的树莓派 Zero W 没有排针,所以我还买了电烙铁给板子焊上排针。然后接上就屏幕驱动板就可以直接用了。


驱动安装

微雪官网的『RPI使用教程』就有显示屏的驱动和使用方式,照着说明安装就可以了。

驱动方式有 C 和 Python 两种,我不懂 C,只能用 Python,而且 Python 用起来比 C 方便很多。

我买这块显示屏型号是 EPD_2in13bc_test(),安装好驱动和库之后运行对应的文件。

sudo python3 ~/e-Paper/RaspberryPi\&JetsonNano/python/examples/epd_2in13bc_test.py

显示屏测试启动。怎么编程其实在这个文件里全部都给出来了,相当简单。


使用例子

我按着这个文件做了两个例子,一个是直接显示三色图案,一个是获取树莓派的信息再生成图片显示。你可以直接下载我的 Demo 文件然后放到 Python 文件夹对应的文件夹中。

~/e-Paper/RaspberryPi\&JetsonNano/python/

Python 的使用方式就是使用 Image 模块分别引用或者生成两个黑色和黄色两个图层图片再分别刷新。


图片显示

树莓派 Zero W 使用微雪电子墨水屏

想要显示图片的时候注意的是,图片需要拆分黑色通道和黄色通道各一张单色图片,而且刷新时候的逻辑是黑色通道先刷新,黄色通道后刷新,而黄色通道会覆盖黑色通道,所以你需要再黄色通道图片上镂空黑色通道的图案。也就是我文件里的 epd_2in13bc_imgs.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
import os
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
    sys.path.append(libdir)
import logging
from waveshare_epd import epd2in13bc
import time
from PIL import Image,ImageFont,ImageChops
import traceback
logging.basicConfig(level=logging.DEBUG)
try:
    logging.info("epd2in13_V2 Demo")
    epd = epd2in13bc.EPD()
    logging.info("init and Clear")
    # 初始化
    epd.init()
    # 清空屏幕
    epd.Clear()
    logging.info("1.Drawing on the image...")
    # 黑白图,先刷新
    HBlackimage = Image.open(os.path.join(picdir, 'gw_b.bmp'))
    # 黄色部分,后刷新,黄色会覆盖黑色
    HRYimage = Image.open(os.path.join(picdir, 'gw_y.bmp'))
    # 旋转180度,根据自己设备方向调整,90,180,270
    HBlackimage = HBlackimage.transpose(Image.ROTATE_180)
    HRYimage = HRYimage.transpose(Image.ROTATE_180)
    # def display(self, 黑白图像, 黄色图像)
    epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRYimage))
    # 休眠
    time.sleep(2)
        
except IOError as e:
    logging.info(e)
    
except KeyboardInterrupt:    
    logging.info("ctrl + c:")
    epd2in13bc.epdconfig.module_exit()
    exit()

而且两个通道图片的模式必须一样的,例如:我给的 Demo 图片就是两张图片都是灰度模式的就是只有黑白灰的颜色,没有彩色。而一般图片都是 RGB 模式的。

还有就是通过 Image 生成图片的时候也要根据你背景图的色彩模式设置,要不然就会报错了!


信息显示

动态生成黑色文字的时候就需要用运算的方式在黄色通道上删除黑色通道部分的内容了。 我的压缩包中的 epd_2in13bc_demo.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
import os
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
    sys.path.append(libdir)
import logging
from waveshare_epd import epd2in13bc
import time
from PIL import Image, ImageDraw, ImageFont, ImageChops
import traceback
# 获取时间
NowTime = time.strftime('%Y-%m-%d %H:%M:%S',  time.localtime(time.time()));
# 内网 IP
import socket
hostName = socket.gethostname()
def get_host_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip
# 外网 IP, sudo pip3 install requests
import json
import requests
wan_ip = requests.get('https://api.ipify.org/?format=json').json()['ip']
# 输出日志等级
logging.basicConfig(level=logging.DEBUG)
try:
    logging.info("1.read bmp file And Text")
    # 初始化
    epd = epd2in13bc.EPD()
    logging.info("init and Clear")
    epd.init()
    epd.Clear()
    # 载入字体,Zipx 这款字体 12/24/36/40 这几个字号能看,其他的都粗细不一
    # higher = ImageFont.truetype(os.path.join(picdir, 'higher_8.ttf'), 14)
    # zipx12 = ImageFont.truetype(os.path.join(picdir, 'zipx.ttf'), 12)
    # fz14 = ImageFont.truetype(os.path.join(picdir, 'FZXIANGSU14.otf'), 14)
    pxlxxlcond = ImageFont.truetype(os.path.join(picdir, 'pxlxxlcond.ttf'), 20)
    logging.info("1.Drawing on the image...")
    # 下层,黑白图,先刷新(白底黑字)
    HBlackimage = Image.new('1', (epd.height, epd.width), 255)  # 212*104 获取 epd 的尺寸
    drawblack = ImageDraw.Draw(HBlackimage)
    drawblack.text((12, 10), 'Host: '+hostName, font = pxlxxlcond)
    drawblack.text((12, 32), 'LAN: '+get_host_ip(), font = pxlxxlcond)
    drawblack.text((12, 54), 'WAN: '+wan_ip, font = pxlxxlcond)
    drawblack.text((12, 76), NowTime, font = pxlxxlcond)
    # 上层,黄色部分,后刷新,黄色会覆盖黑白色
    # 这个 bmp 图片必须是灰阶的,不能是 RGB 的!
    # 如果图片是 RGB 模式怎上面 Image.new('1' 改为 'RGB'
    HRYimage = Image.open(os.path.join(picdir, 'bg_boxks.bmp'))
    # 文字蒙版裁剪背景图,使用差值运算生成反色图像,然后 invert() 反色为想要的颜色。
    HRYimage = ImageChops.subtract_modulo(HBlackimage, HRYimage)
    HRYimage = ImageChops.invert(HRYimage)
    # 旋转180度,根据自己设备方向调整,90,180,270
    HBlackimage = HBlackimage.transpose(Image.ROTATE_180)
    HRYimage = HRYimage.transpose(Image.ROTATE_180)
    # 创建纯色图像,如果你想全屏幕显示黄色就用纯黑色图像代替 HRYimage
    # 如果只想显示黑白,不显示黄色就用纯白色图像代替 HRYimage
    # Whiteimage = Image.new('1', (epd.height, epd.width), 255)
    # Blackimage = Image.new('1', (epd.height, epd.width), 0)
    
    # def display(self, 黑白图像, 黄色图像)
    epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRYimage))
    # 休眠
    time.sleep(2)
        
except IOError as e:
    logging.info(e)
    
except KeyboardInterrupt:    
    logging.info("ctrl + c:")
    epd2in13bc.epdconfig.module_exit()
    exit()

照着上面的代码修改基本就可以了,然后可以设置成开机启动,每次开机都会显示 IP 信息了。

后面我会在研究更实用的例子。


使用群晖唤醒局域网内其他设备

By: Kaiyuan
20 February 2020 at 00:18

之前我写了一篇用树莓派唤醒内网设备的文章,现在再写一篇通过群晖唤醒内网设备的。当然还是要你稍微了解 Linux 系统才可以。用的代码和之前文章的一样。

代码目录

首先在群晖套件中心安装 Web Station 和 Node.js v8(v12 的 npm 安装会提示 zlip 有问题的)。通常 Node.js 会在你安装某些应用时候就会装上的,如果没有装你需要先安装一下。

安装好之后打开 File Station 左边的列表应该就会出现一个 Web 文件夹,在文件夹里建一个 node 文件夹作为存放相关代码文件用,并且在 node 文件夹中再新建一个 logs 文件夹存放日志用。

群晖 Web Station 目录

然后修改一下之前树莓派文章的代码,主要是 pm2_config.json 文件改为绝对路径。一般 Web 文件夹绝对路径是 /volume1/web/,其中 volume1 是储存池的目录,如果你装了多个硬盘或者组阵列的话就需要你自己在终端查一下你 Web 文件夹的目录了。

{
    "apps" : [{
        "name"        : "nodewol",
        "script"      : "/volume1/web/node/index.js",
        "cwd"		 :	"/volume1/web/node/",
	"instances"  : "1",
	"log_date_format"  : "YYYY-MM-DD HH:mm Z",
	"log_file"   : "/volume1/web/node/log/wol.log",
	"error_file" : "/volume1/web/node/log/wol-err.log",
	"out_file"   : "/volume1/web/node/log/wol-out.log",
        "watch"      : true
    }]
}

群晖唤醒方式

群晖上不能安装 waleonlan,所以我们需要使用 nodejs 的 wol 包来实现唤醒设备。

/**
 * Post请求执行 shell 命令
 * 只要向这个地址提交 {"mac":"设备 MAC 地址"}
 * kaiyuan Hsie
 * https://boxks.com
 * */

//1. 导入express
var express = require('express');
// 解析器 需要安装 npm install -g body-parser
var bodyParser = require('body-parser');

// WOL 包 npm install wol
var wolfun = require('wol');

// 时间模块
var sd = require('silly-datetime');
var nowTime=sd.format(new Date(), 'YYYY-MM-DD HH:mm:ss');

// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false });

// 创建服务器
var router = express.Router();

router.post("*", urlencodedParser, function (request, response) {
	//
	if (!request.body) {
		response.send("请提交设备 MAC 地址");
	} else {
		var thisMAC = request.body.mac;
		wolfun.wake(thisMAC, function(error, postText){
			if (error !== null) {
				console.log('-wol- exec error: ' + error+' '+nowTime);
				response.send('exec error: ' +error);
			} else {
				console.log("-wol- "+thisMAC+' '+postText+' '+nowTime);
				response.send('已经叫咗电脑开机!');
			}
		});
		  
	}
});

module.exports = router;

安装 PM2

开启群晖 SSH

在群晖控制面板的「终端机和 SNMP」中勾选「打开 SSH」然后应用。

接着打开你电脑上的终端,Windows 上按 Win+R 然后输入 CMD,或者在开始菜单按钮上右键,选择打开 CMD。

终端 SSH 连接

打开只会输入 ssh user@192.168.2.117 这样的命令,其中 192.168.2.117 替换为你群晖的 IP。通常在群晖页面右下角的系统状况可以看到。而 user 替换为你群晖的账号名。然后会提示你输入密码,这个时候你输入任何内容都不会显示出来的,你不用管,直接输入密码只会按 Enter 就好了。

如果你 nodejs 默认是 v12,则先输入 nvm set 8.9.4 切换回 v8 才能正常使用 npm!

然后安装 PM2

npm install pm2 -g

等待安装好只会会直接显示 pm2 的路径的,注意记下来,因为后面我们要用绝对路径来运行 pm2 的。这个路径一般都是在 Node.js 目录下面。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2
or
/volume1/@appstore/Node.js_v8/usr/local/lib/node_modules/pm2/bin/pm2

你可以测试一下运行上传的代码。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 start /volume1/web/node/pm2_config.json

如果没有提示红色错误,直接显示表格运行状态的话就 OK 了。然后现在关掉这个测试。因为我们要用群晖的任务计划让他开机自动启动。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 stop /volume1/web/node/pm2_config.json

设置开机启动

打开群晖的控制面板,选择任务计划,新增>触发的任务>用户定义的脚本。

设置群晖开启启动命令

任务名称随便你填写一个,用户账号选择 root。然后在任务设置页面「用户定义的脚本」上面测试的那段代码,然后按确定。

设置群晖开机启动命令

保存好只会记得勾选刚新建的项目前面的勾,然后右键>运行。这样就完成了。

设置反向代理

在控制面板中的「应用程序门户」里面的「反响代理服务」新增一项。

设置群晖反向代理

描述随便填,协议选择 Https,端口就是你想用来访问的端口,例如 10505(填5位数可以防止和常用端口冲突),勾选「启动 HTTP/2」,下面的「目的地」就是填 node.js 应用的信息,地址就是 127.0.0.1,端口就是应用的端口 5050。然后确定。

这样就可以把 mac 地址通过 post 发给 https://192.168.2.117:10505/wol 这个地址来唤醒局域网内的设备了。

至于 https 证书问题,如果你用群晖的 DDNS 就不需要额外操作,如果你是用自己的域名就需要用 acme 申请Let’s Encrypt证书了。

当然你要在外网访问还要在路由器上设置端口映射。我之前的文章有写,这这里就不重复了。


❌
❌