Halo详细安装教程

408 阅读8分钟

环境准备

服务器:阿里云服务器 2核2g

Shell工具:Finalshell

阿里经常搞活动,云服务器1年99,不是特别贵,有条件的同学可以购买玩玩(不是打广告,我是用惯了阿里产品。。)

购买连接:www.aliyun.com/lowcode/pro…

  • 服务器购买完成之后,打开控制台

  • 打开云服务器ECS

  • 可以查看自己的实例信息,"IP地址"栏显示公网和内网IP;

  • 打开实例,建议把你的实例账户密码重置一下;

  • 打开安全组,管理规则,这里我配置了两个安全组,一个基础的,一个业务的,嫌麻烦的可以配一个组

  • 基础安全组如下图:将入方向的22;80;443放开;

  • 业务安全组如下图:将入方向3306,81,8090端口放开,后续安装halo需要用到;

注意:业务安全组的授权对象别用0.0.0.0/0;会有安全问题!我这里之前没有注意随便给了0.0.0.0/0,导致被很多莫名其妙的地址访问;

MySQL和halo的你可以给实例的公网IP,NPM没有域名的不用加,有域名的可以配置自己当前电脑使用的网络IP

Shell工具用自己用的顺手的,自行下载即可,这里主要是给小白推荐,我用的是finalshell:www.hostbuf.com/

finalshell安装完成之后,打开新建一个SSH连接

名称:随便;

主机:阿里云实例公网IP;

端口不变;

用户名:阿里云实例登陆的用户名;

密码:阿里云实例密码;

登陆成功~

安装Halo

安装Halo我主要是参考官方文档来的,官方文档链接:docs.halo.run/getting-sta…

一开始用了docker部署,但是docker部署默认使用自带的 H2 Database 数据库,如果要使用自己搭建的mysql数据库,官方建议使用docker-compose部署;所以我这边用了docker-compose部署方式

安装docker

先装docker,docker-compose部署依赖于docker

  • 卸载老的版本
	$ sudo yum remove docker \

	docker-client \

	docker-client-latest \

	docker-common \

	docker-latest \

	docker-latest-logrotate \

	docker-logrotate \

	docker-engine
  • 安装yum工具包
$ sudo yum install -y yum-utils
  • 配置仓库源
	# 1. 默认使用国外源,非常非常非常慢!

	 

	$ sudo yum-config-manager \

	--add-repo \

	https://download.docker.com/linux/centos/docker-ce.repo

	 

	# 2. 推荐用国内源,丝滑!

	$ sudo yum-config-manager \

	--add-repo \

	https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
  • 安装Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io
  • 启动Docker
	$ systemctl enable docker

	$ systemctl start docker

若不报错,说明启动成功。

  • 验证是否安装成功

在docker启动的前提下,在命令行输入以下指令

docker run hello-world

docker run hello-world会先从本地搜索名为hello-world的镜像,若没有找到,则先从docker hub中pull该镜像,拉去镜像到本地成功后,再通过run指令来启动容器运行该镜像。

出现以下信息,说明没啥毛病

安装mysql

  • 下载Mysql镜像,冒号后面可以自己指定版本号,我用的是5.7
docker pull mysql:5.7
  • 查看docker镜像
docker images

会出现已下载的镜像文件

会出现已下载的镜像文件

  • 在本地创建mysql的映射目录
mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf
  • 创建Mysql容器并运行
docker run -p 3306:3306 --name mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  • 查询mysql容器是否在运行
docker ps

STATUS为Up说明在正常运行

好了,数据库环境搭建好了,可以用navicat客户端连接看看;

注意:新建一个halo的数据库,halo博客搭建需要用到;

安装docker-compose

  • 下载最新版的docker-compose文件
sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  • 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
  • 测试安装结果
docker-compose --version

部署Halo

好了,上述依赖都安装完毕,下面开始进入正题,部署Halo

  • 下载halo镜像;这里我用的2.11版本镜像, 建议不要使用latest 标签镜像,很久没更新了
docker pull halohub/halo:2.11
  • 查看镜像,下载成功

  • 在系统任意位置创建一个文件夹,此文档以 ~/halo 为例
mkdir ~/halo && cd ~/halo

注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存

  • 创建 docker-compose.yaml

我这里是halo+mysql;如果你是其他数据库可以参考一下官方文档:docs.halo.run/getting-sta…

yaml文件的创建位置:~/halo/docker-compose.yaml

这里我使用vim创建的时候格式排版乱了,我在自己电脑创建好,再上传到云服务器中;

	version: "3"

	 

	services:

	  halo:

	    image: halohub/halo:2.11

	    container_name: halo

	    restart: on-failure:3

	    network_mode: "host"

	    volumes:

	      - ./halo2:/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/

	      # 端口号 默认8090

	      - --server.port=8090
  • 启动halo
docker-compose -f docker-compose.yaml up -d

在浏览器输入自己的阿里云实例公网地址;ip:8090/console,首次启动会进入初始化页面,自己填写相应信息即可;

安装Nginx Proxy Manager(有域名的同学看过来~)

顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。

即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。

Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。

下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。

  • 首先,我们创建一个文件夹来存放 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:latest'

	    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 关闭或者卸载即可。

  • 启动 NPM
docker-compose -f docker-compose.yml up -d

不出意外,此时你使用阿里云实例的公网ip:81就可以访问 NPM 的网页端了。81入口我们之前放开过

默认登陆的用户名:admin@example.com 密码:changeme

初次登陆修改一下账户和密码

成功之后,页面如下,我这里已经配置一个了,初次Proxy Hosts为0

  • 接着点击 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 自带的一个限制访问功能,这边我们不管,后续可以自行研究。

样例:

Forward Hostname/IP:我这里给的是内网ip,内网ip你可以在云实例的信息中找到;

一键申请 SSL 证书

申请一张 SSL 证书,让我们的网站支持 https 访问

点击save即可;但是我这里报错了。。。

Nginx proxy manager Internal Error报错解决

自动申请不行,网上找了很久也没有找到解决方案;

我开始尝试手动配置;

  • 打开阿里云控制台;搜索数字证书管理服务,点击SSL证书,点击免费证书,创建证书(如果你是其他厂商云服务器,应该也类似功能,你可以自己找找)

image.png

  • 输入你自己的域名;快速签发可以不点;

  • 等待几分钟,证书会出现

  • 点击下载,下载Nginx的证书,会得到一个压缩包,里面有key和pem文件

  • 打开NPM 的网页端,添加证书

name:随便填;key:导入下载的证书key文件;Certificate:导入下载的证书pem文件,点击Save

  • 添加好了之后,回到Proxy Hosts列表,重新配置Proxy Host,SSL选择刚刚手动添加的证书,保存

至此大功告成~