From 16bc357973010847ec8124e43bd2ace0e963912c Mon Sep 17 00:00:00 2001 From: sunny Date: Thu, 6 Mar 2025 14:26:10 +0800 Subject: [PATCH] chore: Remove environment variable DATABASE_ID and KV_NAMESPACE_ID, auto-pagination kvNamespaces --- .env.example | 3 +- .github/workflows/deploy.yml | 4 +- scripts/deploy/cloudflare.ts | 136 ++++++++++++++--------------------- scripts/deploy/index.ts | 47 ++++-------- 4 files changed, 66 insertions(+), 124 deletions(-) diff --git a/.env.example b/.env.example index ee2c4ef..47684bd 100644 --- a/.env.example +++ b/.env.example @@ -5,7 +5,6 @@ AUTH_SECRET = "" CLOUDFLARE_API_TOKEN = "" CLOUDFLARE_ACCOUNT_ID = "" DATABASE_NAME = "" -DATABASE_ID = "" -KV_NAMESPACE_ID = "" +KV_NAMESPACE_NAME = "" CUSTOM_DOMAIN = "" \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index fe548f1..412cb0d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -41,10 +41,8 @@ jobs: CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} PROJECT_NAME: ${{ secrets.PROJECT_NAME }} DATABASE_NAME: ${{ secrets.DATABASE_NAME }} - KV_NAME: ${{ secrets.KV_NAME }} + KV_NAMESPACE_NAME: ${{ secrets.KV_NAMESPACE_NAME }} CUSTOM_DOMAIN: ${{ secrets.CUSTOM_DOMAIN }} - DATABASE_ID: ${{ secrets.DATABASE_ID }} - KV_NAMESPACE_ID: ${{ secrets.KV_NAMESPACE_ID }} AUTH_GITHUB_ID: ${{ secrets.AUTH_GITHUB_ID }} AUTH_GITHUB_SECRET: ${{ secrets.AUTH_GITHUB_SECRET }} AUTH_SECRET: ${{ secrets.AUTH_SECRET }} diff --git a/scripts/deploy/cloudflare.ts b/scripts/deploy/cloudflare.ts index 8a9b375..2d5e6bb 100644 --- a/scripts/deploy/cloudflare.ts +++ b/scripts/deploy/cloudflare.ts @@ -5,120 +5,88 @@ const CF_ACCOUNT_ID = process.env.CLOUDFLARE_ACCOUNT_ID!; const CF_API_TOKEN = process.env.CLOUDFLARE_API_TOKEN; const CUSTOM_DOMAIN = process.env.CUSTOM_DOMAIN; const PROJECT_NAME = process.env.PROJECT_NAME || "moemail"; -const DB_NAME = process.env.DATABASE_NAME || "moemail-db"; -const KV_NAMESPACE_NAME = process.env.KV_NAME || "moemail-kv"; +const DATABASE_NAME = process.env.DATABASE_NAME || "moemail-db"; +const KV_NAMESPACE_NAME = process.env.KV_NAMESPACE_NAME || "moemail-kv"; const client = new Cloudflare({ apiKey: CF_API_TOKEN, }); export const getPages = async () => { - try { - const projectInfo = await client.pages.projects.get(PROJECT_NAME, { - account_id: CF_ACCOUNT_ID, - }); + const projectInfo = await client.pages.projects.get(PROJECT_NAME, { + account_id: CF_ACCOUNT_ID, + }); - return projectInfo; - } catch (error) { - throw error; - } + return projectInfo; }; export const createPages = async () => { - try { - console.log(`๐Ÿ†• Creating new Cloudflare Pages project: "${PROJECT_NAME}"`); + console.log(`๐Ÿ†• Creating new Cloudflare Pages project: "${PROJECT_NAME}"`); - const project = await client.pages.projects.create({ + const project = await client.pages.projects.create({ + account_id: CF_ACCOUNT_ID, + name: PROJECT_NAME, + production_branch: "main", + }); + + if (CUSTOM_DOMAIN) { + console.log("๐Ÿ”— Setting pages domain..."); + + await client.pages.projects.domains.create(PROJECT_NAME, { account_id: CF_ACCOUNT_ID, - name: PROJECT_NAME, - production_branch: "main", + name: CUSTOM_DOMAIN?.split("://")[1], }); - if (CUSTOM_DOMAIN) { - console.log("๐Ÿ”— Setting pages domain..."); - - await client.pages.projects.domains.create(PROJECT_NAME, { - account_id: CF_ACCOUNT_ID, - name: CUSTOM_DOMAIN?.split("://")[1], - }); - - console.log("โœ… Pages domain set successfully"); - } - - console.log("โœ… Project created successfully"); - - return project; - } catch (error) { - throw error; + console.log("โœ… Pages domain set successfully"); } + + console.log("โœ… Project created successfully"); + + return project; }; export const getDatabase = async () => { - try { - const database = await client.d1.database.get(DB_NAME, { - account_id: CF_ACCOUNT_ID, - }); + const database = await client.d1.database.get(DATABASE_NAME, { + account_id: CF_ACCOUNT_ID, + }); - return database; - } catch (error) { - throw error; - } + return database; }; export const createDatabase = async () => { - try { - console.log(`๐Ÿ†• Creating new D1 database: "${DB_NAME}"`); - const database = await client.d1.database.create({ - account_id: CF_ACCOUNT_ID, - name: DB_NAME, - }); - console.log("โœ… Database created successfully"); + console.log(`๐Ÿ†• Creating new D1 database: "${DATABASE_NAME}"`); - return database; - } catch (error) { - throw error; - } -}; + const database = await client.d1.database.create({ + account_id: CF_ACCOUNT_ID, + name: DATABASE_NAME, + }); -export const getKVNamespace = async (namespaceId: string) => { - if (!namespaceId) { - throw new Error("KV namespace ID is required"); - } - - try { - const kvNamespace = await client.kv.namespaces.get(namespaceId, { - account_id: CF_ACCOUNT_ID, - }); + console.log("โœ… Database created successfully"); - return kvNamespace; - } catch (error) { - throw error; - } + return database; }; export const getKVNamespaceList = async () => { - try { - const kvNamespaces = await client.kv.namespaces.list({ - account_id: CF_ACCOUNT_ID, - }); + const kvNamespaces = []; - return kvNamespaces; - } catch (error) { - throw error; + for await (const namespace of client.kv.namespaces.list({ + account_id: CF_ACCOUNT_ID, + })) { + kvNamespaces.push(namespace); } -} + + return kvNamespaces; +}; export const createKVNamespace = async () => { - try { - console.log(`๐Ÿ†• Creating new KV namespace: "${KV_NAMESPACE_NAME}"`); - const kvNamespace = await client.kv.namespaces.create({ - account_id: CF_ACCOUNT_ID, - title: KV_NAMESPACE_NAME, - }); - console.log("โœ… KV namespace created successfully"); + console.log(`๐Ÿ†• Creating new KV namespace: "${KV_NAMESPACE_NAME}"`); - return kvNamespace; - } catch (error) { - throw error; - } -}; \ No newline at end of file + const kvNamespace = await client.kv.namespaces.create({ + account_id: CF_ACCOUNT_ID, + title: KV_NAMESPACE_NAME, + }); + + console.log("โœ… KV namespace created successfully"); + + return kvNamespace; +}; diff --git a/scripts/deploy/index.ts b/scripts/deploy/index.ts index f4cd02a..92f7253 100644 --- a/scripts/deploy/index.ts +++ b/scripts/deploy/index.ts @@ -8,17 +8,14 @@ import { createKVNamespace, createPages, getDatabase, - getKVNamespace, getKVNamespaceList, getPages, } from "./cloudflare"; const PROJECT_NAME = process.env.PROJECT_NAME || "moemail"; const DATABASE_NAME = process.env.DATABASE_NAME || "moemail-db"; -const KV_NAMESPACE_NAME = process.env.KV_NAME || "moemail-kv"; +const KV_NAMESPACE_NAME = process.env.KV_NAMESPACE_NAME || "moemail-kv"; const CUSTOM_DOMAIN = process.env.CUSTOM_DOMAIN; -const DATABASE_ID = process.env.DATABASE_ID || ""; -const KV_NAMESPACE_ID = process.env.KV_NAMESPACE_ID || ""; /** * ้ชŒ่ฏๅฟ…่ฆ็š„็Žฏๅขƒๅ˜้‡ @@ -56,14 +53,6 @@ const setupConfigFile = (examplePath: string, targetPath: string) => { // ๅค„็†ๆ•ฐๆฎๅบ“้…็ฝฎ if (json.d1_databases && json.d1_databases.length > 0) { json.d1_databases[0].database_name = DATABASE_NAME; - if (DATABASE_ID) { - json.d1_databases[0].database_id = DATABASE_ID; - } - } - - // ๅค„็†KV้…็ฝฎ - if (json.kv_namespaces && json.kv_namespaces.length > 0 && KV_NAMESPACE_ID) { - json.kv_namespaces[0].id = KV_NAMESPACE_ID; } // ๅ†™ๅ…ฅ้…็ฝฎๆ–‡ไปถ @@ -102,9 +91,6 @@ const setupWranglerConfigs = () => { const updateDatabaseConfig = (dbId: string) => { console.log(`๐Ÿ“ Updating database ID (${dbId}) in configurations...`); - // ๆ›ดๆ–ฐ็Žฏๅขƒๅ˜้‡ - updateEnvVar("DATABASE_ID", dbId); - // ๆ›ดๆ–ฐๆ‰€ๆœ‰้…็ฝฎๆ–‡ไปถ const configFiles = [ "wrangler.json", @@ -135,9 +121,6 @@ const updateDatabaseConfig = (dbId: string) => { const updateKVConfig = (namespaceId: string) => { console.log(`๐Ÿ“ Updating KV namespace ID (${namespaceId}) in configurations...`); - // ๆ›ดๆ–ฐ็Žฏๅขƒๅ˜้‡ - updateEnvVar("KV_NAMESPACE_ID", namespaceId); - // KVๅ‘ฝๅ็ฉบ้—ดๅชๅœจไธปwrangler.jsonไธญไฝฟ็”จ const wranglerPath = resolve("wrangler.json"); if (existsSync(wranglerPath)) { @@ -215,24 +198,17 @@ const checkAndCreateKVNamespace = async () => { try { let namespace; - if (KV_NAMESPACE_ID) { - namespace = await getKVNamespace(KV_NAMESPACE_ID); - console.log(`โœ… KV namespace "${KV_NAMESPACE_NAME}" already exists (ID: ${namespace.id})`); + const namespaceList = await getKVNamespaceList(); + namespace = namespaceList.find(ns => ns.title === KV_NAMESPACE_NAME); + + if (namespace && namespace.id) { + updateKVConfig(namespace.id); + console.log(`โœ… KV namespace "${KV_NAMESPACE_NAME}" found by name (ID: ${namespace.id})`); } else { - console.log("โš ๏ธ KV_NAMESPACE_ID is not set, checking by name..."); - - const namespaceList = await getKVNamespaceList(); - namespace = namespaceList.result.find(ns => ns.title === KV_NAMESPACE_NAME); - - if (namespace && namespace.id) { - updateKVConfig(namespace.id); - console.log(`โœ… KV namespace "${KV_NAMESPACE_NAME}" found by name (ID: ${namespace.id})`); - } else { - console.log("โš ๏ธ KV namespace not found by name, creating new KV namespace..."); - namespace = await createKVNamespace(); - updateKVConfig(namespace.id); - console.log(`โœ… KV namespace "${KV_NAMESPACE_NAME}" created successfully (ID: ${namespace.id})`); - } + console.log("โš ๏ธ KV namespace not found by name, creating new KV namespace..."); + namespace = await createKVNamespace(); + updateKVConfig(namespace.id); + console.log(`โœ… KV namespace "${KV_NAMESPACE_NAME}" created successfully (ID: ${namespace.id})`); } } catch (error) { console.error(`โŒ An error occurred while checking the KV namespace:`, error); @@ -433,6 +409,7 @@ const updateEnvVar = (name: string, value: string) => { const main = async () => { try { console.log("๐Ÿš€ Starting deployment process..."); + validateEnvironment(); setupEnvFile(); setupWranglerConfigs();