refactor: enhance installation process with support for full-stack and app-only modes, update environment configurations, and improve database migration handling
This commit is contained in:
+19
-20
@@ -1,31 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
#!/usr/bin/env sh
|
||||
|
||||
set -euo pipefail
|
||||
set -eu
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
ROOT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
|
||||
|
||||
if [ -z "${DATABASE_URL:-}" ]; then
|
||||
echo "DATABASE_URL is required." >&2
|
||||
echo "Example:" >&2
|
||||
echo " DATABASE_URL='postgresql://postgres:password@host:5432/postgres' bash ./scripts/apply-migrations.sh" >&2
|
||||
echo " DATABASE_URL='postgresql://postgres:password@host:5432/postgres' sh ./scripts/apply-migrations.sh" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SQL_FILES=(
|
||||
"supabase/schema.sql"
|
||||
"supabase/migrations/0002_add_freelancer_os_core_tables.sql"
|
||||
"supabase/migrations/0003_add_project_planning_assets.sql"
|
||||
"supabase/migrations/0004_add_business_os_tables.sql"
|
||||
"supabase/migrations/0005_add_advanced_crm_tables.sql"
|
||||
"supabase/migrations/0006_add_pgvector_and_embeddings.sql"
|
||||
"supabase/migrations/0007_add_client_portal_tables.sql"
|
||||
"supabase/migrations/0008_add_project_progress_and_quota.sql"
|
||||
"supabase/migrations/0009_lock_registration_after_first_admin.sql"
|
||||
)
|
||||
|
||||
run_sql_file() {
|
||||
local file_path="$1"
|
||||
local absolute_path="$ROOT_DIR/$file_path"
|
||||
file_path="$1"
|
||||
absolute_path="$ROOT_DIR/$file_path"
|
||||
|
||||
if [ ! -f "$absolute_path" ]; then
|
||||
echo "Missing SQL file: $file_path" >&2
|
||||
@@ -45,8 +33,19 @@ run_sql_file() {
|
||||
fi
|
||||
}
|
||||
|
||||
for sql_file in "${SQL_FILES[@]}"; do
|
||||
while IFS= read -r sql_file; do
|
||||
[ -n "$sql_file" ] || continue
|
||||
run_sql_file "$sql_file"
|
||||
done
|
||||
done <<'SQL_FILES'
|
||||
supabase/schema.sql
|
||||
supabase/migrations/0002_add_freelancer_os_core_tables.sql
|
||||
supabase/migrations/0003_add_project_planning_assets.sql
|
||||
supabase/migrations/0004_add_business_os_tables.sql
|
||||
supabase/migrations/0005_add_advanced_crm_tables.sql
|
||||
supabase/migrations/0006_add_pgvector_and_embeddings.sql
|
||||
supabase/migrations/0007_add_client_portal_tables.sql
|
||||
supabase/migrations/0008_add_project_progress_and_quota.sql
|
||||
supabase/migrations/0009_lock_registration_after_first_admin.sql
|
||||
SQL_FILES
|
||||
|
||||
echo "All Neta migrations were applied."
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import crypto from "node:crypto";
|
||||
|
||||
const jwtSecret = process.env.JWT_SECRET || randomSecret();
|
||||
|
||||
const values = {
|
||||
NETA_INSTALL_MODE: "full-stack",
|
||||
NEXT_PUBLIC_SITE_URL: process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000",
|
||||
NETA_PORT: process.env.NETA_PORT || "3000",
|
||||
NEXT_PUBLIC_SUPABASE_URL:
|
||||
process.env.NEXT_PUBLIC_SUPABASE_URL || "http://localhost:8000",
|
||||
SUPABASE_API_PORT: process.env.SUPABASE_API_PORT || "8000",
|
||||
NEXT_PUBLIC_SUPABASE_ANON_KEY:
|
||||
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || generateSupabaseJwt("anon", jwtSecret),
|
||||
SUPABASE_SERVICE_ROLE_KEY:
|
||||
process.env.SUPABASE_SERVICE_ROLE_KEY ||
|
||||
generateSupabaseJwt("service_role", jwtSecret),
|
||||
JWT_SECRET: jwtSecret,
|
||||
POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD || randomSecret(),
|
||||
POSTGRES_PORT: process.env.POSTGRES_PORT || "54322",
|
||||
JWT_EXPIRY: process.env.JWT_EXPIRY || "3600",
|
||||
SMTP_ADMIN_EMAIL: process.env.SMTP_ADMIN_EMAIL || "admin@neta.local",
|
||||
};
|
||||
|
||||
for (const [key, value] of Object.entries(values)) {
|
||||
console.log(`${key}=${value}`);
|
||||
}
|
||||
|
||||
function randomSecret() {
|
||||
return crypto.randomBytes(32).toString("hex");
|
||||
}
|
||||
|
||||
function generateSupabaseJwt(role, secret) {
|
||||
const header = base64UrlJson({ alg: "HS256", typ: "JWT" });
|
||||
const payload = base64UrlJson({
|
||||
iss: "supabase",
|
||||
ref: "neta",
|
||||
role,
|
||||
iat: 1700000000,
|
||||
exp: 4102444800,
|
||||
});
|
||||
const unsigned = `${header}.${payload}`;
|
||||
const signature = crypto
|
||||
.createHmac("sha256", secret)
|
||||
.update(unsigned)
|
||||
.digest("base64url");
|
||||
|
||||
return `${unsigned}.${signature}`;
|
||||
}
|
||||
|
||||
function base64UrlJson(value) {
|
||||
return Buffer.from(JSON.stringify(value)).toString("base64url");
|
||||
}
|
||||
Reference in New Issue
Block a user