四条底线
-
Go 服务
离线构建
构建时断网,依赖只能来自本地。同一份源码,在哪台机器上都编出同一个二进制。
-
镜像 · sha256
版本不会漂
运行的镜像按摘要引用,不用会变的 tag。一年以后,也说得清今天跑的是哪一份字节。
-
PostgreSQL 18
两个库分开
主库和地点库各用各的凭据。地点库没配好,就不提供搜索,不拿主库凑数。
-
对象库 · CAS
按内容寻址
地点包按内容哈希存放,同样的内容只存一份。每次发布都留归档和事件日志,可以整包回滚。
架构
产品只跟 LCT API 打交道。数据库、对象库和外部服务都在适配层后面,换掉哪一个,产品都不用动。
虚线框是外部服务。上游超时有兜底,供应商可以换。密钥只放在服务器的环境变量里,不进代码、镜像和日志。
每一层的做法
首页讲每一层对你有什么用,这里补上是怎么做的。
-
L1
账号与登录
邮箱注册,邮箱加密码登录。库里只有口令的派生结果。
- 口令用 Argon2id 派生,参数按机器实测来调,并设了下限。
- 派生同时进行的数量有上限,登录高峰拖不垮服务器。
- 访问凭据和续期分开计时,掉线不用重新登录。
- 注册、登录、改密、刷新各自限频。口令强度、尝试次数和锁定策略都能调。
-
L2
摄影社区
图和文字分开存,整层可以关掉。这一版对外就是关着的。
- 照片走独立的存储目录。
- 内置敏感词过滤,词表热更新,不用重启。
- 上传有体积上限,过大的文件直接拒收。
-
L3
拍摄地点库
Place Pack 整包发布。包由发布器签名,服务端按信任目录核对,再按内容寻址落盘。
- 发布前先暂存、加锁,读的人碰不到写了一半的包。
- 地点目录可以接独立的数据库,没配就不提供搜索。
- 库里没有的地点,返回未知。
-
L4
天气与空气
接的是和风天气,换供应商的适配层也留好了。
- 实时、逐日、空气质量三份缓存各自计时。
- 每分钟和每天的请求量都有上限。
- 上游超时有兜底,别人的故障不会直接落到你头上。
-
L5
AI 助手
接的是 DeepSeek,供应商和地址都能换。
- 整层可以关,关了就没有这个功能。
- 按小时、按天两道额度,一天的量不会在一小时里用完。
- 密钥只在服务器环境变量里。
配置缺一半的时候,服务拒绝启动。比如开了要发信的功能,却没配发信通道,进程就起不来。不然用户永远收不到信,我们还看不出是哪里坏了。
QQ 交流群
824558022
开放时间、地点库的进展和几个产品的消息,都先发在群里。
邮箱 donaldkuke@gmail.com。本页写的是 LCT 现在已经部署的部分,不代表对开放时间、功能清单或服务等级的承诺。