Go + Redis:本地部署高性能图片主色调提取服务

部署 img2color-go 所需的环境非常轻量,主要包含的核心组件

  • go语言环境编译用(Go 1.21+ (建议最新稳定版)。)
  • docker拉起redis容器缓存用(Docker 20.10+, Docker Compose V2。)

拉起Redis容器做缓存

在 /val/lib/docker/redis-img2color目录下创建 docker-compose.yml:

复制代码
services:
  redis-img2color:
    image: redis:7-alpine
    container_name: redis-img2color
    restart: always
    ports:
      - "127.0.0.1:6380:6379"
    volumes:
      - /val/lib/docker/redis-img2color:/data
    command: redis-server --appendonly yes

执行启动:

复制代码
docker compose up -d

克隆代码

复制代码
git clone https://github.com/anzhiyu-c/img2color-go.git
cd img2color-go

修改包名:api/img2color.go

为什么要改?

  • 原代码 (package handler):这是为 Vercel/Serverless 环境设计的"库"模式,它没有 main 函数入口,直接 go build 会报错或者生成无法直接运行的库文件。

  • 修改后 (package main):这告诉 Go 编译器这是一个独立的可执行程序。配合我们添加的 main 函数(或原有的入口逻辑),才能编译出一个可以在服务器上直接运行的二进制文件 (img2color-server)。

    将 api/img2color.go 第一行的 package handler 替换为 package main

    sed -i '1s/package handler/package main/' api/img2color.go

    验证一下是否修改成功

    head -n 1 api/img2color.go

配置环境变量

创建/修改 .env 文件:

复制代码
PORT=9000
REDIS_ADDRESS=127.0.0.1:6380
REDIS_PASSWORD=
USE_REDIS_CACHE=true
REDIS_DB=0
USE_MONGODB=false
MONGO_URI=
MONGO_DB=
ALLOWED_REFERERS=

编译 Go 程序

复制代码
cd /opt/img2color-go
go mod tidy
go build -o img2color-server ./api/
chmod +x img2color-server

配置 Systemd 服务

创建 /etc/systemd/system/img2color.service:

复制代码
[Unit]
Description=img2color-go Service
After=network.target docker.service

[Service]
Type=simple
User=root
WorkingDirectory=/opt/img2color-go
ExecStart=/opt/img2color-go/img2color-server
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动并验证

复制代码
# 重载配置并启动
sudo systemctl daemon-reload
sudo systemctl enable --now img2color

# 查看日志确认连接成功
sudo journalctl -u img2color -f

最终测试

复制代码
curl "http://127.0.0.1:9000/api?img=https://avatars.githubusercontent.com/u/9919?v=4"

反向代理

后续可以配置个反向代理将ip+port换成域名,这里不做过多赘述

相关推荐
程序喵大人3 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)3 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的3 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质4 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
老男孩游戏时光4 小时前
# Redis分布式锁三种实现方案,踩坑记录
redis
释厄6234 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_962885725 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
石小千5 小时前
Redis开启ACL认证
数据库·redis·缓存
临床数据科学和人工智能兴趣组5 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
蜗牛互联网5 小时前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python