LCT 的后端是怎么跑的

GoPostgreSQL 18内容寻址签名发布更新于

这页写给合作方、开发者,和想加入的人。下面是 LCT 今天实际的部署方式,不是计划。首页只讲它对拍照有什么用,技术细节都在这里。

四条底线

  1. Go 服务

    离线构建

    构建时断网,依赖只能来自本地。同一份源码,在哪台机器上都编出同一个二进制。

  2. 镜像 · sha256

    版本不会漂

    运行的镜像按摘要引用,不用会变的 tag。一年以后,也说得清今天跑的是哪一份字节。

  3. PostgreSQL 18

    两个库分开

    主库和地点库各用各的凭据。地点库没配好,就不提供搜索,不拿主库凑数。

  4. 对象库 · CAS

    按内容寻址

    地点包按内容哈希存放,同样的内容只存一份。每次发布都留归档和事件日志,可以整包回滚。

架构

产品只跟 LCT API 打交道。数据库、对象库和外部服务都在适配层后面,换掉哪一个,产品都不用动。

镜笺 Mark、掌镜 Zlens、MuseFrame 三个产品连接 LCT API;API 之下是 PostgreSQL 主库、地点库、内容寻址对象库与外部上游(和风天气、DeepSeek、邮件发信)。 镜笺 Mark 浏览器 · 内容与地点接口 掌镜 Zlens Android · 账号 MuseFrame Web + Android · 账号 LCT API · Go 单二进制 离线构建 · 镜像按 sha256 引用 · 按动作限频 · 上传体积上限 · 缓存分层 PostgreSQL 18 主库 · 账号 / 社区 地点库 可独立 PG · 独立凭据 对象库 · CAS Place Pack · 图片 外部上游 和风天气 · DeepSeek 邮件发信 发布器签名 → 信任目录校验 → 按内容哈希落盘 → 事件日志 → 可整包回滚

虚线框是外部服务。上游超时有兜底,供应商可以换。密钥只放在服务器的环境变量里,不进代码、镜像和日志。

每一层的做法

首页讲每一层对你有什么用,这里补上是怎么做的。

  1. L1

    账号与登录

    邮箱注册,邮箱加密码登录。库里只有口令的派生结果。

    • 口令用 Argon2id 派生,参数按机器实测来调,并设了下限。
    • 派生同时进行的数量有上限,登录高峰拖不垮服务器。
    • 访问凭据和续期分开计时,掉线不用重新登录。
    • 注册、登录、改密、刷新各自限频。口令强度、尝试次数和锁定策略都能调。
  2. L2

    摄影社区

    图和文字分开存,整层可以关掉。这一版对外就是关着的。

    • 照片走独立的存储目录。
    • 内置敏感词过滤,词表热更新,不用重启。
    • 上传有体积上限,过大的文件直接拒收。
  3. L3

    拍摄地点库

    Place Pack 整包发布。包由发布器签名,服务端按信任目录核对,再按内容寻址落盘。

    • 发布前先暂存、加锁,读的人碰不到写了一半的包。
    • 地点目录可以接独立的数据库,没配就不提供搜索。
    • 库里没有的地点,返回未知。
  4. L4

    天气与空气

    接的是和风天气,换供应商的适配层也留好了。

    • 实时、逐日、空气质量三份缓存各自计时。
    • 每分钟和每天的请求量都有上限。
    • 上游超时有兜底,别人的故障不会直接落到你头上。
  5. L5

    AI 助手

    接的是 DeepSeek,供应商和地址都能换。

    • 整层可以关,关了就没有这个功能。
    • 按小时、按天两道额度,一天的量不会在一小时里用完。
    • 密钥只在服务器环境变量里。

配置缺一半的时候,服务拒绝启动。比如开了要发信的功能,却没配发信通道,进程就起不来。不然用户永远收不到信,我们还看不出是哪里坏了。

想接入,或者一起做

接口在正式开放前可能还会改,架构和部署就是上面这样。想对接接口、谈数据合作,或者你写 Go 也想参与,发封邮件就行。

写邮件给我们

QQ 交流群二维码,群号 824558022

QQ 交流群

824558022

开放时间、地点库的进展和几个产品的消息,都先发在群里。

邮箱 donaldkuke@gmail.com。本页写的是 LCT 现在已经部署的部分,不代表对开放时间、功能清单或服务等级的承诺。