feat(ssr): вынести обработку SSR ошибок в отдельный файл

- Создан resources/js/ssr/errorHandler.js для логирования SSR ошибок
- SSR ошибки теперь записываются в storage/logs/ssr-errors.log
- Обновлён ssr.js с использованием кастомного error handler
- Добавлен storage/logs в .gitignore

Теперь SSR ошибки не засоряют основные логи приложения

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
F4ilji
2026-04-07 22:55:31 +05:00
co-authored by Qwen-Coder
parent d7c6d23a6b
commit bd28fc60d7
5 changed files with 73 additions and 6 deletions
+3
View File
@@ -15,3 +15,6 @@ dump.sql
.cursor
.cache
hot
QWEN.md
.qwen
/storage/logs
+2 -1
View File
@@ -23,7 +23,8 @@
"Bash(docker compose ps)",
"Bash(docker compose build *)",
"Bash(curl *)",
"Bash(cat *)"
"Bash(cat *)",
"Bash(echo *)"
]
},
"$version": 3
-3
View File
@@ -406,6 +406,3 @@ route(name, params) {
- Завершение работы → подключи `review`
4. **Exec (PHP):** Если нужна команда artisan — оберни в `docker exec -it ntspi-php ...`.
5. **Exec (System):** Если нужен поиск — используй `find/grep`.
## Qwen Added Memories
- Security hardening applied to prod: nginx restricts PHP execution to index.php only, blocks access to .env/vendor/storage/hidden files, adds CSP header. PHP-FPM has open_basedir=/var/www:/tmp, disabled dangerous functions (passthru, system, proc_open, etc.), secure session cookies, expose_php=Off. curl_exec and shell_exec kept enabled because app uses them (VK API, LibreOffice conversion). Files: _docker/nginx/prod/conf.d/nginx.conf, _docker/app/php.ini
+10 -2
View File
@@ -6,6 +6,7 @@ import { createSSRApp, h } from 'vue'
import { ZiggyVue } from '../../vendor/tightenco/ziggy/dist/vue.m';
import { default as Router } from '../../vendor/tightenco/ziggy/dist/index.m.js';
import { createRouteMixin } from './mixins/RouteMixin.js';
import { createSsrErrorHandler, logSsrError } from './ssr/errorHandler.js';
createServer(page =>
createInertiaApp({
@@ -20,7 +21,9 @@ createServer(page =>
render: () => h(App, props),
});
ssrApp.config.errorHandler = () => null;
// SSR error handler - logs to separate file
const ssrErrorHandler = createSsrErrorHandler();
ssrApp.config.errorHandler = ssrErrorHandler;
ssrApp.config.warnHandler = () => null;
const ziggyConfig = {
@@ -42,5 +45,10 @@ createServer(page =>
.use(plugin)
.use(ZiggyVue, ziggyConfig);
},
}),
}).catch(error => {
// Catch Inertia SSR errors and log them separately
logSsrError(error);
// Re-throw to maintain normal error flow
throw error;
})
);
+58
View File
@@ -0,0 +1,58 @@
/**
* SSR Error Handler
* Captures and logs SSR-specific errors to a separate log file
*/
import fs from 'fs';
import path from 'path';
const SSR_LOG_FILE = path.join(process.cwd(), 'storage', 'logs', 'ssr-errors.log');
/**
* Format error for logging
*/
function formatError(error) {
const timestamp = new Date().toISOString();
const errorDetails = {
timestamp,
message: error.message || 'Unknown error',
stack: error.stack || 'No stack trace',
type: error.constructor.name,
};
return JSON.stringify(errorDetails) + '\n';
}
/**
* Log error to separate SSR error file
*/
export function logSsrError(error) {
try {
// Ensure directory exists
const logDir = path.dirname(SSR_LOG_FILE);
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
// Append error to log file
fs.appendFileSync(SSR_LOG_FILE, formatError(error), 'utf8');
} catch (logError) {
// Fallback to console if file write fails
console.error('Failed to write SSR error log:', logError);
console.error('Original SSR error:', error);
}
}
/**
* Create SSR error handler middleware
* Usage: Wrap your SSR render function with this
*/
export function createSsrErrorHandler() {
return (error) => {
logSsrError(error);
// Return true to suppress error propagation
// Return false to also throw the error
return true;
};
}