Add wait loops to ensure containers are fully removed before restarting. This fixes race conditions where docker compose would fail because an existing container was still being cleaned up. Changes: - StartProxy: Add explicit stop, wait loop before docker compose up - StopProxy: Add wait loop after container removal - Both actions now poll up to 10 seconds for complete removal - Add error suppression to handle non-existent containers gracefully Tests: - Add StartProxyTest.php with 3 tests for cleanup logic - Add StopProxyTest.php with 4 tests for stop behavior 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
51 lines
1.6 KiB
PHP
51 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\Proxy;
|
|
|
|
use App\Events\ProxyStatusChanged;
|
|
use App\Events\ProxyStatusChangedUI;
|
|
use App\Models\Server;
|
|
use App\Services\ProxyDashboardCacheService;
|
|
use Lorisleiva\Actions\Concerns\AsAction;
|
|
|
|
class StopProxy
|
|
{
|
|
use AsAction;
|
|
|
|
public function handle(Server $server, bool $forceStop = true, int $timeout = 30, bool $restarting = false)
|
|
{
|
|
try {
|
|
$containerName = $server->isSwarm() ? 'coolify-proxy_traefik' : 'coolify-proxy';
|
|
$server->proxy->status = 'stopping';
|
|
$server->save();
|
|
|
|
if (! $restarting) {
|
|
ProxyStatusChangedUI::dispatch($server->team_id);
|
|
}
|
|
|
|
instant_remote_process(command: [
|
|
"docker stop --time=$timeout $containerName 2>/dev/null || true",
|
|
"docker rm -f $containerName 2>/dev/null || true",
|
|
'# Wait for container to be fully removed',
|
|
'for i in {1..10}; do',
|
|
" if ! docker ps -a --format \"{{.Names}}\" | grep -q \"^$containerName$\"; then",
|
|
' break',
|
|
' fi',
|
|
' sleep 1',
|
|
'done',
|
|
], server: $server, throwError: false);
|
|
|
|
$server->proxy->force_stop = $forceStop;
|
|
$server->proxy->status = 'exited';
|
|
$server->save();
|
|
} catch (\Throwable $e) {
|
|
return handleError($e);
|
|
} finally {
|
|
ProxyDashboardCacheService::clearCache($server);
|
|
|
|
if (! $restarting) {
|
|
ProxyStatusChanged::dispatch($server->id);
|
|
}
|
|
}
|
|
}
|
|
}
|