---
title: 用 docker 安装 Halo 博客
created: 2022-02-16 14:04:17
tags:
  - Docker
  - Self-hosted
slug: halo
summary: ''
lastmod: 2022-05-07T05:39:19.169Z
---

系统：ubuntn 20.04

参考：

- [用 Nginx 反代实现 docker 安装 WordPress 与其他服务并存 – 沉默之沙](https://yukieyun.net/tech/shared-service-same-server-wordpress/)
- [RSS | RSSHub 搭配 Miniflux，实现订阅自由](https://mantyke.icu/2021/rsshub-miniflux/)

Halo 官网：[Halo](https://halo.run/#quickstart)

建议大家先去[Halo 官网主题仓库](https://halo.run/themes.html)看看有没有喜欢的主题再决定要不要装，不然很可能像我一样装了之后又跑路了…… ^^

## 准备

### 解析域名

域名生效需要时间，为了避免申请 SSL 证书时屡次失败导致超过申请次数限制，最好提前添加域名解析[^1]，我这里用的是子域名。

为域名添加一个 A 记录，指向服务器所在 IP。如 Namesile 中：
![](https://uneorange.oss-cn-guangzhou.aliyuncs.com/202202151120134.png)

### 安装 docker

在 Ubuntu 中安装 docker[^2]：

```zsh
apt update
apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
apt update
```

其他系统可参考：[Plume | 利用 Docker-compose 搭建 Fedi 开源博客平台 – Zoe's Dumpster.](https://blog.tantalum.life/posts/build-plume-in-docker/#%E5%AE%89%E8%A3%85dockerdocker-compose)中的安装方式，或者查看官方文档。有的 VPS 在装系统的时候也可以预装 docker，如 vultr/contabo 都有，不过 docker-compose 就需要自己装（这里似乎没有用到 docker-compose。

检查是否装好，有版本就装好了：

```zsh
docker -v
```

### 检查端口开放情况

参考：[Ubuntu20.04 开放指定端口\_哈-CSDN 博客](https://blog.csdn.net/lianghecai52171314/article/details/113813826)

我不太懂端口是怎么开放的，自动开放还是用了就开放。这里用的是 ufw 来设置防火墙开放端口，用 netstat 查看端口占用状况。

Debian/Ubuntu 中安装 netstat[^3]：

```zsh
apt install net-tools
```

检查端口占用：

```bash
netstat -aptn
```

ufw 是 Ubuntu20.04 系统预装的 [^3]，如未安装上，可以这样安装：

```bash
 sudo apt update
 sudo apt install ufw
```

常用操作：

```bash
ufw enable  #打开防火墙
ufw disable #关闭防火墙
ufw status  #查看防火墙规则
ufw allow 22 #打开22端口
ufw deny 22 #拒绝访问22端口
```

打开防火墙之前最好打开常用的端口，如 22，不然可能会连不上服务器。

## 安装 Halo

参考：[使用 Docker 部署 Halo | Halo Documents](https://docs.halo.run/getting-started/install/docker)

### 1.创建工作目录

创建一个文件夹存放 Halo，我这里命名为.halo，当然也可以叫其他的。

```bash
mkdir ~/.halo && cd ~/.halo
```

### 2.下载示例配置文件到工作目录

```bash
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
```

### 3. 编辑配置文件，配置数据库或者端口

我不会用 vim 命令，所以这里用 nano 编辑

#### 打开配置文件 application.yaml

```bash
nano application.yaml
```

#### 修改配置

[配置参考 | Halo Documents](https://docs.halo.run/getting-started/config)
这里已经有刚下载好的配置文件了，我们可以根据自己的需要修改，Halo 数据库支持 H2 和 Mysql 数据库，因为我已经安装了一个 Wordpress 博客占用了 Mysql 数据库，虽然不知道有无影响，但为了避免出错，最后选择了按示例里的配置，使用 H2 数据库（主要还是懒得改

我这里将端口放到 8090，因为原 80 端口已经被占用，大家可以选择其他开放端口，注意修改数据库用户名和密码。

```yaml
server:
  port: 8090

  # Response data gzip.
  compression:
    enabled: false
spring:
  datasource:
    # H2 database configuration.
    driver-class-name: org.h2.Driver
    url: jdbc:h2:file:~/.halo/db/halo
    username: admin #数据库用户名
    password: 123456 #数据库密码

    # MySQL database configuration.
  #    driver-class-name: com.mysql.cj.jdbc.Driver
  #    url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  #    username: root
  #    password: 123456

  # H2 database console configuration.
  h2:
    console:
      settings:
        web-allow-others: false
      path: /h2-console
      enabled: false

halo:
  # Your admin client path is https://your-domain/{admin-path}
  admin-path: admin

  # memory or level
  cache: memory
```

### 4. 拉取最新的 Halo 镜像

```bash
docker pull halohub/halo:latest
```

### 5. 创建容器

```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:latest
```

### 6. 打开安装引导界面。

访问 `http://服务器ip:端口号`
![](https://uneorange.oss-cn-guangzhou.aliyuncs.com/202202151243869.png)

## 用 Nginx 反代

说实话，我现在还没懂 Nginx 是干嘛的，反代又是什么，但好像一般都要有，那就做一下吧。幸好 Halo 还有现成的配置[^4]可以抄一下，结合云五的 Wordpress 搭建教程[^2]，把里面 wordpress 的部分改为 halo 就可以了。

### 1.安装 Nginx

```bash
apt install nginx
cd /etc/nginx/sites-enabled/
rm rf default
cd /etc/nginx/sites-available/
nano halo.conf
```

### 2.配置 halo.conf

注意修改`www.yourdomain.com` 为自己的域名

```conf
  upstream halo {
    server 127.0.0.1:8090;
    }
    server {
      listen 80;
      listen [::]:80;
      server_name www.yourdomain.com;
      client_max_body_size 1024m;
      location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    }
```

用`nginx -t`测试配置文件，如果最后有出现`suceessful` ，那测试就成功了。

然后为这个配置文件增加一个链接

```bash
cd /etc/nginx/sites-enabled/
ln -s ../sites-available/halo.conf halo.conf
```

### 3.重启 nginx

```bash
systemctl reload nginx
```

现在访问域名就可以到达 halo 博客主页了，如果不行，可以 ping 一下域名看是不是解析还没生效：如 `ping exampl.com`

我这里出现一个问题，是输入域名后到了我的 miniflux 主页，因为 halo.conf 里域名后缀输错了……

## 安装 certbot，为域名获取免费 SSL 证书

有 ssl 证书后，就不会被提示网站不安全了，也就是从 http->https

### 1.安装 certbot

```bash
apt install certbot python3-certbot-nginx
```

### 2.配置证书

修改 example.com 为自己的域名：

```bash
certbot --nginx -d example.com -d www.example.com
```

如果你不确定是否可以申请成功，或者还在修改/测试配置，可以在后面加`--staging` 测试，避免申请超过次数限制[^1]

一些选项，这里最好选择 1，如果选择 2，就没办法用 http 访问域名了：

```text
  1: No redirect - Make no further changes to the webserver configuration.
  2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
  new sites, or if you're confident your site works on HTTPS. You can undo this
  change by editing your web server's configuration.
```

然后同意条款后问是否暴露邮箱时选 No[^2]。

## 其他

- 主题编辑：首页 / 外观 / 主题编辑 里修改具体文件
- 进入后台：域名后面加/admin，如：https://yourdomain/admin

---

[^1]: [WordPress + VPS 建站教程 - 少数派](https://sspai.com/post/66447#:~:text=sudo%20swapon%20/swapfile-,SSL%20%E8%B6%85%E8%BF%87%E4%BD%BF%E7%94%A8%E9%A2%91%E7%8E%87%E9%99%90%E9%A2%9D,-%E6%98%AF%E7%9A%84%EF%BC%8C%E5%85%8D%E8%B4%B9)
[^2]: [用 Nginx 反代实现 docker 安装 WordPress 与其他服务并存 – 沉默之沙](https://yukieyun.net/tech/shared-service-same-server-wordpress/)
[^3]: [如何在 Linux 中安装 netstat 命令 - 云+社区 - 腾讯云](https://cloud.tencent.com/developer/article/1852241)
[^4]: [使用 Docker 部署 Halo | Halo Documents](https://docs.halo.run/getting-started/install/docker#nginx)
