在信息爆炸的时代,每个人每天都在使用各种联网应用,也在不停的产生各种属于自己隐私的数据(文本、照片、音视频等)。这些数据如果放置在互联网的网盘上,似乎不够安全,不够保险。同时,免费的网盘往往伴随着限速、限空间,无缘无故“和谐”掉一些内容,使用起来非常不顺手。于是,搭建自己的家庭服务器就变得非常有必要。
参数项 | 参数内容 | 选择理由 |
CPU | Intel(R) Celeron(R) J4125 | X86架构,64位4核CPU,性能足够、功耗低、可无风扇稳定运行 |
内存 | 16G DDR4 | 16G足够使用 |
硬盘 | 128G SSD + 2T SSD/SATA | SSD安装系统和存放应用,2T SSD/SATA存放网盘数据(省钱一点,数据盘可以利旧或者买2.5寸机械盘) |
接口 | 2 X 千兆网口+WIFI(2.4G+5G) + 若干usb口 | 1个网口作为WAN口,另外1个网口和WIFI桥接作为LAN口。USB口还可以外挂闲置的移动硬盘。 |
参数项 | 参数内容 | 实现功能 | 备注 |
OS | ubuntu Server 22.04 LTS+cockpit | 操作系统+web管理 | 最小化安装,22.04是当前最新版本 |
docker | docker-ce、docker-compose | 容器平台 | 容器需要使用的软件 |
影音系统 | jellyfin | 影音播放 | 容器安装 |
知识库 | dokuwiki | wiki形式记录知识 | 容器安装 |
网盘 | cloudreve+aria2 | 通过web、webdav使用硬盘空间,aria2实现离线下载 | 容器安装 |
密码库 | vaultwarden | 记录web密码,并实现自动填充 | 容器安装 |
#apt update#apt upgrade
包括编辑器vim、网络工具net-tools、ping命令支持iputils-ping、nslookup支持dnsutils、定时任务cron、解压缩unzip、硬盘检测工具smartmontools、防火墙firewalld。
server#apt updateserver#apt upgrade
#timedatectl set-timezone Asia/Shanghai
配置网络,增加网桥br0,目的是给后面软路由op虚拟机桥接使用。
#vi /etc/netplan/00-installer-config.yaml
样本配置文件如下:
ethernets: enp1s0: dhcp4: false optional: true enp2s0: optional: true bridges: br0: interfaces: - enp1s0 addresses: - 192.168.2.18/24 #根据个人喜欢选择自己的IP和网段 nameservers: addresses: - 8.8.8.8 search: [] routes: - to: default via: 192.168.2.1 parameters: stp: true # 打开STP协议,防止环路; version: 2 renderer: networkd
应用配置
#netplan apply
这里使用cockpit管理面板来实现远程管理,改软件有不少使用组件可以根据自己需要安装,这里安装了虚拟机管理组件 cockpit-machine。
#apt install cockpit cockpit-machine
安装必要的证书并允许 apt 包管理器使用以下命令通过 HTTPS 使用存储库:
#apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
添加 Docker 的官方 GPG 密钥:
#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加 Docker 官方库:
#echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
更新 Ubuntu 源列表:
#apt update
安装docker-ce、docker-compose
#apt install docker-ce docker-compose
docker默认的桥接网络没有开放ipv6,这里自己创建一个支持ipv6的容器网络
#docker network create --ipv6 dnet6
在自己喜欢的目录下(比如:/me)创建compose文件来实现各种功能
version: "3"#--------------------全局设置----------------------## using "docker network create --ipv6 dnet6" command to create this network first.networks: default: external: name: dnet6volumes: temp_data: driver: local driver_opts: type: none device: /data/cloudreve/data o: bind#--------------------服务开始--------------------#services: #---------nginx反向代理(本人仅用来代理密码库)--------# nginx: image: docker.io/library/nginx:latest container_name: nginx ports: - 8000:80 - "4430:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf #需要先在主机目录下创建nginx.conf配置文件 - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/html:/usr/share/nginx/html - ./nginx/log:/var/log/nginx environment: - TZ=Asia/Shanghai restart: always #--------------------知识库--------------------# dokuwiki: image: docker.io/linuxserver/dokuwiki:latest container_name: dokuwiki ports: - 8001:80 - "8043:443" environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - ./dokuwiki:/config restart: always #-------------------密码库-------------------# vaultwarden: image: docker.io/vaultwarden/server:latest container_name: vaultwarden ports: - "8002:80" environment: - WEBSOCKET_ENABLED=true - LOG_FILE=/log/bitwarden.log - ADMIN_TOKEN=your-passwrod #填写你自己的密码 #- ROCKET_TLS={certs="/ssl/server.crt.pem",key="/ssl/server.key.pem"} #有反向代理无需启用 - TZ=Asia/Shanghai volumes: - ./vaultwarden/ssl:/ssl - ./vaultwarden/data:/data - ./vaultwarden/log:/log restart: always #--------------------私家网盘--------------------# cloudreve: container_name: cloudreve image: docker.io/cloudreve/cloudreve:latest restart: always ports: - "5212:443" volumes: - temp_data:/data - ./cloudreve/uploads:/cloudreve/uploads - ./cloudreve/conf.ini:/cloudreve/conf.ini - ./cloudreve/cloudreve.db:/cloudreve/cloudreve.db - ./cloudreve/avatar:/cloudreve/avatar - ./cloudreve/ssl:/cloudreve/ssl #存放自己生成的SSL证书 depends_on: - aria2 #------------------离线下载----------------------# aria2: container_name: aria2 image: docker.io/p3terx/aria2-pro restart: always ports: - "6800:6800" environment: - RPC_SECRET=your-password #设置自己的通讯密码 - RPC_PORT=6800 - TZ=Asia/Shanghai volumes: - ./cloudreve/aria2/config:/config - temp_data:/data logging: driver: k8s-file options: max-size: 1m #------------私家影音平台-------------# jellyfin: image: lscr.io/linuxserver/jellyfin:latest container_name: jellyfin #runtime: runc ports: - "8096:8096" - "8920:8920" #optional https port 需要配置SSL证书 #- 7359:7359/udp #optional auto lan discover #- 1900:1900/udp #optional dlna port volumes: - ./jellyfin/config:/config - ./jellyfin/scripts:/custom-cont-init.d - ./media/path1:/data/media:ro #设置自己影音文件存放位置 - ./media/path2:/data/media2:ro #设置自己影音文件存放位置 devices: - /dev/dri:/dev/dri #VAAPI/NVDEC/NVENC render nodes restart: always environment: - PUID=0 #1000 means docker user;0 means root user; - PGID=0 #1000 means docker user;0 means root user; - TZ=Asia/Shanghai #- DOCKER_MODS=linuxserver/mods:jellyfin-opencl-intel #optional - auto download and install chinese font for create docker first time #- JELLYFIN_PublishedServerUrl=http://192.168.8.18/ #optional - may be necessary for docker healthcheck to pass if running in host network mode #extra_hosts: # - "host.docker.internal:host-gateway" #---------------服务结束--------------------#
进入compose.yml所在目录,并执行以下命令拉取镜像以及创建容器。
docker-compose up -d
备注:
1:喜欢用podman的人,这里可以用podman代替docker。cockpit还有专门的podman支持的插件cockpit-podman,可以实现web图形化管理podman容器。
2:以上开源软件基本都能开启HTTPS加密访问,但需要自行配置证书;
修改nginx配置文件:nginx目录/conf.d/default.conf:
server { listen 443 ssl; listen [::]:443 ssl; #http2 on; server_name domain-name; #配置自己用到的域名 # 根据需要指定 SSL 配置 ssl_certificate /etc/nginx/conf.d/server.crt.pem; ssl_certificate_key /etc/nginx/conf.d/server.key.pem; ssl_trusted_certificate /etc/nginx/conf.d/ca.crt.pem; client_max_body_size 525M; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; 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; proxy_pass http://serverip:port; #填写真实服务器的ip和端口 }
由于ipv4地址资源非常紧张,目前一般的宽带网络都没有ipv4公网地址了。但好在ipv6非常充裕,大部分人都可以获得可公网访问的ipv6地址。于是我们就可以使用ddns+ipv6来实现远程访问。
#crontab -e 按i并在文末加上下文: */5 * * * * /me/ddns/dynamic-url-perl.pl 输入:wq保存退出。这样就实现了每5分钟更新ip的动态域名了
注意点:由于该perl脚本依赖http::tiny模块,所以需要通过下面命令安装libhttp-tiny-perl
#apt install libhttp-tiny-perl
由于我的机器是intel CPU,顾需要开启intel-vt和intel_iommu特性。
在openwrt官方网站的镜像选择器中选择下载。
这里根据我cpu架构选择了x86/64,软件选择最新的发行版本,下载得到
openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz。
通过scp直接上传,命令如下:
scp d:\download\openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz user@serverip:/data/
gzip -d openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
解压后得到
openwrt-22.03.5-x86-64-generic-ext4-combined.img文件。
vi /etc/config/networkconfig interface 'lan' option device 'br-lan' option protocol 'static' option netmask '255.255.255.0' option ipaddr '192.168.1.1' #按需替换ip option ip6assign '60' option gateway '192.168.1.254' #按需替换网关 list dns '8.8.8.8'
这里的IP可以临时改成咋们局域网的一个可用IP地址,并增加以下配置以实现单臂路由上网。
uci set zerotier.openwrt_network=zerotieruci add_list zerotier.openwrt_network.join='你的网络ID'uci set zerotier.openwrt_network.enabled='1'uci commit zerotier
受篇幅影响,以上记录尽量简化(简化自本人自家搭建笔录而来),但保留了所有主要步骤,完全可以实现私家服务器、vip网盘、vip影音系统功能。当然结合容器安装更多的实用开源软件,可以实现更多的功能,只需要你的小主机依然有资源。