介绍

Ubuntu 22.04 LTS 是最新版本的 LTS,维护周期 10 年,非常适合长期项目使用。

博客原来用的是 CentOS 7,使用的版本较老。

环境

  • Ubuntu 22.04
  • Nginx 1.18.0
  • Docker 20.10.17
  • Commento v1.8.0

博客

在 Linode 中创建相同区域新的机器,这样做是为了 IP 迁移,即将原有 IP 从一台机器换到另一台机器上。

Ubuntu 22.04

操作系统配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 登录服务器
$ ssh root@your_server_ip

# 配置新用户
$ adduser sammy
$ usermod -aG sudo sammy

# 配置防火墙
$ ufw app list
$ $ ufw allow OpenSSH
$ ufw enable
$ ufw status

安装 Nginx

1
2
3
4
5
6
7
8
# 安装 Nginx
$ apt update
$ apt install nginx

# 配置防火墙
$ ufw app list
$ ufw allow 'Nginx Full'
$ ufw status

配置网站

只需要先配置 HTTP 协议的网站,HTTPS 等待后续使用 certbot 自动处理。

$ vi /etc/nginx/sites-available/networm.me

 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
server {
    listen 80;
    listen [::]:80;
    server_name networm.me;

    access_log /var/www/networm.me/logs/access.log;
    error_log /var/www/networm.me/logs/error.log warn;

    root /var/www/networm.me/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    if ($host = www.networm.me) {
        return 301 http://networm.me$request_uri;
    }

    listen 80;
    listen [::]:80;
    server_name www.networm.me;
    return 404;
}

$ vi /etc/nginx/sites-available/commento.networm.me

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
server {
    listen 80;
    listen [::]:80;
    server_name commento.networm.me;

    access_log /var/www/commento.networm.me/logs/access.log;
    error_log /var/www/commento.networm.me/logs/error.log;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

sammy 替换为自己的用户名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 博客
$ mkdir -p /var/www/networm.me/html
$ mkdir -p /var/www/networm.me/logs
$ chown -R sammy:sammy /var/www/networm.me
$ vi /etc/nginx/sites-available/networm.me
$ ln -s /etc/nginx/sites-available/networm.me /etc/nginx/sites-enabled/networm.me

# Commento 评论系统
$ mkdir -p /var/www/commento.networm.me/html
$ mkdir -p /var/www/commento.networm.me/logs
$ chown -R sammy:sammy /var/www/commento.networm.me
$ vi /etc/nginx/sites-available/commento.networm.me
$ ln -s /etc/nginx/sites-available/commento.networm.me /etc/nginx/sites-enabled/commento.networm.me

# Nginx 读取配置
$ systemctl reload nginx
$ systemctl status nginx

交换 IP

Linode 中交换 IP,交换完成后需要手动重启机器才会生效,在 Lindoe 管理界面中点击 Reboot 按钮。

迁移 HTTPS 证书

使用命令重新申请,并不使用原有服务器上的证书。

certbot 网站还没有更新 Ubuntu 22.04 的说明,不过使用 22.04 的也一样。

1
2
3
4
$ sudo snap install core; sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
$ sudo certbot --nginx

建议简单参考官方文档,然后以这个更全面的教程为准。

certbot 自动设置了定时更新证书任务,不用手动处理。

验证

需要确保四种地址都可以访问,并且最多只有一次跳转,测试需要在隐身模式下以避免缓存干扰。

  1. http://networm.me
  2. https://networm.me
  3. http://www.networm.me
  4. https://www.networm.me

评论系统

评论系统使用的是 Commento,详细的安装配置方法可以参考 Commento 安装配置 - 狂飙

安装 Docker

按照 Docker 官方教程安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
$ sudo systemctl status docker

参考下面教程的第 2 步,将非 root 用户添加到 docker 组中,以便可以不用 sudo 直接使用 docker 命令。

1
2
3
$ sudo usermod -aG docker your_user
$ sudo su your_user
$ docker run hello-world

安装 Commento

由于 Commento 官方的 docker-compose.yml 未指定容器的版本,然后新版本 PostgreSQL 修改了密码验证的内容,导致 Commento 容器报告无法连接到数据库错误:

1
[ERROR] database_connect.go:31 dbConnect(): cannot talk to postgres, retrying in 10 seconds (4 attempts left): pq: unknown authentication response: 10

此问题已在官方仓库中提出了 Issue,但是官方开发人员一直未进行处理,导致现在最新版本的 Docker 配置是无法启动的。

因此需要强制指定 commento 与 postgres 容器的版本,实测 commento:v1.8.0postgres:11.4 可以使用。如果想要实测哪些版本兼容,建议前往 Container Registry · Commento / Commento · GitLabPostgres - Official Image | Docker Hub,在其中找到需要的版本进行测试。PostgreSQL 的版本发布日期可以前往 PostgreSQL - Wikipedia 查看,具体的版本可以在 Docker Hub 中的 Tags 标签页中搜索框输入版本进行搜索,例如输入 11.5 查找 PostgreSQL 11.5 版本镜像。

 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
version: '3'

services:
  server:
    image: registry.gitlab.com/commento/commento:v1.8.0
    ports:
      - 8080:8080
    environment:
      COMMENTO_ORIGIN: http://commento.example.com:8080
      COMMENTO_PORT: 8080
      COMMENTO_POSTGRES: postgres://postgres:postgres@db:5432/commento?sslmode=disable
    depends_on:
      - db
    networks:
      - db_network
  db:
    image: postgres:11.4
    environment:
      POSTGRES_DB: commento
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    networks:
      - db_network
    volumes:
      - postgres_data_volume:/var/lib/postgresql/data

networks:
  db_network:

volumes:
  postgres_data_volume:

指定版本后进行部署:

1
2
3
4
5
6
7
8
9
$ mkdir commento
$ cd commento

# 这步将内容直接粘贴到文件中,也可以将本地的文件上传
$ vi docker-compose.yaml
$ docker compose up -d

# 查看日志输出是否正常
$ docker compose logs

备份恢复

使用 docker ps 查看 postgres 对应的容器 ID,然后替换下面命令中的 your-db-container

备份数据库,需要在原服务器中执行以下命令

1
$ docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

恢复数据库,在执行操作前需要先停止 commento 容器,只保留 postgres 容器,否则会报以下错误:

1
2
3
4
ERROR:  database "commento" is being accessed by other users
DETAIL:  There are 4 other sessions using the database.
ERROR:  current user cannot be dropped
ERROR:  role "postgres" already exists

执行操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看 commento 容器 ID
$ docker ps
$ docker stop your-commento-container

# 导入数据
$ cat your_dump.sql | docker exec -i your-db-container psql -U postgres
$ docker compose up -d

# 查看日志输出是否正常
$ docker compose logs

验证

  • 找到一篇没有评论的文章,确定 Commento 评论框可以正常显示出来。
  • 找到一篇有评论的文章例如 Commento 安装配置 - 狂飙,确定可以正常显示出已有的评论。
  • 使用管理员登录后台,确定功能是否正常。
  • 在登录界面中点击重置密码,确定邮件通知功能是否正常。

监控

第三方

监控这种东西最好使用第三方的不需要自己维护的产品,这样不用操心。需要将网站与 Commento 评论系统添加到网站监控中,强烈推荐将推送邮箱填写为手机上使用的邮箱,以便及时得到通知。

UptimeRobot

简单对比了一下发现 UptimeRobot 免费版功能最全面,注册后建议将功能更新、开发更新、月度总结相关的邮件通知关闭。

实测免费版本最小间隔检测时间是 5 分钟,完全够用了。另外注意到在网站无法访问时,检测间隔似乎会自动变小,以便及时发现网站可以正常访问。实际发现的确很有用,在网站无法访问时及时发出了通知;并且在恢复访问后马上就有了上线通知,间隔不到 1 分钟。

其他

备份访问日志

需要将旧机器上的日志备份回来

1
2
3
4
5
6
# 在服务器执行
$ cd /var/www/networm.me
$ tar -czf logs.tar.gz logs

# 在本机执行
$ scp sammy@networm.me:/var/www/networm.me/logs.tar.gz .

设置时区

1
$ sudo timedatectl set-timezone Asia/Shanghai

主机名

1
$ hostname your-hostname

设置完成后重新登录 SSH 就会生效。

SSH 登录

使用公钥登录与禁用密码登录

1
$ sudo vi /etc/ssh/sshd_config

PasswordAuthentication yes 改为 PasswordAuthentication no

1
$ sudo systemctl restart ssh

隐藏 Nginx 版本

1
$ sudo vim /etc/nginx/nginx.conf

在 http 内增加 server_tokens off;,然后重启 Nginx

1
$ sudo systemctl reload nginx