通过 GitLab 或 GitHub Pages 来提供一个 WordPress 镜像站点, 从而最小化安全问题。很久以前，我为一个家庭成员建立了一个 WordPress 博客。如今有很多选择，但是当时如果你需要一个带有所见即所得的编辑器的基于 Web 的 CMS，那么就没什么像样的的选择了。而一切运行良好的不幸的副作用是随着时间的推移该博客产生了很多内容。这意味着我要经常更新 WordPress 以防止不断出现的漏洞。因此，当我决定劝说家人切换到 Hugo 会相对容易，然后可以在 GitLab 上托管博客。但是尝试提取所有内容并将其转换为 Markdown 变成了一个巨大的麻烦。有自动脚本完成了 95% 的工作，但并不完美。手动更新所有帖子不是我想做的事情，所以最终，我放弃了试图移动博客。最近，我又开始考虑这个问题，并意识到有一个我没有考虑过的解决方案：我可以继续维护 WordPress 服务器，但将其设置为发布静态镜像，并使用 GitLab Pages（或 GitHub Pages ，如果你喜欢的话）提供服务。这能让我自动化 Let’s Encrypt 证书续订并消除与托管 WordPress 站点相关的安全问题。然而，这意味着评论将无法使用，但在这种情况下感觉就像是一个小损失，因为博客没有收到很多评论。这是我提出的解决方案，到目前为止似乎运作良好：托管 WordPress 站点中的 URL 没有链接到或来自其他任何地方，以减少它被利用的几率。在此例中，我们将使用 http://private.localconspiracy.com（即使此站点实际上是使用 Pelican 构建的）。将公共 URL https://www.localconspiracy.com 托管到 GitLab Pages 上。添加 cron 任务，确定两个 URL 之间的最后构建日期何时不同。如果构建日期不同，则镜像 WordPress 版本。使用 wget 镜像后，将所有链接从“私有”更新成“公共”。运行 git push 来发布新内容。这是我使用的两个脚本：check-diff.sh （cron 每 15 分钟调用一次）：#!/bin/bash ORIGINDATE="$(curl -v --silent http://private.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)" PUBDATE="$(curl -v --silent https://www.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)" if [ "$ORIGINDATE" != "$PUBDATE" ] then /home/doc/repos/localconspiracy/mirror.sh fimirror.sh：#!/bin/sh cd /home/doc/repos/localconspiracy wget \ --mirror \ --convert-links \ --adjust-extension \ --page-requisites \ --retry-connrefused \ --exclude-directories=comments \ --execute robots=off \ http://private.localconspiracy.com git rm -rf public/* mv private.localconspiracy.com/* public/. rmdir private.localconspiracy.com find ./public/ -type f -exec sed -i -e 's|http://private.localconspiracy|https://www.localconspiracy|g' {} \; find ./public/ -type f -exec sed -i -e 's|http://www.localconspiracy|https://www.localconspiracy|g' {} \; git add public/* git commit -m "new snapshot" git push origin master就是这些了！现在，当博客发生变化时，在 15 分钟内将网站镜像到静态版本并推送到仓库，这将在 GitLab Pages 中反映出来。如果你想在本地运行 WordPress，这个概念可以进一步扩展。在这种情况下，你不需要服务器来托管你的 WordPress 博客。你可以在本机运行它。在这种情况下，你的博客不可能被攻击利用。只要你可以在本地运行 wget，就可以使用上面的方法在 GitLab Pages 上托管 WordPress 站点。这篇文章最初发表于 Local Conspiracy。允许转载。via: https://opensource.com/article/18/8/publish-wordpress-static-gitlab-pages-site作者：Christopher Aedo 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何使用 BorgBackup、Rclone 和 Wasabi 云存储推出自己的家庭备份解决方案
使用基于开源软件和廉价云存储的自动备份解决方案来保护你的数据。几年来，我用 CrashPlan 来备份我家的电脑，包括属于我妻子和兄弟姐妹的电脑。CrashPlan 本质上是“永远在线”，不需要为它操心就可以做的规律性的备份，这真是太棒了。此外，能使用时间点恢复的能力多次派上用场。因为我通常是家庭的 IT 人员，所以我对其用户界面非常容易使用感到高兴，家人可以在没有我帮助的情况下恢复他们的数据。最近 CrashPlan 宣布，它正在放弃其消费者订阅，专注于其企业客户。我想，这是有道理的，因为它不能从像我这样的人赚到很多钱，而我们的家庭计划在其系统上使用了大量的存储空间。我决定，我需要一个合适的替代功能，包括：跨平台支持 Linux 和 Mac自动化（所以没有必要记得点击“备份”）时间点恢复（可以关闭），所以如果你不小心删除了一个文件，但直到后来才注意到，它仍然可以恢复低成本备份有多份存储，这样数据存在于多个地方（即，不仅仅是备份到本地 USB 驱动器上）加密以防备份文件落入坏人手中我四处搜寻，问我的朋友有关类似于 CrashPlan 的服务。我对其中一个 Arq 非常满意，但没有 Linux 支持意味着对我没用。Carbonite 与 CrashPlan 类似，但会很昂贵，因为我有多台机器需要备份。Backblaze 以优惠的价格（每月 5 美金）提供无限备份，但其备份客户端不支持 Linux。BackupPC 是一个强有力的竞争者，但在我想起它之前，我已经开始测试我的解决方案了。我看到的其它选项都不符合我要的一切。这意味着我必须找出一种方法来复制 CrashPlan 为我和我的家人提供的服务。我知道在 Linux 系统上备份文件有很多好的选择。事实上，我一直在使用 rdiff-backup 至少 10 年了，通常用于本地保存远程文件系统的快照。我希望能够找到可以去除备份数据中重复部分的工具，因为我知道有些（如音乐库和照片）会存储在多台计算机上。我认为我所做的工作非常接近实现我的目标。我的备份解决方案最终，我的目标落在 BorgBackup、Rclone 和 Wasabi 云存储的组合上，我的决定让我感到无比快乐。Borg 符合我所有的标准，并有一个非常健康的用户和贡献者社区。它提供重复数据删除和压缩功能，并且在 PC、Mac 和 Linux 上运行良好。我使用 Rclone 将来自 Borg 主机的备份仓库同步到 Wasabi 上的 S3 兼容存储。任何与 S3 兼容的存储都可以工作，但是我选择了 Wasabi，因为它的价格好，而且它的性能超过了亚马逊的 S3。使用此设置，我可以从本地 Borg 主机或从 Wasabi 恢复文件。在我的机器上安装 Borg 只要 sudo apt install borgbackup。我的备份主机是一台连接有 1.5TB USB 驱动器的 Linux 机器。如果你没有可用的机器，那么备份主机可以像 Raspberry Pi 一样轻巧。只要确保所有的客户端机器都可以通过 SSH 访问这个服务器，那么你就能用了。在备份主机上，使用以下命令初始化新的备份仓库：$ borg init /mnt/backup/repo1 根据你要备份的内容，你可能会选择在每台计算机上创建多个仓库，或者为所有计算机创建一个大型仓库。由于 Borg 有重复数据删除功能，如果在多台计算机上有相同的数据，那么从所有这些计算机向同一个仓库发送备份可能是有意义的。在 Linux 上安装 Borg 非常简单。在 Mac OS X 上，我需要首先安装 XCode 和 Homebrew。我遵循 how-to 来安装命令行工具，然后使用 pip3 install borgbackup。备份每台机器都有一个 backup.sh 脚本（见下文），由 cron 任务定期启动。它每天只做一个备份集，但在同一天尝试几次也没有什么不好的。笔记本电脑每隔两个小时就会尝试备份一次，因为不能保证它们在某个特定的时间开启，但很可能在其中一个时间开启。这可以通过编写一个始终运行的守护进程来改进，并在笔记本电脑唤醒时触发备份尝试。但现在，我对它的运作方式感到满意。我可以跳过 cron 任务，并为每个用户提供一个相对简单的方法来使用 BorgWeb 来触发备份，但是我真的不希望任何人必须记得备份。我倾向于忘记点击那个备份按钮，直到我急需修复（这时太迟了！）。我使用的备份脚本来自 Borg 的快速入门文档，另外我在顶部添加了一些检查，看 Borg 是否已经在运行，如果之前的备份运行仍在进行这个脚本就会退出。这个脚本会创建一个新的备份集，并用主机名和当前日期来标记它。然后用简单的保留计划来整理旧的备份集。这是我的 backup.sh 脚本：#!/bin/sh REPOSITORY=borg@borgserver:/mnt/backup/repo1 #Bail if borg is already running, maybe previous run didn't finish if pidof -x borg >/dev/null; then echo "Backup already running" exit fi # Setting this, so you won't be asked for your repository passphrase: export BORG_PASSPHRASE='thisisnotreallymypassphrase' # or this to ask an external program to supply the passphrase: export BORG_PASSCOMMAND='pass show backup' # Backup all of /home and /var/www except a few # excluded directories borg create -v --stats \ $REPOSITORY::'{hostname}-{now:%Y-%m-%d}' \ /home/doc \ --exclude '/home/doc/.cache' \ --exclude '/home/doc/.minikube' \ --exclude '/home/doc/Downloads' \ --exclude '/home/doc/Videos' \ --exclude '/home/doc/Music' \ # Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly # archives of THIS machine. The '{hostname}-' prefix is very important to # limit prune's operation to this machine's archives and not apply to # other machine's archives also. borg prune -v --list $REPOSITORY --prefix '{hostname}-' \ --keep-daily=7 --keep-weekly=4 --keep-monthly=6 备份的输出如下所示：------------------------------------------------------------------------------ Archive name: x250-2017-10-05 Archive fingerprint: xxxxxxxxxxxxxxxxxxx Time (start): Thu, 2017-10-05 03:09:03 Time (end): Thu, 2017-10-05 03:12:11 Duration: 3 minutes 8.12 seconds Number of files: 171150 ------------------------------------------------------------------------------ Original size Compressed size Deduplicated size This archive: 27.75 GB 27.76 GB 323.76 MB All archives: 3.08 TB 3.08 TB 262.76 GB Unique chunks Total chunks Chunk index: 1682989 24007828 ------------------------------------------------------------------------------ [...] Keeping archive: x250-2017-09-17 Sun, 2017-09-17 03:09:02 Pruning archive: x250-2017-09-28 Thu, 2017-09-28 03:09:02 我在将所有的机器备份到主机上后，我遵循安装预编译的 Rclone 二进制文件指导，并将其设置为访问我的 Wasabi 帐户。此脚本每天晚上运行以将任何更改同步到备份集：#!/bin/bash set -e repos=( repo1 repo2 repo3 ) #Bail if rclone is already running, maybe previous run didn't finish if pidof -x rclone >/dev/null; then echo "Process already running" exit fi for i in "${repos[@]}" do #Lets see how much space is used by directory to back up #if directory is gone, or has gotten small, we will exit space=`du -s /mnt/backup/$i|awk '{print $1}'` if (( $space < 34500000 )); then echo "EXITING - not enough space used in $i" exit fi /usr/bin/rclone -v sync /mnt/backup/$i wasabi:$i >> /home/borg/wasabi-sync.log 2>&1 done 第一次用 Rclone 同步备份集到 Wasabi 花了好几天，但是我大约有 400GB 的新数据，而且我的出站连接速度不是很快。但是每日的增量是非常小的，能在几分钟内完成。恢复文件恢复文件并不像 CrashPlan 那样容易，但是相对简单。最快的方法是从存储在 Borg 备份服务器上的备份中恢复。以下是一些用于恢复的示例命令：#List which backup sets are in the repo $ borg list borg@borgserver:/mnt/backup/repo1 Remote: Authenticated with partial success. Enter passphrase for key ssh://borg@borgserver/mnt/backup/repo1: x250-2017-09-17 Sun, 2017-09-17 03:09:02 #List contents of a backup set $ borg list borg@borgserver:/mnt/backup/repo1::x250-2017-09-17 | less #Restore one file from the repo $ borg extract borg@borgserver:/mnt/backup/repo1::x250-2017-09-17 home/doc/somefile.jpg #Restore a whole directory $ borg extract borg@borgserver:/mnt/backup/repo1::x250-2017-09-17 home/doc 如果本地的 Borg 服务器或拥有所有备份仓库的 USB 驱动器发生问题，我也可以直接从 Wasabi 直接恢复。如果机器安装了 Rclone，使用 rclone mount，我可以将远程存储仓库挂载到本地文件系统：#Mount the S3 store and run in the background $ rclone mount wasabi:repo1 /mnt/repo1 & #List archive contents $ borg list /mnt/repo1 #Extract a file $ borg extract /mnt/repo1::x250-2017-09-17 home/doc/somefile.jpg 它工作得怎样现在我已经使用了这个备份方法几个星期了，我可以说我真的很高兴。设置所有这些并使其运行当然比安装 CrashPlan 要复杂得多，但这就是使用你自己的解决方案和使用服务之间的区别。我将不得不密切关注以确保备份继续运行，数据与 Wasabi 正确同步。但是，总的来说，以一个非常合理的价格替换 CrashPlan 以提供相似的备份覆盖率，结果比我预期的要容易一些。如果你看到有待改进的空间，请告诉我。这最初发表在 Local Conspiracy，并被许可转载。作者简介：Christopher Aedo - Christopher Aedo 自从大学时开始就一直在用开源软件工作并为之作出贡献。最近他在领导一支非常棒的 IBM 上游开发团队，他们也是开发支持者。当他不在工作或在会议上发言时，他可能在俄勒冈州波特兰市使用 RaspberryPi 酿造和发酵美味的自制啤酒。via: https://opensource.com/article/17/10/backing-your-machines-borg作者：Christopher Aedo 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
怎样在家用 Python 和树莓派搭建一个家用便携的自制酿啤酒装置大约十年前我开始酿制自制啤酒，和许多自己酿酒的人一样，我开始在厨房制造提纯啤酒。这需要一些设备并且做出来后确实是好的啤酒，最终，我用一个放入了所有大麦的大贮藏罐作为我的麦芽浆桶。几年之后我一次酿制过 5 加仑啤酒，但是酿制 10 加仑时也会花费同样的时间和效用（只是容器比之前大些），之前我就是这么做的。容量提升到 10 加仑之后，我偶然看到了 StrangeBrew Elsinore ，我意识到我真正需要的是将整个酿酒过程转换成全电子化的，用树莓派来运行它。建造自己的家用电动化酿酒系统需要大量这方面的技术信息，许多学习酿酒的人是在 TheElectricBrewery.com 这个网站起步的，只不过将那些控制版搭建在一起是十分复杂的，尽管最简单的办法在这个网站上总结的很好。当然你也能用一个小成本的方法并且依旧可以得到相同的结果 —— 用一个热水壶和热酒容器通过一个 PID 控制器来加热你的酿酒原料。但是我认为这有点太无聊（这也意味着你不能体验到完整的酿酒过程）。需要用到的硬件在我开始我的这个项目之前, 我决定开始买零件，我最基础的设计是一个可以将液体加热到 5500 瓦的热酒容器（HLT）和开水壶，加一个活底的麦芽浆桶，我通过一个 50 英尺的不锈钢线圈在热酒容器里让泵来再循环麦芽浆（"热量交换再循环麦芽浆系统, 也叫 HERMS）。同时我需要另一个泵来在热酒容器里循环水，并且把水传输到麦芽浆桶里，整个电子部件全部是用树莓派来控制的。建立我的电子酿酒系统并且尽可能的自动化意味着我需要以下的组件：一个 5500 瓦的电子加热酒精容器（HLT）能够放入加热酒精容器里的 50 英尺（0.5 英寸）的不锈钢线圈（热量交换再循环麦芽浆系统）一个 5500 瓦的电子加热水壶多个固态继电器加热开关2 个高温食品级泵泵的开关用继电器可拆除装置和一个硅管不锈钢球阀一个测量温度的探针很多线一个来容纳这些配件的电路盒子酿酒系统 (photo by Christopher Aedo. CC BY-SA 4.0)建立酿酒系统的电气化方面的细节 The Electric Brewery 这个网站概括的很好，这里我不再重复，当你计划用树莓派代替这个 PID 控制器的话，你可以读以下的建议。一个重要的事情需要注意，固态继电器（SSR）信号电压，许多教程建议使用一个 12 伏的固态继电器来关闭电路，树莓派的 GPIO 针插口只支持 3 伏输出电压，然而，必须购买继电器将电压变为 3 伏。Inkbird SSR (photo by Christopher Aedo. CC BY-SA 4.0)要运行酿酒系统，你的树莓派必须做两个关键事情：测量来自几个不同位置的温度，用继电器开关来控制加热元件，树莓派很容易来处理这些任务。这里有一些不同的方法来将温度传感器连到树莓派上，但是我找到了最方便的方法用单总线。这就可以让多个传感器分享相同的线路（实际上是三根线），这三根线可以使酿酒系统的多个设备更方便的工作，如果你要从网上找一个防水的 DS18B20 温度传感器，你可以会找到很多选择。我用的是日立 DS18B20 防水温度传感器。要控制加热元件，树莓派包括了几个用来软件寻址的总线扩展器（GPIO），它会通过在某个文件写入 0 或者 1 让你发送3.3v 的电压到一个继电器，在我第一次了解树莓派是怎样工作的时候，这个用 GPIO 驱动继电器的树莓派教程对我来说是最有帮助的，总线扩展器控制着多个固态继电器，通过酿酒软件来直接控制加热元件的开关。我首先将所有部件放到这个电路盒子，因为这将成为一个滚动的小车，我要让它便于移动，而不是固定不动的，如果我有一个店（比如说在车库、工具房、或者地下室），我需要要用一个装在墙上的更大的电路盒，而现在我找到一个大小正好的防水工程盒子，能放进每件东西，最后它成为小巧紧凑工具盒，并且能够工作。在左下角是和树莓派连接的为总线扩展器到单总线温度探针和固态继电器的扩展板。要保持 240v 的固态继电器温度不高，我在盒子上切了个洞，在盒子的外面用 CPU 降温凝胶把铜片散热片安装到盒子外面的热槽之间。它工作的很好，盒子里没有温度上的问题了，在盒子盖上我放了两个开关为 120v 的插座，加两个240v 的 led 来显示加热元件是否通电。我用干燥器的插座和插头，所以可以很容易的断开电热水壶的连接。首次尝试每件事情都工作正常。（第一次绘制电路图必有回报）这个照片来自“概念”版，最终生产系统应该有两个以上的固态继电器，以便 240v 的电路两个针脚能够切换，另外我将通过软件来切换泵的开关。现在通过盒子前面的物理开关控制它们，但是也很容易用继电器控制它们。控制盒子 (photo by Christopher Aedo. CC BY-SA 4.0)唯一剩下有点棘手的事情是温度探针的压合接头，这个探针安装在加热酒精容器和麦芽浆桶球形的最底部阀门前的 T 字型接头上。当液体流过温度传感器，温度可以准确显示。我考虑加一个套管到热水壶里，但是对于我的酿造工艺没有什么用。最后，我买到了四分之一英寸的压合接头，它们工作完美。软件一旦硬件整理好，我就有时间来处理软件了，我在树莓派上跑了最新的 Raspbian 发行版，操作系统方面没有什么特别的。我开始使用 Strangebrew Elsinore 酿酒软件，当我的朋友问我是否我听说过 Hosehead（一个基于树莓派的酿酒控制器），我找到了 Strangebrew Elsinore 。我认为 Hosehead 很棒，但我并不是要买一个酿酒控制器，而是要挑战自己，搭建一个自己的。设置 Strangebrew Elsinore 很简单，其文档直白，没有遇到任何的问题。尽管 Strangebrew Elsinore 工作的很好，但在我的一代树莓派上运行 java 有时是费力的，不止崩溃一次。我看到这个软件开发停顿也很伤心，似乎他们也没有更多贡献者的大型社区（尽管有很多人还在用它）。CraftBeerPi之后我偶然遇到了一个用 Python 写的 CraftbeerPI，它有活跃的贡献者支持的开发社区。原作者（也是当前维护者） Manuel Fritsch 在贡献和反馈问题处理方面做的很好。克隆这个仓库然后开始只用了我一点时间。其 README 文档也是一个连接 DS1820 温度传感器的好例子，同时也有关于硬件接口到树莓派或者芯片电脑 的注意事项。在启动的时候，CraftbeerPI 引导用户通过一个设置过程来发现温度探针是否可用，并且让你指定哪个 GPIO 总线扩展器指针来管理树莓派上哪个配件。CraftBeerPi (photo by Christopher Aedo. CC BY-SA 4.0)用这个系统进行自制酿酒是容易的，我能够依靠它掌握可靠的温度，我能输入多个温度段来控制麦芽浆温度，用CraftbeerPi 酿酒的日子有一点点累，但是我很高兴用传统的手工管理丙烷燃烧器的“兴奋”来换取这个系统的有效性和持续性。CraftBeerPI 的用户友好性鼓舞我设置了另一个控制器来运行“发酵室”。就我来说，那是一个二手冰箱，我用了 50 美元加上放在里面的 25 美元的加热器。CraftBeerPI 很容易控制电器元件的冷热，你也能够设置多个温度阶段。举个例子，这个图表显示我最近做的 IPA 进程的发酵温度。发酵室发酵麦芽汁在 67F° 的温度下需要 4 天，然后每 12 小时上升一度直到温度到达 72F°。剩下两天温度保持不变是为了双乙酰生成。之后 5 天温度降到 65F°，这段时间是让啤酒变“干”，最后啤酒发酵温度直接降到 38F°。CraftBeerPI 可以加入各个阶段，让软件管理发酵更加容易。SIPA 发酵设置 (photo by Christopher Aedo. CC BY-SA 4.0)我也试验过用液体比重计来对酵啤酒的比重进行监测，通过蓝牙连接的浮动传感器可以达到。有一个整合的计划能让 CraftbeerPi 很好工作，现在它记录这些比重数据到谷歌的电子表格里。一旦这个液体比重计能连接到发酵控制器，设置的自动发酵设置会基于酵母的活动性直接运行且更加容易，而不是在 4 天内完成主要发酵，可以在比重稳定 24 小时后设定温度。像这样的一些项目，构想并计划改进和增加组件是很容易，不过，我很高兴今天经历过的事情。我用这种装置酿造了很多啤酒，每次都能达到预期的麦芽汁比率，而且啤酒一直都很美味。我的最重要的消费者 —— 就是我！很高兴我可以随时饮用。随时饮用 (photo by Christopher Aedo. CC BY-SA 4.0)这篇文章基于 Christopher 的开放的西部的讲话《用Linux、Python 和树莓派酿制啤酒》。（题图：Quinn Dombrowski. Modified by Opensource.com. CC BY-SA 4.0）作者简介：Christopher Aedo 从他的学生时代就从事并且贡献于开源软件事业。最近他在 IBM 领导一个极棒的上游开发者团队，同时他也是开发者拥护者。当他不再工作或者实在会议室演讲的时候，他可能在波特兰市俄勒冈州用树莓派酿制和发酵一杯美味的啤酒。via: https://opensource.com/article/17/7/brewing-beer-python-and-raspberry-pi作者：Christopher Aedo 译者：hwlife 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出