# Hugo 博客：Algolia 搜索 + Netlify 自动部署


## 引言

[上一篇]({{< ref "loveit-aplayer-pjax-music" >}}) 搞定了音乐播放器，这一篇记录搜索和部署。

LoveIt 默认用 lunr 本地搜索，文章多了会慢。换成 Algolia 云端搜索，再配上 Netlify 自动部署——`git push` 即上线。

## Algolia 搜索

### 注册

[algolia.com](https://www.algolia.com) 注册 → Create Application → Free plan → Region 选 United States → 创建 Index 名为 `linchuan`。

Settings → API Keys，拿到三个密钥：

| 密钥 | 公开/私密 | 用在 |
|------|-----------|------|
| Application ID | 公开 | `hugo.toml` |
| Search-Only API Key | 公开 | `hugo.toml` |
| Admin API Key | **私密** | Netlify 环境变量 |

### hugo.toml

```toml
[params.search]
  enable = true
  type = "algolia"
  [params.search.algolia]
    index = "linchuan"
    appID = "你的ApplicationID"
    searchKey = "你的Search-Only API Key"
```

### atomic-algolia

上传 `public/index.json` 到 Algolia：

```bash
npm install --save-dev atomic-algolia
```

`package.json`：

```json
{
  "scripts": { "algolia": "atomic-algolia" }
}
```

## Netlify 部署

### netlify.toml

```toml
[build]
  command = "hugo --minify && npm run algolia"
  publish = "public"

[build.environment]
  HUGO_VERSION = "0.161.1"
  HUGO_ENV = "production"
  ALGOLIA_INDEX_NAME = "linchuan"
  ALGOLIA_INDEX_FILE = "public/index.json"
  SECRETS_SCAN_OMIT_KEYS = "ALGOLIA_APP_ID"

[[headers]]
  for = "/*"
  [headers.values]
    X-Frame-Options = "DENY"
    X-Content-Type-Options = "nosniff"
    Referrer-Policy = "strict-origin-when-cross-origin"
```

`ALGOLIA_INDEX_NAME` 和 `ALGOLIA_INDEX_FILE` 写进 toml 避免 Netlify 扫描误判。`SECRETS_SCAN_OMIT_KEYS` 是因为 Netlify 会误判公开的 App ID 为密钥泄漏。

### 环境变量

Netlify → Site configuration → Environment variables：

| Key | Value | 勾 Secret |
|------|-------|-----------|
| `ALGOLIA_APP_ID` | `6GZCZ0KA2C` | 否 |
| `ALGOLIA_ADMIN_KEY` | 你的 Admin API Key | ✅ 必须 |
| `ALGOLIA_INDEX_NAME` | `linchuan` | 否 |

> ⚠️ `ALGOLIA_INDEX_NAME` 不要勾 Secret——netlify.toml 和原子输里都已经有它，勾了会被当密钥泄漏扫描出来导致构建失败。

### Github 的密钥处理

`hugo.toml` 会提交到 GitHub。里面只有 `appID` 和 `searchKey`，两个都是公开密钥——暴露了不影响安全。Admin API Key 只存在于 Netlify 服务端的加密环境变量中，永远不会进入代码仓库。

### 初始化推送

```bash
cd 博客目录
git init
git add .
git commit -m "初始化博客"
git branch -M main
git remote add origin https://github.com/你的用户名/仓库名.git
git push -u origin main
```

### 修改 baseURL

部署后把 Netlify 给的域名填入 `hugo.toml`：

```toml
baseURL = "https://linchuan-blog.netlify.app"
```

## 构建流程

```
git push
  → Netlify 拉取代码
  → hugo --minify（生成站点 + public/index.json）
  → npm run algolia（atomic-algolia 上传索引到 Algolia）
  → 密钥扫描（跳过 ALGOLIA_APP_ID）
  → 发布到 CDN
```

每次更新文章只需要 `git push`，全程自动化。

## 总结

| 要点 | 说明 |
|------|------|
| Algolia Free plan | 每月 1 万次搜索，个人博客够用 |
| atomic-algolia | 一行 `npm run algolia`，自动读环境变量 |
| Admin Key 安全 | 只存 Netlify 服务端，永远不碰 git |
| 密钥扫描 | App ID 不敏感，加 `OMIT_KEYS` 跳过 |
| 全自动部署 | push → 构建 → 上传索引 → 发布，无需干预 |

