mirror of
https://github.com/PhyreApps/PhyrePanel.git
synced 2024-11-25 00:50:32 +00:00
Compare commits
20 commits
443d6c8464
...
030d73cf77
Author | SHA1 | Date | |
---|---|---|---|
|
030d73cf77 | ||
|
e4c172218a | ||
|
6e18fb4513 | ||
|
b77f0ad0ff | ||
|
4320aa029c | ||
|
f81cf44978 | ||
|
cc820a7671 | ||
|
6dc1bad756 | ||
|
c15173af24 | ||
|
3c475ddab0 | ||
|
482620edfc | ||
|
d6f2fd8189 | ||
|
2113dc97fe | ||
|
a363e3cdff | ||
|
93af7e058e | ||
|
13d8da81d2 | ||
|
8745b85c34 | ||
|
3648f319ed | ||
|
b11c19d8c5 | ||
|
3a6dac0c15 |
15 changed files with 242 additions and 12384 deletions
28
.drone-extend.yml
Normal file
28
.drone-extend.yml
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
kind: pipeline
|
||||
name: CentOS
|
||||
steps:
|
||||
- name: run unit tests
|
||||
image: centos:latest
|
||||
commands:
|
||||
- sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
|
||||
- sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
|
||||
- yum update -y
|
||||
- dnf -y install sudo wget
|
||||
- sudo wget -q -O - http://www.atomicorp.com/installers/atomic | sh
|
||||
|
||||
- mkdir /phyre-panel
|
||||
- cp installers/centos-stream-9/install-partial/install_base.sh /phyre-panel/install_base.sh
|
||||
- chmod +x /phyre-panel/install_base.sh
|
||||
- /phyre-panel/install_base.sh
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
name: Debian 12
|
||||
steps:
|
||||
- name: run unit tests
|
||||
image: debian:12
|
||||
environment:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
commands:
|
||||
- apt-get update
|
83
.drone.yml
83
.drone.yml
|
@ -1,32 +1,68 @@
|
|||
---
|
||||
kind: pipeline
|
||||
name: CentOS
|
||||
name: Ubuntu 22.04 - CODE COVERAGE
|
||||
steps:
|
||||
- name: run unit tests
|
||||
image: centos:latest
|
||||
commands:
|
||||
- sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
|
||||
- sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
|
||||
- yum update -y
|
||||
- dnf -y install sudo wget
|
||||
- sudo wget -q -O - http://www.atomicorp.com/installers/atomic | sh
|
||||
|
||||
- mkdir /phyre-panel
|
||||
- cp installers/centos-stream-9/install-partial/install_base.sh /phyre-panel/install_base.sh
|
||||
- chmod +x /phyre-panel/install_base.sh
|
||||
- /phyre-panel/install_base.sh
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
name: Debian 12
|
||||
steps:
|
||||
- name: run unit tests
|
||||
image: debian:12
|
||||
image: ubuntu:22.04
|
||||
environment:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
commands:
|
||||
- apt-get update
|
||||
- apt-get install -y libicu-dev sudo cron apt-utils -yqq daemonize dbus-user-session fontconfig rsync
|
||||
- daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
|
||||
|
||||
- ls -la
|
||||
- mkdir /phyre-panel
|
||||
|
||||
- cp installers/ubuntu-22.04/install-partial/install_base.sh /phyre-panel/install_base.sh
|
||||
- chmod +x /phyre-panel/install_base.sh
|
||||
- /phyre-panel/install_base.sh
|
||||
|
||||
- cp installers/ubuntu-22.04/install-partial/install_web.sh /phyre-panel/install_web.sh
|
||||
- chmod +x /phyre-panel/install_web.sh
|
||||
|
||||
- cp -r web /usr/local/phyre/web/
|
||||
- cd /usr/local/phyre/web/
|
||||
- ls -la
|
||||
|
||||
- wget https://getcomposer.org/download/latest-stable/composer.phar
|
||||
- COMPOSER_ALLOW_SUPERUSER=1 phyre-php composer.phar install
|
||||
|
||||
- /phyre-panel/install_web.sh
|
||||
|
||||
- apt-get install autoconf build-essential -y
|
||||
- mkdir -p /usr/local/phyre/php-xdebug
|
||||
- cd /usr/local/phyre/php-xdebug
|
||||
- wget http://xdebug.org/files/xdebug-3.3.2.tgz
|
||||
- tar -xvzf xdebug-3.3.2.tgz
|
||||
- cd xdebug-3.3.2
|
||||
- /usr/local/phyre/php/bin/phpize
|
||||
- ./configure --enable-xdebug --with-php-config=/usr/local/phyre/php/bin/php-config
|
||||
- make
|
||||
|
||||
- mkdir -p /usr/local/phyre/php/zend-xdebug
|
||||
- cp modules/xdebug.so /usr/local/phyre/php/zend-xdebug/xdebug.so
|
||||
|
||||
- chmod 777 /usr/local/phyre/php/zend-xdebug/xdebug.so
|
||||
|
||||
- cp /usr/local/phyre/web/tests/xdebug-php-ini.txt /usr/local/phyre/php/bin/php.ini
|
||||
|
||||
- chmod 777 /usr/local/phyre/php/bin/php.ini
|
||||
- phyre-php -v
|
||||
|
||||
- cd /usr/local/phyre/web/
|
||||
- chmod -R 777 vendor
|
||||
- apt install composer -y
|
||||
- composer test:coverage
|
||||
|
||||
- name: codecov
|
||||
image: robertstettner/drone-codecov
|
||||
environment:
|
||||
CODECOV_TOKEN:
|
||||
from_secret: CODECOV_TOKEN
|
||||
settings:
|
||||
token: $CODECOV_TOKEN
|
||||
files: /usr/local/phyre/web/clover.xml
|
||||
---
|
||||
kind: pipeline
|
||||
name: Ubuntu 22.04
|
||||
|
@ -34,7 +70,7 @@ steps:
|
|||
- name: run unit tests
|
||||
image: ubuntu:22.04
|
||||
environment:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
commands:
|
||||
- apt-get update
|
||||
- apt-get install -y libicu-dev sudo cron apt-utils -yqq daemonize dbus-user-session fontconfig rsync
|
||||
|
@ -53,8 +89,3 @@ steps:
|
|||
- COMPOSER_ALLOW_SUPERUSER=1 phyre-php composer.phar install
|
||||
- /phyre-panel/install_web.sh
|
||||
- phyre-php artisan test
|
||||
# - name: codecov
|
||||
# image: robertstettner/drone-codecov
|
||||
# settings:
|
||||
# token: ${CODECOV_TOKEN}
|
||||
# files: /usr/local/phyre/web/clover.xml
|
||||
|
|
|
@ -11,7 +11,7 @@ jobs:
|
|||
#os: [ubuntu-24.04, ubuntu-22.04, ubuntu-20.04]
|
||||
os: [ubuntu-22.04]
|
||||
|
||||
runs-on: hetzner-${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
|
@ -43,7 +43,7 @@ jobs:
|
|||
sudo COMPOSER_ALLOW_SUPERUSER=1 phyre-php composer.phar install
|
||||
|
||||
sudo /phyre-panel/install_web.sh
|
||||
sudo phyre-php artisan test
|
||||
sudo phyre-php artisan test --filter HostingSubscriptionsTest
|
||||
|
||||
compile-phyre-web-panel:
|
||||
runs-on: ubuntu-22.04
|
|
@ -43,6 +43,7 @@ class DomainIsCreatedListener
|
|||
if (! in_array('letsencrypt', $findHostingPlan->additional_services)) {
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
$generalSettings = Settings::general();
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Jobs\ProcessHostingSubscriptionBackup;
|
||||
use App\Models\Backup;
|
||||
use App\Models\HostingSubscription;
|
||||
use App\Models\HostingSubscriptionBackup;
|
||||
|
@ -45,11 +46,7 @@ class CreateDailyFullHostingSubscriptionsBackup extends Command
|
|||
->where('created_at', '>=', Carbon::now()->subHours(24))
|
||||
->first();
|
||||
if (! $findBackup) {
|
||||
$backup = new HostingSubscriptionBackup();
|
||||
$backup->hosting_subscription_id = $hostingSubscription->id;
|
||||
$backup->backup_type = 'full';
|
||||
$backup->save();
|
||||
|
||||
ProcessHostingSubscriptionBackup::dispatch($hostingSubscription->id);
|
||||
} else {
|
||||
$this->error('Backup already exists for ' . $hostingSubscription->domain);
|
||||
$this->error('Created before: ' . $findBackup->created_at->diffForHumans());
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Backup;
|
||||
use App\Models\HostingSubscription;
|
||||
use App\Models\HostingSubscriptionBackup;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class RunHostingSubscriptionsBackupChecks extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'phyre:run-hosting-subscriptions-backup-checks';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Command description';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
// Delete backups older than 7 days
|
||||
$findBackupsForDeleting = HostingSubscriptionBackup::where('created_at', '<', now()->subDays(7))->get();
|
||||
foreach ($findBackupsForDeleting as $backup) {
|
||||
$backup->delete();
|
||||
}
|
||||
|
||||
// Check for pending backups
|
||||
$getPendingBackups = HostingSubscriptionBackup::where('status', 'pending')
|
||||
->get();
|
||||
|
||||
if ($getPendingBackups->count() > 0) {
|
||||
if ($getPendingBackups->count() > 1) {
|
||||
$this->info('Multiple backups are pending...');
|
||||
} else {
|
||||
foreach ($getPendingBackups as $pendingBackup) {
|
||||
$pendingBackup->startBackup();
|
||||
$this->info('Backup started.. ');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check for processing backups
|
||||
$getRunningBackups = HostingSubscriptionBackup::where('status', 'processing')->get();
|
||||
if ($getRunningBackups->count() > 0) {
|
||||
foreach ($getRunningBackups as $runningBackup) {
|
||||
$runningBackup->checkBackup();
|
||||
$this->info('Checking backup status...');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -31,6 +31,22 @@ class RunRepair extends Command
|
|||
public function handle()
|
||||
{
|
||||
|
||||
// Overwrite supervisor config file
|
||||
file_put_contents('/etc/supervisor/conf.d/phyre.conf', file_get_contents(base_path('app/Supervisor/configs/phyre-worker.conf')));
|
||||
|
||||
// Restart supervisor
|
||||
shell_exec('service supervisor restart');
|
||||
|
||||
// Check supervisor config file
|
||||
$checkSupervisorStatus = shell_exec('service supervisor status');
|
||||
if (strpos($checkSupervisorStatus, 'active (running)') !== false) {
|
||||
$this->info('Supervisor is running');
|
||||
} else {
|
||||
$this->info('Supervisor is not running');
|
||||
$this->info('Restarting supervisor');
|
||||
shell_exec('service supervisor restart');
|
||||
}
|
||||
|
||||
$checkApacheStatus = shell_exec('service apache2 status');
|
||||
}
|
||||
}
|
||||
|
|
70
web/app/Jobs/ProcessHostingSubscriptionBackup.php
Normal file
70
web/app/Jobs/ProcessHostingSubscriptionBackup.php
Normal file
|
@ -0,0 +1,70 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Filament\Enums\BackupStatus;
|
||||
use App\Models\HostingSubscription;
|
||||
use App\Models\HostingSubscriptionBackup;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class ProcessHostingSubscriptionBackup implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
echo "Backup hosting subscription backup with ID: {$this->id}\n";
|
||||
|
||||
$backupDone = false;
|
||||
$findHostingSubscriptionBackup = HostingSubscriptionBackup::where('id', $this->id)->first();
|
||||
if ($findHostingSubscriptionBackup) {
|
||||
|
||||
if ($findHostingSubscriptionBackup->status == BackupStatus::Pending) {
|
||||
$findHostingSubscriptionBackup->startBackup();
|
||||
}
|
||||
|
||||
for ($i = 0; $i < 200; $i++) {
|
||||
echo "Check: ".$i." | Checking backup status...\n";
|
||||
$findHostingSubscriptionBackup->checkBackup();
|
||||
if ($findHostingSubscriptionBackup->status == BackupStatus::Completed) {
|
||||
echo "Backup completed\n";
|
||||
$backupDone = true;
|
||||
break;
|
||||
}
|
||||
if ($findHostingSubscriptionBackup->status == BackupStatus::Failed) {
|
||||
echo "Backup failed\n";
|
||||
break;
|
||||
}
|
||||
|
||||
sleep(4);
|
||||
}
|
||||
|
||||
if (! $backupDone) {
|
||||
echo "Backup failed\n";
|
||||
$findHostingSubscriptionBackup->status = BackupStatus::Failed;
|
||||
$findHostingSubscriptionBackup->save();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -10,6 +10,8 @@ use Dotenv\Dotenv;
|
|||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Jackiedo\DotenvEditor\Facades\DotenvEditor;
|
||||
|
@ -220,9 +222,23 @@ class Backup extends Model
|
|||
|
||||
$shellFileContent .= 'mysqldump --defaults-extra-file='.$mysqlAuthConf.' "'.env('DB_DATABASE').'" > '.$databaseBackupPath . PHP_EOL;
|
||||
|
||||
// Export Phyre Panel Database
|
||||
$database = [];
|
||||
$tables = Schema::getTables();
|
||||
if (count($tables) > 0) {
|
||||
foreach ($tables as $table) {
|
||||
$tableData = [];
|
||||
$tableData['table'] = $table;
|
||||
$tableData['columns'] = Schema::getColumnListing($table['name']);
|
||||
$tableData['data'] = DB::table($table['name'])->get()->toArray();
|
||||
$database[$table['name']] = $tableData;
|
||||
}
|
||||
}
|
||||
|
||||
// Export Phyre Panel ENV
|
||||
$getEnv = Dotenv::createArrayBacked(base_path())->load();
|
||||
$backupStructure = [
|
||||
'database'=>$database,
|
||||
'env'=>$getEnv,
|
||||
];
|
||||
file_put_contents($backupTempPath.'/backup.json', json_encode($backupStructure, JSON_PRETTY_PRINT));
|
||||
|
|
|
@ -5,6 +5,7 @@ namespace App\Models;
|
|||
use App\BackupStorage;
|
||||
use App\Filament\Enums\BackupStatus;
|
||||
use App\Helpers;
|
||||
use App\Jobs\ProcessHostingSubscriptionBackup;
|
||||
use App\ShellApi;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
|
@ -55,29 +56,18 @@ class HostingSubscriptionBackup extends Model
|
|||
});
|
||||
|
||||
static::created(function ($model) {
|
||||
$model->startBackup();
|
||||
ProcessHostingSubscriptionBackup::dispatch($model->id);
|
||||
});
|
||||
|
||||
static::deleting(function ($model) {
|
||||
// if (is_file($model->filepath)) {
|
||||
// shell_exec('rm -rf ' . $model->filepath);
|
||||
// }
|
||||
if (is_file($model->file_path)) {
|
||||
shell_exec('rm -rf ' . $model->file_path);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function checkCronJob()
|
||||
{
|
||||
$cronJobCommand = 'phyre-php /usr/local/phyre/web/artisan phyre:run-hosting-subscriptions-backup-checks';
|
||||
$findCronJob = CronJob::where('command', $cronJobCommand)->first();
|
||||
|
||||
if (! $findCronJob) {
|
||||
$cronJob = new CronJob();
|
||||
$cronJob->schedule = '*/5 * * * *';
|
||||
$cronJob->command = $cronJobCommand;
|
||||
$cronJob->user = 'root';
|
||||
$cronJob->save();
|
||||
}
|
||||
|
||||
$cronJobCommand = 'phyre-php /usr/local/phyre/web/artisan phyre:create-daily-full-hosting-subscriptions-backup';
|
||||
$findCronJob = CronJob::where('command', $cronJobCommand)->first();
|
||||
if (! $findCronJob) {
|
||||
|
|
12
web/app/Supervisor/configs/phyre-worker.conf
Normal file
12
web/app/Supervisor/configs/phyre-worker.conf
Normal file
|
@ -0,0 +1,12 @@
|
|||
[program:phyre-worker]
|
||||
process_name=%(program_name)s_%(process_num)02d
|
||||
command=phyre-php /usr/local/phyre/web/artisan queue:work --sleep=3 --tries=3 --max-time=3600
|
||||
autostart=true
|
||||
autorestart=true
|
||||
stopasgroup=true
|
||||
killasgroup=true
|
||||
user=root
|
||||
numprocs=8
|
||||
redirect_stderr=true
|
||||
stdout_logfile=/usr/local/phyre/web/storage/logs/worker.log
|
||||
stopwaitsecs=3600
|
12270
web/composer.lock
generated
12270
web/composer.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -13,7 +13,7 @@ return [
|
|||
|
|
||||
*/
|
||||
|
||||
'default' => env('QUEUE_CONNECTION', 'sync'),
|
||||
'default' => 'database',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('jobs', function (Blueprint $table) {
|
||||
$table->bigIncrements('id');
|
||||
$table->string('queue')->index();
|
||||
$table->longText('payload');
|
||||
$table->unsignedTinyInteger('attempts');
|
||||
$table->unsignedInteger('reserved_at')->nullable();
|
||||
$table->unsignedInteger('available_at');
|
||||
$table->unsignedInteger('created_at');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('jobs');
|
||||
}
|
||||
};
|
Loading…
Reference in a new issue