Add artisan command to create queue worker service (#253)

* add command to create queue worker service file

* remove comments from service file that are no longer needed

* only create queue worker service file if queue driver is not "sync"

* make "database" the recommended queue driver, again
This commit is contained in:
Boy132 2024-05-18 19:31:02 +02:00 committed by GitHub
parent 38b92ae21d
commit 712b6a285b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 91 additions and 14 deletions

View File

@ -24,9 +24,9 @@ class AppSettingsCommand extends Command
]; ];
public const QUEUE_DRIVERS = [ public const QUEUE_DRIVERS = [
'sync' => 'Synchronous (recommended)', 'database' => 'Database (recommended)',
'database' => 'Database',
'redis' => 'Redis', 'redis' => 'Redis',
'sync' => 'Synchronous',
]; ];
protected $description = 'Configure basic environment settings for the Panel.'; protected $description = 'Configure basic environment settings for the Panel.';
@ -103,7 +103,13 @@ class AppSettingsCommand extends Command
$this->variables['SESSION_SECURE_COOKIE'] = 'true'; $this->variables['SESSION_SECURE_COOKIE'] = 'true';
} }
$this->checkForRedis(); $redisUsed = count(collect($this->variables)->filter(function ($item) {
return $item === 'redis';
})) !== 0;
if ($redisUsed) {
$this->requestRedisSettings();
}
$path = base_path('.env'); $path = base_path('.env');
if (!file_exists($path)) { if (!file_exists($path)) {
@ -116,25 +122,20 @@ class AppSettingsCommand extends Command
Artisan::call('key:generate'); Artisan::call('key:generate');
} }
if ($this->variables['QUEUE_CONNECTION'] !== 'sync') {
Artisan::call('p:environment:queue-service', $redisUsed ? ['--use-redis'] : []);
}
$this->info($this->console->output()); $this->info($this->console->output());
return 0; return 0;
} }
/** /**
* Check if redis is selected, if so, request connection details and verify them. * Request connection details and verify them.
*/ */
private function checkForRedis() private function requestRedisSettings(): void
{ {
$items = collect($this->variables)->filter(function ($item) {
return $item === 'redis';
});
// Redis was not selected, no need to continue.
if (count($items) === 0) {
return;
}
$this->output->note(__('commands.appsettings.redis.note')); $this->output->note(__('commands.appsettings.redis.note'));
$this->variables['REDIS_HOST'] = $this->option('redis-host') ?? $this->ask( $this->variables['REDIS_HOST'] = $this->option('redis-host') ?? $this->ask(
'Redis Host', 'Redis Host',

View File

@ -0,0 +1,76 @@
<?php
namespace App\Console\Commands\Environment;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Process;
class QueueWorkerServiceCommand extends Command
{
protected $description = 'Create the service for the queue worker.';
protected $signature = 'p:environment:queue-service
{--service-name= : Name of the queue worker service.}
{--user= : The user that PHP runs under.}
{--group= : The group that PHP runs under.}
{--use-redis : Whether redis is used.}';
public function handle(): void
{
$serviceName = $this->option('service-name') ?? $this->ask('Service name', 'pelican-queue');
$path = '/etc/systemd/system/' . $serviceName . '.service';
if ($this->input->isInteractive()) {
if (file_exists($path) && !$this->confirm('The service file already exists. Do you want to overwrite it?')) {
return;
}
$user = $this->option('user') ?? $this->ask('User', 'www-data');
$group = $this->option('group') ?? $this->ask('Group', 'www-data');
$afterRedis = $this->option('use-redis') ? '\nAfter=redis-server.service' : '';
} else {
$user = 'www-data';
$group = 'www-data';
$afterRedis = '';
}
$basePath = base_path();
$success = File::put($path, "# Pelican Queue File
# ----------------------------------
[Unit]
Description=Pelican Queue Service$afterRedis
[Service]
User=$user
Group=$group
Restart=always
ExecStart=/usr/bin/php $basePath/artisan queue:work --queue=high,standard,low --tries=3
StartLimitInterval=180
StartLimitBurst=30
RestartSec=5s
[Install]
WantedBy=multi-user.target
");
if (!$success) {
$this->error('Error creating service file');
return;
}
$result = Process::run("systemctl enable --now $serviceName.service");
if ($result->failed()) {
$this->error('Error enabling service: ' . $result->errorOutput());
return;
}
$this->line('Queue worker service file created successfully.');
}
}