0%

无 80 端口申请 Letsencrypt 免费 SSL 证书

从 2018年1月份开始 letsencrypt 支持泛域名了,这让我们部署各种 WEB 应用省了很多功夫,终于不需要维护多个子域名的证书更新,直接使用泛域名证书就好了。

泛域名:*.example.com 这样的域名,就是泛域名。

acme.sh

另向大家浓重介绍由国人利用 shell 脚本开发的 acme.sh 脚本,这脚本使用方便,兼容各种 Linux 系统。他本身就是一个 shell 脚本,仅仅依赖 curlacme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。

acme.sh 支持 '--webroot', '--standalone', '--apache', '--nginx' or '--dns' 5种证书申请模式,熟悉 certbot 的朋友对前面两种一定不陌生。

使用详情可以看acme.sh 中文文档

作为家庭部署 WEB SSL 业务来说,面临最大的问题就是没有 80 端口,这令申请证书尤为困难。而 acme.sh 最后一种申请证书模式 --dns 模式,它支持 41 个域名商的 API,可以实现全自动利用 API 来生成 dns txt 解析,从而实现域名鉴权工作。

参阅 How to use DNS API

acme.sh 使用方法

acme.sh 安装

安装方法参考 acme.sh 中文文档

为了方便大家,我照搬过来。

安装很简单, 一个命令:

1
2
curl  https://get.acme.sh | sh

普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:

  1. 把 acme.sh 安装到你的 home 目录下:
1
2
~/.acme.sh/

并创建 一个 bash 的 alias, 方便你的使用: acme.sh=~/.acme.sh/acme.sh

2). 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

acme.sh 生成证书

这里我只列举 --dns 的使用方法。

这边我用阿里云作为例子。

1.前往阿里云申请 Access keys

  1. 登录云服务器管理控制台

  2. 单击页面顶部的 Access Keys,或直接单击 Access Keys 管理控制台

aliyun_access_keys-01

  1. 创建您的 Access Key。

aliyun_access_keys-02

Access Key IDAccess Key Secret 记录下来待会备用。

2.使用 acme.sh --dns 模块获取 Letsencrypt 证书

  1. 首先录入阿里云的 Access Key IDAccess Key Secret 到环境变量。

注:这里假设我在上一步中获得的 Access Key ID= sdfsdfsdfljlbjkljlkjsdfoiwje,Access Key Secret = jlsdflanljkljlfdsaklkjflsa

1
2
$ export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
$ export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
  1. 执行 acme.sh 命令申请证书

注:example.com 为阿里云申请的域名

1
./acme.sh --issue --dns dns_ali -d example.com

申请完毕后可以到 ~/.acme.sh/example.com 查看你的证书

1
2
3
4
5
6
7
8
9
10
11
12
13
nero@debian:~/.acme.sh/example.com$ ls -al
.
..
ca.cer
chain.pem -> ca.cer
fullchain.cer
fullchain.pem -> fullchain.cer
example.com.cer
example.com.conf
example.com.csr
example.com.csr.conf
example.com.key
privkey.pem -> example.com.key

Docker 使用 acme.sh

acme.sh 作者做了个 13M的容器 neilpang/acme.sh

docker 使用起来比上面更简单。

Pull 镜像

1
$ docker pull neilpang/acme.sh

创建 acme.sh 证书保存目录

因为要将 acme.sh 的证书保存在本地方便操作,所以需要建立一个目录保存证书。

1
$ mkdir ~/acme.sh

运行 acme.sh 容器

1. 申请证书

注1:这里假设我在阿里云中获得的 Access Key ID= sdfsdfsdfljlbjkljlkjsdfoiwje,Access Key Secret = jlsdflanljkljlfdsaklkjflsa
注2:example.com 为阿里云申请的域名

1
2
3
4
5
$ docker run --rm \
-v ~/acme.sh:/acme.sh \
-e Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" \
-e Ali_Secret="jlsdflanljkljlfdsaklkjflsa" \
neilpang/acme.sh --issue --dns dns_ali -d example.com

这一步有时候是因为 https://acme-v01.api.letsencrypt.org 无法访问导致报错,这时候可以尝试多几次,回显输出 Sleep 120 seconds for the txt records to take effect 的时候,就证明正在设置 txt 解析,等120秒解析生效就可以申请证书下来了。

2. 已守护进程方式运行 acme.sh 容器

1
2
3
4
$ docker run --name acme.sh \
-d --restart unless-stopped \
-v ~/acme.sh:/acme.sh \
neilpang/acme.sh daemon

至此 acme.sh 证书到60天就会自动更新。

入坑智能家居三个月,学习了不少,发现很多人对 Hassio 存在一定的误解,所以这边先说明一下 hassio 到底是什么,和homeassistant 到底有什么的关系。

首先希望大家要清晰一点,Hassio 并不是一个操作系统,他仅仅是一个软件部署的架构,并不是一个系统,而官方文档上的 hassio 树莓派固件其实只是官方已经将 hassio 安装在 ResinOS 上面罢了,但是官方可能出于安全性和稳定性,不让用于拥有底层系统的 shell 权限,故此我并不推荐使用这个系统刷到树莓派来使用 hassio。

hassio 架构图

hassio

从架构图可以看出,hassio 是安装在操作系统层面上的一个软件,他本身是一个 Docker 容器,同时 hassio 也具有 Docker 的控制权限。

另系统层面上还有一个叫 hassio-hc 的脚本在运行,这个脚本会建立一个 sock 文件并建立 hassio 容器的时候用 -v 映射到 hassio 容器内部供容器使用。

Home-Assistant 则是跑在 Docker 下面的另一个容器,它享有与本机一样的网络状态,通过网络与 hassio 联系(应该是类似 Rest_api 的方式互通),而 Home-Assistant 则负责前端显示,hassio 角色像是作为 Home-Assistant 的一个插件那样存在。

Addons 是依赖于 Hassio 存在的,这些插件其实就是基于 Hassio 规范设计的 Docker 容器,发布到 Docker Hub、Github 方便 Hassio 调用。

hassio 启动分析

通过 hassio 启动分析,我们才能更好的了解 hassio 的角色和功能。

通过分析 hassio 一键安装脚本hassio_install,其实脚本就做了两件事。

1、检测本地系统内核类别,确定 hassio 的容器名称。

下面是代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
case $ARCH in

"i386" | "i686")

MACHINE=${MACHINE:=qemux86}

HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

HASSIO_DOCKER="$DOCKER_REPO/i386-hassio-supervisor"

;;

"x86_64")

MACHINE=${MACHINE:=qemux86-64}

HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

HASSIO_DOCKER="$DOCKER_REPO/amd64-hassio-supervisor"

;;

"arm" | "armv7l" | "armv6l")

if [ -z $MACHINE ]; then

echo "[ERROR] Please set machine for $ARCH"

exit 1

fi

HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

HASSIO_DOCKER="$DOCKER_REPO/armhf-hassio-supervisor"

;;

"aarch64")

if [ -z $MACHINE ]; then

echo "[ERROR] Please set machine for $ARCH"

exit 1

fi

HOMEASSISTANT_DOCKER="$DOCKER_REPO/$MACHINE-homeassistant"

HASSIO_DOCKER="$DOCKER_REPO/aarch64-hassio-supervisor"

;;

*)

echo "[ERROR] $ARCH unknown!"

exit 1

;;

esac

这里就指明了什么平台下载什么 hassio 容器名称。

2、将 hassio-supervisor.servicehassio-hc.service 注册为服务。

那么这个 hassio-hc 是干什么的呢?我们可以到这里看看 hassio-hc 的代码。

上面的 hassio-hc.service 启动脚本之前会使用 socat 创建一个 hassio-hc.sock ,如果收到信息的话就执行 hassio-hc 脚本,见下面命令

1
/usr/bin/socat UNIX-LISTEN:/var/run/hassio-hc.sock,fork EXEC:%%BIN_DIR%%/hassio-hc

而 hassio-hc 则负责处理收到的信息,他有 info、reboot、shutdown、update 等参数控制,其实说白了就是 hassio 控制宿主用的一些命令,通过他们来控制系统的重启、更新、关机等操作。

接下来我们再看看 hassio-supervisor.service

1
2
3
ExecStartPre=-/usr/bin/docker stop hassio_supervisor 
ExecStart=%%BIN_DIR%%/hassio-start
ExecStop=-/usr/bin/docker stop hassio_supervisor

懂 systemd 的人应该不难看出,hassio 注册为服务,启动的时候先用 docker 指令停掉 hassio_supervisor 再运行 hassio-start 脚本。接下来看下 hassio-start 脚本是做什么的。

学过 docker 的朋友一看就发现了这样一个东西。

1
2
3
4
5
6
7
8
9
10
11
12
runSupervisor() { 
docker rm --force hassio_supervisor || true
docker run --name hassio_supervisor \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/run/hassio-hc.sock:/var/run/hassio-hc.sock \
-v /var/run/dbus:/var/run/dbus \
-v %%DATA_SHARE%%:/data \
-e SUPERVISOR_SHARE=%%DATA_SHARE%% \
-e SUPERVISOR_NAME=hassio_supervisor \
-e HOMEASSISTANT_REPOSITORY=%%HOMEASSISTANT_IMAGE%% \
%%SUPERVISOR_IMAGE%%
}

第一条 docker rm 就是删除 hassio_supervisor 容器

第二条 docker run 就是运行 hassio_supervisor 容器,而 %%SUPERVISOR_IMAGE%% 在一键安装脚本的时候就会根据平台的内核来命名。如果是x86_64的平台用一键脚本安装后应该是如下这样。

1
2
3
4
5
6
7
8
9
10
11
12
runSupervisor() {
docker rm --force hassio_supervisor || true #删除 hassio_supervisor 容器
docker run --name hassio_supervisor \ #运行 homeassistant/amd64-hassio-supervisor 容器命名为 hassio_supervisor
-v /var/run/docker.sock:/var/run/docker.sock \ #将 docker.sock 映射到容器内部
-v /var/run/hassio-hc.sock:/var/run/hassio-hc.sock \ #将 hassio-hc.sock 映射到容器内部
-v /usr/share/hassio:/data \ #将 /usr/share/hassio 映射到容器内部,这就是 hassio 的所有配置目录
-v /var/log/supervisor-log:/var/log \ #将日志文件夹映射到容器内部,为了持久化 hassio 日志
-e SUPERVISOR_SHARE=/usr/share/hassio \ #定义 hassio 的配置文件路径
-e SUPERVISOR_NAME=hassio_supervisor \ #定义 hassio docker 名称
-e HOMEASSISTANT_REPOSITORY=homeassistant/qemux86-64-homeassistant \ #定义homeassistant容器名称,想自定义自己的 homeassistant,可以将容器发布到 hub.docker.com 然后修改这里的容器名就好了。
homeassistant/amd64-hassio-supervisor
}

现在已经很清晰了,hassio 启动的时候,会获得 docker 的控制权,然后再向 hub.docker.com 拉取镜像,然后整个系统都是运行在 docker 里面。故此,hassio 仅仅需要 docker 就好了,其余官方脚本 install 中其余依赖,其实都是给 hassio-hc (也就是重启、更新、关闭操作系统)用的。故此,群晖运行 hassio,仅需以下步骤即可。

群晖运行 hassio 步骤

1. 创建 hassio 运行需要的文件夹

上文提到,运行 hassio 的容器的时候,需要两个路径,一个是 hassio 配置文件夹,一个是 hassio 日志文件夹。

我是这样设置的,大家可以按照自己的需求设置。

DSM-hassio-config-dir-01

DSM-hassio-config-dir-02

2. 在群晖 ssh 中使用 docker 命令运行 hassio

为什么一定要用 ssh 中的 docker 命令执行?

因为上面也说道,hassio 需要取得 docker 控制权,所以我们需要将系统内部的 docker.sock 映射到系统内部,而群晖的 docker 界面我没法找到映射 docker.sock 的方法,所以用命令执行是最方便的啦。

1
2
3
4
5
6
7
8
docker run -d --restart=always --name hassio_supervisor \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /volume1/docker/hassio:/data \
-v /volume1/docker/hassio/supervisor-log:/var/log \
-e SUPERVISOR_SHARE=/volume1/docker/hassio \
-e SUPERVISOR_NAME=hassio_supervisor \
-e HOMEASSISTANT_REPOSITORY=homeassistant/qemux86-64-homeassistant \
homeassistant/amd64-hassio-supervisor

运行命令后,我们会看到一个叫 homeassistant/qemux86-64-homeassistant:landingpage 的镜像在运行,这个其实就是那个 Preparing Hass.io 的页面而已,就是因为树莓派刷了 hassio 而没有修改 docker 的源,导致网络慢啦取镜像下来非常非常慢,而 qemux86-64-homeassistant 要300多兆,国内的网络状态,可想而知速度有多慢,我群晖更换了 docker 源,拉取下来也要几分钟时间,所以官方就做了一个 landingpage 的分支镜像,让刷了树莓派的人能够看到系统在干嘛,其实系统就是在 pull qemux86-64-homeassistant 镜像下来啦。

我们可以看 hassio_supervisor 的日志看到下面这一行。

1
18-01-24 12:47:01 INFO (SyncWorker_0) [hassio.docker.interface] Pull image homeassistant/qemux86-64-homeassistant tag 0.61.1.

这样就只有等了,等 pull 完,就会出现 homeassistant 的界面了。

值得注意的是,如果不小心写错路径,又执行了上面的 docker run 命令,那么需要将 hassio_supervisor 删掉再重新执行命令,否则会报名字已存在,导致 docker run 命令出错。

1
docker rm -f hassio_supervisor

3. 想在 hassio 中修复历史转圈的问题?

那么可以将上面的启动 hassio 命令改成下面的样子。

1
2
3
4
5
6
7
8
docker run -d --restart=always --name hassio_supervisor \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /volume1/docker/hassio:/data \
-v /volume1/docker/hassio/supervisor-log:/var/log \
-e SUPERVISOR_SHARE=/volume1/docker/hassio \
-e SUPERVISOR_NAME=hassio_supervisor \
-e HOMEASSISTANT_REPOSITORY=neroxps/qemux86-64-homeassistant \
homeassistant/amd64-hassio-supervisor

如果已经运行过 hassio 的话,那么可以先在群晖下删除原来的 hassio 镜像,再运行咯。

对比上面的命令会发现 neroxps/qemux86-64-homeassistant 这个容器其实是我根据 homeassistant/qemux86-64-homeassistant 容器修改的,详情可以看这个帖子发布 hassio 的 homeassistant 镜像(仅支持amd64)

4. 启动后没有 hassio 怎么办?

当 homeassistant 启动之后,进去发现没有 hassio 菜单,查日志发现是无法连通 hassio api,查了下 hassio.py 这个插件,发现建立 homeassistant 容器的时候传递了一个 $HASSIO 的变量给homeassistant,这个变量记录了 hassio 的ip地址,而这个ip地址就是 hassio bridge 里面的 ip。

原来当 hassio 运行时候,会初始化一个 hassio bridge,用于分配给所有 hassio addons 的容器,但是当这个 bridge 建立好后,route 里面却没有记录 hassio 网络接口的本地路由条目,导致网络无法连通,具体为什么连不通,可能是群晖的 docker 问题,也可能是群晖网络问题,对 ip bridge 不太熟悉,所以就不知其原因了。

最后我发现一个解决方案,可以通过重启 hassio 网络接口来修复这个问题。

1
2
ifconfig hassio down
ifconfig hassio up

运行后重启 homeassistant 即可。

我写了个脚本,将这个脚本放到群晖一个目录里面(什么目录都可以自己喜欢),然后利用群晖的计划任务来启动脚本,达到修复 hassio 网路不运作的问题。

如果重启后发现 homeassistant 依然无法找到 hassio,请使用 root 账号登陆群晖 ssh,找到 /var/log/hassio-network.log 贴出来回帖吧。

群晖 hassio 下已知问题

  • homebridge 有时候重启群晖会启动失败,建议使用 marcoraddatz/homebridge 代替,不是用 addons 的 homebridge 就没问题了。

  • FTP 重启后启动失败,具体为什么启动失败我还没查到,但是只要在 hassio 中启动 FTP 就修复了。

最后给新手的忠告

hassio 的确方便,但方便的代价是排错困难,当你不了解 homeassistant 的配置文档,不了解 homeassistant 的架构,先从 hassio 入手的话,出错了自己会一脸茫然,然后就出现各种 hassio
为何不稳定啊,hassio 封闭的说法。

其实 hassio 是集成了 docker 的所有优点,docker 是什么,就是一个集装箱,他将所有的环境都封装好,不需要你管环境的问题,开发者已经将所有的环境问题解决了。

我这里建议,先学 homeassistant 的尽量看看论坛置顶帖的手动部署文档,先让 homeassistant 跑起来,等坑填的差不多了,再学习下 docker 的基本使用方法,对要学习 docker,因为 hassio 的所有插件都是跑在 docker 下,如果学会 docker 你将受用终身。

我推荐的部署环境是 debian(ubuntu等) + docker + hassio。树莓派的用户也适用,homeassistant 这种开源系统,不要想他能有多简单,即使出了 UI 配置,也需要底层运维支持。千万不要刷官方的那个 hassio(即使开了 SSH) ,因为你不懂 linux 系统,而且还要从一个非常少资料查询的系统开始学起,无疑是开启了困难模式。

祝大家好运。

本文参考自 http://www.cnblogs.com/VAllen/p/Docker-for-windows-on-VMware.html

1. 安装 docker for windows

我是使用 docker for windows 的 msi 文件安装的,如果是使用 DockerToolbox.exe 安装请看上方参考文本。

安装过程十分简单,这里不赘述。

2. 下载 VMware Workstation 驱动支持

下载最新的 docker-machine-vmwareworkstation

将下载下来的 docker-machine-driver-vmwareworkstation.exe 放到 C:\Program Files\Docker\Docker\resources\bin

3. 新建 machine

打开 Xshell,Xshell 自带 windows 终端模拟功能。

运行 docker-machine ls

1
2
3
PS C:\Users\nero> docker-machine.exe ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * vmwareworkstation Running tcp://192.168.140.129:2376 v17.09.1-ce

默认应该什么都没有,我这里已经部署好所以会出现 default。

可以执行 docker-machine stop default && docker-machine rm default 来结束并删除这个 machine。

创建支持 vmware 的 machine docker-machine create --driver=vmwareworkstation default

启用 docker-machine active default

4. 修改 Docker 源为国内源

在 Xshell 下执行 docker-machine.exe ssh default

这时候会链入一个 Linux 的虚拟机里,其实这个就是 Docker 的虚拟机咯。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[c:\~]$ docker-machine.exe ssh default
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.09.1-ce, build HEAD : e7de9ae - Fri Dec 8 19:41:36 UTC 2017
Docker version 17.09.1-ce, build 19e2cf6
docker@default:~$

接下来修改配置文件 sudo vi /var/lib/boot2docker/profile

--label provider=vmwareworkstation的下一行添加 --registry-mirror https://registry.docker-cn.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14

EXTRA_ARGS='
--label provider=vmwareworkstation
--registry-mirror https://registry.docker-cn.com

'
CACERT=/var/lib/boot2docker/ca.pem
DOCKER_HOST='-H tcp://0.0.0.0:2376'
DOCKER_STORAGE=aufs
DOCKER_TLS=auto
SERVERKEY=/var/lib/boot2docker/server-key.pem
SERVERCERT=/var/lib/boot2docker/server.pem


保存后运行退出 ssh

运行 docker-machine restart

5. powershell 启用后端

创建 powershell 启动运行脚本

1
2
New-item –type file –force $profile
Notepad $profile

打开记事本之后输入

1
& docker-machine.exe env default | Invoke-Expression

保存退出。

关闭 powershell 再次运行的时候会遇到 在此系统中禁止执行脚本解决方法,这时候以管理员身份运行 Powershell 输入以下命令。

1
2
3
4
5
set-executionpolicy remotesigned
执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如
http://go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”): y

以上禁止执行脚本解决方法参考自 PowerShell在此系统中禁止执行脚本解决方法

再次运行 powershell ,再运行 docker info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
PS C:\Users\nero> docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.09.1-ce
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 06b9cb35161009dcb7123345749fef02f7cea8e0
runc version: 3f2f8b84a77f73d38244dd690525642a72156c64
init version: 949e6fa
Security Options:
seccomp
Profile: default
Kernel Version: 4.4.104-boot2docker
Operating System: Boot2Docker 17.09.1-ce (TCL 7.2); HEAD : e7de9ae - Fri Dec 8 19:41:36 UTC 2017
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 995.7MiB
Name: default
ID: GDCJ:VXO6:STS3:IGS5:YU2P:ALGO:L22U:4RV7:62ON:O3F2:X53E:MPBC
Docker Root Dir: /mnt/sda1/var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: 17
Goroutines: 27
System Time: 2017-12-23T07:51:27.84521085Z
EventsListeners: 0
Registry: https://index.docker.io/v1/
Labels:
provider=vmwareworkstation
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://registry.docker-cn.com/
Live Restore Enabled: false

终于可以在 Windows 下愉快的玩耍 Docker 了。

6. 任务管理器中禁用默认的 Docker for Windows 启动

disable_Dockerautorun

概述

本文安装操作系统如下:

  • Debian 9
  • CPU 2核
  • 内存 2G

环境搭建

参考自https://github.com/home-assistant/hassio-build/tree/master/install

注意:本文写编写日期为2017年11月30日,以后更新可能出现增加依赖的情况,故建议先阅读上方参考文档再进行安装操作

依赖清单

  • docker
  • bash
  • socat
  • jq
  • curl
  • avahi-daemon
  • dbus-daemon

Docker 搭建

参考自[Docker — 从入门到实践/Debian 安装 Docker CE/使用脚本自动安装

](https://yeasy.gitbooks.io/docker_practice/content/install/debian.html)

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Debian 系统上可以使用这套脚本安装:

1
2
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。

启动 Docker CE

1
2
$ sudo systemctl enable docker
$ sudo systemctl start docker

Debian 7 Wheezy 请使用以下命令启动

1
$ sudo service docker start

建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

1
$ sudo groupadd docker

将当前用户加入 docker 组:

1
$ sudo usermod -aG docker $USER

测试 Docker 是否安装正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1\. The Docker client contacted the Docker daemon.
2\. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3\. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4\. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/

若能正常输出以上信息,则说明安装成功。

镜像加速器 Ubuntu 16.04+、Debian 8+、CentOS 7

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

1
2
3
4
5
6
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}

之后重新启动服务。

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

修复 not support swap limit capabilities 错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Adjust memory and swap accounting
When users run Docker, they may see these messages when working with an image:

WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
To prevent these messages, enable memory and swap accounting on your system. To enable these on system using GNU GRUB (GNU GRand Unified Bootloader), do the following.

Log into Ubuntu as a user with sudo privileges.

Edit the /etc/default/grub file.

Set the GRUB_CMDLINE_LINUX value as follows:

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
Save and close the file.

Update GRUB.

$ sudo update-grub
Reboot your system.

安装剩余依赖

  • bash
  • socat
  • jq
  • curl
  • avahi-daemon
  • dbus-daemon
1
$ sudo apt install socat jq curl avahi-daemon dbus-daemon

dbus-daemon Debian 9 最小化安装默认也带了,所以不需要安装。

安装 Hass.io

切换到 root ,不能用 sudo

1
$ sudo -s

执行以下命令

1
2
3
4
5
6
7
8
# curl -sL https://raw.githubusercontent.com/home-assistant/hassio-build/master/install/hassio_install | bash -s

[INFO] Install supervisor docker
[INFO] Install generic HostControl
[INFO] Install startup scripts
[INFO] Init systemd
Created symlink /etc/systemd/system/multi-user.target.wants/hassio-supervisor.service → /etc/systemd/system/hassio-supervisor.service.
[INFO] Start services

验证是否运行成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# systemctl status hassio-supervisor

● hassio-supervisor.service - Hass.io supervisor

Loaded: loaded (/etc/systemd/system/hassio-supervisor.service; enabled; vendor preset: enabled)

Active: active (running) since Thu 2017-11-30 13:14:42 CST; 1min 9s ago

Process: 4560 ExecStartPre=/usr/bin/docker stop hassio_supervisor (code=exited, status=1/FAILURE)

Main PID: 4566 (hassio-start)

Tasks: 9 (limit: 4915)

Memory: 5.6M

CPU: 84ms

CGroup: /system.slice/hassio-supervisor.service

├─4566 /bin/bash /usr/bin/hassio-start

└─4591 docker run --name hassio_supervisor -v /var/run/docker.sock:/var/run/docker.sock -v /var/run/hassio-hc.sock:/var/run/hassio-hc.sock -v /usr/share/hassio:/data -v /var/log/supervisor-lo



11月 30 13:14:43 docker hassio-start[4566]: 17-11-30 05:14:43 INFO (MainThread) [__main__] Setup HassIO

11月 30 13:14:43 docker hassio-start[4566]: 17-11-30 05:14:43 INFO (SyncWorker_0) [hassio.dock.supervisor] Attach to supervisor homeassistant/amd64-hassio-supervisor with version 0.75

11月 30 13:14:53 docker hassio-start[4566]: 17-11-30 05:14:53 INFO (MainThread) [hassio.host_control] Send 'info' to HostControl.

11月 30 13:14:54 docker hassio-start[4566]: 17-11-30 05:14:54 INFO (MainThread) [hassio.host_control] Receive from HostControl: { "type": "generic", "version": "0.3", "last_version": "0.3", "hostname": "

11月 30 13:14:54 docker hassio-start[4566]: 17-11-30 05:14:54 INFO (MainThread) [hassio.homeassistant] No HomeAssistant docker homeassistant/qemux86-64-homeassistant found.

11月 30 13:14:54 docker hassio-start[4566]: 17-11-30 05:14:54 INFO (MainThread) [hassio.homeassistant] Setup HomeAssistant landingpage

11月 30 13:14:54 docker hassio-start[4566]: 17-11-30 05:14:54 INFO (SyncWorker_2) [hassio.dock.interface] Pull image homeassistant/qemux86-64-homeassistant tag landingpage.

11月 30 13:14:57 docker hassio-start[4566]: 17-11-30 05:14:57 INFO (SyncWorker_2) [hassio.dock.interface] Tag image homeassistant/qemux86-64-homeassistant with version landingpage as latest

11月 30 13:14:57 docker hassio-start[4566]: 17-11-30 05:14:57 INFO (SyncWorker_1) [hassio.dock.homeassistant] Start homeassistant homeassistant/qemux86-64-homeassistant with version landingpage

11月 30 13:14:57 docker hassio-start[4566]: 17-11-30 05:14:57 INFO (MainThread) [hassio.addons.git] Clone addon https://github.com/home-assistant/hassio-addons repository

设置开机启动及管理命令

开机启动命令

1
$ sudo systemctl enable hassio-supervisor

重启命令

1
$ sudo systemctl restart hassio-supervisor

停止命令

1
$ sudo systemctl stop hassio-supervisor

配置文件及目录介绍

如果用一键安装脚本安装的 Hass.io,那么配置文件目录会在 /usr/share/hassio

1
2
3
4
5
6
7
8
9
10
11
12
nero@docker:/usr/share/hassio$ ll
总用量 48
drwxr-xr-x 6 root root 4096 11月 30 13:14 addons
-rw-r--r-- 1 root root 10997 12月 1 11:33 addons.json
drwxr-xr-x 2 root root 4096 11月 30 13:14 backup
-rw-r--r-- 1 root root 191 12月 1 10:21 config.json
drwxr-xr-x 10 root root 4096 11月 30 14:40 homeassistant
-rw-r--r-- 1 root root 125 11月 30 14:57 homeassistant.json
drwxr-xr-x 2 root root 4096 11月 30 13:14 share
drwxr-xr-x 2 root root 4096 11月 30 15:36 ssl
drwxr-xr-x 2 root root 4096 11月 30 13:14 tmp
-rw-r--r-- 1 root root 76 12月 1 06:27 updater.json
  • addons:所有插件的共享目录都在这里
  • addons.json:所有插件的配置文件都在这里
  • backup:应该是升级备份目录
  • config.json: hassio 主配置文件
  • homeassistant: HomeAssistant 的配置文件目录
  • homeassistant.json: HomeAssistant的信息,猜测是hassio来连接 homeassistant api 的参数,里面包含密码端口等
  • share: 外部磁盘挂载地,可以将U盘挂载到这个目录让homeassistant能读取
  • ssl: SSL证书目录
  • tmp:临时目录
  • updater.json:记录了当前的hassio和homeassistant版本

如果你是从 hassbian 之类的自搭建环境下迁移过来,那么可以将 ~/.homeassistant 目录直接覆盖掉上述的 homeassistant 目录。
注意如果你的HomeAssistant配置文件是设置了密码,请到homeassistant.json文件里面填写自己的密码格式如下:

1
2
3
4
5
6
7
8
{
"boot": true,
"devices": [],
"watchdog": true,
"ssl": false,
"port": 8123,
"password": "你的密码"
}

插件安装

Mariadb

Mariadb 是 Mysql 的分支,自从被 Oracle 收购后发行版提供的免费安装包全部都转到 Mariadb,据说性能比 Mysql 要好。

如果机器内存足够,可以给 HomeAssistant 部署上,默认的 Sqlite 性能如果数据大了的话(比如一年的记录量什么的)可能读取速度会比较慢。

下面是步骤截图,由于我已经部署了一遍,后面再写的记录,所以界面会有所不同。但是操作是一样的。

安装 Mariadb

mariadb_01

mariadb_02

mariadb_03

配置 Mariadb

安装完后可以到回 Hass.io 首页找到 Mariadb,点进去,我们在 Options 下修改下配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"databases": [
"homeassistant"
],
"logins": [
{
"username": "hass",
"host": "homeassistant",
"password": "你的密码"
}
],
"rights": [
{
"username": "hass",
"host": "homeassistant",
"database": "homeassistant",
"grant": "ALL PRIVILEGES ON"
}
]
}

注意:要修改数据库密码。
注意:配置文件格式有可能根据版本更新而更新,最终配置文件格式请到官网上参考https://home-assistant.io/addons/mariadb/

最后因为我们的数据库只是给 HomeAssistant 使用所以 Network 里面把端口删掉,让 mysql 全程走 Docker 内部网络。

mariadb_04

修改 configuration.yaml 应用 Mariadb

在没有安装 Samba 插件之前,我们可以在终端上用 VIM 编辑 configuration.yaml 文件添加如下配置:

1
2
3
4
recorder:
purge_interval: 2
purge_keep_days: 5
db_url: mysql://hass:数据库密码@addon_core_mariadb/homeassistant?charset=utf8

最后重启 HomeAssistant 的 Docker

1
$ docker restart homeassistant

如果 HomeAssistant 页面没有报错的话,那么就代表设置正常,在页面查看历史数据正常的话就代表设置已经完成了。

这时候你可以将你的 homeassistant_v2.sql 这个文件删除了,和 Sqlite 说拜拜。

Samba

Samba,是种用来让UNIX系列的操作系统与微软Windows操作系统的SMB/CIFS(Server Message Block/Common Internet File System)网络协议做链接的自由软件。

可以通过网络共享访问 Hass.io 的配置文件目录方便管理和修改配置文件。

安装方法和 Mariadb 雷同,我这边就不一一截图直接跳到配置文件编写部分。

设置 Samba

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"workgroup": "WORKGROUP",
"name": "hassio",
"guest": false,
"map": {
"config": true,
"addons": true,
"ssl": false,
"share": true,
"backup": true
},
"username": "用户名",
"password": "密码",
"interface": "网络接口"
}

注:网络接口可以通过 ifconfig 命令获得。
注2:如果输入ifconfig显示找不到该文件或文件夹可以使用如下命令安装。

1
$ sudo apt-get install net-tools

map 里面的参数可以调整 hassio 里面的文件夹是否显示在 Samba 里,一般按照默认设置就可以了。

配置好后按 Start 即可。

然后在 Windows 资源管理器中输入 //hassio 输入用户名密码即可访问,我们就可以像本地一样编辑配置文件了。

Let’s Encrypt

Let’s Encrypt 是一个免费的 SSL 证书提供机构,他们可以免费为你签发 SSL 证书使用,为你提供 SSL 加密服务。

而这个插件就是为你自动签发 SSL 证书并且自动更新证书。

设置 Let’s Encrypt

设置之前请将 Hass.io 主机的 443 端口映射到公网,而且您的域名必须指向你的公网IP。

安装好插件后我们只需写入如下配置文件。

1
2
3
4
5
6
7
8
9
{
"challenge": "https",
"email": "你的邮箱",
"domains": [
"你的域名"
],
"certfile": "fullchain.pem",
"keyfile": "privkey.pem"
}

保存后点击 Start 即可。

此时你可以发现 ssl 目录下会出现 fullchain.pemprivkey.pem两个证书文件。

为我们部署 nginx 做准备。

NGINX Home Assistant SSL proxy

Nginx(发音同engine x)是一个 Web服务器,也可以用作反向代理,负载平衡器和 HTTP缓存。该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。

Nginx 是免费的开源软件,根据类似 BSD许可证的条款发布。大部分 Web服务器通常使用 NGINX 作为负载均衡器。

我刚学 Linux 的时候就学了它,然后就没法再学习 Apache 了,因为 Nginx 的配置实在太简单了。

设置 NGINX Home Assistant SSL proxy

注:部署 NGINX Home Assistant SSL proxy 之前必须先获得 SSL 证书。

获取证书不一定要用 Let’s Encrypt,如果你的域名购买的时候有证书,也可以,甚至你可以买证书,但是证书必须放到 /usr/share/hassio/ssl目录下。

在 Options 写下如下配置

1
2
3
4
5
{
"domain": "你的域名",
"certfile": "fullchain.pem",
"keyfile": "privkey.pem"
}

注意:这里的域名必须与你签发的证书域名一致

点 Save 保存后,点 Start 运行。

这时候我们在浏览器输入 https://你的域名 这时候就能够访问到 HomeAssistant 的页面了。

部署 Nginx 后,访问的速度会比原先的速度要好一些,而且页面是使用 HTTP2 协议,会对网页元素进行压缩传输,效率比传统的 HTTP 1.0 协议快很多。

Mosquitto broker

使用 Sonoff 开关的话,我们就必须部署 Mosquitto broker 了,安装后写入如下配置。

配置 Mosquitto broker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"plain": true,
"ssl": false,
"anonymous": true,
"logins": [
{
"username": "mqtt的用户名",
"password": "mqtt的密码"
}
],
"customize": {
"active": false,
"folder": "mosquitto"
},
"certfile": "fullchain.pem",
"keyfile": "privkey.pem"
}

点击 SAVE 保存,再点击 START 即可。

在 Configuration.yaml 添加 mqtt 服务信息

1
2
3
4
5
6
7
mqtt:
broker: addon_core_mosquitto
port: 1883
client_id: home-assistant-1
keepalive: 60
username: mqtt用户名
password: mqtt密码

配置好后重启 HomeAssistant。

1
$ docker restart homeassistant

Homebridge

首先点击 Hass.io 页面右上角的购物袋图标,在Add-On Repositories输入https://github.com/hassio-addons/repository后点SAVE,点击右上角刷新按钮。

刷新完后找到 Homebridge 点击 install。

配置 Homebridge

Options输入一下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"log_level": "info",
"avahi_interfaces": "ens192",
"avahi_hostname": "",
"avahi_domainname": "local",
"enable_ipv6": false,
"packages": [],
"init_commands": [
"npm config set registry https://registry.npm.taobao.org",
"sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk update"
],
"plugins": []
}
  • log_level: 日志等级,默认即可。
  • avahi_interfaces: 监听的网络接口,建议通过 ifconfig 找到主宿机器的网络接口名称写上,官方说法不写也是没问题的。
  • avahi_hostname: 保持默认即可。
  • avahi_domainname: 保持默认即可
  • enable_ipv6: 一般家庭网络没有 IPv6 建议使用false关闭此选项。(默认true)
  • packages: 自动 Alpine 的软件包,可以装类似 ffmpeg 等。但是由于默认的源太慢了,而 packages 动作比下面的 init_commands 要前,所以导致初始化过程十分长,我建议在下一个选择再安装包
  • init_commands: 可以运行用户自定义的 shell 命令,我在此添加了阿里云的源方便安装软件。并且将 npm 的源也切换到淘宝源,为下面的插件安装做准备。
  • plugins: 可以安装自定义的 npm 插件。仅需写上插件名称即可。

下面是我安装 ffmpeg 插件的范例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"log_level": "info",
"avahi_interfaces": "ens192",
"avahi_hostname": "",
"avahi_domainname": "local",
"enable_ipv6": false,
"packages": [],
"init_commands": [
"npm config set registry https://registry.npm.taobao.org",
"sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk update && apk add ffmpeg"
],
"plugins": [
"homebridge-camera-ffmpeg"
]
}

完成配置后点击 SAVE 保存,点击上方的 START 运行即可。

IPhone 添加 Homebridge

点击下方的 Logs,不断点击等待刷出八位 code 为止。

1
2
3
4
5
Or enter this code with your HomeKit app on your iOS device to pair with Homebridge:

┌────────────┐
│ 123-45-678 │
└────────────┘

至此可以在 iphone 或者 ipad 中的 HomeKit 添加配件了。

0. 说在最前

我一开始是参考囧大的帖子:[接入教程] 海康威视摄像头接入HomeAssistant的方法(Ubuntu)](https://bbs.hassbian.com/thread-464-1-2.html)

可能囧大写帖子的时候 HomeAssistant 还没更新,新版本的** ffmpeg_bin 必须写在 configuration.yaml ffmpeg: 里面,不在是 **camera: 里面定义了 ,今晚就是这个把我坑的好惨。

多谢 Syjjx 在群里对我提点。

最后,建议各位看大佬们写的教程帖子的时候必须先看看官方文档,再看大佬的帖子这样才会少遇坑。大佬们的帖子写的时候可能没问题,但是后来随着系统更新会改变。

FFmpeg 接入 HomeAssistant 官方文档

1. 安装 ffmpeg。(不同操作系统安装步骤google或者百度)

我是Debian 9,安装十分简单。

1
apt-get install libav-tools

里面包含了 ffmpeg,应该也可以直接这样

1
apt-get install ffmpeg

2. 修改配置文件

先到 configuration.yaml 添加如下配置

1
2
ffmpeg:
ffmpeg_bin: /usr/bin/ffmpeg

注意:如果不知道自己安装系统的 ffmpeg 绝对路径可以使用如下命令得到

1
2
# which ffmpeg
/usr/bin/ffmpeg

再到 configuration.yaml 写入如下配置

1
2
3
4
camera:
- platform: ffmpeg
input: -rtsp_transport tcp -i rtsp://user:password@camera_ip:rtsp_prot/h264/ch1/main/av_stream
extra_arguments: -pred 1 -q:v 2 -s 704x576
  • user:是摄像枪的登陆用户名,海康威视默认是admin
  • password:是摄像枪的密码,海康威视现在初始化摄像枪都需要修改密码。
  • rtsp_prot:这个是 rtsp 协议的端口,可以到摄像枪网络配置里面找到。
  • h264:这个是代表你的摄像枪是用什么压缩协议,大部分的摄像枪是H.264和H.265,而摄像枪里面也可以自行选择。
  • ch1/main/av_stream因为我这个是老款的硬盘录像机,URL上新款的可能和我略有不同,大家可能自行百度或者google找到你的录像机 rtsp 的url了,ch1代表第一路视频信号。

    3. 故障排除

可以在终端下运行 ffmpeg -rtsp_transport tcp -i rtsp://user:password@camera_ip:rtsp_prot/h264/ch1/main/av_stream -f null -

如果无报错只刷如下显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 3 >= 3
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 18 >= 18
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 21 >= 21
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 38 >= 38
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 53 >= 53
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 56 >= 56
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 73 >= 73
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 88 >= 88
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 91 >= 91
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 108 >= 108
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 123 >= 123
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 126 >= 126
[null @ 0x55ad0c230ac0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 143 >= 143

就表示你的参数没问题了。

更多参数请查看官方文档:https://home-assistant.io/components/ffmpeg/

Seafile 从4.x开始支持 Windows Office Online Server(以前版本叫 Office Web Apps),而官方的所有文档都没有很清晰的表明社区版支持,而我一直以为只有企业版才支持,故此一直折腾 onlyoffice 和 Libreoffice,后论坛看到有人用社区版结合 Office Online Server 才恍然大悟,经过和 Seafile 官方了解,确定社区版是支持 Office Online Server 的(其实支持 WOPI 就行了),然后开始了折腾之路。

之前我一直在折腾 Office Web Apps 可是部署成功后无法结合 Seafile 使用,不知道为何,一直报告 CA 证书错误,后联系 Seafile 员工,建议我更换 Office Online Server,部署完毕后完美运行。

参考: 微软官方:部署 Office Online Server

本文环境:2台 使用 ESXI 虚拟的虚拟机,配置 4个处理器,4G内存,40G硬盘。

准备工作

Office Online Server 需要具备以下条件

故此,部署 Office Online Server 必须有两台 Windows Server,一台作域控制器,一台部署 Office Online Server。

部署域控制器

** 域控制器信息:**

  • IP地址: 192.168.2.41
  • 计算机名称: AD
  • 加入域后全称: AD@domain.com

这个其实搜索引擎一轮就有非常多的方法,我懒得截图,这里就写上通过 Powershell 来部署域控制器。

更改计算机名

以管理员运行 Powershell 执行以下命令

1
Rename-Computer -NewName "AD" -Restart

如果不先更改计算机名的话,升级为域控制器后就没法再修改了。

安装域控制器

参考: PowerShell部署Windows Server 2012 域控制器

注意运行前先将 Windows Server 2012 更新到最新(但安装 Office Online Server 的服务器则不能升级到最新)

以管理员方式运行 AD.ps1

AD.ps1 内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import-module servermanager 
Install-WindowsFeature ad-domain-services,RSAT-ADDS
Import-Module ADDSDeployment
Install-ADDSForest `
-CreateDnsDelegation:$false `
-DatabasePath "C:\Windows\NTDS" `
-DomainMode "Win2012" `
-DomainName "domain.com" ` #这里写域的全称
-DomainNetbiosName "AD" ` #这里写域控制器的计算机名
-ForestMode "Win2012" `
-InstallDns:$true `
-LogPath "C:\Windows\NTDS" `
-NoRebootOnCompletion:$false `
-SysvolPath "C:\Windows\SYSVOL" `
-Force:$true
  • -DomainName “domain.com” 如果您的 Seafile 服务有域名,建议使用您的 Seafile 域名作为域控的 DomainName。

等重启后,域控制器就部署好了。

新建域管理员

部署好后我们建立一个域用户,并将其加入域管理员组(Domain Admins)

将下面语句逐行复制到 Powershell 执行即可(这里 nero 是我的用户名,domaincom 是域名,请按照实际情况替换。)

1
2
New-ADUser -SamAccountName "nero" -Name "nero" -UserPrincipalName "nero@domain.com" -DisplayName "nero" -Path "CN=Users,DC=domain,DC=com" -AccountPassword (ConvertTo-SecureString (Read-Host -AsSecureString "Enter your AccountPassword") -AsPlainText -Force) -Enabled $True
Add-ADGroupMember -Identity "Domain Admins" -Members "nero"

参考自:

命令解析

  • SamAccountName:指定用户,组,计算机或服务帐户的安全帐户管理器(SAM)帐户名称。
  • UserPrincipalName:每个用户帐户的用户主体名称(UPN)格式为 @
  • DisplayName:指定对象的显示名称。 此参数设置对象的DisplayName属性。
  • Path:指定创建新对象的组织单位(OU)或容器的X.500路径。
  • AccountPassword:指定帐户的新密码值。 此值作为加密字符串存储。
  • ConvertTo-SecureString: 将加密的标准字符串转换为安全字符串。 它也可以将纯文本转换为安全字符串。
  • Read-Host: 从控制台读取一行输入。
  • Add-ADGroupMembe: 将一个或多个成员添加到Active Directory组。
  • Identity: 通过提供以下值之一来指定Active Directory组对象。
  • Members: 指定一组以逗号分隔的列表中的用户,组和计算机对象,以添加到组中。要识别每个对象,请使用以下属性值之一。

由于 AccountPassword 必须使用加密字符串存储,故此我们需要将输入的密码转换成密文。

安装 Office Online Server

参考自 部署 Office Online Server

Office Online Server 信息:

  • IP地址: 192.168.2.42
  • DNS: 192.168.2.41 注意,这里的DNS必须为域控制器,否则无法加入域
  • 计算机名称: Office
  • 加入域后全称: Office@domain.com

安装好系统后,千万别更新,千万别更新,千万别更新。
安装好系统后,千万别更新,千万别更新,千万别更新。
安装好系统后,千万别更新,千万别更新,千万别更新。

修改安全标识符SID(非必须)

由于我的 Office Online Server 的操作系统是通过 AD 的那台服务器(未打补丁时的快照)克隆过来的,所以需要修改安全标识SID才能顺利加入域。如果你是全新安装可以略过直接看下章。

管理员身份运行 PowerShell 输入以下命令

1
2
cd C:\Windows\System32\Sysprep
.\sysprep.exe /oobe /generalize

重启后需要重新设置区域、键盘等设置,并且登陆系统后还需要重新输入注册信息(破解的话需要重新运行破解程序再破解一次)

更改计算机名

以管理员运行 Powershell 执行以下命令

1
Rename-Computer -NewName "office" -Restart

加入域

加入域之前请确认 DNS 是否已设为域控制器 IP 地址。

以管理员运行 Powershell 执行以下命令

1
Add-Computer -Domain "domain.com" -Cred "domain.com\nero" -Passthru; Restart-Computer
  • Domain: 域全称
  • Cred: 填写我们之前创建的域管理员

重启后点击返回按钮,点击其他用户,使用域管理员登陆计算机。我这里域管理员是 nero@domain.com

为 Office Online Server 安装必备软件

安装好系统后,千万别更新,千万别更新,千万别更新。
安装好系统后,千万别更新,千万别更新,千万别更新。
安装好系统后,千万别更新,千万别更新,千万别更新。

因为微软的某个补丁造成了如果不先开启 .NET3.5 的话,更新后是没办法再安装 .NET3.5 的,我之前部署的时候就因为这个装了2天。

以管理员方式运行 Powers 输入一下命令

1
Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices,NET-Framework-Features,NET-Framework-Core,NET-HTTP-Activation,NET-Non-HTTP-Activ,NET-WCF-HTTP-Activation45,Windows-Identity-Foundation,Server-Media-Foundation

如果不慎更新了服务器,那么请重新安装操作系统或者恢复到没有更新的快照执行这一段命令,否则会NET-Framework-Features,NET-Framework-Core,NET-HTTP-Activation 这三个是没办法安装,微软自己都没辙。(由此可见微软的内部争议挺大的,又要依赖旧技术,而补丁不得不干掉旧技术。)

安装以下软件:

安装 Office Online Server

  1. MSDN 我告诉你 服务器类别中下载 Office Online Server。cn_office_online_server_last_updated_march_2017_x64_dvd_10245068.iso
  2. 运行 Setup.exe。
  3. 在“阅读 Microsoft 软件许可条款” 页上,选择“我接受此协议的条款” ,然后选择“继续” 。
  4. 在“选择文件位置” 页上,选择要将 Office Online Server 文件安装到的文件夹(例如,C:\Program Files\Microsoft Office Web Apps),然后选择“立即安装” 。如果您指定的文件夹不存在,安装程序将为您创建它。 我们建议在系统驱动器上安装 Office Online Server。
  5. 在安装程序安装完 Office Online Server 后,选择“关闭” 。

为 Office Online Server 安装语言包

Office Online Server 语言包使用户可以查看基于 web 的 Office 多语言文件,无论它们是从 SharePoint 文档库打开,还是从 Outlook Web App 打开。

若要安装语言包,请按以下步骤进行操作。

  1. Office Online Server 语言包下载 Office Online Server中文语言包。
  2. 运行 wacserverlanguagepack.exe
  3. 在 Office Online Server 语言包向导中的“ 阅读 Microsoft 软件许可条款 ”页面上,选择“ 我接受此协议的条款 ”,然后选择“ 继续 ”。
  4. 在安装程序安装完 Office Online Server 后,选择“ 关闭 ”。

部署 Office Online Server

我的 Seafile 内部署了 Nginx 服务,并路由将 Seafile 的 Nginx 443端口映射至公网,故此客户端利用 https 通过公网访问到 Office Online Server 的话,就必须使用 Seafile 的 Nginx 服务来做反向代理。

部署 Office Online Server 墙

为了达到上述的效果,我们必须让 Office Online Server 使用 HTTP 来对外提供服务,而 HTTPS 则由 Nginx 来负责提供服务。

以管理员身份运行 Powershell 执行以下命令

1
New-OfficeWebAppsFarm -InternalUrl "https://office.domain.com" -ExternalUrl "https://office.domain.com" -SSLOffloaded -EditingEnabled
  • New-OfficeWebAppsFarm: 在本地计算机上创建新 Office Online Server 场。我的理解是一个命令为 Office Online Server 配置好 IIS。
  • InternalUrl: 指定客户端用于从 Internet 访问 Office Online Server 场的 URL。
  • ExternalUrl: 指定客户端用于从 Internet 访问 Office Online Server 场的 URL。在负载平衡的多服务器 Office Online Server 场中,外部 URL 绑定到面向外部的负载平衡器的 IP 地址。
  • SSLOffloaded: 向 Office Online Server 场中的服务器指出,SSL 将分流到负载平衡器。如果启用SSLOffloaded ,Web 应用程序将绑定到本地服务器上的端口 80 (HTTP)。但是,引用其他资源(如 CSS 或图像)的 HTML 将对这些引用使用 HTTPS URL。(大概意思就是可以使用外部 HTTPS 服务。)
  • EditingEnabled: 允许在浏览器中进行编辑。默认值为 False 。只有在您具有使用编辑功能的相应许可的情况下,才能将其设置为 True

运行后会见到

1
2
3
4
将 EditingEnabled 设置为 TRUE。只有当此 Office Online Server 的用户具有允许使用 Office Online
进行编辑的许可证时,您才应该这样做。
是否继续执行此操作?
[Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”): Y

Y 回车执行下一步即可。

部署好后应该显示如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
FarmOU                                      :
InternalURL : https://office.domain.com/
ExternalURL : https://office.domain.com/
AllowHTTP : True
AllowOutboundHttp : False
SSLOffloaded : True
CertificateName :
S2SCertificateName :
EditingEnabled : True
LogLocation : C:\ProgramData\Microsoft\OfficeWebApps\Data\Logs\ULS
LogRetentionInDays : 7
LogVerbosity :
Proxy :
CacheLocation : C:\ProgramData\Microsoft\OfficeWebApps\Working\d
MaxMemoryCacheSizeInMB : 75
DocumentInfoCacheSize : 5000
CacheSizeInGB : 15
ClipartEnabled : False
OnlinePictureEnabled : False
OnlineVideoEnabled : False
TranslationEnabled : False
MaxTranslationCharacterCount : 125000
TranslationServiceAppId :
TranslationServiceAddress :
RenderingLocalCacheLocation : C:\ProgramData\Microsoft\OfficeWebApps\Working\waccache
RecycleActiveProcessCount : 5
AllowCEIP : False
OfficeAddinEnabled : False
ExcelRequestDurationMax : 300
ExcelSessionTimeout : 450
ExcelWorkbookSizeMax : 10
ExcelPrivateBytesMax : -1
ExcelConnectionLifetime : 1800
ExcelExternalDataCacheLifetime : 300
ExcelAllowExternalData : True
ExcelUseEffectiveUserName : False
ExcelWarnOnDataRefresh : True
ExcelUdfsAllowed : False
ExcelMemoryCacheThreshold : 90
ExcelUnusedObjectAgeMax : -1
ExcelCachingUnusedFiles : True
ExcelAbortOnRefreshOnOpenFail : True
ExcelAutomaticVolatileFunctionCacheLifeTime : 300
ExcelConcurrentDataRequestsPerSessionMax : 5
ExcelDefaultWorkbookCalcMode : File
ExcelRestExternalDataEnabled : True
ExcelChartAndImageSizeMax : 1
OpenFromUrlEnabled : False
OpenFromUncEnabled : True
OpenFromUrlThrottlingEnabled : True
PicturePasteDisabled : True
RemovePersonalInformationFromLogs : False
AllowHttpSecureStoreConnections : False
Machines : {OFFICE}

部署 Nginx 反向代理

由于是使用 https 提供服务,你需要准备合法的证书,如何获得合法的证书请看我另外一篇博文无80端口情况下使用 CertBot 申请证书并使用nginx更新证书

到 Seafile 的 Nginx 新建配置文件

vim /etc/nginx/conf.d/office.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443 ssl http2;
server_name office.domain.com;

ssl_protocols TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/office.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/office.domain.com/privkey.pem;

# log files
access_log /var/log/nginx/office.access.log;
error_log /var/log/nginx/office.error.log;

location ^~ / {
proxy_pass http://192.168.2.42/;
proxy_set_header host $http_host;
client_max_body_size 0;
}
}

浏览器输入https://office.domain.com/hosting/discovery就会出现如下内容

wopi

由于我不可能有 domain.com 的域名所有权,所以我这里使用的不合法的自签证书演示效果。

修改 Seafile 配置以启用 Office Online Server

参考官方配置手册 Office Online Server Integration

编辑 seahub_settings.py 文件在文件最后添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Enable Office Online Server
ENABLE_OFFICE_WEB_APP = True

# Url of Office Online Server's discovery page
# The discovery page tells Seafile how to interact with Office Online Server when view file online
# You should change `http://example.office-web-app.com` to your actual Office Online Server server address
OFFICE_WEB_APP_BASE_URL = 'https://office.domain.com/hosting/discovery'

# Expiration of WOPI access token
# WOPI access token is a string used by Seafile to determine the file's
# identity and permissions when use Office Online Server view it online
# And for security reason, this token should expire after a set time period
WOPI_ACCESS_TOKEN_EXPIRATION = 30 * 60 # seconds

# List of file formats that you want to view through Office Online Server
# You can change this value according to your preferences
# And of course you should make sure your Office Online Server supports to preview
# the files with the specified extensions
OFFICE_WEB_APP_FILE_EXTENSION = ('ods', 'xls', 'xlsb', 'xlsm', 'xlsx','ppsx', 'ppt',
'pptm', 'pptx', 'doc', 'docm', 'docx')

# Enable edit files through Office Online Server
ENABLE_OFFICE_WEB_APP_EDIT = True

# types of files should be editable through Office Online Server
# Note, Office Online Server 2016 is needed for editing docx
OFFICE_WEB_APP_EDIT_FILE_EXTENSION = ('xlsx', 'pptx', 'docx')

唯一需要修改的地方就是 OFFICE_WEB_APP_BASE_URL 这个值,修改成刚测试使用的'https://office.domain.com/hosting/discovery'

删除 seahub_settings.pyc 文件重启 seahub 以应用配置

1
2
3
4
5
rm -f conf/seahub_settings.pyc
./seafile-server-latest/seafile.sh restart
./seafile-server-latest/seahub.sh restart
如果是6.2以下版本记得使用 fastcgi 重启seahub.sh
./seafile-server-latest/seahub.sh restart-fastcgi

至此,已完成所有的 Office Online Server 部署配置了。对比 onlyoffice 来说,微软怎么说都是从 office 起家的,在这个领域内人家是老大。

但老大的也没法解决兼容旧版本的 doc 文件支持,但真的要比 onlyoffice 好用太多太多了。

可能遇到的问题

安装的时候不注意,安装错 Office Online Server 语言包,怎么切换回中文。

  1. 在 Office Online Server 中以管理员身份运行 Powershell 执行 Remove-OfficeWebAppsMachine 命令;
  2. 在程序和功能中卸载错误的语言包;
  3. 安装正确的语言包;
  4. 参照部署 Office Online Server 墙章节重新部署即可。

参考内容

443端口不知道是电信不想封还是怎么样,一直无需备案就能开启对外服务。公司的对外访问服务都是通过443端口对外访问的。

而443端口就必须使用合法的 SSL 证书,合法的 SSL 证书很多,我一直使用 letsencrypt 提供的SSL证书服务。

但是 letsencrypt 的证书只有90天的有效期,必须在有效期内 renew,否则过期了只好重新申请了。

申请 letsencrypt 证书网上一堆都是需要开放 80 端口才能申请,其实 CertBot 在很早之前就已经支持 https 的方式申请证书。

阅读全文 »

因为调试 CronTab 需要希望显示服务器的实时时间,搜索下感觉直接用 while 写就好了。

1
while true; do date; sleep 1; done

对,就是这么简单。

经常安装 Windows Server 的同学都可能会注意到,Windows Server 在安装的时候是可以选择 no gui 版本,我也很好奇,Windows Server no gui 版本是个什么样的东西,会不会和 Linux 一样?

带着这些疑问,我开始了 Windows Server no gui 旅程。

阅读全文 »