feat: store node logo/favicon in postgres instead of S3

- Add logoData and faviconData columns to nodes table
- Create /api/admin/node/upload endpoint for direct DB storage
- Create /api/node/logo and /api/node/favicon endpoints to serve images
- Update admin page to use new upload endpoint
- Remove dependency on admin's personal S3 storage for node assets
This commit is contained in:
Christomatt
2026-02-01 16:29:39 +01:00
parent 0cea2e9e1f
commit 90dfd62434
17 changed files with 913 additions and 90 deletions
+30 -2
View File
@@ -577,8 +577,36 @@ export default function LoginPage() {
<option value="minio">MinIO / Self-hosted</option>
<option value="other">Other S3-compatible</option>
</select>
<div style={{ fontSize: '11px', color: 'var(--foreground-tertiary)', marginTop: '4px' }}>
You own your storage. We just connect to it.
</div>
</div>
{/* Storage Explainer Section */}
<div style={{
marginBottom: '20px',
padding: '16px',
background: 'var(--background-secondary)',
border: '1px solid var(--border)',
borderRadius: 'var(--radius-md)',
}}>
<div style={{ fontSize: '14px', fontWeight: 600, marginBottom: '12px', color: 'var(--foreground)' }}>
🗄 Why do I need to provide storage?
</div>
<div style={{ fontSize: '13px', color: 'var(--foreground-secondary)', lineHeight: 1.5, marginBottom: '12px' }}>
Synapsis is <strong>decentralized</strong> unlike other platforms, we don't store your photos, videos, or files on our servers.
Instead, you connect your own S3-compatible storage bucket (like Cloudflare R2 or Backblaze B2) where your media lives.
</div>
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))', gap: '12px' }}>
<div style={{ fontSize: '12px', color: 'var(--foreground-tertiary)' }}>
<strong style={{ color: 'var(--success)' }}>✓ You own your data</strong><br/>
Your files stay in your bucket, not ours
</div>
<div style={{ fontSize: '12px', color: 'var(--foreground-tertiary)' }}>
<strong style={{ color: 'var(--success)' }}>✓ Portable</strong><br/>
Take your media with you if you leave
</div>
<div style={{ fontSize: '12px', color: 'var(--foreground-tertiary)' }}>
<strong style={{ color: 'var(--success)' }}>✓ Free options</strong><br/>
R2 and B2 offer 10GB free
</div>
</div>
</div>