服务器部署Halo博客
创建AWS账户
创建EC2 实例
开启root账户SSH账密登陆
使用AWS控制台创建的密钥对或者直接通过网页登录
- 注意:使用pem私钥不允许直接登录root用户,只能登录默认用户例如:
ec2-user
,ubuntu
等等
创建root密码
sudo passwd root
切换到root用户
su root
修改 sshd_config
文件
vim /etc/ssh/sshd_config
允许使用密码登录
PasswordAuthentication yes
允许root用户登录
PermitRootLogin yes
- 注意:如果
PermitRootLogin
项找不到自行添加
5、重新启动ssh服务
systemctl restart sshd
安装Docker容器和docker-compose
安装docker
sudo yum install docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动docker服务
systemctl start docker
检查docker是否启动
systemctl status docker
或者是
docker ps
Linux 下 docker 设置开机自启动
sudo systemctl enable docker
安装docker-compose
在Linux上,您可以从GitHub上的Compose存储库发行页面下载Docker Compose二进制文件 。按照链接中的说明进行操作,其中包括curl
在终端中运行命令以下载二进制文件。这些分步说明也包含在下面。
对于
alpine
,需要以下依赖包:py-pip
,python-dev
,libffi-dev
,openssl-dev
,gcc
,libc-dev
,和make
。
运行以下命令以下载Docker Compose的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的Compose,请替换
1.27.4
为要使用的Compose版本。
如果使用进行安装时遇到问题curl
,请参见 上方的“备用安装选项”标签。
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
注意:如果命令
docker-compose
在安装后失败,请检查您的路径。您也可以创建指向/usr/bin
或路径中任何其他目录的符号链接。
例如:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
(可选)为 和shell安装命令完成。bash
zsh
测试安装。
docker-compose --version
docker-compose version 1.27.4, build 1110ad01
升级
如果要从Compose 1.2或更早版本进行升级,请在升级Compose之后删除或迁移现有容器。这是因为从1.3版开始,Compose使用Docker标签来跟踪容器,并且需要重新创建容器以添加标签。
如果Compose检测到创建的没有标签的容器,它将拒绝运行,这样您就不会最终获得两组标签。如果要继续使用现有容器(例如,因为它们具有要保留的数据量),则可以使用Compose 1.5.x通过以下命令迁移它们:
docker-compose migrate-to-labels
另外,如果您不担心保留它们,可以将其删除。撰写只是创建新的。
docker container rm -f -v myapp_web_1 myapp_db_1 ...
卸载
如果使用curl
以下命令安装,则要卸载Docker Compose :
sudo rm /usr/local/bin/docker-compose
如果使用pip
以下命令安装,则要卸载Docker Compose :
pip uninstall docker-compose
申请域名并解析
注册账号
网站地址为:https://www.dynadot.com/zh/
需要手机号注册,国内手机也可以(无需实名制)
购买域名
在购物车进行支付
DNS解析域名
安装Nginx Proxy Manager
简介
顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。
即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。
Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。
下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。
安装 Nginx Proxy Manager
说明:默认你的服务器已经安装了 Docker 和 Docker Compose,如果你没有安装,可以参考:使用 Docker Compose 部署 的环境搭建部分来进行安装。
点击下方链接进入 Nginx Proxy Manager(以下简称 NPM) 官网:https://nginxproxymanager.com/
我们可以直接选择 快速安装。
首先,我们创建一个文件夹来存放 NPM 的 docker-compose.yml
文件:
mkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹
cd ~/data/docker_data/nginxproxymanager # 进入该文件夹
vi docker-compose.yml
在英文状态的输入法下,按下 i
,左下角出现 --INSERT--
后,粘贴填入下面的内容:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:2.9.18'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ./data:/data # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
- ./letsencrypt:/etc/letsencrypt # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建
注意:安装了 NPM 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 NPM 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。
之后,同样在英文输入法下,按一下 esc
,然后 :wq
保存退出。
启动 NPM:启动时候一定要确认docker是否已经启动了
docker-compose up -d # -d 表示后台运行
docker compose up -d # 如果你用的是 docker-compose-plugin 的话,用这条命令
不出意外,此时你使用 http://127.0.0.1:81 就可以访问 NPM 的网页端了。(注意把 127.0.0.1
替换成你实际服务器的 IP)
信息
- 不知道服务器 IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的 IP。
- 遇到访问不了的情况,请再次检查在宝塔面板的防火墙和服务商的后台防火墙是否打开对应了端口。
默认登陆的用户名:admin@example.com
密码:changeme
第一次登陆会提示更改用户名和密码,建议修改一个复杂一点的密码。
至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 Halo 或者其他 Web 应用做反向代理了。
配置 Halo 的反向代理
首先我们登陆网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。
保存之后,会让我们修改密码(建议用一个复杂的密码)。
接着我们就可以来给 Halo 来添加一个反向代理了。
点击 Proxy Hosts
,
接着点击 Add Proxy Host
,弹出如下对话框:
看起来都是英文,很复杂,但是其实很简单,我们只要用到其中的几个功能即可,这边稍微解释一下:
Domain Names
:填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上Scheme
:默认http
即可,除非你有自签名证书Forward Hostname/IP
:填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)Forward Port
:填入 Halo 映射出的端口,这边默认是8090
Cache Assets
:缓存,可以选择打开Block Common Exploits
: 阻止常见的漏洞,可以选择打开Websockets Support
:WS 支持,可以选择打开Access List
: 这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究。
以下是一个样列:
因为样例的 NPM 和 Halo 搭建在同一台 VPS 上,所以这边的 IP,图中填的是 172.17.0.1
,为 Docker 容器内部的 IP 地址,
可以通过下面的命令查询:
ip addr show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:e4:a3:b5:b9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
这边的 IP 是 172.17.0.1
,填入这个 IP,可以不用打开防火墙的 8090
端口。
当然,如果你的 NPM 和 Halo 不在同一台服务上,你需要在 IP 部分填入 你的 Halo 所在的服务器的 IP,并在服务商(部分服务商如腾讯、阿里)的后台打开 8090
端口。
一键申请 SSL 证书
接着我们来申请一张 SSL 证书,让我们的网站支持 https
访问。
如图所示,记得打开强制 SSL,其他四个的功能请自行研究,这边不多做讨论。
信息
- 申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;
- 如果你使用的是国内的服务器,默认
80
和443
端口是关闭的,你需要备案之后才能使用; - 如果你使用了 CloudFlare 的 DNS 服务,记得把小黄云关闭(即不开启 CDN)。
不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。
再次点开配置,查看一下,将强制 SSL 打开。
至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!
同样的,举一反三,试试把你的 NPM 也用一个域名来反向代理一下吧。(小提示:你需要再解析一个域名(可以是二级域名)到 NPM 所在的服务器上,反代页面需要填的 IP 可以填 docker 容器内的 IP 也可以填服务器的 IP,端口填
81
即可)
通过docker-compose部署Halo 2.4
可用的 Halo 2.4 的 Docker 镜像:
注意
目前 Halo 2 并未更新 Docker 的 latest 标签镜像,主要因为 Halo 2 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如 halohub/halo:2.4
或者 halohub/halo:2.4.0
。
halohub/halo:2.4
:表示最新的 2.4.x 版本,即每次发布 patch 版本都会同时更新halohub/halo:2.4
镜像。halohub/halo:2.4.0
:表示一个具体的版本。
后续文档以 halohub/halo:2.4
为例。
在系统任意位置创建一个文件夹,此文档以
~/halo
为例。信息mkdir ~/halo && cd ~/halo vim docker-compose.yml
注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。
创建
docker-compose.yaml
信息此文档提供两种场景的 Docker Compose 配置文件,请根据你的需要选择一种。
需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。
创建 Halo + PostgreSQL 的实例:~/halo/docker-compose.yaml
version: "3" services: halo: image: halohub/halo:2.4 container_name: halo restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - ./:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo - --spring.r2dbc.username=halo # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。 - --spring.r2dbc.password=openpostgresql - --spring.sql.init.platform=postgresql # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=P@88w0rd halodb: image: postgres:latest container_name: halodb restart: on-failure:3 networks: halo_network: volumes: - ./db:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: [ "CMD", "pg_isready" ] interval: 10s timeout: 5s retries: 5 environment: - POSTGRES_PASSWORD=openpostgresql - POSTGRES_USER=halo - POSTGRES_DB=halo - PGUSER=halo networks: halo_network:
创建 Halo + MySQL 的实例:~/halo/docker-compose.yaml
version: "3" services: halo: image: halohub/halo:2.4 container_name: halo restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - ./:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo - --spring.r2dbc.username=root # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。 - --spring.r2dbc.password=o#DwN&JSa56 - --spring.sql.init.platform=mysql # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=P@88w0rd halodb: image: mysql:8.0.31 container_name: halodb restart: on-failure:3 networks: halo_network: command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --explicit_defaults_for_timestamp=true volumes: - ./mysql:/var/lib/mysql - ./mysqlBackup:/data/mysqlBackup ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] interval: 3s retries: 5 start_period: 30s environment: # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 - MYSQL_ROOT_PASSWORD=o#DwN&JSa56 - MYSQL_DATABASE=halo networks: halo_network:
仅创建 Halo 实例(使用默认的 H2 数据库,不推荐用于生产环境,建议体验和测试的时候使用):~/halo/docker-compose.yaml
version: "3" services: halo: image: halohub/halo:2.4 container_name: halo restart: on-failure:3 volumes: - ./:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=P@88w0rd
仅创建 Halo 实例(使用已有外部数据库,MySQL 为例):~/halo/docker-compose.yaml
version: "3" services: halo: image: halohub/halo:2.4 container_name: halo restart: on-failure:3 network_mode: "host" volumes: - ./:/root/.halo2 command: # 修改为自己已有的 MySQL 配置 - --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo - --spring.r2dbc.username=root - --spring.r2dbc.password= - --spring.sql.init.platform=mysql # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=P@88w0rd # 端口号 默认8090 - --server.port=8090
参数详解:
参数名 描述 spring.r2dbc.url 数据库连接地址,详细可查阅下方的 数据库配置 spring.r2dbc.username 数据库用户名 spring.r2dbc.password 数据库密码 spring.sql.init.platform 数据库平台名称,支持 postgresql、mysql、h2,需要与 SPRING_R2DBC_URL 对应 halo.external-url 外部访问链接,如果需要在公网访问,需要配置为实际访问地址 halo.security.initializer.superadminusername 初始超级管理员用户名 halo.security.initializer.superadminpassword 初始超级管理员密码 数据库配置:
链接方式 链接地址格式 SPRING_SQL_INIT_PLATFORM PostgreSQL r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE} postgresql MySQL r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE} mysql H2 Database r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE h2 启动 Halo 服务
docker-compose up -d
实时查看日志:
docker-compose logs -f
用浏览器访问
$HALO_EXTERNAL_URL/console/
(外部访问链接)即可进入 Halo 管理端。管理员用户名为admin
,登录密码为上方设置的HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD
。提示如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过
http://ip:端口号
的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
更新容器组
停止运行中的容器组
cd ~/halo && docker-compose down
备份数据(重要)
cp -r ~/halo ~/halo.archive
需要注意的是,halo.archive 文件名不一定要根据此文档命名,这里仅仅是个示例。
更新 Halo 服务
修改
docker-compose.yaml
中配置的镜像版本。services: halo: image: halohub/halo:2.4 container_name: halo
docker-compose pull halo
docker-compose up -d
更该时区和同步时间
CentOS同步时间
yum -y install ntpdate
timedatectl set-timezone Asia/Shanghai
ntpdate ntp1.aliyun.com
BBR
CentOS 7 BBR
wget -N --no-check-certificate "https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/tcp.sh" && chmod +x tcp.sh && ./tcp.sh
![image-20230416160949106](../../../../Application Support/typora-user-images/image-20230416160949106.png)
选择:4,好像只能开始BBR加速,没办法开启BBRplus。
也可以运行一下10系统配置优化
单线程测试
bash <(curl -Lso- https://bench.im/hyperspeed)
流媒体测试
bash <(curl -L -s https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/check.sh)
Chatgpt测试
bash <(curl -Ls https://cpp.li/openai)
添加SWAP虚拟内存
注意:VPS 的内存如果过小,建议设置一下 SWAP,一般为内存的 1-1.5 倍即可,可以让系统运行更流畅!
wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh