T.JOHN 发表于 2020-3-11 23:12

从小白到入门-自建服务器部署家庭应用之各种教程-长期更新

本帖最后由 T.JOHN 于 2020-6-13 19:09 编辑


由于多数家庭有淘汰的旧电脑或是土豪会购置各种小体积“软路由”,本着变废为宝,一机多用的绿色生活。此贴用来介绍以debian为基础,部署各种开源程序以实现安全,快捷,强大的服务端。包含0.科学网关1.文件共享 2.离线下载 3.远程监控 4.NAS管理 5.个人网盘 6.聊天服务器... 甚至 网站 图床 编译openwrt 等
本文的目的在于不花一分钱购买硬件设备的前提下理解以下内容:
1.公益。保护个人隐私。具体可以参看2014年发起的非营利网站及其创始人的TED演讲
本贴就是将公益实践的一个过程,即去windows和群晖等商业性方案开始,采用全开源方案。开源方案越来越被推广的原因是符合人类未来需求,微软虽然是商业公司在github上开源贡献也最多
2.简化。硬件区对于此类的需求有很多虚拟化(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也能运行的方案相比。在性能,鲁棒性,可持续性,易用性及隐私保护等方面有多大的优势
3.认知。对于在CHH,koolshare,群晖,恩山上所讨论的很多需求都是需要大神给出固件或者教程,没了固件你就歇菜,提升认知后我们可以跳过这个步骤,一切不求于人
a). 即学会使用github,全世界的第一手代码都在这个网站,使用linux就相当于学会使用了github,所有需求你都可以自助了
b). 当你学会使用linux和github以后,你不再是用户,你也成为了半个开发者,你可以逐步理解这些软件工作的原理,进行更定制化的优化使用 (比如v2ray解决DNS污染问题)
c). 当你对linux使用时间长了以后,你越理解为什么它适合做服务系统,感受到他的简单快捷,越体验到windows为何在服务器领域远不如桌面来的受欢迎
4.节能。在路由器上差个U盘部署一些24小时运行的软件,其实就是为了节能的一种表现,但很多服务路由器不堪胜任
linux是可以运行在非常简化的设备上的,比如树莓派之类的开发板,N1这类电视盒等等,他们可以24小时开机,满足大部分人的个人或者需求,每年为你省不少电费。
x86有历史包袱,要兼容之前构架,在追逐高性能的道路上无法和arm比节能的。很多人可能不知道大多数云服务器(aws 阿里云)是512M内存,1CPU 15%的可用起步的,但是还是有很多人购买并使用。linux就能做到在这种低配机器上可靠运行,而debian/centos两大免费服务器系统就是跨平台的,arm设备以后会越来越多,所以这也是为什么微软也要做arm的windows,死活不放弃的原因
5. 软件。我们的需求永远是软件,软件优先于硬件,硬件只是软件运行的平台
整个教程的过程中,大家会逐步理解这一点。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给某些企业特殊用途的方案,十分小众。
Part 2 安装Debian系统

废话说完,我们进入试毒(练习)阶段,使用hyper-v安装Debian10。如果你觉得毒性太强,不适应,删了就可以立刻解毒,毫不影响你的原系统。Hyper-v对于linux GUI支持了不友善,但是系统和内核还是很不错的。
注意:这里使用虚拟机的原因是大多数人都使用win10,而没用过linux,一旦在机器上裸装linux,你可能连浏览器都没有。为了方便学习,使用hyper-v这个win10自带的虚拟机熟悉linux比较合适,当你学会以后,就不需要虚拟机了,直接在设备上裸安装linux即可。
这里长远来看目前的arm设备已经可以完美运行linux了,也就是树莓派设备等。他们功耗比win更低,性能完全堪用,扩展接口也不错,如果要求不高,是理想的个人服务器
参照:微软官方文档
1. Powershell打开hyper-v,重启
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
2. 下载debian10最小镜像,见官网,选AMD64即可
3. 使用快速创建,然后进入debian的GUI安装
a.) 你可以选择一个桌面体验下,比如KDE or Gnome甚至Xfce,进入系统后输入startx(本贴教程不需要GUI)
b.) 如果你的路由全局富强,可以用官方源,否则改选国内镜像源。记住你自己设置的root密码,之后登陆要用
4. 装完以后设置分配的内存的CPU,分多少看你喜好。请勿使用动态内存,最新版win10会内存泄漏,选择固定内存即可。网络设置如下:
a) 在hyperv管理器右侧“虚拟交换机管理器”->“外部”->“创建虚拟网络”->“应用”
b) 然后点击下部虚拟机名字页面的“设置”->“网络适配器”->“虚拟交换机”,同时开启“高级功能”里的“启用MAC地址欺骗”你的虚拟机会有个独立ip,方便之后ssh操作
以上安装完成
Part 3 软路由篇
零. 科学上网——网关(软路由)篇
之前已经发过N1的,去掉刷机部分完全一样,就不再重复了,参见传送门
1. 由于虚拟机上安装的debian默认DNS文件是空值,可能上不了网,你可以如下手动添加dns
vi /etc/resolv.conf #使用vim编辑文档
nameserver 114.114.114.114 #点击o或者i进入编辑模式,添加dns
2. 虚拟机在关机后会导致时间不同步,以至于v2ray无法正常连接网络,每次开机都需要进行重新同步
apt install ntpdate #安装ntpdate这个同步时间的命令
ntpdate time1.aliyun.com #使用阿里云的服务器同步时间


注:白话文教程在19年10月利用19年2月的DNS黑科技一文完成了透明代理Tproxy+v2ray内置dns的教程,这一部分非常优秀,仅用一个软件提供了比chinadns,adgaurd更优秀的隐私保护+访问速度,大致重点如下:
1.使用v2ray劫持udp DNS查询,使用内置DNS服务,与系统和本地DNS完全分离
2.国内外网站分两个DNS解析,这样不会让国内网站返回境外的CDN,使你开网页变慢
3.国内DNS由你自定义,明文传输,这没有隐私可言,也没有必要
4.国外网站通过配置可以DOT(DNS over https)查询,使得本地DNS和运营商无法获取信息,此为隐私保护
5.由于你使用代理服务器间接发送DNS查询命令,这样获得一个中转加速,因此不用直连CF或者google的DNS服务器,这样可以抗干扰且实际dns响应可能比直连更快
Part 4 内网共享服务
新手入门1——从samba安装学起

使用mobaxterm连接虚拟机,root登陆后
apt install samba -y #安装samba
vi /etc/samba/smb.conf #打开samba配置文件进行修改
#点击i或者o输入以下内容(可以根据自己需求修改)

   comment = share folder
   browseable = yes
   available = yes
   path = /home/share #你建立的linux系统下真实文件路径
   read only = no
   public = yes
   writable = yes
   create mask = 0777 #777是linux系统下的最高权限
   directory mask = 0777

最后service smbd start就OK了,没OK就service nmbd start
samba的配置参数有很多,可以分不同用户(valid users),不同文件夹,不同读写权限等,可以参见官方文档
samba添加用户命令是 smbpasswd -a "user",添加后会提示输入密码。其他命令参见smbpasswd -h的帮助

然后在内网windows电脑上点击win+r,输入\\192.168.x.x(你的虚拟机IP)就能登陆linux下的ext4文件格式的共享文件夹了。安卓手机可以用ES文件管理器或者小米文件管理器
注:samba可以用于互联网共享,前提你有公网的445端口

说明1. apt install是debian安装软件的命令,linux会把一切相关依赖程序自动安装上去,不需要你一个个装。
说明2. etc是linux大多数软件的配置保存目录,一般是/etc/软件/配置文件,这种结构
说明3. vi /etc/samba/smb.conf可以打开编辑器,编辑文件。但是vim编辑器对新人不友善,可以ssh工具的文本编辑器
说明4. linux的配置均为文字配置,没有GUI界面,因此大多数配置都是可读的,即能看懂,比如path = xxx就是路径是什么。当然也有看不懂的,比如Nginx的正则表达式。
技巧1. 如果你发现有啥没装导致没启动的,你可以使用apt search xxx或者apt list | grep xxx,比如samba,寻找到你要安装的相关文件,比如samba-common。再进行安装apt install samba-common即可。grep是linux的全局搜索命令,最强大的命令之一
技巧2. 寻找某个程序,可以用whereis samba这个命令;寻找某个文件,可以用find / -name samba这个命令
技巧3. 输入clear回车,能清屏
Part 5.1 离线下载之PT
新人入门2——安装qbittorrent远程下载PT

输入apt install qbittorrent-nox -y
安装成功后,输入qbittorrent-nox -d 激活程序并使其在后台运行。如果你直接输入qbittorrent会一直在程序中,点ctrl+c结束程序才能返回命令行
在浏览器中输入192.168.x.x:8080(虚拟机IP),即可打开qbittorrent界面。
由于他是用QT跨平台开发,win, linux, webui都长一个样,如果你已经用过这款软件,那么想必轻车熟路。你可以根据自己喜好改端口或者语言等。

Q: 你不是说作为服务端没有GUI么?为什么qbittorrent还是用了webUI?
A: 是的,服务端一般都是代码和不可见程序。但这个qbittorent是个客户端,如果你特别喜欢用文字编辑的方式进行设定,PT下载软件可以用transmission,它是最古老和通用的PT客户端。

说明1. qbittorrent安装后不像transmission一样自带服务,即开机启动功能。你可以自建一个服务或者做个脚本。本着正统学习的原则,我们建立一个系统服务,nano /etc/systemd/system/qbittorrent-nox.service如下(新手可以在ssh中使用nano,也可以用vim,也可以windows下建个文件然后用scp丢进去)

Description=qbittorrent-nox service
After=network.target

Type=forking
RemainAfterExit=yes
ExecStart=/usr/bin/qbittorrent-nox -d
Restart=on-failure
RestartPreventExitStatus=255

WantedBy=multi-user.target


说明2. 系统自带源中版本一般不会是最新版本,最新版本在github上下载后需要自行编译,编译还不是“新手入门”范畴
技巧1. 需要帮助打命令 -h,比如qbittorrent-nox -h
技巧2. 查看本机service服务有哪些:service --status-all
技巧3. 点击ctrl+c,就是windows的复制组合键可以中断linux正在执行的程序

Part 5.2 离线下载之ARIA2
进阶入门1——安装ARIA2,并使用Nginx配置ARIANG网页进行远程控制

上一小节我们介绍了qbitttorent的webUI,但并不是所有软件都自带webUI,比如知名的aria2,它作为linux下的典型软件就是一个简单的内核,用命令行控制所有下载行为。
这里我们引入nginx,让大家初步理解网页作为远程访问的最常规手段,它的后端是如何工作的。也为后面的synapse,nextcloud,bitwarden等软件做准备,因为他们都要用到nginx。

输入apt install aria2 -y
安装完毕后,它并不直接启动。输入 "aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all -c -D" 后进入后台模式。
但这个方法增加参数启动很麻烦,因此我们建立aria2的配置目录,使其进入后台模式,更为可控。
mkdir /root/.aria2#mkdir是linux新建文件夹的命令
touch /root/.aria2/aria2.session#touch是新建个空文件命令
touch /root/.aria2/aria2.log #新建日志文件
nano /root/.aria2/aria2.conf #新建配置文件
将下列内容输入aria2.conf
dir=/var/www/aria2 #你需要的下载目录
disable-ipv6=true #关闭ipv6监听
enable-rpc=true
rpc-allow-origin-all=true
rpc-listen-all=true
rpc-listen-port=6800
continue=true
input-file=/root/.aria2/aria2.session
save-session=/root/.aria2/aria2.session
max-concurrent-downloads=5
max-connection-per-server=16
daemon=true
然后输入aria2c后即可直接启动

以下内容为新手进阶——搭建web服务器
step1. 下载将网页程序aria2ng后,将AriaNg-1.1.4.zip解压至/home/aria2目录
step2. 安装nginx:apt install nginx -y (目前debian的默认版本还是1.14,sites-enabled是默认加载配置的目录,我以1.14为例,1.16已经没有这个目录)
安装完毕后,新建一个网站,
vi /etc/nginx/sites-enabled/a2.conf
输入以下内容
server
{
listen 80;
      server_name 2.aria;#这里设置的是网站域名
      index index.html;
      root /home/aria2; #这里是你网站目录

location / {
                try_files $uri $uri/ =404;
      }
      access_log/var/log/nginx/aria2ooxxqqq.log;
      error_log/var/log/nginx/aria2ooxxqqq.log;
}
service nginx restart 完成
将域名写入windows host下,C:\Windows\System32\drivers\etc\host 添加
192.168.x.x 2.aria
192.168.x.x是你的debian ip,在浏览器中完整输入http://2.aria,即可进入远程管理

说明1. nginx默认配置中会加载sites-enabled下的内容
说明2. 域名->ip地址->网站程序,这是一个一一对应的关系,也是互联网的核心所在。所有关于加密和隐私防护都是在这三个环节之间。
a) windows的域名解析优先级最高的是本地host文件,因此写入host后就可以直接解析
b) 正常域名解析是通过互联网的DNS服务器,目前DNS服务是不加密的,所以可以劫持,也是GFW的常用污染方式。因此有了DNS over tls和DNS over http,目前最完美的加密浏览网页的方式是v2ray的内置DNS
c) 之后的网盘等程序,可以购买一个真实的域名,并且用域名解析服务,完成真正的远程访问
d) nginx是一个可以部署多个网站的程序,即有域名对应目录的设置,但他们都可以共享一个端口。在ip地址->网站程序这个过程,用户可以自定义nginx的WAF(防火墙)应对网络攻击
技巧1. nginx -t 能够测试配置是否正常
技巧2. mkdir,touch等命令是linux常规命令,可以google一些文章学习
Part 6 密码管理
入门进阶2——Bitwarden跨平台密码管理软件
这里我们引入Docker,docker是一种虚拟方案,但和Hyper-v不一样,它能够在linux上秒启动,并且几乎不怎么耗资源。在不破坏系统环境下,使得软件相互不干扰,如果打个比方就是安卓上面的app。由于bitwarden只提供了docker安装方式,我们就在这个章节让大家从实践中了解docker。

step1 .安装docker及docker-compose,docker是通过很长的命令行直接启动程序,一般人记不住。而docker-compose是通过预先写好的配置文件及一个很短的命令行启动所有程序。
更新安装包目录
apt-get update
允许apt通过https安装以免被篡改
apt-get install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg2 \
   lsb-release \
   software-properties-common
添加软件源的 GPG 密钥
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
添加docker ce入软件源
add-apt-repository \
   "deb https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
docker完成安装
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
安装docker-compose需要依赖环境
apt install -y python-pip python-dev libffi-dev openssl gcc libc-dev make
下载二进制包并安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
step2.创建配置文件
mkdir /root/docker && cd /root/docker
vi /root/docker/docker-compose.yml
version: '3'

services:
bitwarden:
    image: bitwardenrs/server:latest #镜像名
    container_name: bitwarden #容器名
    restart: always #重启选择
    volumes: #数据卷
      - ./data:/bitwarden/data #密码数据库目录
    env_file:
      - config.env #运行环境
    ports:
      - "10010:80" #docker的80端口映射到本机10010,下同
      - "10011:3012"
vi /root/docker/config.env
SIGNUPS_ALLOWED=true #允许注册
DOMAIN=https://testbitwarden.co #网站域名
DATABASE_URL=/data/bitwarden.db #数据库文件名
WEB_VAULT_ENABLED=true#管理网页
adminSettings__admins=test@email.com #管理员账户
ADMIN_TOKEN=1234 #管理页密码
WEBSOCKET_ENABLED=true #支持websocket
环境配置的所有参数可以参照作者wiki
此时,输入虚拟机ip:端口即可访问,如"192.168.1.100:10010"
step3.域名访问
使用nginx反代本机端口,vi /etc/nginx/sites-enabled/bt.conf
server {
listen 80;
server_name bt.ts;

# Allow large attachments
client_max_body_size 128M;

location / {
    proxy_pass http://127.0.0.1:10010;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

location /notifications/hub {
    proxy_pass http://127.0.0.1:10011;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location /notifications/hub/negotiate {
    proxy_pass http://127.0.0.1:10010;
}
}
如上文相同,将bt.ts域名写入windows host下,C:\Windows\System32\drivers\etc\host 添加
192.168.x.x bt.ts ip为虚拟机的局域网ip
此时输入http://bt.ts 即可访问 bitwarden页面,输入http://bt.ts/admin,可以访问bitwarden管理页面

注:nginx proxy_pass的反代功能和前文v2ray软路由的iptables规则会有冲突,体现在TCP流量的重定向"iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345"及本机代理 "iptables -t nat -A OUTPUT -p tcp -j V2RAY",删除其中任何一条均可以正常使用。建议删除OUTPUT规则,结果就是本机无法扶墙,但局域网设备可以,比较符合软路由定位
Part 7 DDNS服务
扩展入门1——Cloudflare DDNS服务
本篇介绍使用Cloudflare API完成DDNS,虽然dnspod和aliyun有类似业务,但是用国内的域名服务商等于失去隐私。虽然CF是一家CDN领域领先的商业公司,但所有服务一直致力于隐私保护,并且被Privacytools推荐,最后其免费内容就足够强大,无需付费。
step1.购买域名(推荐namesilo或者namecheap),并且注册cloudflare账号
step2.将域名添加入你的cloudflare 面板(dashboard),按向导操作即可。在域名服务商的管理面板中,将nameserver改为cloudflare面板中所提供的
step3.获得DDNS API必要的信息,1.zone id(overview中的右下角) 2. api key(在zone id下方Get your API token,页面跳转后点击Global API Key获得)
利用API创建域名记录,[内容]需要你自己填写
curl -X POST "https://api.cloudflare.com/client/v4/zones/[你的zone id]/dns_records" \
   -H "X-Auth-Email: [你的CF注册邮箱]" \
   -H "X-Auth-Key: [你的api key]" \
   -H "Content-Type: application/json" \
   --data '{"type":"A","name":"[你要解析的DDNS域名]","content":"[解析指向的IP]","ttl":180,"proxied":false}'
输入完会返回一长串字符,如果没报错信息就是成功
查询DNS记录,执行下面这个命令后,shell 窗口中会列出你的帐号上的所有 dns 记录
curl -X GET "https://api.cloudflare.com/client/v4/zones/[你的zone id]/dns_records" \
   -H "X-Auth-Email: [你的CF注册邮箱]" \
   -H "X-Auth-Key: [你的api key]" \
   -H "Content-Type: application/json"
其中指向你所设IP的id"xxxx"就是你创建的DNS记录的ID

更新 DNS记录
curl -X GET "https://api.cloudflare.com/client/v4/zones/[你的zone id]/dns_records"/ \
   -H "X-Auth-Email: [你的CF注册邮箱]" \
   -H "X-Auth-Key: [你的api key]" \
   -H "Content-Type: application/json" \
   --data '{"type":"A","name":"[你要解析的DDNS域名]","content":"[解析指向的IP]","ttl":180,"proxied":false}'

以上为Cloudflare DNS设置及更新方式,为了实现完整的DDNS,我们需要一个定期执行的脚本,vi /root/ddns.sh
ip=$(curl ifconfig.co)
curl -X GET "https://api.cloudflare.com/client/v4/zones/[你的zone id]/dns_records"/ \
   -H "X-Auth-Email: [你的CF注册邮箱]" \
   -H "X-Auth-Key: [你的api key]" \
   -H "Content-Type: application/json" \
   --data '{"type":"A","name":"[你要解析的DDNS域名]","content":"'${ip}'","ttl":180,"proxied":false}'
以上从ifconfig.co获取本机ip,如果你使用v2ray作为网关,请在直连名单中添加此域名。与上文区别是'${ip}'在sh脚本中作为本机ip的引用,赋予文件执行权限 chmod +x /root/ddns.sh
在Linux系统中添加任务,每小时执行一次,输入crontab -e,添加0 */1 * * */root/ddns.sh


除了DNS以外,需要在路由和光猫中设置端口转发,电信光猫中一般以“虚拟主机”作为称呼,以下以openwrt为例设置端口映射
https://p.transfersw.com/images/2020/03/28/29a961912df160c72061308ff6e6267d.png
将服务器的ip 192.168.1.110:80映射到wan口ip:1120,此时你在浏览器中输入wan口ip也能访问内网,光猫中设置雷同。如果这个wan口ip是公网ip,你已经可以远程访问了,最后可以通过[域名:端口]访问内网服务

注:nginx可以同一个端口安装多个网站,因此要在配置中设置域名以对应
Part 8 系统性能测试
linux下测试一般都由命令行完成,完成后会在终端内打印结果或者生成网页链接。以下介绍常用性能测试软件和命令,以让大家了解搭建的服务器性能是否正常
1.综合测试 unixbench,相当于win下的pcmark
wget https://github.com/kdlucas/byte-unixbench/archive/v5.1.3.zip #下载源码
unzip v5.1.3.zip #解压缩
cd /byte-unixbench-5.1.3/UnixBench #进入主目录
./run 运行测试
需要经过30分钟甚至更长实践才会输出结果

2.综合测试 geekbench,主要用户跨平台比较
wget http://cdn.geekbench.com/Geekbench-5.1.0-Linux.tar.gz #下载测试程序
tar -xzf /root/Geekbench-5.1.0-Linux.tar.gz #解压缩
cd /root/Geekbench-5.1.0-Linux/ #进入主目录
./geekbench5 或 ./geekbench_x86_64 #均可运行测试程序
测试速度比unixbench快很多,会生成网页连接供用户查看结果

3.CPU测试 sysbench,相当于win下的象棋跑分或者cpu-z跑分,快速检测结果
#安装软件
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
#cpu测试,查看结果 CPU speed: events per second: xxx
sysbench --test=cpu --cpu-max-prime=20000 run #CPU单线程测试
sysbench --test=cpu --cpu-max-prime=20000 --num-threads=2 run #CPU多线程测试,修改threads数量可测试不同线程数
#文件读写,查看结果Throughput和latency
sysbench --test=fileio --file-total-size=10G prepare #预创建10G的文件
sysbench --test=fileio --file-total-size=10G --file-test-mode=rndrw --max-time=30 --max-requests=0 run #对文件进行30秒随机读写测试
sysbench --test=fileio --file-total-size=10G cleanup#清理创建的文件
#内存传输,查看结果 MiB/sec和Latency
sysbench --test=memory --num-threads=4 run #4线程CPU测试内存

4.测试硬盘IO的dd命令。在10年前vps刚开始流行的时候,内存和cpu都是购买前就知道是多少的,比如1CPU,128M内存,他们的性能基本是可以预期的,但是硬盘是未知的,尤其当年又是HDD的年代,硬盘IO往往是全部系统的最大短板,跑数据库(mysql)的时候非常明显。到了今天有了PCI-E 2.0以上的SSD,这些情况大为缓解,但即使如此,你仍然会最为关注硬盘IO,因为大多数人都有NAS的需求,部署一些软件也会用到数据库,比如前面介绍的bitwarden和后面的nextcloud。同时linux上有ZFS、XFS、EXT4、BRTFS那么多常用的文件系统,有DM-cache、bcache、LVM cache、flashCache那么多缓存加速技术。ZFS甚至自带内存做1级缓存,SSD做2级缓存的技术,都是为了提高硬盘IO所做的努力。
dd命令用于复制文件并对原文件的内容进行转换和格式化处理,说了通俗点就是底层级别的复制黏贴。dd可以用来来备份裸设备(全盘备份),相当于windows的ghost。也可以用来测试硬盘读写
#dd 命令通用语法格式如下:
dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks# 输入文件 -> 输出文件 -> 数据块大小 -> 次数
time dd if=/dev/zero of=/root/test bs=4k count=10240 conv=fsync #测试硬盘写的能力,可以调整bs值,测试更大的数据块
time dd if=/root/test of=/dev/null bs=4k #测试硬盘读的能力,可以调整bs值,测试更大的数据块

dd命令只能进行大概测试,主要是顺序读写,如果需要全面测试如随机读写可以使用fio

主要参数如下
filename=/dev/sda 测试文件名称,即盘符的根目录。
direct=1 是否使用directIO,和dd命令一样,为了跳过操作系统的缓存直接写入
bs=4k 和dd命令一样,单个数据块大小
bsrange=512-2048 同上,指定数据块的大小范围
size=1G 测试文件大小为1G
numjobs=10 每个job(任务)开的线程数
name=job1 任务名
thread一般都采用thread测试
runtime=60 测试时间为60秒,如果不写则一直将1g文件分4k每次写完为止。
ioengine=libaio 指定io引擎使用异步方式
iodepth=16 队列的深度为16.
rw=randwrite 测试随机写
rw=randrw 测试随机写和读
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。


磁盘读写常用测试点:
-rw=read (100%顺序读)
-rw=write (100%顺序写)
-rw=randread (100%随机读)
-rw=randwrite (100%随机写)
-rw=rw -rwmixread=70 -rwmixwrite=30(70%顺序读,30%顺序写)
-rw=randrw -rwmixread=70 -rwmixwrite=30 (70%随机读,30%随机写)

apt install fio#安装fio
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -size=1G -runtime=60 -group_reporting #4k随机读
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -filename=/dev/sda -name="BS 4KB write test" -iodepth=16 -size=1G -runtime=60 -group_reporting
#4k随机写
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=rw -rwmixread=70 -rwmixwrite=30 -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -size=1G -runtime=60 -group_reporting #4k混合随机顺序写读(70%读)
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randrw -rwmixread=70 -rwmixwrite=30 -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -size=1G -runtime=60 -group_reporting#4k混合混合随机读写(70%读)

Part 9 公网web测速
在我们学会用ddns和nginx以后,我们以可架设web服务,以进行公网访问,第一步就是建立个测速页面,以确定你家中的上传速度是否满足各种网络的访问,如三大运营商的4G/5G无线网络或者你公司的网络。测速页面源码依旧来源于github
1. 下载并安装程序
wget https://github.com/librespeed/speedtest/archive/5.2.tar.gz #下载源码
tar -xzvf 5.2.tar.gz -C /home #解压程序至home文件夹
mv /home/speedtest-5.2/example-singleServer-full.html /home/speedtest-5.2/index.html#修改此测速页面为主页

2. 安装php环境 - 网上有大量教程关于linux操作系统部署lnmp(linux+nginx+mysql+php)环境,从最早的lnmp一键编译到后来的宝塔面板,都是为了尽量简化搭建web服务器的步骤,这里是手动安装php,测速页面无需数据库,因此无需安装mysql
apt -y install php-cli php-fpm php7.3-common php-json php-pdo php-mysql php-zip php-gdphp-mbstring php-curl php-xml php-pear php-bcmath
3. 添加nginx配置 (由于chh开启的安全防护,nginx代码无法用文字写出,使用pastebin贴出,链接如下)
https://pastebin.com/8zidjWDB
4.公网测速
若你已经在前文第七节ddns教程中完成了端口转发,输入[域名:wan端口]即可进行公网测速。若你尚无域名,亦可输入[公网Ip:wan端口]进行公网测速,由于nginx默认服务器是安装完后欢迎页面,你可能无法正常打开测速页面。可以修改nginx监听端口,即配置文件第二行"listen 80"改为"listen 8081",再进行路由端口转发,将lan的8081端口转发至wan的8081端口,输入[公网ip:8081]即可访问
Part 10 OMV安装与简介
OMV全称是openmediavault,是一个基于debian开源的nas管理系统,由freenas前核心成员离开后开发,已有11年历史,个人认为是目前阶段最适合家庭和个人使用的系统之一。本节主要介绍他的基本使用方式,webui选项功能,及所对应的系统设置。
注意:由于omv会接管大量debian底层的设置,你之后需要在omv设置中才会生效,比如网路ip等
它的创始人脱离freenas创立OMV的理由是freenas使用的linux发行版freebsd对很多设备没有驱动,导致用户面比较狭窄。他希望有更多的人能用上nas系统,因此选择了linux发行版对设备驱动支持最多的debian作为系统,其大致界面如下(这是用n1运行的截图)
https://p.transfersw.com/images/2020/05/07/omv.png
1. 安装omv及omv-extra插件
omv安装请参见官网论坛的命令,你黏贴复制即可
第一步,添加源,有#注释的是其他几个备用网站
cat <<EOF >> /etc/apt/sources.list.d/openmediavault.list
deb https://packages.openmediavault.org/public usul main
# deb https://downloads.sourceforge.net/project/openmediavault/packages usul main
## Uncomment the following line to add software from the proposed repository.
# deb https://packages.openmediavault.org/public usul-proposed main
# deb https://downloads.sourceforge.net/project/openmediavault/packages usul-proposed main
## This software is not part of OpenMediaVault, but is offered by third-party
## developers as a service to OpenMediaVault users.
# deb https://packages.openmediavault.org/public usul partner
# deb https://downloads.sourceforge.net/project/openmediavault/packages usul partner
EOF
第二步,安装脚本
export LANG=C.UTF-8
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
wget -O "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc" https://packages.openmediavault.org/public/archive.key
apt-key add "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc"
apt-get update
apt-get --yes --auto-remove --show-upgraded \
      --allow-downgrades --allow-change-held-packages \
      --no-install-recommends \
      --option Dpkg::Options::="--force-confdef" \
      --option DPkg::Options::="--force-confold" \
      install openmediavault-keyring openmediavault


# Populate the database.
omv-confdbadm populate


# Display the login information.
cat /etc/issue
如果你是arm设备,比如armbian,在ssh中输入armbian-config选择software->softy就能找到OMV,空格选择后即可安装

之后你只需等待一段时间,无意外就安装完毕了,唯一可能会产生的冲突是nginx。原因是omv监听端口写法是同时监听ipv4和ipv6,一般人习惯是只监听ipv4,但这无伤大雅。之后输入你的主机ip,即可进入omv管理页面,默认用户名是admin,密码openmediavault
我们再安装omv-extra,它包含很多额外插件列表
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash
2. 开启smart监控硬盘温度
omv是nas系统,因此它不把系统盘作为共享盘,必须是非系统盘。在"存储器"->"硬盘"可以看到你所有的硬盘。在"S.M.A.R.T."中选择启用,这样你就能看到设备的smart信息及最重要的硬盘温度。
3. 挂载硬盘,共享文件,设定用户权限并启用smb为局域网分享
挂载硬盘
在"文件系统"中选中你所需要的硬盘,点击"挂载",并且赋予它标签,比如"NAS"。"创建"可以选择需要格式化的文件系统,最常用的是ext4
注意:你必须在omv的webui中进行挂载,如果你用mount进行挂载是omv是不识别的,"共享文件夹"无法选择该硬盘设定
共享文件夹
"访问权限管理"->"共享文件夹",选择"添加",输入"名称","设备"选择我们刚才挂载的硬盘,路径你可以自定义,不改则为该硬盘根目录,点击"保存"即可
设定用户权限
"访问权限管理"->"用户",选择"添加",输入"名称"和"密码"。创建完毕后选择"特权",勾选"读/写"权限
启用smb局域网共享
在"服务"->"smb/cifs"中选择"启用"后"保存"即可,在windows中输入\\改机ip即可访问samba
在学会以上设定后,你可以给不同用户看不同文件夹,且具有不同权限

4. 使用系统信息观看复杂报表
在"系统"->"监测"中选择"启用"后"保存"。在"诊断"->"系统信息"->"性能统计",可以查看cpu,内存,网络,磁盘过去1小时,1天,1周,1月,1年的占用率。这是非常有用的远程监控
5. 所有选项卡全解 系统
常规设置 - 端口设置及证书设置(证书需要你手动导入),自动登出改为"禁用"可以无限制会话时间。"管理员密码"可以修改掉openmediavault的默认密码
日期时间 - 时区改为asia/shanghai,时间服务器改为ntp1.aliyun.com。
网络 - 主机名是你在路由器中显示的名字,域名是真实的域名,保存后omv会在nginx中写入该域名。"接口"你可以选择网卡并且修改为"静态ip",这样方便你访问。"代理"中可以设置http透明代理,比如本机运行了v2ray,这样可以加快你访问源的速度,否则更新下载会很慢。我一般不设置,会用ssh手动设置临时环境并手动更新。"防火墙
"就是图形化的iptables规则
通告 - 对于监控以邮件形式发给管理员,你需要会设置邮件服务器。一般人不用
监测 - 你可以启用。"计划任务"可以定期重启等
证书 - ssh证书可以让你使用证书访问,而非密码访问,这里可以手动添加也可以不添加。ssl需要手动添加(用vim打开证书,并复制其中内容),如果你想在webui中启用ssl。如果自行修改nginx同样可以启用ssl
计划任务 - 可定期执行脚本,相当于corntab,只是图形化了
更新管理 - 有可更新的软件会列出来,包括debian的内核
OMV-Extras - 这个在安装omv-extra以后才有,他会让你图形化安装docker并且提供大量其他插件

存储器(上文已经讲过)
raid管理应该是omv自动提供的软raid,我没用过,你可以用zfs插件建立软raid

访问权限管理(上文已经讲过)

服务
这里都是局域网共享和远程访问的方式,你喜欢哪种可以开哪种,一般至少开smb和ssh

诊断
仪表盘 - 你默认的登陆界面能看到的内容
系统信息 - 你的监控
系统日志 - 你可以选择不同类别,比如smart,你可以看到当硬盘smart值发生变化时的记录
服务 - 你可以查看正在连接的用户是谁

至于是否好用,就请各位自行评价了,我觉得对于一般家庭使用即精简又完,没什么技术层面上漏洞
远程管理-宝塔面板
以上我们学了很多linux命令行的内容,有一种东西叫面板,就是一键脚本,且图形化(webui)操作,异常适合小白。目前做了最出色的就是宝塔,他虽然是给运维用的,但是也可以管理我们自己的服务器。目前尚未证实它有植入后门,如果你不信任可以不用,如果你懒可以使用。本节只是介绍互联网上这种东西的存在,除了它还有appnode DirectAdmin面板等
官网是 https://www.bt.cn/
演示是 http://27.50.161.190:8888/login
一键安装脚本是 https://www.bt.cn/bbs/thread-19376-1-1.html
它还有windows面板,虽然我没用过。如果你学过上文内容,会使用Lnmp环境,那么宝塔对你来说就很容易了,通过演示你很快就能上路

有人会问既然有面板了,为什么还要学那么多linux命令?其实很简单,你终究需要有排查问题的时候,会更多的命令,更熟悉linux的环境和原理,你能自助排查issue。我很多时候会花几小时解决一个问题,如果google不到还要靠自己猜,很多经验是靠自己摸索出来的。如果只会面板的话,依赖性太强并不好。但面板终究能降低你的操作量,我所有的云服务器上均装有宝塔,这样好管理和操作,毕竟对隐私没那么高的要求。至于自己的服务器,我就不会装面板了,如果是arm设备,宝塔支持的不好。如果是x86设备,我会更加定制化系统环境,甚至通过ipmi远程登陆操作。而无论如何宝塔能够帮你制造一个简单无脑的系统环境,对于不熟悉linux新人,绝对是好事
个人网盘-nextcloud
我一直没更新就是因为这一节非常花时间(是指你要根据教程操作,可能是一整天),你需要耐心和仔细看完。nextcloud真的非常美观,易用,完善,它的对标软件是onedrive,百度网盘之类。nextcloud客户端在全平台都有,详见 https://nextcloud.com/install/#install-clients,这里是服务器端教学
首先构建lnmp环境,你可以用宝塔,但本节是全手动。前文我们已经安装了nginx和php,现在我们补全php插件及安装mariadb(mysql)数据库
## 安装php7.3全家桶
apt install php7.3 php7.3-bz2 php7.3-cli php7.3-common php7.3-curl php7.3-fpm php7.3-gd php7.3-gmp php7.3-intl php7.3-json php7.3-ldap php7.3-mbstring php7.3-mysql php7.3-opcache php7.3-xml php7.3-zip php-apcu
## 安装数据库mariadb
apt install mariadb-server
在mariadb中新建nextcloud数据库及用户名/密码
mariadb #进入数据库
CREATE USER admin@localhost IDENTIFIED BY 'pw';#创建一个用户名为admin,密码为pw的本地账户
CREATE DATABASE nextcloud; #创建一个名为nextcloud的数据库
grant all on nextcloud.* to admin@localhost; #赋予admin对数据库nextcloud的一切权限
flush privileges;
\q #退出mariadb
注意:mariadb所有命令必须以分号结尾
下载nextcloud主程序并且解压
cd /var/www #进入/var/www目录,原因这是linux默认安装网站的目录
wget https://download.nextcloud.com/server/releases/nextcloud-18.0.4.zip #下载主程序18.04
unzip nextcloud-18.0.4.zip #解压文件
chown -R www-data:www-data /var/www/nextcloud/ #赋予用户权限
修改nginx配置,由于nginx配置还是无法在此贴中打出,依然使用pastebin,请参考官方文档
需要修改的部分如下在pastebin中我已经用中文说明,已经包含nginx参数调优,务必仔细阅读
https://pastebin.com/W2W4ZDDV

web安装
1. 输入域名:端口来到web界面安装
用户名密码设置:默认用户名admin,即便你新建一个用户名作为管理员,admin还是会被系统保留,密码请自行设定
数据文件夹设置:注意!data folder是你要设定的保存文件的目录,之后所有数据都会在这个文件夹下,请设置在你需要的盘,比如nas盘符对应的目录中。以omv举例,可以是/srv/dev-disk-by-label-nas/nextcloud/ 这个。请三思而设置,一旦设定很难修改,要修改就得进行修改数据库的骚操作了,实际上对于大多数人想修改只能删了数据库重装,否则工作量太大。
数据库设置:database user(用户名) password(密码) name(数据库名)都是你前面在mariadb中设定的内容,一次对应admin pw和nextcloud。
至此安装完毕,然后nextcloud会进行安装完整度及安全检查,你可能会遇到一堆错误,然后我们需要逐个修复,以通过nextcloud的安全自检

如果按照上文安装已经安装php全家桶,则两个插件apcu和opcache均已安装,nginx的webdav解析目录也会正确,报错会减少4条。我们需要再安装redis(内存型数据库做缓存)和修改php参数以优化nextcloud性能

用occ命令解决两个初装报错
cd /var/www/nextcloud #进入主目录执行命令
sudo -u www-data php occ db:convert-filecache-bigint
sudo -u www-data php occ db:add-missing-indices

安装imagick解决报错并提升性能
apt install php-imagick imagemagick
echo extension = "imagick.so" >> /etc/php/7.3/fpm/php.ini


apt install redis-server #安装redis数据库
vi /etc/redis/redis.conf #修改Redis配置
requirepass password #设置密码
unixsocket /var/run/redis/redis-server.sock #找到这两行,如果被注释掉就删除注释,使用unixsocket通讯
unixsocketperm 700
sudo usermod -a -G redis www-data #赋予nextcloud使用redis权限

修改nextcloud配置进行优化
vi /var/www/nextcloud/config/config.php #打开nextcloud配置文件
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => array ( 'host' => '/run/redis/redis.sock', 'port' => 0, 'dbindex'=> 0, 'password' => 'password','timeout' => 1.5, ),#"password"为你设置的密码
session_lifetime' => 60 * 60 * 24 #延长会话时间

PHP-FPM参数调优(上传大文件,多用户使用,在线播放视频)
vi /etc/php/7.3/fpm/pool.d/www.conf #打开php fpm的配置文件,并找到以下几行
php_admin_value = 512M#默认值是32M或者128M之类,使用php-fpm占用的最大内存
pm = dynamic #进程数量为动态(如果你是128G内存服务器可以设置为静态)
pm.max_children = 120 #进程数量,必须将pm设置为static(静态)才起效,默认值5,所以他现在不起效的
pm.start_servers = 12 #动态条件下启动php-fpm时默认的进程数量,默认值2
pm.min_spare_servers = 6 #动态条件下php-fpm最少的进程数量,默认值1
pm.max_spare_servers = 16 #动态条件下php-fpm最多的进程数量,默认值3
pm是php-fpm的进程数量,越多则并发越高,支持越多的人同时上传下载数据,开销也就越大。如果fpm进程数量过少,会产生一个现象就是你刚下载了一个文件或正在播放一个视频,再想上传一个文件,操作需要等待前一个php-fpm进程请求结束,由于默认php的pm数量很少,然后你就只能在那里慢慢等,产生nextcloud很慢的错觉。每个php-phm大约需要占用20-50mb内存,请根据自己的内存大小酌情调整

问答
问:Github上面某人在docker php下面提问为啥不把pm默认值5改成50?https://github.com/docker-library/php/issues/162
答:我在n1上把max spare servers调到50以后结果就是瞬间卡死,ssh被强制断开,除了拔插电源无解。导致我omv的外置硬盘的挂载失效,pt数据花了20小时重新校验。拯救办法为重启后必须快速连上ssh,输入"service php7.3-fpm stop"中止守护进程才能拯救回来。

PHP全局环境参数调优,启用php OPcache通过缓存预编译的字节码以改善php应用的性能
vi /etc/php/7.3/fpm/php.ini #打开php全局环境配置文件,并找到以下几行
post_max_size = 2G #php上传最大文件为2G
upload_max_filesize = 2G #单个上传最大文件为2G
upload_tmp_dir = /var/big_temp_file/ #上传文件临时目录
max_input_time 3600 #最大输入时间
max_execution_time 3600 #最大执行时间
output_buffering = 0#减少php产生内存相关错误
#以下是opcache参数,删除句首注释的;即可
opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Mariadb数据库参数调优 ,让数据库调用内存作为缓存,而非对虚拟内存(硬盘)读写,以下是1G内存示例
vi /etc/mysql/conf.d/mysql.cnf #打开mysql配置文件,并找到以下几行
innodb_buffer_pool_size=1G
innodb_io_capacity=4000

注:nextcloud的官方安装文档很有用,你多阅读

我上文缺失ssl的配置,即使用https加密的公网访问,我会重新开一个小节以补充这部分教程

聊天服务器的客户端可以参照matrix的官方页面,大部分人用Riot。与nextcloud一样,我们同样是建立服务器端,称之为synapse。它的对标软件就是大名鼎鼎的微信,也可以是米聊 whatsapp等软件。所有信息我们都能从它的官方github页面上获得,他的开发文档非常全。它与nextcloud一样,可以用docker一键安装,但这里是配置python3虚拟环境的官方安装方式。它默认安装用的数据库是sqlite3,但官方表示,这个轻量化的数据库仅用于少数人的服务器或者测试用,若运行大型聊天室,建议改为postgreSQL。



paochu_2007 发表于 2020-3-12 09:31

最近接触linux越来越多,win现在感觉就是office+oa以及一些娱乐,好用的,还是linux。

真心后悔上学时没选linux做为专业。

goldensquall 发表于 2020-3-12 11:49

T.JOHN 发表于 2020-3-12 19:55

本帖最后由 T.JOHN 于 2020-3-12 19:58 编辑

goldensquall 发表于 2020-3-12 11:49
我正想把我的M720q出了,看了楼主这帖子………………嗯,这个坑有点儿大啊!是跳还是不跳呢? ...
这要取决于你有多爱折腾了,我尽量每天多更新一个Part,让人有事可折腾[偷笑]

goldensquall 发表于 2020-3-13 10:31

magiclu 发表于 2020-3-13 14:27

网络有问题,测试下来不能单机自攻自受当软路由

hyperv可以的
参考我这个教程
https://www.chiphell.com/thread-2142173-1-1.html

T.JOHN 发表于 2020-3-13 15:52

本帖最后由 T.JOHN 于 2020-3-13 20:23 编辑

magiclu 发表于 2020-3-13 14:27
网络有问题,测试下来不能单机自攻自受当软路由

hyperv可以的

可能我表述了不清楚,主贴更新了下

两点需要注意:
1. 你的宿主机win是整个局域网内不能直接科学的设备,局域网内其他设备(其他电脑 手机 电视)均可直接科学,包括虚拟机自己
2. 你想让宿主机win科学办法是用sock5代理的端口,比如win自带的网络设置,或者firefox这种浏览器自带的设置(虚拟机ip:端口)

原因是虚拟机中的debian没法改动网关,nmtui中gateway是无法设置的。而windows那个网卡修改网关后,连带虚拟机的网关也会被改
以上谬误回帖,删除

magiclu 发表于 2020-3-13 16:31

debian我不清楚,我试了一下,我把我win10的网关改为openwrt的ip没问题的
不过我需要下载bt,用socks5省事
pfsense虚拟机负责拨号,openwrt负责连接真互联网
如果freebsd的pfsense和linux的openwrt都正常,那就是你水平还不够(你linux水平已经比我高多了,我只会复制粘贴),哪里设置不对

windows那个网卡修改网关后,连带虚拟机的网关也会被改,我搞不懂你这个是什么情况,我的虚拟机都没事啊

怪叔叔 发表于 2020-3-13 17:08

收藏吃灰再说[狂笑]

T.JOHN 发表于 2020-3-13 17:28

本帖最后由 T.JOHN 于 2020-3-13 20:26 编辑

magiclu 发表于 2020-3-13 16:31
debian我不清楚,我试了一下,我把我win10的网关改为openwrt的ip没问题的
不过我需要下载bt,用socks5省事
...
我不知道怎么回复你,就hyper-v二代+debian而言,debian作为虚拟机是自己无法控制自己网络设置的,网络是hyper-v管理器赋予debian的(在/etc/network/interface无论写什么都失效)。如果独立设备安装debian,那就是debian自己控制自己的网络,区别就那么简单。——谬误结论,删除
用hyper-v举例只是方便新手熟悉debian,能在windows上好操作,仅仅作为演示,最终学会了以后是在硬件上直接装debian的,有且仅有一个系统。

这文章的目的是摒弃openwrt,虚拟化技术,windows,不涉及桥接,拨号等额外工作,甚至脱离硬件。告诉使用者,你不需要改变家中任何设备,任何设置,只要用一根网线连上一个装linux的设备,就能实现所有服务端的功能。

Part3 软路由网络部分仅仅是v2ray+iptables nat规则而已,也不在这篇文章里,并不是重点,和你的文章目的不同

magiclu 发表于 2020-3-13 17:59

我装了ubuntu server虚拟机的 /etc/netplan里的50-cloud-init.yaml 是可以改ip,网关什么的,完全没问题
难道是debian有bug?

感觉小白还是适合在虚拟机里装linux,毕竟可以用快照,和物理机也没有明显的区别,出事了直接还原

T.JOHN 发表于 2020-3-13 20:00

本帖最后由 T.JOHN 于 2020-3-13 22:37 编辑

magiclu 发表于 2020-3-13 17:59
我装了ubuntu server虚拟机的 /etc/netplan里的50-cloud-init.yaml 是可以改ip,网关什么的,完全没问题
难 ...
我刚又试了下,你说了对。虚拟机(debian)可以改IP,宿主机(windows)改网卡IP后可以留学访问,我修改了下Part3的教程。主要应该是我没给windows设DNS,没开MAC欺骗有关,以及debian的默认dns server是空的

豆豆那头熊 发表于 2020-3-14 12:31

感觉对于小白,装个docker,然后整套web gui,然后安装一堆容器来实现这些功能会比较容易让他们理解,纯命令实现很容易让他们失去耐心

cenxiao01 发表于 2020-3-14 19:45

首先感谢楼主分享。

其次,感觉帖子还是没个爆点。用虚拟机,本来就可以实现你说的全部功能,比如EXSI虚拟软路由+黑群晖或者WIN,那你用linux做服务器的意义到底在哪里呢?

比较专业的程序员不屑于学习这个,学习或者了解这个的基本都是爱折腾的玩家,没有吸引人的地方,没办法继续去学习啊。

T.JOHN 发表于 2020-3-14 20:14

本帖最后由 T.JOHN 于 2020-3-14 20:20 编辑

cenxiao01 发表于 2020-3-14 19:45
首先感谢楼主分享。

其次,感觉帖子还是没个爆点。用虚拟机,本来就可以实现你说的全部功能,比如EXSI虚拟 ...
因为你说的虚拟机,黑群晖或者win都是“复杂”的方案,这个是“简单”的方案。所谓简单就是用最少的软件,性能最低的硬件,最短时间,最低的能耗完成任务,一台linux替代所有。这世上服务器大多数本来就是linux,而不是用我硬要用linux做服务器,这因果关系反了,我只是普及大家不知道的linux如何实现这些功能的过程。
举个简单例子,3年前流行的科学方案是ss+chinadns+dnsmasq,现在是v2ray一个软件完成,但是openwrt里的luci界面对于ss还行,对于v2ray就显得很残废了,因为很多设置并没有。如果要用json导入,最后发现还是得自己学linux。然后v2ray假设更新到xxx版本了,结果某个大神的固件不再更新了,比如lintel的潘多拉,那就永远停在老版本了,新软件得依靠某个大神用sdk去编译。如果想要自己编译,那必须在linux下完成,还是绕不过去。但大多数人不理解v2ray完全可以自己装的,从github直接获得,把v2ray core算一手的,openwrt源码二手,编译成自己ipk算三手。其他软件一个道理,很多经过二次开发的软件没有任何安全性可言,比如某K论坛的merlin。
再举个例子,像nextcloud这样的TOP1网盘程序,matrix synapse这样TOP1的聊天程序,想要安装就得学习nginx,php或者docker,这些程序都是运行在linux上的,和虚拟机,软路由,黑群晖或者win都没关系。当然这是后半部的内容了,而非入门篇。
条条大路通罗马,这只是最短的路,而硬要说唯一吸引人的地方那就是拒绝不可靠的二次开发,完全无后门,全开源,隐私和安全保护到极致。

cenxiao01 发表于 2020-3-14 20:32

T.JOHN 发表于 2020-3-14 20:14
因为你说的虚拟机,黑群晖或者win都是“复杂”的方案,这个是“简单”的方案。所谓简单就是用最少的软件, ...

额。/苦笑。。

我没有别的意思哈,只是单纯站在一个不专业玩家的角度去看一个教程。

假如不是工作需要,一个教程吸引我的关键点就是这个教程对我有没有用,所以我才说楼主这个帖子里没有讲到我用这个linux的话,到底有什么地方值得我去研究学习。

所以我才说楼主你的帖子没有爆点,起码现在是这样的。

或者换个说法,楼主你发的这个教程目的是什么,你所介绍的linux系统,到底能带给我们普通玩家什么?

1.NAS 旁路由不需要多好的硬件设备,一台80元的N1可以满足绝大多数人需求
那就是我用N1就可以了?有什么问题我直接去找N1的教程就好哦。
2.Openwrt只是个精简linux,走进centos/debian你会发现新世界大门
能直接介绍下这个大门之后到底有什么是我们普通玩家用的上的吗?
3.为什么需求总是从软件层面解决问题,硬件只是为了软件服务的配角
略。。。
4.windows在服务器领域几乎没用武之地,这里是linux天下,重新学习方能成长
比如我们普通玩家需要的那些功能在linux上能更好的实现呢?


然后你后面说的,都是其他虚拟机能实现或者WIN就能简单实现的呀。。。

楼主,没别的意思,我一直感觉论坛上有分享才能是好论坛。

只是建议楼主能把分享的教程先说结果和重点,然后再介绍实现步骤,这样我们看的目的明确,你更新的也有动力。。。

再次感谢你的分享!!!

lucifersun 发表于 2020-3-15 16:01

一般以Windows桌面系统为主的家庭环境,一个Windows server已经能解决绝大多数需求了,比如文件共享(SMB)、下载、远程接入、WSUS、WDS之类服务。而且图形界面友善,管理方便。
考究点弄个hyper-v或者ESX,安装多个win server系统的虚拟机,将不同服务独立开来,提高可用性。同时还能与物理机隔离,方便迁移。
再加上一个Ubuntu来支持一些Linux应用。
密码管理Bitwarden、私有云NextCloud之类服务,本身就不适合跑在家用网络上,单就一个反向DNS就搞不定,还是直接买个VPS更方便。

谎言之神Cyric 发表于 2020-3-16 15:55

有个问题,如何实现使用服务器进行判断非留学域名与IP走直连,其余链接(包括UDP)全走维二?

我看使用某list进行PAC,还是借用什么GEOIP查询实现效果均非常差

这个需求较为迫切,全局是最劣的用法,其次是PAC

T.JOHN 发表于 2020-3-16 18:59

本帖最后由 T.JOHN 于 2020-3-16 19:20 编辑

谎言之神Cyric 发表于 2020-3-16 15:55
有个问题,如何实现使用服务器进行判断非留学域名与IP走直连,其余链接(包括UDP)全走维二?

我看使用某l ...
这个是原始的白话文教程,你可以参考下,主要是客户端的config.json,他写了已经很到位了,建议一定要自己写config.json,别用图形界面,否则设置啥你自己都不知道。
关于规则:不管是list,geoip和geosite,他们是一个可甄别的预存列表,能够实现快速分流,设置在config.json的rules选项卡中。但如果域名不在表里,就要进行dns查询,v2内置程序做了很好,这一点part3我解释过了,更详细的解释在 黑科技漫谈一文。
Geoip和Geosite你可以从github上这个仓库下载
我不知道你是哪个平台用v2。有些路由器我测试了ws+tls是连不上的,只能最简单的TCP(68U的merlin和R6200的openwrt),而且openwrt还是我用SDK自己编译,而且v2的程序25M,加上两个dat 35M,一般路由器都没那么大空间装,所以不适合在路由上运行,路由还是跑SS合适。win你能开个sock5代理用,udp是可以走sock5的。但win没有iptables规则,有些程序不一定经过sock5代理,所以你有个linux走旁路最好,方式就是白话文教程。

遗忘痕迹 发表于 2020-3-16 22:38

家庭宽带最大问题就是没有80/443端口,而且不能备案,搭建远程管理页面什么的无所谓,如果搭建了网站,在某些问题问题就很大了

xf22cn 发表于 2020-3-17 01:03

goldensquall 发表于 2020-3-12 11:49
我正想把我的M720q出了,看了楼主这帖子………………嗯,这个坑有点儿大啊!是跳还是不跳呢? ...

如果没有基础,建议不要跳……

goldensquall 发表于 2020-3-17 10:43

xf22cn 发表于 2020-3-17 10:45

goldensquall 发表于 2020-3-17 10:43
听明白了
所以我卖了………………
好像还是有点儿可惜

这个东西,是需要一定基础的。
看教程都看得明白,真到自己做的时候没有基础就是一团乱。
有的时候卡住了可能拼命搜索都找不到解决问题的办法,但是稍微有一点基础就能自己解决……

ghost_zl 发表于 2020-3-17 13:32

作为一个小白维保人员和中度玩家,winserver做服务器系统,出了问题我还能折腾折腾
这linux系统,我觉得入门都很难
公司电脑都是winserver系统,从2003-2016都有,和普通windows通用性还是很强的,很多问题都能找到共性的解答

hamajun 发表于 2020-4-13 20:46

年前搞了一套i7 7700T+32g,装了debian 10+pve---lede+akuai+群晖+win,感觉没啥意思,看了您这个感觉还可以再抢救一下;
我的目标是:类似买的vps,抛开80端口和443端口,是否可行?
麻烦老师指导一下

myacer4925g 发表于 2020-4-13 22:30

T.JOHN 发表于 2020-4-15 23:42

hamajun 发表于 2020-4-13 20:46
年前搞了一套i7 7700T+32g,装了debian 10+pve---lede+akuai+群晖+win,感觉没啥意思,看了您这个感觉还可 ...

这个帖子内容其实就是基于vps的搭建,去图形化带公网ip的linux,算是完全符合你的需求。主要两个区别就是你的机器性能远强于vps,是dedicate server,但网络肯定没机房强,毕竟别人是固定ip且级别较高的QOS。

T.JOHN 发表于 2020-4-15 23:44

myacer4925g 发表于 2020-4-13 22:30
咋不更新了啊?

最近比较忙,疫情后复工的高峰期,没时间和精力写,最晚大概在五一前补完现有的目录

charles911 发表于 2020-4-20 00:01

mark啦!

trmalive 发表于 2020-4-24 11:41

咋找不到教程?
页: [1] 2 3
查看完整版本: 从小白到入门-自建服务器部署家庭应用之各种教程-长期更新