惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
量子位
月光博客
月光博客
罗磊的独立博客
宝玉的分享
宝玉的分享
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
博客园 - 叶小钗
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
美团技术团队
爱范儿
爱范儿
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Y
Y Combinator Blog

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
Fluid -44- 自建一言 docker 部署实例
Yiwei Zhang · 2024-02-08 · via 又见苍岚

一言是很酷的中二短句生成平台,近来应该是访问量太大,服务器加入了一些限制,稍微有较大访问频率时便会报错,而针对这个问题一言提供了实例部署的方案解决,本文记录实现过程。

一言

用代码表达言语的魅力,用代码书写山河的壮丽。

一言是创建于 2016 年的项目,起初是用于个人目的。目前已经转为公益项目,由萌创团队运营,为大家提供服务。 所谓一言(ヒトコト),即一句话。这句话可以是传达了感动,可以是博人一笑,可以是发人深思。总之,一言,代表着言语的触动,灵魂的交流。

问题复现

近来对一言的语句接口访问稍微频繁一点(大概10秒内访问三五次)便会被屏蔽一段时间:

1
Access to XMLHttpRequest at 'https://v1.hitokoto.cn/' from origin 'https://www.zywvvd.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

不爽归不爽,但还是开心一言这个公益项目有这么多的访问量。

解决方案

https://developer.hitokoto.cn/sentence/deploy.html

一言官方自 v1.5.0 可以部署自己的实例,这个方案十分适合访问量大,站点私密性高的需求。为了方便隔离环境,我们直接使用 Docker 实现部署。

Docker 容器创建

在自己的服务器上床一个文件夹 hitokoto,写入 docker-compose.yml 文件:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
version: '3'
networks:
hitokoto_api:
driver: bridge

services:
hitokoto_api:
networks:
- hitokoto_api
image: hitokoto/api:release
container_name: hitokoto_api
hostname: hitokoto_api
environment:
NODE_ENV: production
# 服务配置
url: https://v1.hitokoto.cn # 请修改为您想要部署的域名
api_name: vvd-hitokoto # 改一个好听的标识吧
requests.hosts: "['v1.hitokoto.cn','international.v1.hitokoto.cn', 'api.a632079.me', 'api.hitokoto.cn', 'sslapi.hitokoto.cn']" # 改成你想统计的主机名列表
redis.host: redis # Redis 连接地址,如果您使用本文件提供的 Redis 的话您无需修改此项
redis.port: 6379 # Redis 连接端口
# redis.password:
# redis.database: 0
ports:
- 8000:8000 # 前面的主机端口可以根据实际需求调整,后面的容器端口 8000 不能改
links:
- redis
restart: always
volumes:
- ./etc/api:/usr/src/app/data

redis:
networks:
- hitokoto_api
image: redis
restart: always
container_name: redis
hostname: redis
volumes:
- ./etc/redis.conf:/etc/redis/redis.conf # 一定要记得把 redis.conf 先放在这个位置哦
- ./data/redis:/data
command: redis-server /etc/redis/redis.conf
# ports:
# - 6379:6379 # 如果有必要请取消注释本行

这里和官方提供的稍有不同,根据个人需求自己调整

之后就可以部署了:

1
docker-compose up -d

如果有如下输出说明容器创建成功:

1
2
3
docker-compose up -d
Recreating redis ... done
Recreating hitokoto_api ... done

接口测试

测试地址:

1
2
127.0.0.1:8000
localhost:8000

如返回如下格式信息说明部署成功:

也可以在浏览器直接输入上述两个地址

1
2
$ curl localhost:8000 
{"id":7891,"uuid":"7447ee12-e574-4984-8bd5-6d3b64d5beae","hitokoto":"若你困于无风之地,我将奏响高天之歌。","type":"c","from":"原神","from_who":"温迪","creator":"神在白天做梦","creator_uid":12651,"reviewer":1,"commit_from":"web","created_at":"1658136015","length":18}

注意:在刚刚部署完的几分钟内,测试接口报错 curl: (56) Recv failure: Connection reset by peercurl: (52) Empty reply from server 都是正常的,应该是他在初始化个啥,得等一会才好使。

反向代理

Nginx 反向代理成 带证书的 https 接口,暴露给公网:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen <port> ssl;
listen [::]:<port> ssl;
# server_name localhost;

ssl_certificate /ssl/uipv4.zywvvd.com.crt;
ssl_certificate_key /ssl/uipv4.zywvvd.com.key;

location / {
proxy_set_header X-FORWARDED-FOR $remote_addr;
proxy_set_header X-FORWARDED-PROTO $scheme;
proxy_set_header Host $http_host;
proxy_pass http://<ip:port>;
}
}

Fluid 使用自建接口

所以我现在自建的一言接口: https://uipv4.zywvvd.com:33044/

将这个接口替换掉 _config.fluid.yml 文件中的 原始一言 接口 “https://v1.hitokoto.cn/” 可以平替功能的同时实现没有限制的访问。

如果你的网站调用 一言,访问量不那么大的话可以用我这个试试看 ~

参考资料

文章链接:
https://www.zywvvd.com/notes/hexo/theme/fluid/fluid-hitokoto-deploy/hitokoto-deploy/