数据安全这个问题太过深奥、复杂,对于我们自己的个人数据,仅能做到自己能力范围内的所谓安全吧。那么我们就记录一下,目前能力范围内,能够做到的个人数据所谓安全的方案。
存储数据的类型
目前我主要存储的数据类型,且个人认为重要的有大概如下:
- 资料类,个人工作办公文档表格等图文类型文件
- 音视频类,个人或家庭照片、视频、音频等
- 软件类的,系统iso,办公软件,图片或图形处理软件等个人收藏的软件。
- 可能还有其它杂七杂八的等等
实际上个人的重要数据不是非常的多,目前有 1TB 的存储已经足有存储这些重要的东西了。各种乱七八糟的娱乐类的音视频文件,随时可以网上下载的东西,都不列为我认为的重要的数据。
如何存储这些数据
我们如何整理存储这些数据,这个也是太过于深奥、复杂,每个不同的环境、条件等等因素不同都千差万别。
目前我的存储方案
配置一台 All in One 电脑,即没有特殊情况,从来不关机的电脑做服务器硬件基础。Proxmox VE (PVE)作为底层系统(母鸡),根据各种需求来孵化各种小鸡。(所有服务器系统及软件都用官方,杜绝第三方系统及软件)
目前 Proxmox VE 孵化的小鸡:
- OpenWrt 负责家庭网关
- WordPress 负责内容管理系统
- NextCloud 负责文件管理系统
- Windows 负责各种辅助
OpenWrt 是开源的路由软件,用着放心,起码比目前市面上各种乱七八糟的华而不实的各种风险路由用得踏实。
WordPress 个人觉得负责内容管理非常完美,在有时间的时候,可以将重要的内容由 WordPress 为我们存储、发布、呈现、分享…
NextCloud 私有云,负责存储文档资料、音视频、各种软件、文件等等,这就是云存储,不过是私人的云存储。个人认为是靠谱的存储,起码比目前任何网络第三方存储靠谱。但门槛高!要自己搭建并完善这个私有云。NextCloud 给我们实现了一个同步盘,能有效避免因硬件损坏而丢失数据,还有各种版本控制,文件修改记录,且还能共享连接等等,更多关于 NextCloud 的优缺点这里不再详细介绍了。
Windows 这个不用介绍了,我相信在我生活的周边环境上,用苹果电脑的人应该非常非常少,所以都是用 Windows 的系统。这个 Windows 是运行在 Proxmox VE 小鸡上的呀,主要负责匹配 UPS 软件,安装各种下载软件(迅雷、百度云等等)作为辅助的存在。
如何备份数据
Proxmox VE 作为底层系统(母鸡)的备份,个人认为备份各种配置文件即可。
NextCloud 私有云,已经为我们实现了许多关于文件存储方面的数据安全了,因此我们只需要备份 NextCloud 服务器小鸡,就能进一步加固了我们的数据安全。
WordPress 内容管理系统,我们一样是备份 WordPress 服务器小鸡即可。
备份 Proxmox VE 母鸡
目前我发现一个备份 Proxmox VE 的脚本 prox_config_backup.sh ,非常好用。
该脚本原作者分享的 GitHub 网址 GitHub – DerDanilo/proxmox-stuff: prox_config_backup
如果手动运行脚本,我们需要先设置备份目录环境变量 export BACK_DIR="/path/to/backup/directory" 定义自己的备份目录!
如果计划任务运行脚本,我们就修改脚本默认保存备份的目录为自己需要定义的目录 _bdir=${BACK_DIR:-/mnt/backups/proxmox}
prox_config_backup.sh 脚本完整内容如下:
#!/bin/bash
# Version 0.2.2 - BETA ! !
# Date 02.20.2020
# Author DerDanilo
# Contributors aboutte, xmirakulix, bootsie123
# set vars
# always exit on error
set -e
# permanent backups directory
# default value can be overridden by setting environment variable before running prox_config_backup.sh
# example: export BACK_DIR="/mnt/pve/media/backup"
# or
# example: BACK_DIR="." ./prox_config_backup.sh
_bdir=${BACK_DIR:-/mnt/backups/proxmox}
# number of backups to keep before overriding the oldest one
MAX_BACKUPS=5
# temporary storage directory
_tdir=${TMP_DIR:-/var/tmp}
_tdir=$(mktemp -d $_tdir/proxmox-XXXXXXXX)
function clean_up {
echo "Cleaning up"
rm -rf $_tdir
}
# register the cleanup function to be called on the EXIT signal
trap clean_up EXIT
# Don't change if not required
_now=$(date +%Y-%m-%d.%H.%M.%S)
_HOSTNAME=$(hostname -f)
_filename1="$_tdir/proxmoxetc.$_now.tar"
_filename2="$_tdir/proxmoxpve.$_now.tar"
_filename3="$_tdir/proxmoxroot.$_now.tar"
_filename4="$_tdir/proxmoxcron.$_now.tar"
_filename5="$_tdir/proxmoxvbios.$_now.tar"
_filename6="$_tdir/proxmoxpackages.$_now.list"
_filename7="$_tdir/proxmoxreport.$_now.txt"
_filename8="$_tdir/proxmoxlocalbin.$_now.tar"
_filename_final="$_tdir/proxmox_backup_"$_HOSTNAME"_"$_now".tar.gz"
##########
function description {
clear
cat <<EOF
Proxmox Server Config Backup
Hostname: "$_HOSTNAME"
Timestamp: "$_now"
Files to be saved:
"/etc/*, /var/lib/pve-cluster/*, /root/*, /var/spool/cron/*, /usr/share/kvm/*.vbios"
Backup target:
"$_bdir"
-----------------------------------------------------------------
This script is supposed to backup your node config and not VM
or LXC container data. To backup your instances please use the
built in backup feature or a backup solution that runs within
your instances.
For questions or suggestions please contact me at
https://github.com/DerDanilo/proxmox-stuff
-----------------------------------------------------------------
Hit return to proceed or CTRL-C to abort.
EOF
read dummy
clear
}
function are-we-root-abort-if-not {
if [[ ${EUID} -ne 0 ]] ; then
echo "Aborting because you are not root" ; exit 1
fi
}
function check-num-backups {
if [[ $(ls ${_bdir}/*${_HOSTNAME}*.tar.gz -l | grep ^- | wc -l) -ge $MAX_BACKUPS ]]; then
local oldbackup="$(basename $(ls ${_bdir}/*${_HOSTNAME}*.tar.gz -t | tail -1))"
echo "${_bdir}/${oldbackup}"
rm "${_bdir}/${oldbackup}"
fi
}
function copyfilesystem {
echo "Tar files"
# copy key system files
tar --warning='no-file-ignored' -cvPf "$_filename1" /etc/.
tar --warning='no-file-ignored' -cvPf "$_filename2" /var/lib/pve-cluster/.
tar --warning='no-file-ignored' -cvPf "$_filename3" /root/.
tar --warning='no-file-ignored' -cvPf "$_filename4" /var/spool/cron/.
if [ "$(ls -A /usr/local/bin 2>/dev/null)" ]; then tar --warning='no-file-ignored' -cvPf "$_filename8" /usr/local/bin/.; fi
if [ "$(ls /usr/share/kvm/*.vbios 2>/dev/null)" != "" ] ; then
echo backing up custom video bios...
tar --warning='no-file-ignored' -cvPf "$_filename5" /usr/share/kvm/*.vbios
fi
# copy installed packages list
echo "Copying installed packages list from APT"
apt-mark showmanual | tee "$_filename6"
# copy pvereport output
echo "Copying pvereport output"
pvereport | tee "$_filename7"
}
function compressandarchive {
echo "Compressing files"
# archive the copied system files
tar -cvzPf "$_filename_final" $_tdir/*.{tar,list,txt}
# copy config archive to backup folder
# this may be replaced by scp command to place in remote location
cp $_filename_final $_bdir/
}
function stopservices {
# stop host services
for i in pve-cluster pvedaemon vz qemu-server; do systemctl stop $i ; done
# give them a moment to finish
sleep 10s
}
function startservices {
# restart services
for i in qemu-server vz pvedaemon pve-cluster; do systemctl start $i ; done
# Make sure that all VMs + LXC containers are running
qm startall
}
##########
description
are-we-root-abort-if-not
check-num-backups
# We don't need to stop services, but you can do that if you wish
#stopservices
copyfilesystem
# We don't need to start services if we did not stop them
#startservices
compressandarchive
恢复方法(从作者那搬过来的教程,防止GitHub打不开,懒得机器翻译了,)
On my machine, you end up with a GZipped file of about 1-5 MB with a name like “proxmox_backup_proxmoxhostname_2017-12-02.15.48.10.tar.gz”.
Depending upon how you schedule it and the size of your server, that could eventually become a space issue so don’t
forget to set up some kind of archive maintenance.
To restore, move the file back to proxmox with cp, scp, webmin, a thumb drive, whatever.
I place it back into the /var/tmp directory from where it came.
# Unpack the original backup tar -zxvf proxmox_backup_proxmoxhostname_2017-12-02.15.48.10.tar.gz # unpack the tared contents tar -xvf proxmoxpve.2017-12-02.15.48.10.tar tar -xvf proxmoxetc.2017-12-02.15.48.10.tar tar -xvf proxmoxroot.2017-12-02.15.48.10.tar # If the services are running, stop them: for i in pve-cluster pvedaemon vz qemu-server; do systemctl stop $i ; done # Copy the old content to the original directory: cp -avr /var/tmp/var/tmp/etc /etc cp -avr /var/tmp/var/tmp/var /var cp -avr /var/tmp/var/tmp/root /root # And, finally, restart services: for i in qemu-server vz pvedaemon pve-cluster; do systemctl start $i ; done
If nothing goes wrong, and you have separately restored the VM images using the default Proxmox process.
You should be back where you started. But let’s hope it never comes to that.
实际我们可以根据自己的需求,手动恢复需要的配置文件即可。
备份小鸡
OpenWrt 与 Windows 是分别运行在独立的虚拟机上,WordPress 与 NextCloud 是分别运行在独立的 LXC 容器上。
OpenWrt 我们的路由器,一般能够正常工作基本就 OK 。除了平时的日常更新,还有配置一些端口转发,DDNS,DHCP等,这些都是随机应变的配置。我觉得只要配置好基础的服务类软件然后做一个备份即可,剩下的各种日常配置修改,就根据日后的需求再做完善,不必列入计划任务去备份。
Windows 也是一样,基础配置好做一个备份即可。
备份 WordPress
WordPress 原来是跟 NextCloud 同在一个 LXC 上的,后来才独立出来运行在一个独立的 LXC 容器上,是避免受到 NextCloud 的影响,效果会更好一点。
运行 WordPress 的 LXC 容器配置是这样的
- 一核心,1GB 内存
- 根磁盘 rootfs ,存放在 LVM 盘 pve 组,120GB 固态硬盘上
- 挂载点 mp0,存放在 LVM 盘 vghddst 组,机械硬盘上
整个 WordPress 运行在根磁盘 rootfs 上
挂载点 mp0 是用于备份的:
- 计划任务执行每天备份存放数据库
- 计划任务执行每天 Rsync 同步 wp-content 目录
为 WordPress 小鸡拍快照
拍照可以保存历史,必要时候可以回到过去!
假如网站被勒索病毒了,Rsync 或 Lsyncd 同步还是无法规避这种风险,那么快照是不是就完美的应对这种风险了呢!
母鸡每天为小鸡拍一张快照,在拍快照的同时检查并保留最新的 3 张快照,删除超过 3 天的旧照。(请注意,以下拍照方案在测试阶段,这个方案从设计到测试耗了我2天哟)
#!/bin/bash
######## 必需检查或填写 VMID 与 str 参数 ########
# 需要做快照的 VM-ID 或 LXC-ID
VMID=102
# 快照名前缀
str=test
# 保留快照的数量 = 设置值(vol) - 1
vol=4
########### 以上为必需检查或填写的参数 ###########
# 年月日时分
DATE=`date +%Y%m%d%H%M`
############### 创建快照 ###############
/usr/sbin/pct snapshot $VMID "$str"_"$DATE"
# 稍微休息10秒
sleep 10
############### 保留快照与删除快照 ################
# 变量-查看快照
lssnap="/usr/sbin/pct listsnapshot ${VMID}"
# 变量-删除快照
delsnap='\/usr\/sbin\/pct delsnapshot '"$VMID"' '"$str"''
# 从列出的快照列表,排除需保留的新快照,将设置值(vol)(包括第vol个)之后的旧快照列表字符串转化为命令行
cmd=`$lssnap | grep "$str" | sort -n -r | awk '{print $2}' | sed -n "$vol",'$p' | sed '/^'"$str"'/a\sleep 8' | sed 's/.$/&\;/' | sed 's/'"$str"'/'"$delsnap"'/g'`
# 判断字符串不为空
if [ -n "$cmd" ]; then
# 执行命令
eval $cmd
else
echo "没有任何快照被删除"
fi
# 退出
exit
特别注意的是:
因为根磁盘 rootfs 与挂载点 mp0 两个虚拟磁盘,拍照就会分别为 2 个磁盘拍照,假如某天其中一个磁盘损坏,那么我们就无法通过正常的 pct 命令或 Web 管理页面上还原快照!如果需要单独还原未损坏的磁盘的快照,可以通过编辑该 LXC 小鸡配置文件(必需先备份该配置文件) /etc/pve/nodes/fzpve/lxc/102.conf 将损坏的挂载点配置删除,就能通过正常的 pct 命令或 Web 管理页面还原快照了。还原快照之后,必需注意检查并完善还原之后的配置文件 /etc/pve/nodes/fzpve/lxc/102.conf 最后才启动 LXC
其实备份数据库已经可以回到过去,但是 Rsync 我们设置的是镜像同步模式,不是增量模式,因为增量模式我目前还没有更详细的了解,或者说增量模式不适合我使用。
备份 NextCloud
运行 WordPress 的 LXC 容器配置是这样的
- 二核心,4GB 内存
- 根磁盘 rootfs ,存放在 LVM 盘 pve 组,120GB 固态硬盘上
- 挂载点 mp0 ,存放在 LVM 盘 vgssd 组,1TB 固态硬盘上
- 挂载点 mp1 ,存放在 LVM 盘 vghddst 组,机械硬盘上
rootfs 运行 Apache + MariaDB + PHP 环境
挂载点 mp0 用于存放 NextCloud 网站目录
挂载点 mp1 用于备份
- 计划任务执行每天备份存放数据库
- Lsyncd 实时同步 NextCloud 的 data 目录
- 计划任务执行每天 Rsync 同步 NextCloud 目录
为 NextCloud 小鸡拍快照
可以完全参照 WordPress 的拍照方案,但需要注意的是,我只是想拍挂载点 mp1 一个磁盘的快照,这样就必需修改一下拍照的配置,这个以后慢慢完善后,在补充上来。
2022年3月27日
NextCloud 的存储方案做了一些细微的调整:
- 挂载点 mp0 ,1TB SSD 主要负责存放重要的个人数据(目前还没200GB)
- 挂载点 mp1,1.5TB HDD 主要负责 Rsync 同步 mp0 的重要数据
- 在 mp1 上建立 NextCloud External Storage(外部存储)
- 个人 Windows 电脑 NextCloud 桌面端同步包括 External Storage 的数据。
- External Storage 目录配置为 Apache AutoIndex 作为静态资源下载站。
- 数据库备份及各种日志(快照、Rsync、等日志)推送到 External Storage 子目录。
- 子目录配置 Apache AuthConfig 密码登录授权访问
调整 NextCloud 存储原因是由于有一大部分常用的软件及系统文件,平时经常需要访问与下载,NextCloud 共享下载目录真的挺耗资源的!所以干脆将这部分从 NextCloud 核心存储转移到外部存储(External Storage),这样既腾出了本来就局促的SSD存储空间,又能将这部分静态资源由 Apache AutoIndex 负责提供下载。
Apache AutoIndex 静态下载 对比 NextCloud 共享下载,既减轻了服务器负载的同时又提高了响应速度,一举两得!
实际上还有很大一部分的不舍得删除的音视频资源,也转移到了 External Storage !这样一顿操作猛如虎之后,1TB 的 SSD 仅用了180GB左右。存储在 SSD 的重要数据共有三份镜像数据存储在不同的磁盘上,安全等级最高。存储在 External Storage 外部存储上的普通数据共有二份镜像数据存储在不同的磁盘上,安全等级一般,但对我而言也够了。
母鸡配置备份与快照方案
通过几天的摸爬打滚,母鸡为小鸡们拍照脚本如下:

