介绍
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 [email protected]:/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
|
共有 0 条评论