Update panels, docs, and screenshots
@@ -175,3 +175,8 @@ php artisan test --compact
|
|||||||
## License
|
## License
|
||||||
|
|
||||||
MIT
|
MIT
|
||||||
|
|
||||||
|
## Documentation Notes
|
||||||
|
|
||||||
|
- Documentation screenshots are generated for all admin and user pages.
|
||||||
|
- cPanel Migration tabs (Domains, Databases, Mailboxes, Forwarders, SSL) only render after a backup is analyzed. Provide a sample cPanel backup to capture those tab screenshots.
|
||||||
|
|||||||
235
app/BackupSchedule.php
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
|
||||||
|
class BackupSchedule extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'user_id',
|
||||||
|
'destination_id',
|
||||||
|
'name',
|
||||||
|
'is_active',
|
||||||
|
'is_server_backup',
|
||||||
|
'frequency',
|
||||||
|
'time',
|
||||||
|
'day_of_week',
|
||||||
|
'day_of_month',
|
||||||
|
'include_files',
|
||||||
|
'include_databases',
|
||||||
|
'include_mailboxes',
|
||||||
|
'include_dns',
|
||||||
|
'domains',
|
||||||
|
'databases',
|
||||||
|
'mailboxes',
|
||||||
|
'users',
|
||||||
|
'retention_count',
|
||||||
|
'last_run_at',
|
||||||
|
'next_run_at',
|
||||||
|
'last_status',
|
||||||
|
'last_error',
|
||||||
|
'metadata',
|
||||||
|
];
|
||||||
|
|
||||||
|
protected function casts(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'is_active' => 'boolean',
|
||||||
|
'is_server_backup' => 'boolean',
|
||||||
|
'include_files' => 'boolean',
|
||||||
|
'include_databases' => 'boolean',
|
||||||
|
'include_mailboxes' => 'boolean',
|
||||||
|
'include_dns' => 'boolean',
|
||||||
|
'domains' => 'array',
|
||||||
|
'databases' => 'array',
|
||||||
|
'mailboxes' => 'array',
|
||||||
|
'users' => 'array',
|
||||||
|
'metadata' => 'array',
|
||||||
|
'retention_count' => 'integer',
|
||||||
|
'day_of_week' => 'integer',
|
||||||
|
'day_of_month' => 'integer',
|
||||||
|
'last_run_at' => 'datetime',
|
||||||
|
'next_run_at' => 'datetime',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function user(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destination(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(BackupDestination::class, 'destination_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function backups(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Backup::class, 'schedule_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the schedule should run now.
|
||||||
|
*/
|
||||||
|
public function shouldRun(): bool
|
||||||
|
{
|
||||||
|
if (! $this->is_active) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $this->next_run_at) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->next_run_at->isPast();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate and set the next run time.
|
||||||
|
*/
|
||||||
|
public function calculateNextRun(): Carbon
|
||||||
|
{
|
||||||
|
$timezone = $this->getSystemTimezone();
|
||||||
|
$now = Carbon::now($timezone);
|
||||||
|
$time = explode(':', $this->time);
|
||||||
|
$hour = (int) ($time[0] ?? 2);
|
||||||
|
$minute = (int) ($time[1] ?? 0);
|
||||||
|
|
||||||
|
$next = $now->copy()->setTime($hour, $minute, 0);
|
||||||
|
|
||||||
|
// If time already passed today, start from tomorrow
|
||||||
|
if ($next->isPast()) {
|
||||||
|
$next->addDay();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($this->frequency) {
|
||||||
|
case 'hourly':
|
||||||
|
$next = $now->copy()->addHour()->startOfHour();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'daily':
|
||||||
|
// Already set to next occurrence
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'weekly':
|
||||||
|
$targetDay = $this->day_of_week ?? 0; // Default to Sunday
|
||||||
|
while ($next->dayOfWeek !== $targetDay) {
|
||||||
|
$next->addDay();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'monthly':
|
||||||
|
$targetDay = $this->day_of_month ?? 1;
|
||||||
|
$next->day = min($targetDay, $next->daysInMonth);
|
||||||
|
if ($next->isPast()) {
|
||||||
|
$next->addMonth();
|
||||||
|
$next->day = min($targetDay, $next->daysInMonth);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$nextUtc = $next->copy()->setTimezone('UTC');
|
||||||
|
$this->attributes['next_run_at'] = $nextUtc->format($this->getDateFormat());
|
||||||
|
|
||||||
|
return $nextUtc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get frequency label for UI.
|
||||||
|
*/
|
||||||
|
public function getFrequencyLabelAttribute(): string
|
||||||
|
{
|
||||||
|
$base = match ($this->frequency) {
|
||||||
|
'hourly' => 'Every hour',
|
||||||
|
'daily' => 'Daily at '.$this->time,
|
||||||
|
'weekly' => 'Weekly on '.$this->getDayName().' at '.$this->time,
|
||||||
|
'monthly' => 'Monthly on day '.($this->day_of_month ?? 1).' at '.$this->time,
|
||||||
|
default => ucfirst($this->frequency),
|
||||||
|
};
|
||||||
|
|
||||||
|
return $base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get day name for weekly schedules.
|
||||||
|
*/
|
||||||
|
protected function getDayName(): string
|
||||||
|
{
|
||||||
|
$days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
||||||
|
|
||||||
|
return $days[$this->day_of_week ?? 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getSystemTimezone(): string
|
||||||
|
{
|
||||||
|
static $timezone = null;
|
||||||
|
if ($timezone === null) {
|
||||||
|
$timezone = trim((string) @file_get_contents('/etc/timezone'));
|
||||||
|
if ($timezone === '') {
|
||||||
|
$timezone = trim((string) @shell_exec('timedatectl show -p Timezone --value 2>/dev/null'));
|
||||||
|
}
|
||||||
|
if ($timezone === '') {
|
||||||
|
$timezone = 'UTC';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $timezone;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope for active schedules.
|
||||||
|
*/
|
||||||
|
public function scopeActive($query)
|
||||||
|
{
|
||||||
|
return $query->where('is_active', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope for due schedules.
|
||||||
|
*/
|
||||||
|
public function scopeDue($query)
|
||||||
|
{
|
||||||
|
return $query->active()
|
||||||
|
->where(function ($q) {
|
||||||
|
$q->whereNull('next_run_at')
|
||||||
|
->orWhere('next_run_at', '<=', now());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope for user schedules.
|
||||||
|
*/
|
||||||
|
public function scopeForUser($query, int $userId)
|
||||||
|
{
|
||||||
|
return $query->where('user_id', $userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope for server backup schedules.
|
||||||
|
*/
|
||||||
|
public function scopeServerBackups($query)
|
||||||
|
{
|
||||||
|
return $query->where('is_server_backup', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get last status color for UI.
|
||||||
|
*/
|
||||||
|
public function getLastStatusColorAttribute(): string
|
||||||
|
{
|
||||||
|
return match ($this->last_status) {
|
||||||
|
'success' => 'success',
|
||||||
|
'failed' => 'danger',
|
||||||
|
default => 'gray',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
1616
app/Backups.php
Normal file
@@ -185,51 +185,3 @@ class BackupSchedule extends Model
|
|||||||
return $timezone;
|
return $timezone;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Scope for active schedules.
|
|
||||||
*/
|
|
||||||
public function scopeActive($query)
|
|
||||||
{
|
|
||||||
return $query->where('is_active', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scope for due schedules.
|
|
||||||
*/
|
|
||||||
public function scopeDue($query)
|
|
||||||
{
|
|
||||||
return $query->active()
|
|
||||||
->where(function ($q) {
|
|
||||||
$q->whereNull('next_run_at')
|
|
||||||
->orWhere('next_run_at', '<=', now());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scope for user schedules.
|
|
||||||
*/
|
|
||||||
public function scopeForUser($query, int $userId)
|
|
||||||
{
|
|
||||||
return $query->where('user_id', $userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scope for server backup schedules.
|
|
||||||
*/
|
|
||||||
public function scopeServerBackups($query)
|
|
||||||
{
|
|
||||||
return $query->where('is_server_backup', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get last status color for UI.
|
|
||||||
*/
|
|
||||||
public function getLastStatusColorAttribute(): string
|
|
||||||
{
|
|
||||||
return match ($this->last_status) {
|
|
||||||
'success' => 'success',
|
|
||||||
'failed' => 'danger',
|
|
||||||
default => 'gray',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
4
doccs/site/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
.astro/
|
||||||
|
.DS_Store
|
||||||
4
doccs/site/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"recommendations": ["astro-build.astro-vscode"],
|
||||||
|
"unwantedRecommendations": []
|
||||||
|
}
|
||||||
11
doccs/site/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"command": "./node_modules/.bin/astro dev",
|
||||||
|
"name": "Development server",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "node-terminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
49
doccs/site/README.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# Starlight Starter Kit: Basics
|
||||||
|
|
||||||
|
[](https://starlight.astro.build)
|
||||||
|
|
||||||
|
```
|
||||||
|
npm create astro@latest -- --template starlight
|
||||||
|
```
|
||||||
|
|
||||||
|
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||||
|
|
||||||
|
## 🚀 Project Structure
|
||||||
|
|
||||||
|
Inside of your Astro + Starlight project, you'll see the following folders and files:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── public/
|
||||||
|
├── src/
|
||||||
|
│ ├── assets/
|
||||||
|
│ ├── content/
|
||||||
|
│ │ └── docs/
|
||||||
|
│ └── content.config.ts
|
||||||
|
├── astro.config.mjs
|
||||||
|
├── package.json
|
||||||
|
└── tsconfig.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.
|
||||||
|
|
||||||
|
Images can be added to `src/assets/` and embedded in Markdown with a relative link.
|
||||||
|
|
||||||
|
Static assets, like favicons, can be placed in the `public/` directory.
|
||||||
|
|
||||||
|
## 🧞 Commands
|
||||||
|
|
||||||
|
All commands are run from the root of the project, from a terminal:
|
||||||
|
|
||||||
|
| Command | Action |
|
||||||
|
| :------------------------ | :----------------------------------------------- |
|
||||||
|
| `npm install` | Installs dependencies |
|
||||||
|
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||||
|
| `npm run build` | Build your production site to `./dist/` |
|
||||||
|
| `npm run preview` | Preview your build locally, before deploying |
|
||||||
|
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||||
|
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||||
|
|
||||||
|
## 👀 Want to learn more?
|
||||||
|
|
||||||
|
Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).
|
||||||
34
doccs/site/astro.config.mjs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// @ts-check
|
||||||
|
import { defineConfig } from 'astro/config';
|
||||||
|
import starlight from '@astrojs/starlight';
|
||||||
|
|
||||||
|
// https://astro.build/config
|
||||||
|
export default defineConfig({
|
||||||
|
server: {
|
||||||
|
allowedHosts: ['jabali.lan'],
|
||||||
|
},
|
||||||
|
integrations: [
|
||||||
|
starlight({
|
||||||
|
title: 'Jabali Panel Documentation',
|
||||||
|
description: 'Feature documentation and screenshots for the Jabali hosting panel.',
|
||||||
|
sidebar: [
|
||||||
|
{
|
||||||
|
label: 'Getting Started',
|
||||||
|
items: [{ label: 'Overview', slug: 'overview' }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Admin Panel',
|
||||||
|
autogenerate: { directory: 'admin' },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'User Panel',
|
||||||
|
autogenerate: { directory: 'user' },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Platform',
|
||||||
|
autogenerate: { directory: 'platform' },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
});
|
||||||
6394
doccs/site/package-lock.json
generated
Normal file
17
doccs/site/package.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "doccs-site",
|
||||||
|
"type": "module",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "astro dev",
|
||||||
|
"start": "astro dev",
|
||||||
|
"build": "astro build",
|
||||||
|
"preview": "astro preview",
|
||||||
|
"astro": "astro"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@astrojs/starlight": "^0.37.6",
|
||||||
|
"astro": "^5.6.1",
|
||||||
|
"sharp": "^0.34.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
doccs/site/public/favicon.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M81 36 64 0 47 36l-1 2-9-10a6 6 0 0 0-9 9l10 10h-2L0 64l36 17h2L28 91a6 6 0 1 0 9 9l9-10 1 2 17 36 17-36v-2l9 10a6 6 0 1 0 9-9l-9-9 2-1 36-17-36-17-2-1 9-9a6 6 0 1 0-9-9l-9 10v-2Zm-17 2-2 5c-4 8-11 15-19 19l-5 2 5 2c8 4 15 11 19 19l2 5 2-5c4-8 11-15 19-19l5-2-5-2c-8-4-15-11-19-19l-2-5Z" clip-rule="evenodd"/><path d="M118 19a6 6 0 0 0-9-9l-3 3a6 6 0 1 0 9 9l3-3Zm-96 4c-2 2-6 2-9 0l-3-3a6 6 0 1 1 9-9l3 3c3 2 3 6 0 9Zm0 82c-2-2-6-2-9 0l-3 3a6 6 0 1 0 9 9l3-3c3-2 3-6 0-9Zm96 4a6 6 0 0 1-9 9l-3-3a6 6 0 1 1 9-9l3 3Z"/><style>path{fill:#000}@media (prefers-color-scheme:dark){path{fill:#fff}}</style></svg>
|
||||||
|
After Width: | Height: | Size: 696 B |
BIN
doccs/site/public/screenshots/admin-automation-api.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
doccs/site/public/screenshots/admin-backup-download.png
Normal file
|
After Width: | Height: | Size: 583 KiB |
BIN
doccs/site/public/screenshots/admin-backups--tab-backups.png
Normal file
|
After Width: | Height: | Size: 162 KiB |
|
After Width: | Height: | Size: 107 KiB |
BIN
doccs/site/public/screenshots/admin-backups--tab-schedules.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
doccs/site/public/screenshots/admin-backups.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
doccs/site/public/screenshots/admin-cpanel-migration.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
doccs/site/public/screenshots/admin-dashboard.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
doccs/site/public/screenshots/admin-database-tuning.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
doccs/site/public/screenshots/admin-dns-zones.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
doccs/site/public/screenshots/admin-email-logs.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
doccs/site/public/screenshots/admin-email-queue.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
doccs/site/public/screenshots/admin-geo-block-rules-5-edit.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
doccs/site/public/screenshots/admin-geo-block-rules-create.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
doccs/site/public/screenshots/admin-geo-block-rules-edit.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
doccs/site/public/screenshots/admin-geo-block-rules.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
doccs/site/public/screenshots/admin-home.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
doccs/site/public/screenshots/admin-hosting-packages-1-edit.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
doccs/site/public/screenshots/admin-hosting-packages-create.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
doccs/site/public/screenshots/admin-hosting-packages-edit.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
doccs/site/public/screenshots/admin-hosting-packages.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
doccs/site/public/screenshots/admin-ip-addresses.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
doccs/site/public/screenshots/admin-login.png
Normal file
|
After Width: | Height: | Size: 524 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 124 KiB |
BIN
doccs/site/public/screenshots/admin-migration.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
doccs/site/public/screenshots/admin-password-reset-request.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
doccs/site/public/screenshots/admin-password-reset-reset.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
doccs/site/public/screenshots/admin-php-manager.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
doccs/site/public/screenshots/admin-security--tab-antivirus.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
doccs/site/public/screenshots/admin-security--tab-fail2ban.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
doccs/site/public/screenshots/admin-security--tab-firewall.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 93 KiB |
BIN
doccs/site/public/screenshots/admin-security--tab-overview.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
doccs/site/public/screenshots/admin-security--tab-ssh.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 122 KiB |
BIN
doccs/site/public/screenshots/admin-security.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 114 KiB |
BIN
doccs/site/public/screenshots/admin-server-settings--tab-dns.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 108 KiB |
BIN
doccs/site/public/screenshots/admin-server-settings.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
doccs/site/public/screenshots/admin-server-status.png
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
doccs/site/public/screenshots/admin-server-updates.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
doccs/site/public/screenshots/admin-services.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
doccs/site/public/screenshots/admin-ssl-manager.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
doccs/site/public/screenshots/admin-two-factor-challenge.png
Normal file
|
After Width: | Height: | Size: 527 KiB |
BIN
doccs/site/public/screenshots/admin-users-1-edit.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
doccs/site/public/screenshots/admin-users-create.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
doccs/site/public/screenshots/admin-users-edit.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
doccs/site/public/screenshots/admin-users.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
doccs/site/public/screenshots/admin-waf.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
doccs/site/public/screenshots/admin-webhook-endpoints-1-edit.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
doccs/site/public/screenshots/admin-webhook-endpoints-create.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
doccs/site/public/screenshots/admin-webhook-endpoints-edit.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
doccs/site/public/screenshots/admin-webhook-endpoints.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
doccs/site/public/screenshots/admin-whm-migration.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
doccs/site/public/screenshots/user-backup-download.png
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
BIN
doccs/site/public/screenshots/user-backups--tab-my-backups.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 119 KiB |
BIN
doccs/site/public/screenshots/user-backups.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
doccs/site/public/screenshots/user-cdn-integration.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
doccs/site/public/screenshots/user-cpanel-migration.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
doccs/site/public/screenshots/user-cron-jobs.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
doccs/site/public/screenshots/user-dashboard.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
doccs/site/public/screenshots/user-databases.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
doccs/site/public/screenshots/user-dns-records.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
doccs/site/public/screenshots/user-domains.png
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
doccs/site/public/screenshots/user-email--tab-autoresponders.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
doccs/site/public/screenshots/user-email--tab-catch-all.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
doccs/site/public/screenshots/user-email--tab-forwarders.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
doccs/site/public/screenshots/user-email--tab-logs.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
doccs/site/public/screenshots/user-email--tab-mailboxes.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
doccs/site/public/screenshots/user-email--tab-spam-settings.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
doccs/site/public/screenshots/user-email.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
doccs/site/public/screenshots/user-files.png
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
doccs/site/public/screenshots/user-git-deployment.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
doccs/site/public/screenshots/user-home.png
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
doccs/site/public/screenshots/user-image-optimization.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
doccs/site/public/screenshots/user-login.png
Normal file
|
After Width: | Height: | Size: 584 KiB |
BIN
doccs/site/public/screenshots/user-logs--tab-activity-log.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
doccs/site/public/screenshots/user-logs--tab-logs.png
Normal file
|
After Width: | Height: | Size: 117 KiB |