revert: remove deploy UI, controller, actions, tasks, and routes

- Remove Deploy/Index.vue, DeployController, DeploySiteAction, DeployTask
- Remove deploy routes from web.php
- Remove deploy menu item from menuConfig
- Remove deploy button and methods from Main.vue
- Remove deploy logging channel from logging.php
- Keep _deploy/ folder for future CI/CD setup
This commit is contained in:
F4ilji
2026-07-02 12:00:48 +05:00
parent cc98d509e5
commit 8bc5c367d6
8 changed files with 0 additions and 752 deletions
@@ -1,97 +0,0 @@
<?php
namespace App\Containers\Dashboard\Actions\Posts;
use App\Containers\Dashboard\Tasks\DeployTask;
use Illuminate\Support\Facades\Log;
class DeploySiteAction
{
public function __construct(
private readonly DeployTask $deployTask,
) {}
public function run(): array
{
try {
if (!$this->deployTask->scriptExists()) {
Log::channel('deploy')->warning('[DeployAction] Script not found');
return [
'success' => false,
'message' => 'Скрипт деплоя не найден на сервере',
];
}
if ($this->deployTask->isDeployRunning()) {
Log::channel('deploy')->warning('[DeployAction] Deploy already running', [
'user_id' => auth()->id(),
]);
return [
'success' => false,
'message' => 'Деплой уже запущен! Подождите завершения текущего процесса.',
];
}
$started = $this->deployTask->startDeploy();
if (!$started) {
Log::channel('deploy')->error('[DeployAction] Failed to start deploy script', [
'user_id' => auth()->id(),
]);
return [
'success' => false,
'message' => 'Скрипт деплоя не запустился. Проверьте лог.',
];
}
Log::channel('deploy')->info('[DeployAction] Deploy triggered successfully', [
'user_id' => auth()->id(),
'user_email' => auth()->user()?->email,
]);
return [
'success' => true,
'message' => 'Деплой запущен! Процесс обновления сайта начнётся в течение нескольких секунд.',
];
} catch (\Exception $e) {
Log::channel('deploy')->error('[DeployAction] Exception', [
'user_id' => auth()->id(),
'exception' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
return [
'success' => false,
'message' => 'Ошибка при запуске деплоя: ' . $e->getMessage(),
];
}
}
public function getStatus(): array
{
return $this->deployTask->getDeployStatus();
}
public function getLog(int $lines = 50): array
{
return [
'log' => $this->deployTask->getLogTail($lines),
'full_log' => $this->deployTask->getLog(),
];
}
public function getHistory(): array
{
return [
'history' => $this->deployTask->getHistory(),
];
}
public function clearStatus(): void
{
Log::channel('deploy')->info('[DeployAction] Log cleared', [
'user_id' => auth()->id(),
]);
$this->deployTask->clearLog();
}
}
@@ -1,149 +0,0 @@
<?php
namespace App\Containers\Dashboard\Tasks;
use Illuminate\Support\Facades\Log;
class DeployTask
{
private string $deployScript = '/var/www/_deploy/deploy.sh';
private string $logFile = '/var/www/_deploy/deploy.log';
private string $historyDir = '/var/www/_deploy/history';
public function scriptExists(): bool
{
$exists = file_exists($this->deployScript);
$this->phpLog('check_script', $exists ? 'found' : 'not_found');
return $exists;
}
public function isDeployRunning(): bool
{
$output = shell_exec('pgrep -f "deploy\\.sh"');
$running = !empty(trim($output ?? ''));
return $running;
}
public function startDeploy(): bool
{
if ($this->isDeployRunning()) {
$this->phpLog('start', 'already_running');
return false;
}
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
$this->phpLog('start', 'launching deploy.sh');
$command = sprintf(
'bash %s > /dev/null 2>&1 &',
escapeshellarg($this->deployScript)
);
shell_exec($command);
usleep(500000);
$started = $this->isDeployRunning();
$this->phpLog('start', $started ? 'process_started' : 'process_failed_to_start');
return $started;
}
public function getDeployStatus(): array
{
if (!$this->isDeployRunning()) {
if (!file_exists($this->logFile)) {
$this->phpLog('status', 'idle');
return ['status' => 'idle', 'message' => 'Деплой не запущен'];
}
$log = $this->getLog();
$lastLines = array_slice(explode("\n", trim($log)), -5);
$lastOutput = implode("\n", $lastLines);
$isSuccess = stripos($lastOutput, '✅') !== false
|| stripos($lastOutput, 'completed successfully') !== false;
$isFailed = stripos($lastOutput, '❌') !== false
|| stripos($lastOutput, 'ERROR') !== false;
$status = $isSuccess ? 'completed' : ($isFailed ? 'failed' : 'unknown');
$this->phpLog('status', $status);
return [
'status' => $status,
'message' => $isSuccess ? 'Деплой завершён успешно!' : 'Деплой завершён',
'log' => $log,
];
}
$this->phpLog('status', 'running');
return [
'status' => 'running',
'message' => 'Деплой выполняется...',
'log' => $this->getLog(),
];
}
public function getLog(): string
{
if (!file_exists($this->logFile)) {
return '';
}
return file_get_contents($this->logFile);
}
public function getLogTail(int $lines = 50): string
{
$log = $this->getLog();
if (empty($log)) {
return '';
}
$allLines = explode("\n", trim($log));
return implode("\n", array_slice($allLines, -$lines));
}
public function clearLog(): void
{
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
$this->phpLog('clear', 'deploy log cleared');
}
public function getHistory(): array
{
if (!is_dir($this->historyDir)) {
return [];
}
$files = glob($this->historyDir . '/*.json');
usort($files, fn($a, $b) => strcmp($b, $a));
$history = [];
foreach (array_slice($files, 0, 50) as $file) {
$content = file_get_contents($file);
$data = json_decode($content, true);
if ($data) {
$history[] = $data;
}
}
return $history;
}
private function phpLog(string $event, string $message): void
{
Log::channel('deploy')->info('[Deploy] {event}: {message}', [
'event' => $event,
'message' => $message,
]);
}
}
@@ -1,103 +0,0 @@
<?php
namespace App\Containers\Dashboard\UI\WEB\Controllers;
use App\Containers\Dashboard\Actions\Posts\DeploySiteAction;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Inertia\Inertia;
class DeployController extends Controller
{
public function __construct(
private readonly DeploySiteAction $deploySiteAction,
) {}
public function index(): \Inertia\Response
{
$history = $this->deploySiteAction->getHistory();
$status = $this->deploySiteAction->getStatus();
return Inertia::render('Dashboard/Deploy/Index', [
'history' => $history['history'],
'status' => $status,
]);
}
public function deploy(Request $request): JsonResponse
{
if (app()->environment() !== 'production') {
return response()->json([
'success' => false,
'message' => 'Деплой доступен только на production',
], 403);
}
if (!$request->user()->hasRole('super_admin')) {
return response()->json([
'success' => false,
'message' => 'Недостаточно прав для выполнения этой операции',
], 403);
}
$result = $this->deploySiteAction->run();
return response()->json($result);
}
public function status(Request $request): JsonResponse
{
if (app()->environment() !== 'production') {
return response()->json(['status' => 'disabled'], 403);
}
if (!$request->user()->hasRole('super_admin')) {
return response()->json([
'success' => false,
'message' => 'Недостаточно прав',
], 403);
}
$status = $this->deploySiteAction->getStatus();
return response()->json($status);
}
public function log(Request $request): JsonResponse
{
if (!$request->user()->hasRole('super_admin')) {
return response()->json(['success' => false], 403);
}
$lines = (int) $request->query('lines', 50);
$result = $this->deploySiteAction->getLog($lines);
return response()->json($result);
}
public function history(Request $request): JsonResponse
{
if (!$request->user()->hasRole('super_admin')) {
return response()->json(['success' => false], 403);
}
$result = $this->deploySiteAction->getHistory();
return response()->json($result);
}
public function clear(Request $request): JsonResponse
{
if (!$request->user()->hasRole('super_admin')) {
return response()->json([
'success' => false,
'message' => 'Недостаточно прав',
], 403);
}
$this->deploySiteAction->clearStatus();
return response()->json(['success' => true]);
}
}
@@ -10,7 +10,6 @@ use App\Containers\Dashboard\UI\WEB\Controllers\CategoryController as NewsCatego
use App\Containers\Dashboard\UI\WEB\Controllers\ContactWidgetController;
use App\Containers\Dashboard\UI\WEB\Controllers\CreateSliderController;
use App\Containers\Dashboard\UI\WEB\Controllers\CustomFormController;
use App\Containers\Dashboard\UI\WEB\Controllers\DeployController;
use App\Containers\Dashboard\UI\WEB\Controllers\DepartmentController;
use App\Containers\Dashboard\UI\WEB\Controllers\PageReferenceListController;
use App\Containers\Dashboard\UI\WEB\Controllers\DepartmentProgramController;
@@ -63,13 +62,6 @@ Route::post('/dashboard/logout', [AuthenticatedSessionController::class, 'destro
// Authenticated dashboard routes
Route::middleware(['access-check', 'dashboard.auth'])->group(function () {
Route::get('/dashboard', IndexDashboardController::class)->name('dashboard.index');
Route::get('/dashboard/deploy', [DeployController::class, 'index'])->name('dashboard.deploy.index');
Route::post('/dashboard/deploy', [DeployController::class, 'deploy'])->name('dashboard.deploy');
Route::get('/dashboard/deploy/status', [DeployController::class, 'status'])->name('dashboard.deploy.status');
Route::get('/dashboard/deploy/log', [DeployController::class, 'log'])->name('dashboard.deploy.log');
Route::get('/dashboard/deploy/history', [DeployController::class, 'history'])->name('dashboard.deploy.history');
Route::post('/dashboard/deploy/clear', [DeployController::class, 'clear'])->name('dashboard.deploy.clear');
Route::get('/dashboard/sveden', [SvedenController::class, 'index'])->name('dashboard.sveden');
Route::post('/dashboard/sveden', [SvedenController::class, 'store'])->name('dashboard.sveden.store');