switch from minio to seaweed S3 storage: configs and buckets (dev vs. prod, refactoring magic strings)

This commit is contained in:
2025-09-04 10:55:45 +02:00
parent 3d22aab5b3
commit b9c03831cb
7 changed files with 24 additions and 21 deletions

View File

@@ -1,10 +1,10 @@
{ {
"minio": { "minio": {
"endPoint": "api-s3.innovation-hub-niedersachsen.de", "endPoint": "sws3.innovation-hub-niedersachsen.de",
"port": 443, "port": 443,
"useSSL": true, "useSSL": true,
"accessKey": "GxKhfnfkNvlDU7qzsz0D", "accessKey": "wjpKrmaqXra99rX3D61H",
"secretKey": "cqSM5rIRr4MPtqzu2sNKgmB9k2OghPbyxwAWogeM" "secretKey": "fTPi0u0FR6Lv9Y9IKydWv6WM0EA5XrsK008HCt9u"
}, },
"jwt": { "jwt": {
"secret": "@S2!q@@wXz$dCQ8JoVsHLpzaJ6JCfB", "secret": "@S2!q@@wXz$dCQ8JoVsHLpzaJ6JCfB",

View File

@@ -1,9 +1,9 @@
import { client } from '$lib/minio'; import { client, BUCKET } from '$lib/minio';
export default async function vorgangNumberOccupied (vorgangNumber: string): Promise<boolean> { export default async function vorgangNumberOccupied (vorgangNumber: string): Promise<boolean> {
const prefix = `${vorgangNumber}`; const prefix = `${vorgangNumber}`;
const promise: Promise<boolean> = new Promise((resolve) => { const promise: Promise<boolean> = new Promise((resolve) => {
const stream = client.listObjectsV2('tatort', prefix, false, ''); const stream = client.listObjectsV2(BUCKET, prefix, false, '');
stream.on('data', () => { stream.on('data', () => {
stream.destroy(); stream.destroy();
resolve(true); resolve(true);

View File

@@ -7,6 +7,10 @@ import config from '$lib/config';
/** export const client = new Minio.Client(config.minio); */ /** export const client = new Minio.Client(config.minio); */
export const client = new Client(config.minio); export const client = new Client(config.minio);
export const BUCKET = 'tatort'; const isProd = process.env.NODE_ENV == 'production';
const BUCKET = isProd ? 'tatort' : 'tatort-dev';
export { BUCKET };
export const TOKENFILENAME = '__perm__'; export const TOKENFILENAME = '__perm__';
export const CONFIGFILENAME = 'config.json'; export const CONFIGFILENAME = 'config.json';

View File

@@ -1,5 +1,5 @@
import { Readable } from 'stream'; import { Readable } from 'stream';
import { client } from '$lib/minio'; import { BUCKET, client } from '$lib/minio';
import { fail } from '@sveltejs/kit'; import { fail } from '@sveltejs/kit';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
@@ -51,7 +51,7 @@ export const actions = {
objectName += '.glb'; objectName += '.glb';
} }
const url = await client.presignedPutObject('tatort', objectName); const url = await client.presignedPutObject(BUCKET, objectName);
return { url }; return { url };
}, },
@@ -95,7 +95,7 @@ export const actions = {
const vorgang = data.vorgang; const vorgang = data.vorgang;
const name = data.name; const name = data.name;
const url = await client.presignedPutObject('tatort', `${vorgang}/${name}`, 60); const url = await client.presignedPutObject(BUCKET, `${vorgang}/${name}`, 60);
return { url }; return { url };
}, },
@@ -106,7 +106,7 @@ export const actions = {
const stream = data.file.stream(); const stream = data.file.stream();
const metaData = { 'Content-Type': 'model-gtlf-binary', 'X-VorgangsNr': '4711' }; const metaData = { 'Content-Type': 'model-gtlf-binary', 'X-VorgangsNr': '4711' };
const result = new Promise((resolve, reject) => { const result = new Promise((resolve, reject) => {
client.putObject('tatort', name, Readable.from(stream), metaData, function (err, etag) { client.putObject(BUCKET, name, Readable.from(stream), metaData, function (err, etag) {
if (err) return reject(err); if (err) return reject(err);
resolve(etag); resolve(etag);
}); });

View File

@@ -1,8 +1,8 @@
import { client } from '$lib/minio'; import { BUCKET, client } from '$lib/minio';
import type { PageServerLoad } from './$types'; import type { PageServerLoad } from './$types';
export const load: PageServerLoad = async ({ params }) => { export const load: PageServerLoad = async ({ params }) => {
const { vorgang, tatort } = params; const { vorgang, tatort } = params;
const url = await client.presignedUrl('GET', 'tatort', `${vorgang}/${tatort}`); const url = await client.presignedUrl('GET', BUCKET, `${vorgang}/${tatort}`);
return { url }; return { url };
} };

View File

@@ -1,4 +1,4 @@
import { client } from '$lib/minio'; import { BUCKET, client } from '$lib/minio';
import { import {
deleteVorgangByToken, deleteVorgangByToken,
getCrimesListByToken, getCrimesListByToken,
@@ -11,7 +11,7 @@ export async function DELETE({ params }) {
const object_list = await new Promise((resolve, reject) => { const object_list = await new Promise((resolve, reject) => {
const res = []; const res = [];
const items_str = client.listObjects('tatort', vorgangToken, true); const items_str = client.listObjects(BUCKET, vorgangToken, true);
items_str.on('data', (obj) => { items_str.on('data', (obj) => {
res.push(obj.name); res.push(obj.name);
@@ -24,7 +24,7 @@ export async function DELETE({ params }) {
}); });
}); });
await client.removeObjects('tatort', object_list); await client.removeObjects(BUCKET, object_list);
deleteVorgangByToken(vorgangToken); deleteVorgangByToken(vorgangToken);
return new Response(null, { status: 204 }); return new Response(null, { status: 204 });

View File

@@ -40,10 +40,9 @@ export async function PUT({ params, request }) {
const vorgangToken = params.vorgang; const vorgangToken = params.vorgang;
// prepare copy, incl. check if new name exists already // prepare copy, incl. check if new name exists already
const crimeOldName = data['oldName']; const crimeOldName = data['oldName'];
const crimeS3FullBucketPathOld = `/tatort/${vorgangToken}/${crimeOldName}`; const crimeS3FullBucketPathOld = `/${BUCKET}/${vorgangToken}/${crimeOldName}`;
const crimeNewName = `${vorgangToken}/${data['newName']}`; const crimeNewName = `${vorgangToken}/${data['newName']}`;
if (!crimeOldName || !crimeNewName) { if (!crimeOldName || !crimeNewName) {
@@ -51,14 +50,14 @@ export async function PUT({ params, request }) {
} }
try { try {
await client.statObject('tatort', crimeNewName); await client.statObject(BUCKET, crimeNewName);
return json({ msg: 'Die Datei existiert bereits.' }, { status: 400 }); return json({ msg: 'Die Datei existiert bereits.' }, { status: 400 });
} catch (error) { } catch (error) {
console.log(error, 'continue operation'); console.log(error, 'continue operation');
} }
await client.copyObject('tatort', crimeNewName, crimeS3FullBucketPathOld); await client.copyObject(BUCKET, crimeNewName, crimeS3FullBucketPathOld);
await client.removeObject('tatort', `${vorgangToken}/${crimeOldName}`); await client.removeObject(BUCKET, `${vorgangToken}/${crimeOldName}`);
return json({ success: 'success' }, { status: 200 }); return json({ success: 'success' }, { status: 200 });
} }