Add MinIO S3 storage setup artifact
Documents nuc-portal S3 configuration for deployment previews Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
158
.artifacts/2026-02-06_20-00_minio-s3-storage-setup.md
Normal file
158
.artifacts/2026-02-06_20-00_minio-s3-storage-setup.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# MinIO S3 Storage Setup for nuc-portal
|
||||
|
||||
**Date:** 2026-02-06 20:00
|
||||
**Context:** Added S3-compatible storage for deployment preview screenshots
|
||||
|
||||
---
|
||||
|
||||
## MinIO Configuration
|
||||
|
||||
### Access Details
|
||||
|
||||
| Property | Value |
|
||||
|----------|-------|
|
||||
| **API Endpoint** | `http://192.168.1.3:9000` |
|
||||
| **Console** | `http://192.168.1.3:9001` |
|
||||
| **Root User** | `minioadmin` |
|
||||
| **Root Password** | `minioadmin` |
|
||||
|
||||
### nuc-portal Service Account
|
||||
|
||||
| Property | Value |
|
||||
|----------|-------|
|
||||
| **Access Key** | `nuc-portal` |
|
||||
| **Secret Key** | `YpVhIltqY6itWQXHWbEzJ82O9Qr3viR5` |
|
||||
| **Policy** | `readwrite` |
|
||||
| **Bucket** | `nuc-portal-previews` |
|
||||
|
||||
---
|
||||
|
||||
## Port Forwarder
|
||||
|
||||
MinIO container wasn't exposed on host. Created port forwarder:
|
||||
|
||||
```bash
|
||||
# Container: minio-port-fwd
|
||||
# Forwards: 9000 (API) and 9001 (Console)
|
||||
docker run -d --name minio-port-fwd \
|
||||
--network xwowg8kswwsocssgocs8ss40 \
|
||||
-p 9000:9000 \
|
||||
-p 9001:9001 \
|
||||
alpine/socat \
|
||||
TCP-LISTEN:9000,fork,reuseaddr TCP-CONNECT:minio-xwowg8kswwsocssgocs8ss40:9000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Environment Variables
|
||||
|
||||
Added to `/Users/agutierrez/Desktop/nuc/nuc-portal/.env.local`:
|
||||
|
||||
```env
|
||||
# MinIO / S3 Storage (for deployment previews)
|
||||
S3_ENDPOINT=http://192.168.1.3:9000
|
||||
S3_ACCESS_KEY=nuc-portal
|
||||
S3_SECRET_KEY=YpVhIltqY6itWQXHWbEzJ82O9Qr3viR5
|
||||
S3_BUCKET=nuc-portal-previews
|
||||
S3_REGION=us-east-1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Files Created
|
||||
|
||||
### `src/lib/s3.ts`
|
||||
|
||||
S3 client helper with functions:
|
||||
|
||||
| Function | Purpose |
|
||||
|----------|---------|
|
||||
| `uploadFile(key, body, contentType)` | Upload any file |
|
||||
| `uploadPreviewScreenshot(appUuid, deploymentUuid, buffer)` | Upload deployment preview |
|
||||
| `getPresignedUrl(key, expiresIn)` | Get signed URL for reading |
|
||||
| `getPreviewUrl(appUuid, deploymentUuid)` | Get preview presigned URL |
|
||||
| `fileExists(key)` | Check if file exists |
|
||||
| `previewExists(appUuid, deploymentUuid)` | Check if preview exists |
|
||||
| `deleteFile(key)` | Delete a file |
|
||||
| `getFile(key)` | Download file as Buffer |
|
||||
|
||||
### `src/app/api/deployments/[uuid]/preview/route.ts`
|
||||
|
||||
API endpoint that:
|
||||
- Checks if preview exists in S3
|
||||
- Returns presigned URL (valid 1 hour) if exists
|
||||
- Returns `{ exists: false }` with hint if not
|
||||
|
||||
---
|
||||
|
||||
## Dashboard Integration
|
||||
|
||||
Updated `DeploymentDashboard.tsx`:
|
||||
- Added SWR hook for preview fetching
|
||||
- Shows loading spinner while fetching
|
||||
- Displays image if preview exists
|
||||
- Falls back to placeholder if not
|
||||
|
||||
---
|
||||
|
||||
## Storage Structure
|
||||
|
||||
```
|
||||
nuc-portal-previews/
|
||||
└── previews/
|
||||
└── {app-uuid}/
|
||||
└── {deployment-uuid}.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependencies Added
|
||||
|
||||
```json
|
||||
{
|
||||
"@aws-sdk/client-s3": "^3.x",
|
||||
"@aws-sdk/s3-request-presigner": "^3.x"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
To capture screenshots automatically:
|
||||
1. Add post-deployment hook in Coolify
|
||||
2. Use Playwright (`playwriter-nuc-01`) to take screenshot
|
||||
3. Upload to MinIO via `uploadPreviewScreenshot()`
|
||||
|
||||
Manual capture example:
|
||||
```typescript
|
||||
// Using Playwright to capture screenshot
|
||||
const screenshot = await page.screenshot({ type: 'png' });
|
||||
await uploadPreviewScreenshot(appUuid, deploymentUuid, screenshot);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verification
|
||||
|
||||
```bash
|
||||
# Test MinIO health
|
||||
curl http://192.168.1.3:9000/minio/health/live
|
||||
|
||||
# List buckets (via mc)
|
||||
ssh nuc 'docker run --rm --network host --entrypoint /bin/sh minio/mc -c "
|
||||
mc alias set m http://localhost:9000 nuc-portal YpVhIltqY6itWQXHWbEzJ82O9Qr3viR5
|
||||
mc ls m/
|
||||
"'
|
||||
|
||||
# Test preview API
|
||||
curl http://localhost:3000/api/deployments/<uuid>/preview
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Related
|
||||
|
||||
- MinIO container: `minio-xwowg8kswwsocssgocs8ss40`
|
||||
- Port forwarder: `minio-port-fwd`
|
||||
- Implementation: `.artifacts/2026-02-06_19-30_deployment-dashboard-implementation.md`
|
||||
Reference in New Issue
Block a user