d2d.emegrendeles.hu/app/Services/Deployment/DeploymentTargets.php
E98Developer 2965f231ce ADD Deployment csomagoló queue worker és scheduler újraindítás a teendők közé
A 2026-08-17-i eset általánosítása: a d2d/e2e Docker Swarmban ugyanazt a kódot több
service futtatja közös volume-ról, és a queue:work hosszan futó folyamat a betöltött
osztályokat a memóriájában tartja. A fájlmásolás után a worker RÉGI kóddal dolgozta fel
a jobot - a felület jónak látszott, a háttérfeladat némán a régi viselkedést hozta.

- config: 'runtime' minta (app/, config/, database/, routes/, bootstrap/, composer.lock),
  mert a restart nem csak a jobok változásakor kell; targetenként a service nevek és a
  Swarm manager elérése
- a felületen figyelmeztetés, a teendőkben a konkrét ssh + docker service update parancs
- a restart szándékosan a cache ürítés UTÁN: a frissen induló worker különben a régi,
  cache-elt konfigot töltené be
- a d2d schedulernél jelezzük, hogy 0 replikán fut (a restart üresjárat lehet), a t2t-nél
  pedig azt, hogy queue service még nincs, de a névkonvenció alapján t2t_queue lesz

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 06:41:19 +02:00

89 lines
2.5 KiB
PHP

<?php
namespace App\Services\Deployment;
/**
* A célkörnyezetek (e2e, d2d) feloldása a config/deployment.php-ból.
*
* A target nem utólagos címke: már a csomagoláskor rögzül, mert befolyásolja a
* mappanevet, a teendők listáját, a kezdő commit előtöltését és a naplót is.
*/
class DeploymentTargets
{
/**
* @return array<string, array{key:string, label:string, domain:string, remote_path:string, expected_branch:?string, services:array<string, string>, services_note:?string}>
*/
public function all(): array
{
/** @var array<string, array<string, mixed>> $targets */
$targets = (array) config('deployment.targets', []);
$resolved = [];
foreach ($targets as $key => $target) {
$resolved[$key] = array_merge(
[
'label' => $key,
'domain' => '',
'remote_path' => '',
'expected_branch' => null,
'services' => [],
'services_note' => null,
],
$target,
['key' => $key],
);
}
return $resolved;
}
/**
* A célkörnyezet hosszan futó service-einek újraindító parancsai.
*
* @return array<int, string>
*/
public function restartCommands(?string $key): array
{
$target = $this->find($key);
if (! $target || $target['services'] === []) {
return [];
}
$user = (string) config('deployment.swarm.user', 'root');
$host = (string) config('deployment.swarm.host');
return array_values(array_map(
fn (string $service): string => sprintf(
'ssh %s@%s "docker service update --force %s"',
$user,
$host,
$service,
),
$target['services'],
));
}
/**
* @return array{key:string, label:string, domain:string, remote_path:string, expected_branch:?string, services:array<string, string>, services_note:?string}|null
*/
public function find(?string $key): ?array
{
return $key ? ($this->all()[$key] ?? null) : null;
}
/**
* @return array<string, string>
*/
public function options(): array
{
return array_map(fn (array $target): string => $target['label'], $this->all());
}
public function defaultKey(): ?string
{
return array_key_first($this->all());
}
}