docker에서 supabase self-hosting으로 사용 중 폴더 위치 변경 시 파일 다시 업로드하기

Beaver Bridge - Aug 13 - - Dev Community

참고 https://supabase.com/docs/guides/platform/migrating-and-upgrading-projects#migrate-storage-objects

// storage_restore.js

const { createClient } = require("@supabase/supabase-js");
const fs = require("fs");

const PROJECT_URL = "http://localhost:8100";
const PROJECT_SERVICE_KEY = "service_role_key";

(async () => {
  console.log("started at: ", new Date().toISOString());
  const supabaseRestClient = createClient(PROJECT_URL, PROJECT_SERVICE_KEY, {
    db: { schema: "storage" },
  });
  const supabaseClient = createClient(PROJECT_URL, PROJECT_SERVICE_KEY);

  // make sure you update max_rows in postgrest settings if you have a lot of objects or paginate here
  const { data: objects, error } = await supabaseRestClient
    .from("objects")
    .select();
//    .eq("bucket_id", "manuals");

  if (error) {
    console.log("error getting objects from old bucket");
    throw error;
  }

  for (const objectData of objects) {
    console.log(`moving ${objectData.id}`);
    try {
      const data = fs.readFileSync(
        `./storage/stub/stub/${objectData.bucket_id}/${objectData.name}/${objectData.version}`
      );

      const { _, error: uploadObjectError } = await supabaseClient.storage
        .from(objectData.bucket_id)
        .upload(objectData.name, data, {
          upsert: true,
          contentType: objectData.metadata.mimetype,
          cacheControl: objectData.metadata.cacheControl,
        });
      if (uploadObjectError) {
        throw uploadObjectError;
      }
    } catch (err) {
      console.log("error moving ", objectData);
      console.log(err);
    }
  }
  console.log("finished at: ", new Date().toISOString());
})();
Enter fullscreen mode Exit fullscreen mode

이 파일을 supabase studio 컨테이너로 이동시킨다.

docker cp storage_restore.js container_id:/app/
Enter fullscreen mode Exit fullscreen mode

기존 폴더에서 supabase studio 컨테이너로 파일을 이동시킨다.

docker cp storage container_id:/app/
Enter fullscreen mode Exit fullscreen mode

컨테이너 안으로 진입해서 스크립트를 실행한다

docker exec -it container_id bash
cd app
node store_restore.js
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . .