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.