lmk123 / blog

个人技术博客,博文写在 Issues 里。
https://github.com/lmk123/blog/issues
623 stars 35 forks source link

划词翻译服务器操作记录 #85

Open lmk123 opened 3 years ago

lmk123 commented 3 years ago

三年前,在某某云的活动下,我买了一台服务器,吃灰两年后居然派上了用场。最近我重装了这台服务器,在网上查了一下,国内似乎用 Centos 的比较多,于是装了 Centos 8.0 系统(但是我最近关注到 Centos 8.0 再过两年就不维护了……算了先装上去再说),然后放了一个星期,今天再 ssh 登录上去的时候,看到了这条消息:

There were 5600 failed login attempts since the last successful login.

也就是从这条消息开始,我的运维生涯开始了……

配置 ssh

出现这条消息的原因是我在安装系统的时候用了 root 用户 + 密码登录的方式,所以有人一直在尝试暴力破解我的密码。虽然可能没有被猜中密码,但我还是重装了服务器。我仍然用了 Centos 8.0 系统,但是我默认使用了密匙登陆的方式,并关闭了密码登录方式。

在 Windows 系统下使用 Bash

虽然云服务器提供商支持使用网页的方式登录到服务器,但是还是用电脑的终端更方便一些。我使用的是 Windows 系统,好在 Windows 现在已经支持 Linux 子系统了。在 PowerShell 中输入 wsl 就可以切换到 Linux 子系统的终端,然后就可以使用 Bash 连接到服务器了。

现在 WSL 已经是版本 2 了,但是我安装的时候还是版本 1。在 PowerShell 运行 wsl -l -v 的时候会看到我的 Ubuntu 运行的是 WSL 1:

> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Stopped       1

可以去这里下载内核更新包:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

安装完成后运行下面的命令进行升级:

> wsl --set-version Ubuntu 2
正在进行转换,这可能需要几分钟时间...
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
转换完成。

安装 Docker 和 Docker Componse

我的应用是用 Docker 和 Docker Componse 开发的,部署我也决定用这一套。

在 Centos 安装 Docker 的步骤:https://docs.docker.com/engine/install/centos/

安装 Docker Compose 的步骤:https://docs.docker.com/compose/install/

按照文档的步骤来就行。

使用 acme.sh 生成 https 证书

为了让应用支持使用 https 的方式访问,我还需要给 limingkai.cn 创建一个泛域名证书。我使用了 acme.sh 来创建证书,另外,acme.sh 还提供了 Docker 镜像的使用方式。

我一开始本来打算将这个镜像集成到我应用的 compose.yaml 里,但是在看了文档 Deploy certs from a container to another container 之后,我发现即使集成到了 compose.yaml 里,还是要运行几个 docker exec 命令进行创建操作,所以我打算将 acme.sh 作为一个单独的容器来维护,我的应用只需要从它的 volume 里读取生成好的证书就可以了。

首先,按照 Run acme.sh as a docker daemon 的方式创建 acme.sh 的容器:

docker run --rm  -itd  \
  -v acme:/acme.sh  \
  --net=host \
  --name=acme.sh \
  neilpang/acme.sh daemon

简单解读一下这条命令:Docker 基于镜像 neilpang/acmesh 创建了一个名为 acme.sh 的容器,这个容器将生成的证书文件夹保存在了名为 acme 的 volume 当中。

运行成功后,可以看到容器已经在运行了:

$ docker container ls
CONTAINER ID   IMAGE              COMMAND              CREATED         STATUS         PORTS     NAMES
1d609a8b0a9d   neilpang/acme.sh   "/entry.sh daemon"   7 seconds ago   Up 6 seconds             acme.sh

名为 acme 的 volume 也自动创建了:

$ docker volume inspect acme
[
    {
        "CreatedAt": "2020-12-22T18:21:41Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/acme/_data",
        "Name": "acme",
        "Options": null,
        "Scope": "local"
    }
]

然后,运行下面的命令在这个容器中生成证书:

docker exec \
  -e DP_Id=xxx \
  -e DP_Key=xxx \
  acme.sh --issue --dns dns_dp -d *.limingkai.cn

最后,修改应用的 compose.yaml,用于从名为 acme 的 volume 当中读取证书文件:

services:
  app:
    volumes:
      - type: volume
        source: acme
        target: /app/acme
volumes:
  acme:
    external: true

用 docker-compose 运行应用之后,我们就可以在 app 这个容器里看到证书了:

$ docker-compose exec app ls acme/*.limingkai.cn
*.limingkai.cn.cer
*.limingkai.cn.conf
*.limingkai.cn.csr
*.limingkai.cn.csr.conf
*.limingkai.cn.key
ca.cer
fullchain.cer

这样,当应用启动时,只需要在这个文件夹下找到证书就可以了。

这种方式有一个不好的问题就是:当 acme.sh 自动给证书续期后,我的应用不会自动重启。但目前我不需要考虑这一点,毕竟我应该不可能 90 天都不更新我的应用。

参考文章