diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 796e6ad..d7b5bd3 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -343,8 +343,8 @@ 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" - # Apply Payload Migrations using the target app container - ssh root@alpha.mintel.me "cd $SITE_DIR && echo '→ Running Payload Migrations...' && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' exec -T mb-grid-app npx payload migrate" + # Apply Payload Migrations using the target app container's programmatic endpoint + ssh root@alpha.mintel.me "cd $SITE_DIR && echo '→ Running Payload Migrations...' && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file '$ENV_FILE' exec -T mb-grid-app sh -c 'curl -s -f -X POST -H \"Authorization: Bearer \$$PAYLOAD_SECRET\" http://localhost:3000/api/payload/migrate' || { echo 'Migration failed!'; exit 1; }" ssh root@alpha.mintel.me "docker system prune -f --filter 'until=24h'" diff --git a/app/api/payload/migrate/route.ts b/app/api/payload/migrate/route.ts new file mode 100644 index 0000000..5751a80 --- /dev/null +++ b/app/api/payload/migrate/route.ts @@ -0,0 +1,29 @@ +import { NextResponse } from "next/server"; +import { getPayload } from "payload"; +import configPromise from "@payload-config"; +import { getServerAppServices } from "@/lib/services/create-services.server"; + +export async function POST(req: Request) { + const authHeader = req.headers.get("authorization"); + if (authHeader !== `Bearer ${process.env.PAYLOAD_SECRET}`) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } + + const { logger } = getServerAppServices(); + + try { + logger.info("Starting programmatic Payload migrations..."); + const payload = await getPayload({ config: configPromise }); + + await payload.db.migrate({ forceAcceptWarning: true }); + + logger.info("Successfully executed Payload migrations."); + return NextResponse.json({ + success: true, + message: "Migrations executed successfully.", + }); + } catch (error: any) { + logger.error("Failed to run migrations remotely", { error }); + return NextResponse.json({ error: error.message }, { status: 500 }); + } +} diff --git a/docker-compose.yaml b/docker-compose.yaml index 115221a..c6a1750 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -84,7 +84,7 @@ services: POSTGRES_USER: ${DIRECTUS_DB_USER:-directus} POSTGRES_PASSWORD: ${DIRECTUS_DB_PASSWORD:-directus} volumes: - - directus-db-data:/var/lib/postgresql/data + - mb-grid-db-data:/var/lib/postgresql/data networks: default: @@ -93,6 +93,4 @@ networks: external: true volumes: - directus-db-data: - external: true - name: mb-grid-solutions-production_directus-db-data + mb-grid-db-data: diff --git a/next-env.d.ts b/next-env.d.ts index 9edff1c..c4b7818 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/types/routes.d.ts"; +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.