finish migration for db and add multiple fixes for deploy settings in server

This commit is contained in:
Esteban Paz 2026-08-16 10:31:04 -05:00
parent 1effb62498
commit 6787b3db50
8 changed files with 26 additions and 71 deletions

50
.env
View File

@ -1,50 +0,0 @@
# Archivo de variables de entorno para la configuración de Google Sheets
GOOGLE_SERVICE_ACCOUNT_EMAIL=dbsheets@dbsheets-487314.iam.gserviceaccount.com
GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCi2DVTbgH5WzE4\nrsT4BLcjplwszwkiZmhUxcVma/xI/6G+LQpzWTmmETmPWGFBpPukcoEDJDIugSFF\nuiKM+cSJIJJTYYWb5sBGXC6bi36AiA3W/zuRYGoFdNP+34iqepWpXpjKY8T0bbJJ\njhIgjW/SN2fYZeVBZqLATEzRqCcPYXI5gs9fyb2bzTEjiB3kCklVCudl/JDoxAWm\nJ9vO/OOXEgt/t97v9cMoo9OZ4Y3txqiQB41UdS97btDvpezc59u+8K9s5FT+yljC\nMyfRiRM+4MpycCoJobiT8NnCaNblMTd8mkfuujrFvnT/k9O794gBOJ2sgF7AYej4\nzm9tXpknAgMBAAECggEAM50bqcngTkydGT4rqAC2m1ILPRiR6JlU0CmvG3t2hxyf\nA0v7V/wbzYsAF3MHwGquZ7zzLy+1yA+doCAS+2Pe6yeruUnbs0I8BxEIpLxd6Bc3\na8GR+833TKtu1gW7p20bKoeVHfDpaB+stquVC0RJAPQWsfv54fTJ+PE2F+2YE8Np\njhWvM4OkUNZVBPZxG+RF0gzylIx2tw3QpLN3DMSr9Z2wGfohp7yryP96qqC1RFGQ\nCsaHsPRfzv+UNinGmA0Yzv79Stuqgsg+J3V/01Pm4ANutHix/kP0YAYCyg29UtVZ\nIJZtPOAfHWICYw+hQMpcfSLWzbkUQpwTTG0Bk6xmwQKBgQDUNf226UzdAm/V2Pag\nc1YF4P6Bru1A5jiFTpyrAYPSN+Wk84Gkl8XtuDDb7zXL+MaVb8aIVXTKhM2b0RDw\nHtDayoCCXci8VfP4sDRzjEGB1O1OPOl/wPD6L94CmNB0QeepNs4Q5xD0HEsoNN6s\nZGafIkIbVVUBCkuZwNxoLVXSKQKBgQDEcnKkgE/ror9vXSj0XY9Rn0wU2W6DreUt\nMizWyH9R0wBbaSJQ/4Wd3F6co2H2DSuZgXxLJvsPlqffUivs/oZnlx8HhWi6vjLL\nvSiqNC1D+Bh5TT7PEonENU99lruKtZfKcMpRtVF6WycW5ZlYok4lRCEBBvbjtGgr\nIHnqc8WazwKBgD0oHilDjQI4fJBtiY3uD0F8ePxYtEk6z9kjMaVat2my8DycbKVJ\nlCIRLguEIcXZuSlB4D5UGmdu5G5eTvpUdy5Go8huTLZyMvBdn5AZQJuxCH6+sTA/\nI3OGrf2jmpeWkrPCdpqKbOlc6g/5RJ78BFMiJVkJO4kkNWtnGF3xisUZAoGAJ8VT\n2GHxzC7CuvUNWYunfErXyFDMwvPttdy2nzUwMYyaQedi/yr8Dh2TOfsJ1hqMfSNt\n2nkl0t4ZVmj4Y56T71z09zzXGxduiTjehrbRgzUzHzu4P4vtQD/au/5MMaTZ+i4j\nh69Bs5fIriYFiaAyWfEVDXQvf6IChNiqVgDiPJkCgYEAooIiW4HHVUNGMnIeB7UI\nBXv5gSs2heHYSmEK+Er7In5cfJQzkcJvwiOMfOPCNuwVPn+ow5IN8le1acDon5I2\n0OsXhWmgyg9zmgguj273mH3h6+o6XTg5GrEYgPVpU3m2dJkd05oWhQvzy7/OxHs8\nE4ZMz97uqmU2r8XJCo//tv8=\n-----END PRIVATE KEY-----\n"
GOOGLE_SHEET_ID=12X6qeU0W4ZDw00vS4OreyC4nFjKBeBYo7rq3wyRsrNQ
# Archivo de variables de entorno para la configuración de envío de emails
EMAIL_API_KEY=9UShpS8oh5Iun92TJSfevElI3Lp99TCv
# This was inserted by prisma init:
# Environment variables declared in this file are NOT automatically loaded by Prisma.
# Please add import "dotenv/config"; to your prisma.config.ts file, or use the Prisma CLI with Bun
# to load environment variables from .env files: https://pris.ly/prisma-config-env-vars.
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
# The following prisma+postgres URL is similar to the URL produced by running a local Prisma Postgres
# server with the prisma dev CLI command, when not choosing any non-default ports or settings. The API key, unlike the
# one found in a remote Prisma Postgres URL, does not contain any sensitive information.
N8N_WEBHOOK_URL="https://flows2.carpa.com/webhook/news-summary"
N8N_API_KEY="sk_live_JwjpTdZrLVvijCKuWylWZbUuhBm6zPDH"
# Cloudflare Email Sending
CLOUDFLARE_API_TOKEN=cfut_8Y0Tcwiv3v0K1LDK9QSvc3BjlU1lZFs1zikACgTw33977b37
CLOUDFLARE_ACCOUNT_ID=3e689750123db91e81d3542d2930a907
# Cloudflare Turnstile — public key (visible in frontend)
TURNSTILE_SITE_KEY=0x4AAAAAAD9IYWC6HPflpneO
# Cloudflare Turnstile — secret key (server-side, keep safe!)
# In production, set this as a Gitea Actions secret named TURNSTILE_SECRET_KEY
TURNSTILE_SECRET_KEY=0x4AAAAAAD9IYXASjQSpmo2iS902SDoXnT4
# Supabase PostgreSQL
# <<<<<<< Updated upstream
# DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres?schema=public"
# DIRECT_URL="postgresql://postgres:postgres@localhost:5432/postgres?schema=public"
# SUPABASE_URL="http://localhost:8000"
# SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE"
# SUPABASE_SERVICE_ROLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q"
# POSTGRES_PASSWORD=postgres
# =======
DATABASE_URL="postgresql://postgres:13730fbbdb2e76c904b228bd93bedd7f@vps1.carpa.com:5432/postgres?schema=public"
DIRECT_URL="postgresql://postgres:13730fbbdb2e76c904b228bd93bedd7f@vps1.carpa.com:5432/postgres?schema=public"
SUPABASE_URL="http://vps1.carpa.com"
SUPABASE_ANON_KEY="eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjNhMWFiMzE3LWJhOWQtNGVlMy1hY2Y4LTgzNjVmNmE5ZTBiNyJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzgyODU4MjA4LCJleHAiOjE5NDA1MzgyMDh9.53Jkizte60-Hos40tOz0Ld7ffHe6DAG6Nt033XDZHPCnanjYOpgaLfC2QlbY4mFWw9Z2hCd8bUgxWsGpwFNcPg"
SUPABASE_SERVICE_ROLE_KEY="eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjNhMWFiMzE3LWJhOWQtNGVlMy1hY2Y4LTgzNjVmNmE5ZTBiNyJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaXNzIjoic3VwYWJhc2UiLCJpYXQiOjE3ODI4NTgyMDgsImV4cCI6MTk0MDUzODIwOH0.f4ZWyQj0fGpEAKXWvL97b1w_4eaBfXRC13b5Mtac9UhJNbMFKIJJn1x_-8Kds-1PfIv590xlumN4sp_3X_tZeg"
POSTGRES_PASSWORD=13730fbbdb2e76c904b228bd93bedd7f
# >>>>>>> Stashed changes

View File

@ -53,9 +53,16 @@ jobs:
npm install -g pnpm@11 2>&1
cd ${{ env.TARGET_DIR }}
pnpm install --prod 2>&1
sed -i "s|TURNSTILE_SITE_KEY: \"\"|TURNSTILE_SITE_KEY: \"${{ secrets.TURNSTILE_SITE_KEY }}\"|g" ecosystem.config.cjs
sed -i "s|TURNSTILE_SECRET_KEY: \"\"|TURNSTILE_SECRET_KEY: \"${{ secrets.TURNSTILE_SECRET_KEY }}\"|g" ecosystem.config.cjs
sed -i "s|CLOUDFLARE_API_TOKEN: \"\"|CLOUDFLARE_API_TOKEN: \"${{ secrets.CLOUDFLARE_API_TOKEN }}\"|g" ecosystem.config.cjs
sed -i "s|CLOUDFLARE_ACCOUNT_ID: \"\"|CLOUDFLARE_ACCOUNT_ID: \"${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\"|g" ecosystem.config.cjs
cat > .env <<'ENVEOF'
DATABASE_URL="${{ secrets.DATABASE_URL }}"
GOOGLE_SERVICE_ACCOUNT_EMAIL="${{ secrets.GOOGLE_SERVICE_ACCOUNT_EMAIL }}"
GOOGLE_PRIVATE_KEY="${{ secrets.GOOGLE_PRIVATE_KEY }}"
GOOGLE_SHEET_ID="${{ secrets.GOOGLE_SHEET_ID }}"
EMAIL_API_KEY="${{ secrets.EMAIL_API_KEY }}"
TURNSTILE_SITE_KEY="${{ secrets.TURNSTILE_SITE_KEY }}"
TURNSTILE_SECRET_KEY="${{ secrets.TURNSTILE_SECRET_KEY }}"
CLOUDFLARE_API_TOKEN="${{ secrets.CLOUDFLARE_API_TOKEN }}"
CLOUDFLARE_ACCOUNT_ID="${{ secrets.CLOUDFLARE_ACCOUNT_ID }}"
ENVEOF
pm2 reload ecosystem.config.cjs --only ${{ env.APP_NAME }} --update-env || \
pm2 start ecosystem.config.cjs --only ${{ env.APP_NAME }} --update-env

1
.gitignore vendored
View File

@ -14,6 +14,7 @@ pnpm-debug.log*
# environment variables
.env
.env.keys
# macOS-specific files

View File

@ -2,26 +2,22 @@ module.exports = {
apps: [
{
name: "cdrdpyj",
cwd: __dirname,
script: "dist/server/entry.mjs",
interpreter_args: "--env-file=.env",
env: {
NODE_ENV: "staging",
PORT: 3310,
TURNSTILE_SITE_KEY: "",
TURNSTILE_SECRET_KEY: "",
CLOUDFLARE_API_TOKEN: "",
CLOUDFLARE_ACCOUNT_ID: "",
}
},
{
name: "cdrdpyj-live",
cwd: __dirname,
script: "dist/server/entry.mjs",
interpreter_args: "--env-file=.env",
env: {
NODE_ENV: "production",
PORT: 4321,
TURNSTILE_SITE_KEY: "",
TURNSTILE_SECRET_KEY: "",
CLOUDFLARE_API_TOKEN: "",
CLOUDFLARE_ACCOUNT_ID: "",
}
}
]

View File

@ -11,6 +11,7 @@ const tl = createTranslator(Astro.currentLocale);
const { locale, section } = Astro.params;
const routeKey = getRouteKeyFromSlug(section);
const turnstileSiteKey = process.env.TURNSTILE_SITE_KEY;
if (routeKey === "formulario") {
if (!["es", "en", "pt"].includes(Astro.currentLocale)) {
@ -62,7 +63,7 @@ if (routeKey === "formulario") {
<h1 class="text-3xl lg:text-4xl font-bold font-secondary text-[#EBE6D2] text-center mb-4 md:mb-9">
{tl("form.page_title")}
</h1>
<DynamicForm client:load locale={Astro.currentLocale} turnstileSiteKey={import.meta.env.TURNSTILE_SITE_KEY} />
<DynamicForm client:load locale={Astro.currentLocale} turnstileSiteKey={turnstileSiteKey} />
</div>
</main>
)}

View File

@ -79,7 +79,7 @@ export const POST: APIRoute = async ({ request }) => {
}
const turnstileToken = body.turnstileToken || "";
const turnstileSecret = import.meta.env.TURNSTILE_SECRET_KEY;
const turnstileSecret = process.env.TURNSTILE_SECRET_KEY;
if (turnstileSecret && turnstileToken) {
const verify = await fetch(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",

View File

@ -3,7 +3,7 @@ import Cloudflare from "cloudflare";
type TypeEmailData = "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO" | "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION";
export async function sendEmail(data: object, to: string, type: TypeEmailData) {
const emailApiKey = import.meta.env.EMAIL_API_KEY;
const emailApiKey = process.env.EMAIL_API_KEY;
const dataFinal = {
...data,
@ -77,8 +77,8 @@ function stripHtml(html: string): string {
}
export async function sendEmailCf(data: Record<string, string>, to: string, type: TypeEmailData) {
const apiToken = import.meta.env.CLOUDFLARE_API_TOKEN;
const accountId = import.meta.env.CLOUDFLARE_ACCOUNT_ID;
const apiToken = process.env.CLOUDFLARE_API_TOKEN;
const accountId = process.env.CLOUDFLARE_ACCOUNT_ID;
try {
const client = new Cloudflare({ apiToken });
@ -122,7 +122,7 @@ export async function sendEmailCf(data: Record<string, string>, to: string, type
// to: string,
// type: TypeEmailData
// ) {
// const apiKey = import.meta.env.BREVO_API_KEY;
// const apiKey = process.env.BREVO_API_KEY;
// const { subject } = TEMPLATE_URLS[type];
// const rawHtml = await fetchTemplate(type);
// const html = renderTemplate(rawHtml, data);

View File

@ -2,14 +2,14 @@ import { google } from 'googleapis';
const auth = new google.auth.GoogleAuth({
credentials: {
client_email: import.meta.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
private_key: import.meta.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, '\n'),
client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
private_key: process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, '\n'),
},
scopes: ['https://www.googleapis.com/auth/spreadsheets'],
});
const sheets = google.sheets({ version: 'v4', auth });
const SPREADSHEET_ID = import.meta.env.GOOGLE_SHEET_ID;
const SPREADSHEET_ID = process.env.GOOGLE_SHEET_ID;
export async function emailExists(email: string): Promise<boolean> {
const formula = `=COUNTIF(G:G,"${email}")`;