介绍
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 自动设置了定时更新证书任务,不用手动处理。
验证
需要确保四种地址都可以访问,并且最多只有一次跳转,测试需要在隐身模式下以避免缓存干扰。
- http://networm.me
- https://networm.me
- http://www.networm.me
- 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 官方的 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.0
与 postgres:11.4
可以使用。如果想要实测哪些版本兼容,建议前往 Container Registry · Commento / Commento · GitLab 与 Postgres - 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
|