feat: Containerize services with Docker Compose (PostgreSQL, Strapi CMS, Express Backend, Nginx Frontend) on custom ports >9000
This commit is contained in:
+14
-1
@@ -14,6 +14,8 @@ import multer from 'multer';
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const PORT = process.env.PORT || 3001;
|
||||
const UPLOAD_DIR = process.env.UPLOAD_DIR || path.join(__dirname, 'uploads');
|
||||
const STRAPI_UPLOADS_DIR = path.join(__dirname, '..', 'strapi-cms', 'public', 'uploads');
|
||||
const PUBLIC_UPLOADS_DIR = path.join(__dirname, '..', 'public', 'uploads');
|
||||
// Public URL prefix on Apache (e.g. /citpl_website). Leave empty if site is at domain root.
|
||||
const SITE_BASE = (process.env.SITE_BASE ?? '').replace(/\/$/, '');
|
||||
const distDir = path.join(__dirname, '..', 'dist');
|
||||
@@ -42,6 +44,8 @@ function mountApp(base) {
|
||||
const prefix = base || '';
|
||||
|
||||
app.use(`${prefix}/uploads`, express.static(UPLOAD_DIR));
|
||||
app.use(`${prefix}/uploads`, express.static(STRAPI_UPLOADS_DIR));
|
||||
app.use(`${prefix}/uploads`, express.static(PUBLIC_UPLOADS_DIR));
|
||||
|
||||
app.get(`${prefix}/api/health`, (_req, res) => {
|
||||
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
||||
@@ -74,8 +78,14 @@ if (SITE_BASE) {
|
||||
// Fallback: serve public/assets directly at /assets/ and /citpl_website/assets/
|
||||
// This ensures cert/logo images load regardless of which base the build used
|
||||
app.use('/assets', express.static(publicAssetsDir));
|
||||
app.use('/uploads', express.static(UPLOAD_DIR));
|
||||
app.use('/uploads', express.static(STRAPI_UPLOADS_DIR));
|
||||
app.use('/uploads', express.static(PUBLIC_UPLOADS_DIR));
|
||||
if (SITE_BASE) {
|
||||
app.use(`${SITE_BASE}/assets`, express.static(publicAssetsDir));
|
||||
app.use(`${SITE_BASE}/uploads`, express.static(UPLOAD_DIR));
|
||||
app.use(`${SITE_BASE}/uploads`, express.static(STRAPI_UPLOADS_DIR));
|
||||
app.use(`${SITE_BASE}/uploads`, express.static(PUBLIC_UPLOADS_DIR));
|
||||
}
|
||||
|
||||
// Return proper 404 for missing static assets (prevents index.html served as JS/CSS)
|
||||
@@ -95,7 +105,7 @@ app.use((err, _req, res, _next) => {
|
||||
res.status(500).json({ error: err.message || 'Internal server error', code: 'SERVER_ERROR' });
|
||||
});
|
||||
|
||||
app.listen(PORT, () => {
|
||||
app.listen(PORT, '0.0.0.0', () => {
|
||||
console.log(`CITPL Node server on http://localhost:${PORT}`);
|
||||
console.log(` API: /api/* and ${SITE_BASE || ''}/api/*`);
|
||||
console.log(` Auth: ADMIN_USERNAME from .env (${process.env.ADMIN_USERNAME || 'admin'})`);
|
||||
@@ -103,3 +113,6 @@ app.listen(PORT, () => {
|
||||
console.log(` Static: ${distDir}`);
|
||||
}
|
||||
});
|
||||
|
||||
// Keep process active in background subshells
|
||||
setInterval(() => {}, 1000 * 3600);
|
||||
|
||||
Reference in New Issue
Block a user