Files
ntspi-app/app/Containers/Dashboard/Actions/Posts/DeploySiteAction.php
T
2026-04-09 17:23:10 +05:00

99 lines
3.1 KiB
PHP

<?php
namespace App\Containers\Dashboard\Actions\Posts;
use Illuminate\Support\Facades\Log;
class DeploySiteAction
{
private string $lockFile = '/var/www/_deploy/deploy.lock';
private string $logFile = '/var/www/_deploy/deploy.log';
/**
* Создаёт файл-триггер для запуска деплоя
*
* @return array ['success' => bool, 'message' => string]
*/
public function run(): array
{
try {
// Проверяем, не запущен ли уже деплой
if (file_exists($this->lockFile)) {
$lockContent = file_get_contents($this->lockFile);
$lockData = json_decode($lockContent, true);
if ($lockData && isset($lockData['status']) && $lockData['status'] === 'running') {
return [
'success' => false,
'message' => 'Деплой уже запущен! Подождите завершения текущего процесса.',
];
}
}
// Создаём файл-триггер
$lockData = [
'status' => 'pending',
'started_at' => now()->toDateTimeString(),
'started_by' => auth()->id(),
];
file_put_contents($this->lockFile, json_encode($lockData, JSON_PRETTY_PRINT));
Log::info('Deploy triggered', ['user_id' => auth()->id()]);
return [
'success' => true,
'message' => 'Деплой запущен! Процесс обновления сайта начнётся в течение 1 минуты.',
];
} catch (\Exception $e) {
Log::error('Deploy trigger failed', ['exception' => $e->getMessage()]);
return [
'success' => false,
'message' => 'Ошибка при запуске деплоя: ' . $e->getMessage(),
];
}
}
/**
* Проверяет статус деплоя
*/
public function getStatus(): array
{
if (!file_exists($this->lockFile)) {
return ['status' => 'idle', 'message' => 'Деплой не запущен'];
}
$content = file_get_contents($this->lockFile);
$data = json_decode($content, true);
if (!$data) {
return ['status' => 'error', 'message' => 'Ошибка чтения статуса'];
}
// Читаем лог если есть
$log = '';
if (file_exists($this->logFile)) {
$log = file_get_contents($this->logFile);
}
return [
'status' => $data['status'] ?? 'unknown',
'started_at' => $data['started_at'] ?? null,
'completed_at' => $data['completed_at'] ?? null,
'message' => $data['message'] ?? '',
'log' => $log,
];
}
/**
* Очищает статус деплоя
*/
public function clearStatus(): void
{
if (file_exists($this->lockFile)) {
unlink($this->lockFile);
}
}
}