# PostgreSQL Production Deployment Guide via Ansible ## 1. Instalacja serwerów Dwa serwery Debian 12: | Serwer | Rola | IP | | ------ | ------- | -------- | | pg-1 | Primary | 10.0.0.1 | | pg-2 | Replica | 10.0.0.2 | Na każdym serwerze wykonaj: ```bash sudo apt update sudo apt upgrade -y sudo apt install -y sudo vim curl gnupg rsync unzip ``` Opcjonalnie utwórz konto do Ansible: ```bash sudo adduser ansible sudo usermod -aG sudo ansible ``` --- ## 2. Konfiguracja IP i DNS Edytuj `/etc/hosts` na obu serwerach: **pg-1 (/etc/hosts)** ``` 10.0.0.1 pg1 10.0.0.2 pg2 ``` **pg-2 (/etc/hosts)** ``` 10.0.0.1 pg1 10.0.0.2 pg2 ``` Upewnij się, że hostnames `pg1` i `pg2` są rozpoznawane w sieci. --- ## 3. Przygotowanie repozytorium Ansible na pg-1 Skopiuj paczkę Ansible na pg-1: ```bash scp postgres_ansible_prod_full.zip user@pg-1:/home/user/ ssh pg-1 unzip postgres_ansible_prod_full.zip -d ~/postgres_ansible_prod cd ~/postgres_ansible_prod ``` Edytuj `inventory.ini`, jeśli IP lub hostnames są inne: ```ini [primary] pg1 ansible_host=10.0.0.1 [replica] pg2 ansible_host=10.0.0.2 [all:vars] ansible_user=root pg_version=16 pg_cluster=main pg_data=/var/lib/postgresql/16/main ``` Ustaw hasła w `group_vars/all/secrets.yml`: ```yaml replicator_password: "SILNE_HASLO_REPL" mailuser_password: "SILNE_HASLO_DB" ``` Opcjonalnie zaszyfruj je Ansible Vault: ```bash ansible-vault encrypt group_vars/all/secrets.yml ``` --- ## 4. Uruchomienie playbooka Zainstaluj Ansible na pg-1: ```bash sudo apt install -y ansible ansible --version ``` Test połączenia z pg-2: ```bash ansible -i inventory.ini all -m ping ``` Uruchomienie wdrożenia: ```bash ansible-playbook -i inventory.ini site.yml ``` Playbook automatycznie: - Instaluje PostgreSQL 16 na obu serwerach - Konfiguruje primary i replica - Tworzy użytkownika `mailuser` i bazę `mailarchiver` - Ustawia pgBackRest i cron backupów (full i incremental) --- ## 5. Test działania Na pg-1: ```bash sudo -u postgres psql -c "\l" sudo -u postgres psql -c "\du" ``` Sprawdź replikację: ```bash sudo -u postgres psql -c "SELECT * FROM pg_stat_replication;" ``` Test backupów (pgBackRest): ```bash sudo -u postgres pgbackrest --stanza=main info ``` --- ## 6. Przywracanie w razie awarii Jeśli pg-1 padnie, przywracasz z pg-2: ```bash ansible-playbook -i inventory.ini restore_primary.yml ``` Ręczny failover (promowanie pg-2 na primary): ```bash sudo -u postgres pg_ctl promote ``` Następnie zmień DNS lub connection string w aplikacji, aby wskazywał nowy primary.