feat(prod): production deployment fixes - env loader, mongoose module, CSS static files, security hardening, PDF export, new UI components
This commit is contained in:
1 parent
a403f752f3
commit
46f33eb088
69 files changed
+7367
-744
No files matched your search
@@ -0,0 +1,133 @@
|
||||
// scripts/start-frontend.js
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// BackOne DPI — Start Frontend & Fix PM2 Setup on Server
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
'use strict';
|
||||
|
||||
const { Client: SshClient } = require('ssh2');
|
||||
|
||||
const CONFIG = {
|
||||
host: '103.185.47.52',
|
||||
port: 2222,
|
||||
username: 'adminbackend',
|
||||
password: 'htEo7x6LsBQiEHHH',
|
||||
};
|
||||
|
||||
const REMOTE_ROOT = '/home/adminbackend/web/demoplace.my.id/public_html';
|
||||
|
||||
const COMMANDS = [
|
||||
// Check what's currently running on port 3000
|
||||
'echo "=== PORT 3000 CHECK ===" && ss -tlnp 2>/dev/null | grep 3000 || netstat -tlnp 2>/dev/null | grep 3000 || echo "Port 3000 not in use"',
|
||||
|
||||
// Check if standalone server.js exists
|
||||
`echo "=== STANDALONE CHECK ===" && ls -la ${REMOTE_ROOT}/.next/standalone/server.js 2>/dev/null || echo "standalone server.js NOT FOUND"`,
|
||||
|
||||
// List standalone directory structure
|
||||
`echo "=== STANDALONE DIRECTORY ===" && ls ${REMOTE_ROOT}/.next/standalone/ 2>/dev/null | head -20`,
|
||||
|
||||
// Check static assets copied correctly
|
||||
`echo "=== STATIC IN STANDALONE ===" && ls ${REMOTE_ROOT}/.next/standalone/.next/ 2>/dev/null || echo "No .next dir in standalone"`,
|
||||
|
||||
// Find the correct npm bin directory for npx pm2
|
||||
'echo "=== NPM BIN DIR ===" && npm bin 2>/dev/null || npm config get prefix',
|
||||
|
||||
// Check npx pm2 path
|
||||
'echo "=== NPX PM2 PATH ===" && find /home/adminbackend/.npm -name "pm2" -type f 2>/dev/null | grep "/bin/pm2" | head -3',
|
||||
|
||||
// Install PM2 using npm to user's npm prefix
|
||||
'echo "=== SET NPM PREFIX ===" && npm config set prefix /home/adminbackend/.npm-global && npm install -g pm2 2>&1 | tail -5',
|
||||
'echo "=== PM2 INSTALLED ===" && /home/adminbackend/.npm-global/bin/pm2 --version 2>&1 || echo "Still not found"',
|
||||
|
||||
// Try npx approach
|
||||
`echo "=== USING NPX PM2 ===" && cd ${REMOTE_ROOT} && npx pm2 --version 2>&1`,
|
||||
|
||||
// Start frontend standalone server if not running
|
||||
`echo "=== CHECKING STANDALONE SERVER ===" && ls -la ${REMOTE_ROOT}/.next/standalone/server.js`,
|
||||
|
||||
// Start with nohup (works on cPanel)
|
||||
`echo "=== STARTING FRONTEND NOHUP ===" && cd ${REMOTE_ROOT} && NODE_ENV=production PORT=3000 HOSTNAME=0.0.0.0 NEXT_PUBLIC_API_URL=http://127.0.0.1:3001 nohup node .next/standalone/server.js >> logs/frontend-out.log 2>&1 & echo "PID: $!"`,
|
||||
|
||||
// Wait and check
|
||||
'sleep 5',
|
||||
|
||||
// Verify port 3000 is now listening
|
||||
'echo "=== PORT 3000 AFTER START ===" && ss -tlnp | grep 3000 || netstat -tlnp | grep 3000 || echo "Port 3000 still not in use"',
|
||||
|
||||
// Check all running processes
|
||||
'echo "=== ALL NODE PROCESSES ===" && ps aux | grep node | grep -v grep',
|
||||
|
||||
// Test all endpoints
|
||||
'echo "=== BACKEND HEALTH ===" && curl -s http://127.0.0.1:3001/api/health',
|
||||
'echo "=== FRONTEND RESPONSE ===" && curl -s -o /dev/null -w "HTTP Status: %{http_code}" http://127.0.0.1:3000/ 2>&1',
|
||||
|
||||
// Show frontend log
|
||||
`echo "=== FRONTEND LOG ===" && tail -20 ${REMOTE_ROOT}/logs/frontend-out.log 2>/dev/null || echo "No frontend log"`,
|
||||
|
||||
// Check proxy connection to MongoDB
|
||||
`echo "=== PROXY LOG ===" && tail -10 ${REMOTE_ROOT}/logs/proxy-out.log 2>/dev/null || echo "No proxy log"`,
|
||||
|
||||
// Show existing pm2 in npx cache and start all services via npx pm2
|
||||
`echo "=== STARTING WITH NPX PM2 ===" && cd ${REMOTE_ROOT} && NODE_ENV=production npx pm2 list 2>&1 | head -20`,
|
||||
];
|
||||
|
||||
function runSshCommands(commands) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const ssh = new SshClient();
|
||||
const results = [];
|
||||
|
||||
ssh.on('ready', () => {
|
||||
console.log('[SSH] Connected!\n');
|
||||
let index = 0;
|
||||
|
||||
function runNext() {
|
||||
if (index >= commands.length) {
|
||||
ssh.end();
|
||||
return;
|
||||
}
|
||||
|
||||
const cmd = commands[index++];
|
||||
const preview = cmd.length > 120 ? cmd.substring(0, 120) + '...' : cmd;
|
||||
console.log(`\n$ ${preview}`);
|
||||
|
||||
ssh.exec(cmd, { env: { PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' } }, (err, stream) => {
|
||||
if (err) {
|
||||
console.error(`[ERROR] ${err.message}`);
|
||||
runNext();
|
||||
return;
|
||||
}
|
||||
|
||||
stream.on('data', (data) => process.stdout.write(data.toString()));
|
||||
stream.stderr.on('data', (data) => {
|
||||
const text = data.toString();
|
||||
if (!text.includes('npm warn') && !text.includes('npm notice')) {
|
||||
process.stdout.write(`[ERR] ${text}`);
|
||||
}
|
||||
});
|
||||
stream.on('close', () => runNext());
|
||||
});
|
||||
}
|
||||
|
||||
runNext();
|
||||
ssh.on('end', () => resolve(results));
|
||||
});
|
||||
|
||||
ssh.on('error', reject);
|
||||
ssh.connect({ ...CONFIG, readyTimeout: 30000 });
|
||||
});
|
||||
}
|
||||
|
||||
async function main() {
|
||||
console.log('\n╔══════════════════════════════════════════════════╗');
|
||||
console.log('║ BackOne DPI — Frontend Startup & PM2 Fix ║');
|
||||
console.log('╚══════════════════════════════════════════════════╝\n');
|
||||
|
||||
try {
|
||||
await runSshCommands(COMMANDS);
|
||||
console.log('\n✅ Frontend startup attempt complete!\n');
|
||||
} catch (err) {
|
||||
console.error('\n[FATAL]', err.message);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in new issue
Block a user