From 30eb2e6e0e2ac3d30a3e1c27239f8efe26cc7c7f Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Tue, 24 Feb 2026 22:24:01 +0100 Subject: [PATCH] feat: persistent payload storage and automated db migrations --- .dockerignore | 2 -- .gitea/workflows/deploy.yml | 4 ++++ docker-compose.yml | 4 ++++ package.json | 13 ++---------- scripts/seed-payload.ts | 41 +++++++++++++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 scripts/seed-payload.ts diff --git a/.dockerignore b/.dockerignore index ffab86ac..aba46535 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,8 +5,6 @@ node_modules .gitignore .gitea .github -public/uploads -directus/uploads .turbo reference/ .next diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index a5356d8d..7466e191 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -357,6 +357,10 @@ jobs: ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' pull" ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' up -d --remove-orphans" + # Initialize PayloadCMS Database + ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' exec -T klz-app pnpm run cms:migrate" + ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' exec -T klz-app pnpm run cms:seed" + ssh root@alpha.mintel.me "docker system prune -f --filter 'until=24h'" - name: ๐Ÿงน Post-Deploy Cleanup (Runner) diff --git a/docker-compose.yml b/docker-compose.yml index c7a06eaf..73ddc0c8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,8 @@ services: environment: POSTGRES_URI: postgres://${PAYLOAD_DB_USER:-payload}:${PAYLOAD_DB_PASSWORD:-120in09oenaoinsd9iaidon}@klz-db:5432/${PAYLOAD_DB_NAME:-payload} PAYLOAD_SECRET: ${PAYLOAD_SECRET:-fallback-secret-for-production-needs-change} + volumes: + - klz_media_data:/app/public/media labels: - "traefik.enable=true" # HTTP โ‡’ HTTPS redirect @@ -89,3 +91,5 @@ networks: volumes: klz_db_data: external: false + klz_media_data: + external: false diff --git a/package.json b/package.json index 05e0da25..73309110 100644 --- a/package.json +++ b/package.json @@ -116,17 +116,8 @@ "cms:bootstrap": "pnpm run cms:branding:local", "pdf:datasheets": "tsx ./scripts/generate-pdf-datasheets.ts", "pdf:datasheets:legacy": "tsx ./scripts/generate-pdf-datasheets-pdf-lib.ts", - "cms:schema:snapshot": "./scripts/cms-snapshot.sh", - "cms:schema:apply": "./scripts/cms-apply.sh local", - "cms:schema:apply:testing": "./scripts/cms-apply.sh testing", - "cms:schema:apply:staging": "./scripts/cms-apply.sh staging", - "cms:schema:apply:prod": "./scripts/cms-apply.sh production", - "cms:pull:testing": "./scripts/sync-directus.sh pull testing", - "cms:pull:staging": "./scripts/sync-directus.sh pull staging", - "cms:pull:prod": "./scripts/sync-directus.sh pull production", - "cms:push:staging:DANGER": "./scripts/sync-directus.sh push staging", - "cms:push:testing:DANGER": "./scripts/sync-directus.sh push testing", - "cms:push:prod:DANGER": "./scripts/sync-directus.sh push production", + "cms:migrate": "payload migrate", + "cms:seed": "tsx ./scripts/seed-payload.ts", "pagespeed:test": "tsx ./scripts/pagespeed-sitemap.ts", "pagespeed:audit": "./scripts/audit-local.sh", "pagespeed:urls": "tsx -e \"import sitemap from './app/sitemap'; sitemap().then(urls => console.log(urls.map(u => u.url).join('\\n')))\"", diff --git a/scripts/seed-payload.ts b/scripts/seed-payload.ts new file mode 100644 index 00000000..242354df --- /dev/null +++ b/scripts/seed-payload.ts @@ -0,0 +1,41 @@ +import { getPayload } from 'payload'; +import configPromise from '../payload.config'; + +async function seed() { + console.log('๐ŸŒฑ Starting PayloadCMS seed process...'); + + try { + const payload = await getPayload({ config: configPromise }); + + // Check if any users exist + const { totalDocs } = await payload.find({ + collection: 'users', + limit: 1, + }); + + if (totalDocs === 0) { + console.log('๐Ÿ‘ค No users found. Creating default admin user...'); + await payload.create({ + collection: 'users', + data: { + email: 'admin@mintel.me', + password: 'klz-admin-setup', + firstName: 'KLZ', + lastName: 'Admin', + role: 'admin', + }, + }); + console.log('โœ… Default admin user created successfully.'); + } else { + console.log(`โ„น๏ธ Database already contains ${totalDocs} users. Skipping user creation.`); + } + + console.log('โœ… PayloadCMS seed completed successfully!'); + process.exit(0); + } catch (error) { + console.error('โŒ Failed to seed PayloadCMS database:', error); + process.exit(1); + } +} + +seed();