# Azure Database for PostgreSQL Flexible Server

> zop.dev provisions a PostgreSQL Flexible Server (sku GP_Standard_D2s_v3, PostgreSQL 13, storage_mb from 32768 to 33553408) with an optional read replica, firewall rule, 4 Key Vault secrets, and a db-init job. Unlike the MySQL variant, storage_scaling defaults to off, so a filling disk is a real failure mode.

Source: https://zop.dev/integrations/provision/azure/azure-database-for-postgresql-flexible-server
Updated: 2026-08-19

---

Azure Database for PostgreSQL Flexible Server is Microsoft's managed PostgreSQL offering. zop.dev provisions the server with the same credential, schema, and backup automation as its MySQL counterpart.

## Server, replica, firewall rule, and Key Vault secrets

Flexible server plus optional read replica, database, firewall rule, four Key Vault secrets, and a db-init job.

## PostgreSQL 13, storage_mb, and zone 2

```text
sku_name default GP_Standard_D2s_v3; postgres_version default 13; storage_mb 32768-33553408; storage_scaling off by default; storage_tier P4; backup_retention_days 7; zone 2; enable_ssl; collation; administrator_login default psqladmin; read_replica; multi_ds.
```

## storage_scaling is off by default here

Unlike the MySQL variant, storage scaling defaults to off.

## Same automation, different storage posture

The credential and schema automation matches the MySQL variant: 4 Key Vault secrets at
distinct privilege levels, a db-init job building the schemas, firewall rule and `multi_ds`
support. The storage default flips, though. `storage_scaling` is off. A PostgreSQL server
provisioned on defaults will not grow its own disk, and PostgreSQL behaves badly at 100
percent full. Either turn scaling on at creation or treat disk-usage alerting as part of the
provision, because the MySQL habit of letting auto-grow catch it does not transfer here.

## What is pinned before the first query

Three settings are effectively decided at creation. `administrator_login` (default psqladmin)
cannot change for the server's lifetime. The availability zone defaults to zone 2, placement
worth knowing when reasoning about zone-level failures alongside your AKS node pools. And
`postgres_version` defaults to 13: upgradable later, never downgradable, and each major
upgrade is a deliberate operation with an extension-compatibility check, so starting newer is
cheaper than catching up.

## The storage range is deceptive

`storage_mb` spans 32768 to 33553408 (32 GB to roughly 32 TB), with a `storage_tier` default
of P4. Tier and size interact: the tier caps IOPS, so a database can have disk to spare and
still be I/O-bound. When a Postgres workload slows without the disk filling, the tier is the
setting to check before the query plans.

## The replica doubles more than reads

A read replica is a second full server billing at its own SKU: capacity, storage, the lot. It
scales read traffic and shortens recovery stories, but it is not a backup:
`backup_retention_days` (default 7) is what answers point-in-time recovery, and the replica
faithfully replicates yesterday's mistake along with yesterday's data.
