fix: move mc command to coolify image from helper
This commit is contained in:
@@ -25,7 +25,7 @@ use Illuminate\Queue\InteractsWithQueue;
|
|||||||
use Illuminate\Queue\Middleware\WithoutOverlapping;
|
use Illuminate\Queue\Middleware\WithoutOverlapping;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use App\Models\InstanceSettings;
|
use Visus\Cuid2\Cuid2;
|
||||||
|
|
||||||
class DatabaseBackupJob implements ShouldBeEncrypted, ShouldQueue
|
class DatabaseBackupJob implements ShouldBeEncrypted, ShouldQueue
|
||||||
{
|
{
|
||||||
@@ -399,6 +399,7 @@ class DatabaseBackupJob implements ShouldBeEncrypted, ShouldQueue
|
|||||||
$backupCommand .= " $this->container_name pg_dump --format=custom --no-acl --no-owner --username {$this->database->postgres_user} $database > $this->backup_location";
|
$backupCommand .= " $this->container_name pg_dump --format=custom --no-acl --no-owner --username {$this->database->postgres_user} $database > $this->backup_location";
|
||||||
|
|
||||||
$commands[] = $backupCommand;
|
$commands[] = $backupCommand;
|
||||||
|
ray($commands);
|
||||||
$this->backup_output = instant_remote_process($commands, $this->server);
|
$this->backup_output = instant_remote_process($commands, $this->server);
|
||||||
$this->backup_output = trim($this->backup_output);
|
$this->backup_output = trim($this->backup_output);
|
||||||
if ($this->backup_output === '') {
|
if ($this->backup_output === '') {
|
||||||
@@ -480,6 +481,7 @@ class DatabaseBackupJob implements ShouldBeEncrypted, ShouldQueue
|
|||||||
private function upload_to_s3(): void
|
private function upload_to_s3(): void
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
ray($this->backup_location);
|
||||||
if (is_null($this->s3)) {
|
if (is_null($this->s3)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -489,62 +491,20 @@ class DatabaseBackupJob implements ShouldBeEncrypted, ShouldQueue
|
|||||||
$bucket = $this->s3->bucket;
|
$bucket = $this->s3->bucket;
|
||||||
$endpoint = $this->s3->endpoint;
|
$endpoint = $this->s3->endpoint;
|
||||||
$this->s3->testConnection(shouldSave: true);
|
$this->s3->testConnection(shouldSave: true);
|
||||||
if (data_get($this->backup, 'database_type') === 'App\Models\ServiceDatabase') {
|
$configName = new Cuid2;
|
||||||
$network = $this->database->service->destination->network;
|
|
||||||
} else {
|
|
||||||
$network = $this->database->destination->network;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->ensureHelperImageAvailable();
|
$s3_copy_dir = str($this->backup_location)->replace(backup_dir(), '/var/www/html/storage/app/backups/');
|
||||||
|
$commands[] = "docker exec coolify bash -c 'mc config host add {$configName} {$endpoint} $key $secret'";
|
||||||
$fullImageName = $this->getFullImageName();
|
$commands[] = "docker exec coolify bash -c 'mc cp $s3_copy_dir {$configName}/{$bucket}{$this->backup_dir}/'";
|
||||||
$commands[] = "docker run -d --network {$network} --name backup-of-{$this->backup->uuid} --rm -v $this->backup_location:$this->backup_location:ro {$fullImageName}";
|
|
||||||
$commands[] = "docker exec backup-of-{$this->backup->uuid} mc config host add temporary {$endpoint} $key $secret";
|
|
||||||
$commands[] = "docker exec backup-of-{$this->backup->uuid} mc cp $this->backup_location temporary/$bucket{$this->backup_dir}/";
|
|
||||||
instant_remote_process($commands, $this->server);
|
instant_remote_process($commands, $this->server);
|
||||||
$this->add_to_backup_output('Uploaded to S3.');
|
$this->add_to_backup_output('Uploaded to S3.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$this->add_to_backup_output($e->getMessage());
|
$this->add_to_backup_output($e->getMessage());
|
||||||
throw $e;
|
throw $e;
|
||||||
} finally {
|
} finally {
|
||||||
$command = "docker rm -f backup-of-{$this->backup->uuid}";
|
$removeConfigCommands[] = "docker exec coolify bash -c 'mc config remove {$configName}'";
|
||||||
instant_remote_process([$command], $this->server);
|
$removeConfigCommands[] = "docker exec coolify bash -c 'mc alias rm {$configName}'";
|
||||||
|
instant_remote_process($removeConfigCommands, $this->server, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function ensureHelperImageAvailable(): void
|
|
||||||
{
|
|
||||||
$fullImageName = $this->getFullImageName();
|
|
||||||
|
|
||||||
$imageExists = $this->checkImageExists($fullImageName);
|
|
||||||
|
|
||||||
if (!$imageExists) {
|
|
||||||
$this->pullHelperImage($fullImageName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function checkImageExists(string $fullImageName): bool
|
|
||||||
{
|
|
||||||
$result = instant_remote_process(["docker image inspect {$fullImageName} >/dev/null 2>&1 && echo 'exists' || echo 'not exists'"], $this->server, false);
|
|
||||||
return trim($result) === 'exists';
|
|
||||||
}
|
|
||||||
|
|
||||||
private function pullHelperImage(string $fullImageName): void
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
instant_remote_process(["docker pull {$fullImageName}"], $this->server);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$errorMessage = "Failed to pull helper image: " . $e->getMessage();
|
|
||||||
$this->add_to_backup_output($errorMessage);
|
|
||||||
throw new \RuntimeException($errorMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getFullImageName(): string
|
|
||||||
{
|
|
||||||
$settings = InstanceSettings::get();
|
|
||||||
$helperImage = config('coolify.helper_image');
|
|
||||||
$latestVersion = $settings->helper_version;
|
|
||||||
return "{$helperImage}:{$latestVersion}";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@ services:
|
|||||||
PUSHER_APP_SECRET: "${PUSHER_APP_SECRET:-coolify}"
|
PUSHER_APP_SECRET: "${PUSHER_APP_SECRET:-coolify}"
|
||||||
volumes:
|
volumes:
|
||||||
- .:/var/www/html/:cached
|
- .:/var/www/html/:cached
|
||||||
|
- /data/coolify/backups/:/var/www/html/storage/app/backups
|
||||||
postgres:
|
postgres:
|
||||||
pull_policy: always
|
pull_policy: always
|
||||||
ports:
|
ports:
|
||||||
|
@@ -34,7 +34,7 @@ RUN if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \
|
|||||||
chmod +x ~/.docker/cli-plugins/docker-compose /usr/bin/docker /usr/local/bin/pack /root/.docker/cli-plugins/docker-buildx \
|
chmod +x ~/.docker/cli-plugins/docker-compose /usr/bin/docker /usr/local/bin/pack /root/.docker/cli-plugins/docker-buildx \
|
||||||
;fi
|
;fi
|
||||||
|
|
||||||
COPY --from=minio/mc:RELEASE.2024-03-13T23-51-57Z /usr/bin/mc /usr/bin/mc
|
COPY --from=minio/mc:RELEASE.2024-09-09T07-53-10Z /usr/bin/mc /usr/bin/mc
|
||||||
RUN chmod +x /usr/bin/mc
|
RUN chmod +x /usr/bin/mc
|
||||||
|
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
@@ -37,6 +37,9 @@ RUN /bin/bash -c "if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \
|
|||||||
curl -L https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
|
curl -L https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
|
||||||
;fi"
|
;fi"
|
||||||
|
|
||||||
|
COPY --from=minio/mc:RELEASE.2024-09-09T07-53-10Z /usr/bin/mc /usr/bin/mc
|
||||||
|
RUN chmod +x /usr/bin/mc
|
||||||
|
|
||||||
RUN { \
|
RUN { \
|
||||||
echo 'upload_max_filesize=256M'; \
|
echo 'upload_max_filesize=256M'; \
|
||||||
echo 'post_max_size=256M'; \
|
echo 'post_max_size=256M'; \
|
||||||
|
Reference in New Issue
Block a user