从小白到入门-自建服务器部署家庭应用

由于多数家庭有淘汰的旧电脑或是土豪会购置各种小体积“软路由”,本着变废为宝,一机多用的绿色生活。此贴用来介绍以debian为基础,部署各种开源程序以实现安全,快捷,强大的服务端。

从小白到入门-自建服务器部署家庭应用
Photo by Lukas / Unsplash

包含以下:

  1. 科学网关
  2. 文件共享
  3. 离线下载
  4. 远程监控
  5. NAS管理
  6. 个人网盘
  7. 聊天服务器... 甚至网站、图床、编译openwrt 等

本文的目的在于不花一分钱购买硬件设备的前提下理解以下内容:

  • 公益,保护个人隐私,具体可以参看2014年发起的非营利网站及其创始人的TED演讲。本贴就是将公益实践的一个过程,即去windows和群晖等商业性方案开始,采用全开源方案。开源方案越来越被推广的原因是符合人类未来需求,微软虽然是商业公司在github上开源贡献也最多。
  • 简化,硬件区对于此类的需求有很多虚拟化(exsi hyperv),ROS,群晖等方案,甚至很多在windows上部署。这些在我看来显然是因为对linux不熟悉而舍近求远,费力劳神搞的方案。以每个人都知道的ss为例,简述原因:
    a). linux一般是软件诞生平台。因为所有的开源软件都可以根据源代码自行编译的,而编译这个过程大多是在linux下完成的,也就是说第一版软件会发布在linux上,其他的win exe及IOS app等都是交叉编译或二次开发的。虽说win也能构建编译环境,但是这不是程序员常规的开发平台。
    b). 对软件直接调用。linux主要以命令行完成操作,图形界面可有可无,但windows是全图形化界面,这是两者重要区别。因此像ss有个配置文件,在linux上用写入后再用命令行运行,是直接调用,整个过程无中间环节。而通过路由器的luci图形界面或者win上软件的图形界面则是间接调用,等于是在内核上套个壳,如果不开源你不知道他会不会有后门。
    c). 在理解安装和编译linux软件后,你开始理解什么叫返璞归真,和那些能在windows也能运行的方案相比。在性能,鲁棒性,可持续性,易用性及隐私保护等方面有多大的优势。
  • 认知,对于在CHH,koolshare,群晖,恩山上所讨论的很多需求都是需要大神给出固件或者教程,没了固件你就歇菜,提升认知后我们可以跳过这个步骤,一切不求于人。
    a). 即学会使用github,全世界的第一手代码都在这个网站,使用linux就相当于学会使用了github,所有需求你都可以自助了。
    b). 当你学会使用linux和github以后,你不再是用户,你也成为了半个开发者,你可以逐步理解这些软件工作的原理,进行更定制化的优化使用 (比如v2ray解决DNS污染问题)。
    c). 当你对linux使用时间长了以后,你越理解为什么它适合做服务系统,感受到他的简单快捷,越体验到windows为何在服务器领域远不如桌面来的受欢迎。
  • 节能,在路由器上差个U盘部署一些24小时运行的软件,其实就是为了节能的一种表现,但很多服务路由器不堪胜任。
    linux是可以运行在非常简化的设备上的,比如树莓派之类的开发板,N1这类电视盒等等,他们可以24小时开机,满足大部分人的个人或者需求,每年为你省不少电费。
    x86有历史包袱,要兼容之前构架,在追逐高性能的道路上无法和arm比节能的。很多人可能不知道大多数云服务器(aws 阿里云)是512M内存,1CPU 15%的可用起步的,但是还是有很多人购买并使用。linux就能做到在这种低配机器上可靠运行,而debian/centos两大免费服务器系统就是跨平台的,arm设备以后会越来越多,所以这也是为什么微软也要做arm的windows,死活不放弃的原因
  • 软件,我们的需求永远是软件,软件优先于硬件,硬件只是软件运行的平台
    整个教程的过程中,大家会逐步理解这一点。CHH很多人也许会在乎硬件性能,但随着使用服务器一段时间,大家就会知道树莓派都可能是硬件性能过剩的服务器,因为就你一个人或者家庭成员的少数人访问,基本不存在大量并发需求。
Part 1 前言

Q: 为什么要学“服务器部署”?什么是“服务器部署”
A: 因为要个性化服务,只有自己动手才能丰衣足食。所谓“服务器部署”就是使用Linux CLI(command in line)安装服务端的软件和调试,对应的是windows GUI下鼠标点exe装客户端的软件和设置

Q: 学“服务器部署”会不会比较没性价比?应用面狭窄,学习曲线过抖等?
A: 看你需求,如果你真的有以上方面个性化需求,学个入门绝对不亏。从win95到win10的20年你肯定会觉得变化很大,毕竟控制面板都大变。然而20年过去了,linux的安装命令还是apt/yum install xxx,远程控制还是通过ssh,修改配置还是通过vim,基本没变。过去如此,未来还会是如此。如果你需要的个人服务越多,你的“linux全方位认知”越有用。我会从最简单的部署开始,从实践逐步了解linux

Q: 你怎么能保证这些软件不会过时或者可以长期使用?
A: 因为专用(闭源)方案长期来看比不上通用(开源)方案有生命力,专用方案像windwos Mac这种获得巨大成功的,需要大量资金,而开源就是指一代一代传承和贡献,不断有人维护。群晖就是典型的专用方案,它除了提供集成度较高的硬件和漂亮的硬盘位,还提供了亲和的软件界面,甚至web服务,然而如果公司倒闭就没人维护了。而开源软件即便像clowwindy把源码删了,后来者在fork后依旧会使软件得到更新。

Q: 你为什么不提供windows的客户端软件?这样更方便大家使用。
A: 因为没有,几乎所有Github上服务器的客户端都部署在linux上,这对于开发者和使用者都是开源免费,而linux作为操作系统本身开源。所以这就是为什么服务器市场windows份额极低的原因。然而各位可能不知道win10大量的新feature比如wsl,powershell,hyper-v二代甚至vs code等,都是为了拥有linux等同的功能,提供更好支持,拉拢开发者。

Q: 为什么是debian?不是centos?或者是其他linux发行版本
A: 很多人linux都是从ubuntu入手,而debian和ubuntu没啥太大区别,命令一样,较易学习。debian相比centos占用内存更小,而且国外社区支持了更多,所以有树莓派的raspbian和各种电视盒的armbian(debian for arm)的诞生。这样硬件方面可以照顾N1和树莓派用户,让你的arm设备也能当服务器,软件方面一大优势是独占openmediavault(后文会提到的NAS系统),另一方面仓库的软件源也更新些,这样对新人更友善。centos我一般部署在云服务器上,毕竟他一个版本的维护周期是十年(现在是centos7第五年和centos8元年),软件旧就旧了,服务器稳定第一,比如centos7上的默认python2已经于2020年1月1日停止维护,默认的数据库sqlite软件源停留在3.7(2013年)已经不被某些软件所支持了。

Q: All in one的方案会不会不稳?一个服务崩了其他全崩?
A: 要看你是如何部署,如何维护。由于现在有docker的出现,它作为linux上的虚拟机,现在是一种很流行的方案去隔离各种软件,一行命令把所有软件全装完。一方面方便快捷,一方面崩溃了不影响系统。他的原理和安卓上的app雷同,运行在java虚拟机上。部当然有的人不喜欢docker,喜欢用自己部署的系统环境。其实最重要的还是备份,linux自带dd命令可以全盘复制(ghost)。

Q: 你好像没怎么提到虚拟化技术,很流行的esxi装多个系统不好么?
A: 这个需要根据每个人的需求决定,看你要在虚拟机上运行什么。首先,除了迅雷和QQ,我想不太到win作为server的意义。其次,openwrt作为一个虚拟机上的系统在linux下可以用docker安装并运行,而debian安装v2ray配合iptables规则也可以当网关。最后像freenas这种管理zfs的系统在debian上安装OVM后一样可以建立zfs存储池。因此大部分情况下是无需虚拟方案的。这除了降低机器性能和复杂化以外没什么好处。
在IDC领域最流行的虚拟化技术是KVM,主要是开源和免费,其用途是母鸡生小鸡,出售资源用。在个人家庭,你拥有服务器的所有资源,因此没有这种目的。其他IDC还用的虚拟化技术有Xen(AWS),OVZ(早期非独立虚拟化)和hyper-v(Azure),esxi是vmware给某些企业特殊用途的方案,十分小众。