FIX (agent): Verify PostgreSQL connection without requirement to expose ports

This commit is contained in:
Rostislav Dugin
2026-03-20 12:45:02 +03:00
parent e913f4c32e
commit 82d615545b
2 changed files with 55 additions and 38 deletions

View File

@@ -537,7 +537,7 @@ jobs:
echo "Cleanup complete"
build-dev:
build-and-push-dev:
runs-on: self-hosted
needs: [test-backend, test-frontend, test-agent, e2e-agent, e2e-agent-backup-restore]
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/develop' }}
@@ -669,43 +669,6 @@ jobs:
echo "No version bump needed"
fi
build-only:
runs-on: self-hosted
needs: [test-backend, test-frontend, test-agent, e2e-agent, e2e-agent-backup-restore]
if: ${{ github.ref == 'refs/heads/main' && contains(github.event.head_commit.message, '[skip-release]') }}
steps:
- name: Clean workspace
run: |
sudo rm -rf "$GITHUB_WORKSPACE"/* || true
sudo rm -rf "$GITHUB_WORKSPACE"/.* || true
- name: Check out code
uses: actions/checkout@v4
- name: Set up QEMU (enables multi-arch emulation)
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push SHA-only tags
uses: docker/build-push-action@v5
with:
context: .
push: true
platforms: linux/amd64,linux/arm64
build-args: |
APP_VERSION=dev-${{ github.sha }}
tags: |
databasus/databasus:latest
databasus/databasus:${{ github.sha }}
build-and-push:
runs-on: self-hosted
needs: [determine-version]

View File

@@ -205,6 +205,15 @@ func verifyPgBasebackupDocker(cfg *config.Config, log *slog.Logger) error {
}
func verifyDatabase(cfg *config.Config, log *slog.Logger) error {
switch cfg.PgType {
case "docker":
return verifyDatabaseDocker(cfg, log)
default:
return verifyDatabaseHost(cfg, log)
}
}
func verifyDatabaseHost(cfg *config.Config, log *slog.Logger) error {
connStr := fmt.Sprintf(
"host=%s port=%d user=%s password=%s dbname=postgres sslmode=disable",
cfg.PgHost, cfg.PgPort, cfg.PgUser, cfg.PgPassword,
@@ -255,6 +264,51 @@ func verifyDatabase(cfg *config.Config, log *slog.Logger) error {
return nil
}
func verifyDatabaseDocker(cfg *config.Config, log *slog.Logger) error {
ctx, cancel := context.WithTimeout(context.Background(), dbVerifyTimeout)
defer cancel()
query := "SELECT current_setting('server_version_num')"
cmd := exec.CommandContext(ctx,
"docker", "exec",
"-e", "PGPASSWORD="+cfg.PgPassword,
cfg.PgDockerContainerName,
"psql", "-h", "localhost", "-p", "5432", "-U", cfg.PgUser,
"-d", "postgres", "-t", "-A", "-c", query,
)
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf(
"failed to connect to PostgreSQL in container '%s' as user '%s': %w (output: %s)",
cfg.PgDockerContainerName, cfg.PgUser, err, strings.TrimSpace(string(output)),
)
}
versionNumStr := strings.TrimSpace(string(output))
majorVersion, err := parsePgVersionNum(versionNumStr)
if err != nil {
return fmt.Errorf("failed to parse PostgreSQL version '%s': %w", versionNumStr, err)
}
if majorVersion < minPgMajorVersion {
return fmt.Errorf(
"PostgreSQL %d is not supported, minimum required version is %d",
majorVersion, minPgMajorVersion,
)
}
log.Info("PostgreSQL connection verified (docker)",
"container", cfg.PgDockerContainerName,
"user", cfg.PgUser,
"version", majorVersion,
)
return nil
}
func parsePgVersionNum(versionNumStr string) (int, error) {
versionNum, err := strconv.Atoi(strings.TrimSpace(versionNumStr))
if err != nil {