@php $monitor = $monitoring['config']; $latest = $monitoring['latest']; $backupConfig ??= null; $backups ??= collect(); $backupScheduleMode = old('schedule_mode', $backupConfig?->schedule_times ? 'times' : 'interval'); $backupScheduleTimes = old('schedule_times', $backupConfig?->schedule_times ?? []); @endphp @extends('layout') @section('content')
@include('partials.context-back')

Monitoramento

{{ $system->name }} · disponibilidade, resposta e proteção de dados

appsVer solução
sensors Disponibilidade

{{ $monitoring['availability'] === null ? '—' : $monitoring['availability'].'%' }}

{{ $monitoring['checks']->count() }} verificação(ões) registradas
speed Tempo de resposta

{{ $latest === null || $latest->response_ms === null ? '—' : $latest->response_ms.' ms' }}

última medição
history Última verificação

{{ $latest === null ? '—' : datetime_br($latest->checked_at?->format('Y-m-d H:i:s'), 'd/m H:i') }}

{{ $latest === null ? 'Aguardando' : strtoupper($latest->status) }}
@if($monitor)
@endif
@csrf

O OPS fará uma requisição HEAD no endereço configurado e registrará disponibilidade, status HTTP e tempo de resposta. Para proteger a hospedagem e evitar excesso de tráfego, o limite global é de 10 verificações por minuto.

{!! field_error('endpoint') !!}
{!! field_error('interval_minutes') !!}
{!! field_error('timeout_seconds') !!}
{!! field_error('expected_status') !!}
{!! field_error('slow_threshold_ms') !!}
{{ $monitor ? 'Agendamento ativo' : 'Ainda não configurado' }}
@php $maskedBackupHost = static function (?string $value): string { if (blank($value)) { return '—'; } if (filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { $octets = explode('.', $value); return substr($octets[0], 0, 1).'*.' .substr($octets[1], 0, 1).'.'.substr($octets[2], 0, 2).'*.*'; } return mb_substr($value, 0, 1).'••••'; }; $maskedBackupIdentifier = static fn (?string $value): string => blank($value) ? '—' : mb_substr($value, 0, 1).'••••'; @endphp
{{ $backupConfig ? 'Configurado' : 'Não configurado' }}

O OmniAURIOS conecta diretamente ao MySQL, gera um dump compactado e guarda o arquivo em armazenamento privado. Os campos mostram apenas máscaras; valores atuais não são enviados à página. Deixe-os vazios para manter a configuração. A senha é cifrada pela APP_KEY.

@csrf
{!! field_error('host') !!}
{!! field_error('port') !!}
{!! field_error('database_name') !!}
{!! field_error('username') !!}
{!! field_error('password') !!}
{!! field_error('schedule_mode') !!}
{!! field_error('interval_hours') !!}
{!! field_error('retention_count') !!}

Escolha até três horários por dia. O OmniAURIOS agenda no máximo três backups no total a cada janela de 15 minutos; horários não executados podem ser recuperados por até 24 horas, respeitando a mesma cota.

@for($slot = 0; $slot < 3; $slot++)
{!! field_error('schedule_times.'.$slot) !!}
@endfor
{!! field_error('schedule_times') !!}
{!! field_error('backup') !!}
@if($backupConfig)
@csrfConta na cota global de três despachos a cada 15 minutos. O worker processará o arquivo em segundo plano.
@endif
{{ $fileBackupConfig?->connection_status === 'verified' ? 'Conexão verificada' : ($fileBackupConfig ? 'Configuração salva' : 'Fase de configuração') }}

Configuração SFTP por solução. As credenciais ficam cifradas e a chave do servidor precisa ser fixada após conferência fora de banda.

Capacidade: {{ $fileBackupCapabilities['native_pipeline_ready'] ? 'recursos nativos detectados' : 'requisitos pendentes' }} · não homologada @if($fileBackupCapabilities['missing']) {{ implode(' ', $fileBackupCapabilities['missing']) }} A coleta e os snapshots permanecem desabilitados até configurar um executor compatível. @else Dependências locais detectadas, mas o pipeline permanece fechado até homologar coleta, snapshot, retenção e restauração isolada no executor real. @endif {{ $fileBackupCapabilities['hosting_type_reason'] }} Executor externo e modalidade restrita somente por PHP ainda não estão implementados.
@csrf
{!! field_error('host') !!}
{!! field_error('port') !!}
{!! field_error('username') !!}
{!! field_error('auth_type') !!}
{!! field_error('credential') !!}
Só se aplica à autenticação por chave SSH; também é protegida junto da credencial.{!! field_error('credential_passphrase') !!}
Credencial separada para restauração remota Desativada por padrão

Use uma conta SFTP distinta, limitada a criar arquivos em diretórios autorizados. Ela nunca será reutilizada na coleta. Cadastrar esta credencial não habilita gravações: a restauração remota permanece bloqueada até homologação e ativação explícita do gate.

{!! field_error('remote_restore_username') !!}
{!! field_error('remote_restore_auth_type') !!}
Armazenada cifrada. Deixe vazia para preservar a atual, exceto ao trocar usuário ou método de autenticação.{!! field_error('remote_restore_credential') !!}
{!! field_error('remote_restore_passphrase') !!}
Não aceite automaticamente uma chave apresentada pela rede. Compare o fingerprint com o provedor/administrador do servidor antes de salvar.{!! field_error('host_fingerprint') !!}
Links simbólicos são identificados e não podem ser abertos pelo navegador SFTP.{!! field_error('directories') !!}
{{ $fileBackupConfig?->connection_verified_at ? 'Verificada em '.datetime_br($fileBackupConfig->connection_verified_at->toDateTimeString()) : 'Salve a configuração antes de testar.' }}
{!! field_error('destination_driver') !!}
{!! field_error('schedule_type') !!}
{!! field_error('schedule_time') !!}
{!! field_error('schedule_day') !!}
{!! field_error('timezone') !!}
{!! field_error('retention_count') !!}
Credenciais do destino S3 / R2 use quando esse destino estiver selecionado @php($destinationOptions = $fileBackupConfig?->destination_options ?? [])
{!! field_error('destination_endpoint') !!}
{!! field_error('destination_bucket') !!}
{!! field_error('destination_access_key') !!}
{!! field_error('destination_secret_key') !!}
Credenciais são cifradas no banco. O endpoint precisa estar em FILE_BACKUP_ALLOWED_DESTINATION_HOSTS e resolver somente para IPs públicos.
{!! field_error('notification_email') !!}
notify_on_failure ?? true))>Falhas e ocorrências relevantes
notify_on_success ?? true))>Execuções concluídas
{!! field_error('notify_on_failure') !!}{!! field_error('notify_on_success') !!}
{!! field_error('directories_text') !!}{!! field_error('credential') !!}
Salvar não testa a conexão nem ativa a execução.
@if($fileBackupConfig)
@csrf
@csrf
{{ $fileBackupConfig->enabled ? 'Agendamento ativo · conexão '.($fileBackupConfig->connection_status === 'verified' ? 'validada' : 'não validada') : 'Agendamento suspenso' }}
@endif

timeline Histórico recente

{{ $monitoring['checks']->count() }} registro(s)
@if($monitoring['checks']->isEmpty())
monitor_heart

Nenhuma verificação registrada.

Salve o endereço e execute a primeira verificação.
@else
@foreach($monitoring['checks']->take(10) as $check)
{{ strtoupper($check->status) }}{{ $check->http_status ?? '—' }} · {{ $check->response_ms ?? '—' }} ms{{ datetime_br($check->checked_at?->format('Y-m-d H:i:s'), 'd/m H:i') }}
@endforeach
@endif

history Histórico de backups

Execuções e arquivos SQL e remotos, cada um no seu histórico.

folder_zip Histórico de backup de arquivos

{{ $fileBackupOperations['summary']['total'] }} execução(ões)
{{ $fileBackupOperations['summary']['completed'] }} snapshots válidos {{ $fileBackupOperations['summary']['failed'] }} execuções com falha {{ number_format($fileBackupOperations['summary']['bytes_transferred'] / 1048576, 2, ',', '.') }} MB transferidos @if($fileBackupOperations['percentiles']['sample_size'] > 0) {{ $fileBackupOperations['percentiles']['sample_size'] }} snapshots concluídos @if($fileBackupOperations['percentiles']['period_start_at'] && $fileBackupOperations['percentiles']['period_end_at']) Período {{ $fileBackupOperations['percentiles']['period_start_at']->timezone(config('app.timezone'))->format('d/m/Y') }}–{{ $fileBackupOperations['percentiles']['period_end_at']->timezone(config('app.timezone'))->format('d/m/Y') }} @endif P50 {{ number_format($fileBackupOperations['percentiles']['p50_ms'] / 1000, 1, ',', '.') }} s P95 {{ number_format($fileBackupOperations['percentiles']['p95_ms'] / 1000, 1, ',', '.') }} s P98 {{ number_format($fileBackupOperations['percentiles']['p98_ms'] / 1000, 1, ',', '.') }} s @else Percentis disponíveis após a primeira execução medida. @endif
@if($fileBackupOperations['runs']->isEmpty())
folder_off

Nenhuma execução de arquivos.

Este histórico é separado dos backups SQL e das verificações HTTP.
@else
@foreach($fileBackupOperations['runs'] as $fileBackupRun) @php($backupTone = in_array($fileBackupRun->status, ['completed'], true) ? 'ok' : (in_array($fileBackupRun->status, ['inventory', 'transferring', 'staged'], true) ? 'warn' : 'bad')) @php($latestRestore = $fileBackupRun->restores->sortByDesc('id')->first()) @php($restoreStatusLabels = ['queued' => 'na fila', 'running' => 'em andamento', 'verified' => 'verificada', 'failed' => 'falhou', 'expired' => 'expirada']) @endforeach
StatusSnapshotArquivosVolumeDuraçãoDataRestaurações de testeAção
{{ str_replace('_', ' ', $fileBackupRun->status) }} {{ $fileBackupRun->snapshot_id ? '#'.substr($fileBackupRun->snapshot_id, 0, 12) : '—' }} {{ number_format($fileBackupRun->files_processed, 0, ',', '.') }} / {{ number_format($fileBackupRun->files_total, 0, ',', '.') }} {{ number_format($fileBackupRun->bytes_transferred / 1048576, 2, ',', '.') }} MB {{ $fileBackupRun->duration_ms !== null ? number_format($fileBackupRun->duration_ms / 1000, 1, ',', '.').' s' : '—' }} @if($fileBackupRun->stage_durations_ms) @php($stageLabels = ['connection' => 'Conexão', 'inventory' => 'Inventário', 'transfer' => 'Transferência', 'snapshot_validation' => 'Validação', 'snapshot_publication' => 'Snapshot', 'retention' => 'Retenção'])
Etapas @foreach($fileBackupRun->stage_durations_ms as $stage => $duration) {{ $stageLabels[$stage] ?? $stage }}: {{ number_format((int) $duration / 1000, 1, ',', '.') }} s{{ !$loop->last ? ' · ' : '' }} @endforeach
@endif
{{ datetime_br($fileBackupRun->created_at?->format('Y-m-d H:i:s'), 'd/m/Y H:i') }} {{ $fileBackupRun->restores->count() }} · {{ $fileBackupRun->restores->where('status', 'verified')->count() }} verificadas @if($latestRestore && in_array($latestRestore->status, ['queued', 'running', 'failed'], true)) Última #{{ $latestRestore->id }} · {{ $restoreStatusLabels[$latestRestore->status] ?? $latestRestore->status }} @endif @if($fileBackupRun->status === 'completed' && $fileBackupRun->phase === 'snapshot_validated') @php($verifiedRestore = $fileBackupRun->restores->where('status', 'verified')->sortByDesc('id')->first()) @if($verifiedRestore) folder_openArquivos recuperados @elseif($latestRestore && in_array($latestRestore->status, ['queued', 'running'], true)) Restauração #{{ $latestRestore->id }} {{ $restoreStatusLabels[$latestRestore->status] }} @else settings_backup_restoreTestar restauração @endif @else Snapshot não confirmado @endif
@endif

history Histórico de backups SQL

{{ $backups->count() }} registro(s)
@if($backups->isEmpty())
database

Nenhum backup gerado.

Os arquivos aparecerão aqui depois da primeira execução.
@else
@foreach($backups as $backup) @endforeach
Status Arquivo Tamanho Data Ação
{{ $backup->status }} {{ $backup->status === 'success' ? 'Backup SQL #'.$backup->id : 'Backup em processamento' }} {{ $backup->size_bytes ? number_format($backup->size_bytes / 1048576, 2, ',', '.').' MB' : '—' }} {{ datetime_br($backup->created_at?->format('Y-m-d H:i:s'), 'd/m/Y H:i') }} @if($backup->status === 'success')downloadBaixar@elseIndisponível@endif
@endif
@endsection