SuperAPI AI 工具集

railway-storage

部署与运维

查看项目

更新于 10-15 17:27

技能介绍

用途:本技能用于在 Railway 上配置和使用其 S3 兼容存储桶,适用于文件上传、为 Railway 设置 S3 客户端,以及通过代理接口或预签名 URL 提供文件访问的场景。

主要能力与限制:Railway 桶默认私有且不支持公共桶,ACL: "public-read" 会被忽略;对外提供文件需使用代理端点(推荐,由 API 路由从 S3 取回文件再返回客户端)或预签名 URL(限时直链)。

环境变量:关联存储桶到服务后,Railway 自动注入以下名称,需使用 AWS_* 前缀,勿用 S3_*:AWS_ENDPOINT_URL=https://storage.railway.app、AWS_DEFAULT_REGION=auto、AWS_S3_BUCKET_NAME=your-bucket-name、AWS_ACCESS_KEY_ID=tid_xxx、AWS_SECRET_ACCESS_KEY=tsec_xxx。

客户端设置:应使用惰性初始化,避免在模块顶层访问 process.env(Docker 构建时变量不可用);S3Client 需设置 endpoint、region(通常为 auto)、credentials,并必须加 forcePathStyle: true。上传使用 PutObjectCommand,Bucket 取 AWS_S3_BUCKET_NAME,ACL 被忽略,上传后返回代理 URL 如 /uploads/{key}。

代理端点:可创建如 src/app/api/uploads/[...path]/route.ts 的路由,读取 S3 对象并设置 Content-Type、Content-Length、Cache-Control 等响应头;读取辅助函数用 GetObjectCommand,通过 transformToWebStream 返回流。可通过 next.config.ts 的 rewrites 将 /uploads/:path* 映射到 /api/uploads/:path*。

依赖:bun add @aws-sdk/client-s3 @aws-sdk/s3-request-presigner。

常见问题:上传后返回 403 因 ACL 被忽略,应改用代理端点;构建报缺少环境变量因模块顶层初始化,应改为惰性初始化;"Invalid endpoint" 因缺少 forcePathStyle,需补上;图片更新不生效多为浏览器或 React Query 缓存,需调用 invalidateQueries()。数据库中应存代理 URL,如 /uploads/{teamId}/avatar/{filename},而非 https://storage.railway.app/bucket/{key}。