const fs = require('fs'); const path = require('path'); /** * Helper function to read variables from .env file synchronously if it exists. * This prevents hardcoding credentials in this config file which gets tracked by git. */ function readEnv() { const envPath = path.join(__dirname, '.env'); if (!fs.existsSync(envPath)) return {}; const lines = fs.readFileSync(envPath, 'utf8').split('\n'); const env = {}; for (const line of lines) { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#')) continue; const idx = trimmed.indexOf('='); if (idx === -1) continue; const key = trimmed.substring(0, idx).trim(); let val = trimmed.substring(idx + 1).trim(); if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) { val = val.slice(1, -1); } env[key] = val; } return env; } const localEnv = readEnv(); module.exports = { apps: [{ name: 'cshare-api', script: 'node_modules/.bin/tsx', args: 'src/server.ts', cwd: '/srv/CShare/backend', instances: 1, autorestart: true, watch: false, max_memory_restart: '400M', env: { NODE_ENV: process.env.NODE_ENV || localEnv.NODE_ENV || 'production', PORT: process.env.PORT || localEnv.PORT || '4001', DATA_DIR: process.env.DATA_DIR || localEnv.DATA_DIR || '/srv/CShare/data', PUBLIC_APP_URL: process.env.PUBLIC_APP_URL || localEnv.PUBLIC_APP_URL || 'https://file.asabbagh.com', FRONTEND_URL: process.env.FRONTEND_URL || localEnv.FRONTEND_URL || 'https://file.asabbagh.com', JWT_ACCESS_SECRET: process.env.JWT_ACCESS_SECRET || localEnv.JWT_ACCESS_SECRET, JWT_REFRESH_SECRET: process.env.JWT_REFRESH_SECRET || localEnv.JWT_REFRESH_SECRET, ADMIN_API_KEY: process.env.ADMIN_API_KEY || localEnv.ADMIN_API_KEY, GDRIVE_CLIENT_ID: process.env.GDRIVE_CLIENT_ID || localEnv.GDRIVE_CLIENT_ID, GDRIVE_CLIENT_SECRET: process.env.GDRIVE_CLIENT_SECRET || localEnv.GDRIVE_CLIENT_SECRET, GDRIVE_REFRESH_TOKEN: process.env.GDRIVE_REFRESH_TOKEN || localEnv.GDRIVE_REFRESH_TOKEN, GDRIVE_FOLDER_ID: process.env.GDRIVE_FOLDER_ID || localEnv.GDRIVE_FOLDER_ID, }, }], };