rspace-online/backlog/tasks/task-140 - IPFS-integration...

2.1 KiB

id title status assignee created_date updated_date labels dependencies references priority
TASK-140 IPFS integration for backups and generated files Done
2026-04-02 22:11 2026-04-02 22:11
infra
ipfs
storage
server/ipfs.ts
server/ipfs-routes.ts
server/local-first/backup-store.ts
server/local-first/backup-routes.ts
server/index.ts
medium

Description

Add IPFS as a redundant storage layer via Kubo (ipfs.jeffemmett.com). Pin encrypted backups and AI-generated files (images, 3D models, zines) to IPFS fire-and-forget. Filesystem remains primary — IPFS failures are non-fatal. API routes at /api/ipfs for status, pin/unpin, and gateway proxy.

Acceptance Criteria

  • #1 server/ipfs.ts client library with pin/unpin/status functions
  • #2 server/ipfs-routes.ts Hono router at /api/ipfs (status, pin, unpin, gateway proxy)
  • #3 Backup pinning in backup-store.ts (fire-and-forget, CID in manifest)
  • #4 IPFS URL route in backup-routes.ts (GET /:space/:docId/ipfs)
  • #5 Generated file pinning with .cid sidecar files for 8 producer endpoints
  • #6 IPFS_API_URL and IPFS_GATEWAY_URL env vars in docker-compose.yml
  • #7 Kubo reachable from rspace container via traefik-public network

Final Summary

Implemented IPFS integration for rspace-online. Created server/ipfs.ts (client library) and server/ipfs-routes.ts (API routes at /api/ipfs). Modified backup-store.ts to pin encrypted backups fire-and-forget with CID stored in manifest. Added pinGeneratedFile() helper in server/index.ts called from 8 producer endpoints (3D models, fal.ai images, Gemini/Imagen images, zine pages). Each pinned file gets a .cid sidecar loaded into memory cache on startup. Kubo container is collab-server-ipfs-1 on traefik-public network. Deployed and verified on Netcup. Key deployment discovery: server uses local Gitea registry (localhost:3000/jeffemmett/rspace-online), not compose build — documented in MEMORY.md.