feat(native): build frontend and serve SPA from backend (SERVE_FRONTEND); fix Cannot GET /admin on native installs
Mirror to GitHub / mirror (push) Successful in 42s
Test and Lint / backend-test (push) Successful in 1m33s
Test and Lint / frontend-test (push) Successful in 2m7s
Version and Release / version-bump (push) Successful in 1m0s
Version and Release / trigger-drone (push) Successful in 3s
Mirror to GitHub / mirror (push) Successful in 42s
Test and Lint / backend-test (push) Successful in 1m33s
Test and Lint / frontend-test (push) Successful in 2m7s
Version and Release / version-bump (push) Successful in 1m0s
Version and Release / trigger-drone (push) Successful in 3s
This commit is contained in:
@@ -12,6 +12,7 @@ logger.info('Server starting up', {
|
|||||||
timestamp: new Date().toISOString()
|
timestamp: new Date().toISOString()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const helmet = require('helmet');
|
const helmet = require('helmet');
|
||||||
const cors = require('cors');
|
const cors = require('cors');
|
||||||
@@ -219,6 +220,22 @@ app.use('/api/public', require('./src/routes/publicCMS'));
|
|||||||
app.use('/api/images', require('./src/routes/protectedImages'));
|
app.use('/api/images', require('./src/routes/protectedImages'));
|
||||||
app.use('/api/secure-images', secureImagesRoutes);
|
app.use('/api/secure-images', secureImagesRoutes);
|
||||||
|
|
||||||
|
// Optional: Serve built frontend (native installs)
|
||||||
|
try {
|
||||||
|
const serveFrontend = process.env.SERVE_FRONTEND === 'true';
|
||||||
|
const frontendDir = process.env.FRONTEND_DIR || path.join(__dirname, '../frontend/dist');
|
||||||
|
if (serveFrontend && fs.existsSync(frontendDir)) {
|
||||||
|
logger.info(`Serving frontend from ${frontendDir}`);
|
||||||
|
app.use(express.static(frontendDir));
|
||||||
|
// SPA fallback for non-API routes
|
||||||
|
app.get([ '/', '/admin', '/admin/*', '/gallery/*' ], (req, res) => {
|
||||||
|
res.sendFile(path.join(frontendDir, 'index.html'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logger.warn('Failed to enable frontend static serving', { error: e.message });
|
||||||
|
}
|
||||||
|
|
||||||
// Error handling middleware
|
// Error handling middleware
|
||||||
app.use((err, req, res, next) => {
|
app.use((err, req, res, next) => {
|
||||||
console.error('EXPRESS ERROR HANDLER:', err);
|
console.error('EXPRESS ERROR HANDLER:', err);
|
||||||
|
|||||||
+15
-1
@@ -602,10 +602,20 @@ setup_native_installation() {
|
|||||||
# Install backend production dependencies
|
# Install backend production dependencies
|
||||||
cd "$NATIVE_APP_DIR/app/backend"
|
cd "$NATIVE_APP_DIR/app/backend"
|
||||||
npm install --production
|
npm install --production
|
||||||
|
|
||||||
# Ensure SQLite data directory exists for native installs
|
# Ensure SQLite data directory exists for native installs
|
||||||
mkdir -p "$NATIVE_APP_DIR/app/backend/data"
|
mkdir -p "$NATIVE_APP_DIR/app/backend/data"
|
||||||
|
|
||||||
|
# Build frontend for native serving
|
||||||
|
log_step "Building frontend..."
|
||||||
|
if [[ -d "$NATIVE_APP_DIR/app/frontend" ]]; then
|
||||||
|
cd "$NATIVE_APP_DIR/app/frontend"
|
||||||
|
# Try ci (faster/clean) then fallback to install
|
||||||
|
run_as_user "npm ci --include=dev" || run_as_user "npm install"
|
||||||
|
run_as_user "npm run build"
|
||||||
|
else
|
||||||
|
log_warn "Frontend directory not found; admin UI will not be served by backend"
|
||||||
|
fi
|
||||||
|
|
||||||
# Generate secrets
|
# Generate secrets
|
||||||
local jwt_secret=$(generate_jwt_secret)
|
local jwt_secret=$(generate_jwt_secret)
|
||||||
[[ -z "$ADMIN_PASSWORD" ]] && ADMIN_PASSWORD=$(generate_password)
|
[[ -z "$ADMIN_PASSWORD" ]] && ADMIN_PASSWORD=$(generate_password)
|
||||||
@@ -654,6 +664,10 @@ DEFAULT_EXPIRY_DAYS=30
|
|||||||
# Logging
|
# Logging
|
||||||
LOG_DIR=$NATIVE_APP_DIR/logs
|
LOG_DIR=$NATIVE_APP_DIR/logs
|
||||||
LOG_LEVEL=info
|
LOG_LEVEL=info
|
||||||
|
|
||||||
|
# Frontend serving (native installs)
|
||||||
|
SERVE_FRONTEND=true
|
||||||
|
FRONTEND_DIR=$NATIVE_APP_DIR/app/frontend/dist
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Set permissions
|
# Set permissions
|
||||||
|
|||||||
Reference in New Issue
Block a user