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:
parent
38b92ae21d
commit
712b6a285b
@ -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',
|
||||||
|
@ -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.');
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user