0%

准备工作

树莓派需要连接摄像头
烧写镜像后启动
记得将/etc/apt/sources.list文件中
默认的源地址http://raspbian.raspberrypi.org/
替换为http://mirrors.ustc.edu.cn/raspbian/
raspi-config上开启shh和摄像头,同时登陆WiFi

安装motion

1
$ sudo apt-get install motion

基本配置

添加守护进程

1
$ sudo nano /etc/default/motion

修改如下

1
start_motion_daemon=yes

使其允许外部访问

1
$ sudo nano /etc/motion/motion.conf

修改如下

1
stream_localhost off

启动服务:

1
$ sudo service motion start

浏览器访问http://xxx.xxx.xxx.xxx:8081
看到输出画面即为正常

优化

会有一些卡顿的情况,需要进一步调整

1
$ sudo nano /etc/motion/motion.conf

修改如下

1
2
3
4
5
6
7
daemon on
framerate 30
ffmpeg_variable_bitrate 2
stream_maxrate 30
stream_quality 100
output_pictures off
ffmpeg_output_movies off

重新启动之后,画面会流畅很多

添加到群晖

在群晖的套件中心安装Surveillance Station并激活
添加网络摄像头
品牌选择用户自定义
类型选择串流-HTTP
路径输入xxx.xxx.xxx.xxx:8081
测试成功之后,此设备就可以作为监控摄像头使用,视频会自动存储在NAS上

缘由

差不多是两年前看到了一段视频,非常吸引我
(Setting Up) NO filter, NO CO2, NO Ferts 5 Gallon Nano Tank
很想挖这个坑,但直到今天才开始着手,我会在这里记录我的操作

器材准备

  • 超白玻鱼缸1个(400mm宽/230mm深/250mm高,厚度4.8mm)
  • 照明灯1盏(9W,390mm-540mm可调长度,灯珠5730,灯珠数36颗,蓝白光)
  • 温度计(吸盘式,115mm长,范围0℃~40℃,误差±1℃)
  • 黄沙(7kg,颗粒直径2mm~5mm)
  • 种植土(6L,美乐棵通用性营养土)

操作记录

2020年2月27日

晚上收到了快递,把缸体清洗干净,放在了进门的柜子上

准备工作

DNS服务器

在域名的DNS管理页添加如下记录

Type Name Value
A mail xxx.xxx.xxx.xxx
MX @ mail.xxx.com

公网服务器防火墙

首先查看防火墙端口状态

1
$ sudo ufw status

然后开放如下端口

名称 协议 端口号
SMTP TCP 25
IMAP TCP 143
POP3 TCP 110
SMTP-SSL TCP 465
SMTP-TLS TCP 587
通过 SSL/TLS 的 IMAP TCP 993
通过 SSL/TLS 的 POP3 TCP 995
1
$ sudo ufw allow 端口号

frp

在公网服务器frps的配置文件frps.ini添加

1
2
[common]
subdomain_host = xxx.com

在家里的软路由frpc内添加添加对应的远程端口和TCP协议
内容与上面的防火墙设置一样
此外添加二级域名的代理

1
2
3
4
[mail]
type = http
local_port = 80
subdomain = mail

Nginx

邮件的Web客户端也需要用80端口,但由于公网服务器上Nginx已经占用了80端口
所以我们修改Nginx配置,在二级域名mail上让nginx转发80流量到frp的8080端口
添加frp.conf,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 80;
server_name mail.xxx.com;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}
server {
listen 443 ssl;
server_name mail.xxx.com;

# ssl on;
ssl_certificate /etc/letsencrypt/live/mail.xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mail.xxx.com/privkey.pem;
ssl_prefer_server_ciphers on;
ssl_session_timeout 60m;

location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}

邮件服务器安装

群晖套件中心安装Mail Server
启用SMTP,填写主机名xxx.com
启用SMTP-SSL,启用SMTP-TLS

测试使用

群晖套件中心安装Mail Station
访问地址为http://mail.xxx.com/mail
使用其他邮箱互发邮件
It Works!

使用群晖MailPlus套件

此软件免费授权只有5个帐号
胜在Web端UI精致,还有APP供选择
改用此套件,服务器端设置基本相同
需要注意的是

DSM设置

Web客户端访问地址需要打开
控制面板中打开应用程序门户
选择MailPlus,启用自定义别名mail,就可以通过如下地址直接访问
https://xxx.xxx.xxx.xxx/mail

frpc修改

修改二级域名mail的参数

1
2
3
4
[mail]
type = http
local_port = 5000
subdomain = mail

Nginx

mail.xxx.com的地址重定向到mail.xxx.com/mail便于访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
server {

listen 80;
server_name mail.hack42.com;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}


}
server {
listen 443 ssl;
server_name mail.hack42.com;

if ($host = 'mail.hack42.com' ) {
rewrite ^/(.*)$ http://mail.hack42.com/mail;
}
# ssl on;
ssl_certificate /etc/letsencrypt/live/mail.hack42.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mail.hack42.com/privkey.pem; # managed by Certbot
ssl_prefer_server_ciphers on;
ssl_session_timeout 60m;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}

此外,记得签发二级域名的证书

访问地址为http://mail.xxx.com/
It Works!

经常需要开放Docker或是虚拟机部署的服务到互联网
就会用到内网穿透的反向代理

注意事项

  • 客户端与服务器端版本号对齐
  • 启动时注意权限

以minetest为例

服务器端

下载并解压
https://github.com/fatedier/frp/releases
编辑配置文件frps.ini

1
2
3
4
5
6
7
8
9
[common]
bind_port = 7000
vhost_http_port = 8080
vhost_https_port = 8081
token = r6aJRnN8cGyYMmb7A

dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password
  • token需要和客户端匹配
    启动服务
    1
    $ sudo ./frps -c frps.ini
    客户端

客户端我用的是OpenWrt软件库里的frpc
是web界面的配置方法,其实也就是配置了frpc.ini
全局设置

  • 服务器地址
  • 服务器端口7000
  • 令牌r6aJRnN8cGyYMmb7A
    因为minetest是使用本地30000端口进行udp通讯的
    所以frpc上添加了一项服务
  • 服务名称minetest
  • 服务协议udp
  • 远程端口 30000
  • 内网主机192.168.1.110
  • 内网主机端口30000

frpc.ini近似配置文件

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 服务器地址
server_port = 7000
token = r6aJRnN8cGyYMmb7A

[minetest]
type = udp
local_ip = 192.168.1.110
local_port = 30000
remote_port = 30000

工作状态也可以通过服务器的7500端口查看dashboard确认

硬件选择工作

NAS选择

选择群晖主要是为了易用和稳定,毕竟是用来备份资料的设备
个人认为群晖适合家用的两个型号:两盘位的DS218+和四盘位的DS918+
plus系列最大特点是支持Docker,这个很重要
需要体积小巧就选前者,需要海量存储就选择后者
我购买的是DS218+

加装内存

为了更好地使用Docker,务必选择加装内存,当然过大也没啥用
注意是低电压版本的DDR3L 1866的内存
我购买的是8GB容量

硬盘选择

硬盘有NAS专用盘
容量方面可以参考单位容量单价比较
即用该硬盘总价/硬盘容量
可以做出性价比不错的选择
我购买的是希捷的4TB*2

UPS选择

虽然有各类保护,但突然掉电对硬盘还是有一定影响
购买UPS可以避免这一点
小型的UPS不占地方,大约能提供几十分钟的电力支援
我购买的是APC施耐德BK650-CH(400W/650VA)

其他设备

  • 配合电视机,可以购买支持DLNA播放的视频盒子,Apple TV、小米盒子或者Raspberry Pi刷了OSMC都可以
  • 尽管群晖也可以来做软路由,我还是倾向于有一块OpenWrt无线路由,ASUS RT-AC88U之类
  • 可以买99元的花生棒做内网穿透,便于更灵活的使用
  • 防尘问题可以将机器拆开,在风扇处加装防尘网,并把风扇反置

软件选择

照片备份

套件中心中启用Moments,手机上安装Moments APP
家中每人可以用各自的帐号备份自己设备的照片
同时将部分照片共享出来,建立共享照片库

影音下载

在Docker中注册表搜索oldiy/rrshare64
把映像建立容器,配置下载路径后即可使用
它提供海量的人人影视翻译的视频下载,不用到处找资源

媒体中心

套件中心中启用Plex Media Server
下载后的视频移动到对应目录就可以自动扫描出影片信息
注意放置的位置
电影
/Media/Movies/Apollo.11/Apollo.11.mp4
电视剧
/Media/TV Shows/Better.Call.Saul/Season 01/Better.Call.Saul.S01E01.mp4
移动端推荐使用Plex APP或是VLC APP
电视机连接媒体盒子后,可以直接搜索出DLNA设备播放

Docker

在Docker Hub海量资源有很多可以探索的
我使用linuxserver/minetest搭建了minetest游戏服务器
配合路由上的frps做内网穿透,让我社区的朋友可以一起游玩
因为负载不大,所以还算流畅

Virtual Machine Manager

Virtual Machine Manager可以创建需要的虚拟机
我在上面建立过魔兽世界3.3.5版本的TrinityCore服务器,但是在线三个人就开始卡顿
如果服务器性能再强一些,支持五人在线游戏就不错

同步与备份

安装Synology Drive的客户端来同步PC上的文件到服务器
使用Snapshot Replication来建立备份快照
如果你有两台群晖,或者花了300元买到了星际蜗牛
你还可以运行Hyper Backup做异地备份,充分保护你的数据安全

准备工作

安装nodejs和hexo

1
2
$ sudo apt-get install nodejs
$ sudo npm install -g hexo-cli

其他就是配置github帐号等等

初始化

1
$ hexo init

如果是是用新的电脑写作,记得保存如下文件/文件夹

  • _config.yml
  • source
  • themes

修改配置文档

网站的配置文档在/_config.yml
主题的配置文件在/themes/_config.yml
文件内都有详细的修改说明
如果需要在文章内配图,可以修改网站配置文档的post_asset_folder参数
这样可以在source/_posts内随文章建立同名的文件夹
文章内可直接引用链接地址“文章名/文件名”

使用

文章写作时注意Markdown语法
新建文章

1
$ hexo new ‘文章名’

生成静态文件

1
$ hexo g

本地预览

1
$ hexo s

更新部署

1
$ hexo d

部署实例

需要注意的地方有

  • 创建后测试服务器ip,注意是否屏蔽、延迟及丢包率
  • 以上三项达不到要求就重新部署新的服务器
  • 创建新的之后再销毁旧的,否则有可能获得相同的ip

创建用户

我使用的是Ubuntu18.04,后台提供了root密码
putty登陆后,先创建用户

1
# adduser username

然后添加权限

1
# nano /etc/sudoers

增加一行

1
username ALL=(ALL:ALL) ALL

绑定域名

方便起见,可以在Godaddy上买个域名
在域名的DNS设置页面将A记录指向服务器ip

添加证书

使用certbot申请let’s encrypt证书

1
2
$ sudo apt-get install certbot python-certbot-nginx
$ sudo certbot --nginx

证书到期后续约

1
$ sudo certbot renew –dry-run

编辑nginx配置,将http重定向到https

1
$ sudo nano /etc/nginx/conf.d/http.conf

内容如下

1
2
3
4
5
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}

https相关配置

1
$ sudo nano /etc/nginx/conf.d/https.conf
1
2
3
4
5
6
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;
}

重启nginx即可

1
$ sudo server nginx restart

CDN加速

  1. 在Cloudflare注册并添加域名
  2. 在Godaddy上修改Nameservers
  3. 开启Always use HTTPS
    至此,测试网站的延迟从100ms左右下降到了60ms左右

It worked!

安装pip

1
$sudo apt-get install python3-pip

安装虚拟机环境

1
$sudo apt-get install virtualenv

创建虚拟机环境并启动

1
2
$virtualenv VENV
$source VENV/bin/activate

安装Django

1
(VENV)$pip install django

新建一个项目

1
(VENV)$django-admin startproject iot

进入项目并修改配置文件

1
2
(VENV)$cd iot
(VENV)$nano iot/settings.py

添加允许访问位置和修改时区设置

1
2
ALLOWED_HOSTS = ["192.168.1.128","localhost"]
TIME_ZONE = 'Asia/Shanghai'

测试运行

1
(VENV)$python manage.py runserver localhost:8000

定时任务

修改配置文件setting.py
INSTALLED_APPS中加入
django_crontab
文件中加入

1
2
3
4
5
6
7
8
9
10
CRONJOBS = [
('*/1 * * * *', 'power.cron.poweron', '>>/tmp/job.log'),
]
{% endcodeblock %}
在power目录下创建cron.py文件
{% codeblock %}
from .models import Power

def poweron():
#here

任务加载
python manage.py crontab add
移除所有的任务
python manage.py crontab remove
修改后再次运行
python manage.py crontab add
查看当前运行中的任务
python manage.py crontab show

编译内核

获取Kernel

1
$git clone --depth=1 https://github.com/raspberrypi/linux

获取交叉编译工具

1
$sudo apt-get install gcc-arm-linux-gnueabihf

进入目录设定编译选项

1
2
$cd linux
$make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

参数bcm2709_defconfig是Raspberry Pi2/3代,1代使用bcmrpi_defconfig
j4是使用4核心来编译,建议改为核心数的1.5倍
然后开始编译

1
$make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

编译需要一段时间
完成之后插入烧写好raspbian系统的TF卡,安装modules

1
$sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/dan/7f593562-9f68-4bb9-a7c9-2b70ad620873/ modules_install

INSTALL_MOD_PATH后面的路径改为本机路径
可以选择覆盖掉原来的Kernel或者放置多个kernel以便切换
然后拷贝KernelDevice Tree blobs到TF卡

1
2
3
4
$sudo cp arch/arm/boot/zImage /media/dan/boot/kernel-new.img
$sudo cp arch/arm/boot/dts/*.dtb /media/dan/boot/
$sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/dan/boot/overlays/
$sudo cp arch/arm/boot/dts/overlays/README /media/dan/boot/overlays/

如果没有覆盖Kernel的话,还需要编辑/boot/config.txt加上

1
kernel=kernel-new.img

编译就完成了

更换logo和启动画面

安装图形工具netpbm

1
$sudo apt-get install -y netpbm

准备一张63×80像素用于替换的logo.jpg
然后生成logo_linux_clut224.ppm

1
2
3
4
$cd ~/linux/drivers/video/logo
$jpegtopnm logo.jpg >logo.ppm
$ppmquant 224 logo.ppm >logo_224.tmp
$pnmnoraw logo_224.tmp > logo_linux_clut224.ppm

在交叉编译之前,确保开机logo是224色设置

1
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

位置在

  1. Device Drivers —>
  2. Graphics support —>
  3. [*] Bootup logo —>
  4. — Bootup logo
    [ ] Standard black and white Linux logo
    [ ] Standard 16-color Linux logo
    [*] Standard 224-color Linux logo

后续开始编译,步骤同上

启动画面

安装看图工具fbi

1
$sudo apt-get install fbi

拷贝图片并保存到/etc/splash.jpg
在TF卡的/etc/init.d/下创建新脚本asplashscreen

1
$sudo nano /etc/init.d/asplashscreen

内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#! /bin/sh
### BEGIN INIT INFO
# Provides: asplashscreen
# Required-Start:
# Required-Stop:
# Should-Start:
# Default-Start: S
# Default-Stop:
# Short-Description: Show custom splashscreen
# Description: Show custom splashscreen
### END INIT INFO


do_start () {

/usr/bin/fbi -T 1 -noverbose -a /etc/splash.jpg
exit 0
}

case "$1" in
start|"")
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
# No-op
;;
status)
exit 0
;;
*)
echo "Usage: asplashscreen [start|stop]" >&2
exit 3
;;
esac

:

保存之后,设置文件执行属性

1
$sudo chmod a+x /etc/init.d/asplashscreen

最后将脚本加入服务

1
$sudo insserv /etc/init.d/asplashscreen

结束

屏蔽开机信息

打开/boot/cmdline.txt
修改console=tty1console=tty3
结尾增改为

1
logo.nologo loglevel=3 vt.global_cursor_default=0