postgresql logo
Prima di tutto vorrei chiarire che non è autoflagellazione, quella di ricompilarsi tutti i pacchetti di postgres, ma un’ esigenza che nasce dalla mancanza del supporto nativo per UUID nelle rpm di Postgres reperibili, nei classici repo di redhat, fedora e centos.

Tenendo poi a mente che alcune guide in rete possono essere forvianti, inducendo in errori che nella maggior parte dei casi danno grossi grattacapi a chi come me non è un grande esperto programmatore.

Ma quali sono questi errori, da cosa derivano? Oggi i software più evoluti e aggiornati richiedono ambienti d’ installazione "attualizzati" e con supporto a protocolli che fino a poco prima non si pensa fossero necessari, non tanto noi come "utilizzatori" e "installatori" ma, anche gli sviluppatori dei sistemi operativi che usiamo.

qui sotto due errori causati dal mancato supporto per uuid.

SQL Command failed with: ERROR: could not access file "$libdir/uuid-ossp": No such file or directory

—-8<—–

CREATE OR REPLACE FUNCTION uuid_generate_v4()

RETURNS uuid

AS ‘$libdir/uuid-ossp’, ‘uuid_generate_v4′

VOLATILE STRICT LANGUAGE C;

qui sotto invece un errore causato dall’ errata inizializazione del database, fatta seguendo le guide esistenti per sme.

/opt/openbravo/src-db/database/build-create.xml:223: The following error occurred while executing this line:

/opt/openbravo/src-db/database/build-create.xml:203: org.postgresql.util.PSQLException: ERROR: encoding UTF8 does not match server’s locale it_IT

Detail: The server’s LC_CTYPE setting requires encoding LATIN1.

Gli errori appena visti sono occorsi al sottoscritto tentando di installare Openbravo 2.50 (un erp professionale molto diffuso n.d.r) su una piattaforma sme server 7.4 vanilla, sulla quale avevo installato postgres, seguendo alcune guide; senza sapere che gli rpm disponibili non hanno incorporato il supporto per uuid, ovvero non sono state compilate per sfruttalo, anche se ne installiamo i relativi eseguibili e librerie. Adesso veniamo alla guida su come installare correttamente potgres 8.3.9 con le specifiche già illustrate senza ricorrere all’aggiunta, tra l’altro, di repo non ufficiali.

Abbiamo bisogno di software non direttamente disponibile nei repo di sme quindi, Scarichiamo il sorgente di postgres 8.3.9 da qui
e naturalmente i pacchetti uuid-devel
e uuid,
da notare che uuid devel non viene richiesto automaticamente perché, come vedremo in seguito, non richiesto dalle specifiche del sorgente di postgres.

poi installiamo:

rpm -ivh  postgresql-8.3.9-1PGDG.rhel4.src.rpm
yum localinstall uuid-1.5.1-4.rhel4.i386.rpm uuid-devel-1.5.1-4.rhel4.i386.rpm 

Accettiamo le dipendenze e aspettiamo lo scaricamento e l’ applicazione dei pacchetti. Anticipando che la compilazione deve essere eseguita da un utente diverso da root, prepariamo l’utente che poi eseguirà i comandi salienti e impostiamo i permessi alle cartelle, dove sono stati i sorgenti.

Dal server-manager creiamo l’utente "pippo" o se vogliamo postgres (il quale sarà comunque creato automaticamente nel server di lavoro definitivo).

postgres user

[root@sme74 ~]# chsh -s /bin/bash postgres

Modifica shell per postgres in corso.

Shell modificata.

 
Applichiamo i permessi in modo che le cartelle siano scrivibili da tutti gli user e quindi a tutte le cartelle dentro a /usr/src/redhat/

[root@sme74 ~]# cd /usr/src/

[root@sme74 src]# ls -l

totale 4

drwxr-xr-x 7 root root 4096 1 giu 2009 redhat

[root@sme74 src]# chmod 777 redhat -Rf

[root@sme74 src]# ls -l redhat/

totale 20

drwxrwxrwx 2 root root 4096 1 giu 2009 BUILD

drwxrwxrwx 8 root root 4096 1 giu 2009 RPMS

drwxrwxrwx 2 root root 4096 1 giu 2009 SOURCES

drwxrwxrwx 2 root root 4096 1 giu 2009 SPECS

drwxrwxrwx 2 root root 4096 1 giu 2009 SRPMS

ci spostiamo nella cartella /usr/src/redhat/SPECS/ e editiamo con l’editor di nostra preferenza il file postgresql-8.3.spec . ci spostiamo nel testo e troviamo la riga contentenente queste informazioni:

%{!?uuid:%define uuid 0} e attiviamo il supporto uuid cambiano lo stato da 0 a 1: %{!?uuid:%define uuid 1} e salviamo la modifica. avviamo la compilazione dei nostri nuovi pacchetti ricordando di farlo con un utente diverso da root, dando quindi i seguenti comandi:

[root@sme74 ~]# nano /usr/src/redhat/SPECS/postgresql-8.3.spec

[root@sme74 ~]# cd /usr/src/redhat/SPECS/

[root@sme74 SPECS]# su postgres

bash-3.00$ rpmbuild -ba postgresql-8.3.spec

se la compilazione fila liscia, dopo un po’ una quindicina di minuti ci ritroviamo con i pacchetti rpm appena sfornati nella cartella /usr/src/redhat/RPMS/i386. Usciamo dall’utente postgres con exit e una volta spostati nella cartella installiamo il tutto (o nel caso una volta copiati i file nel server di produzione) con il comando:

yum localinstall *.rpm –enablerepo=centosplus

L’abilitazione di centosplus risolvere alcune dipendenze che, altrimenti non sarebbero soddisfatte, per il mancato aggiornamento di alcune librerie in particolare:

Error: Missing Dependency: libpq.so.3 is needed by package dovecot

L’inizializzazione del database, è una parte delicata del processo, infatti seguendo le altre guide reperite si incappa in un errore di forma, infatti queste indicano come procedura l’ uso del comando /etc/init.d/postgres inidtdb, questo processo inizializza il database con l’ utente postgres , come deve essere tra l’altro, ma non accetta parametri aggiuntivi andandosi a prendere di default le variabili ambiente del sistema, facendo uso nello specifico della lingua del sistema, nel mio caso IT restituendo quindi un database LATIN1 non unicode UTF-8 compliant compatible, con gli errori conseguenti che ho accennato all’inizio della guida. Pertanto la procedura corretta è quella di passare questo comando come user postgres:

[root@tricky ~]#su postgres
bash-3.00$ initdb --encoding=UTF8 --locale=it_IT.UTF8 --pgdata=/var/lib/pgsql/data/
Proviamo ad avviare il server per vedere se tutto va bene, con il comando /etc/init.d/postgres start Il prossimo passo è quello di creare lo "strato di compatibilità" con le caratteristiche peculiari di sme server, cioè i templates, e impostare la configurazione:
mkdir -p /etc/e-smith/templates/var/lib/pgsql/data
mkdir -p /etc/e-smith/templates-custom/var/lib/pgsql/data

cp /var/lib/pgsql/data/*.conf /etc/e-smith/templates/var/lib/pgsql/data
cp /var/lib/pgsql/data/*.conf /etc/e-smith/templates-custom/var/lib/pgsql/data
Copiamo la configurazione di default nelle cartelle dei template create:
cp /var/lib/pgsql/data/postgresql.conf /etc/e-smith/templates/var/lib/pgsql/data
cp /var/lib/pgsql/data/pg_hba.conf /etc/e-smith/templates/var/lib/pgsql/data
cp /var/lib/pgsql/data/postgresql.conf /etc/e-smith/templates-custom/var/lib/pgsql/data
cp /var/lib/pgsql/data/pg_hba.conf /etc/e-smith/templates-custom/var/lib/pgsql/data
Loggandoci nuovamente come utente postgres impostiamo la password del superuser del database:
[root@tricky ~]# su postgres
bash-3.00$ psql -U postgres -d template1
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
template1=# alter role postgres with encypted password ‘password scelta’;
ALTER ROLE
template1=# \q
bash-3.00$ psql -l
List of databases
Name | Owner | Encoding
———–+———-+———-
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(3 rows)
bash-3.00$ exit

Con il comando psql -l abbiamo listato i database esistenti, verificando in tal modo la correttezza dell’inizializzazione fatta pocanzi.

modifichiamo adesso le impostazioni nei templates:

/etc/e-smith/templates-custom/var/lib/pgsql/data/postgresql.conf

qui occorre abilitare, togliendo il segno # le seguenti opzioni:

password_encryption = on
listen_addresses = ‘localhost’

mentre nel file:

/etc/e-smith/templates-custom/var/lib/pgsql/data/pg_hba.conf

andiamo a modificare il file nella parte finale in modo che sia come segue:

local all all md5

host all all 127.0.0.1/32 md5

host all all ::1/128 md5

e aggiungiamo questa riga:

host    all    all    0.0.0.0 255.255.255.255  reject

ricordandosi di lasciare una riga vuota alla fine del file.

Applichiamo le nuove impostazioni espandendo i templates:

expand-template /var/lib/pgsql/data/pg_hba.conf
expand-template /var/lib/pgsql/data/postgresql.conf
applichiamo i nuovi settaggi e creiamo un collegamento che avvi il postgres all’avvio del server insieme agli altri servizi:
/etc/init.d/postgresql stop
/etc/init.d/postgresql start  
ln -s /etc/init.d/postgresql /etc/rc.d/rc7.d/S56postgresql

opzionalmente possiamo aggiungere il servizio al database di configurazione di sme:

config set postgresql service status enabled
Bene abbiamo finito di installare il nostro sistema postgres, salvo ovviamente complicazioni o errori che possono occorrervi o altro tipo di necessità, pertanto ho scritto sotto anche qualche nozione aggiuntiva per eventuali altre opzioni o errori che si possono incontrare.

OPZIONI:

E’ possibile limitare le connessioni simultanee al server e abilitare anche crittazione delle comunicazioni attivando queste opzioni nel template postgresql.conf:

superuser_reserved_connections=2

ssl = on

per attivare ssl occorre anche copiare le credenziali del server nel path di lavoro di postgres e cambiargli il proprietario:

cd /var/lib/pgsql/data

cp /etc/httpd/conf/ssl.crt/server.crt .

cp /etc/httpd/conf/ssl.key/server.key .

chown postgres:postgres server.*

nel caso si vogliano accettare e abilitare connessioni tramite internet o altra rete configureremo i nostri due template di conseguenza come descritto in questa guida molto semplice.

 

ERRORI:

1- I sorgenti non sono nel posto che ci si aspetta ma nella directory corrente, rimuovere il pacchetto con yum e installarlo con "rpm".

2- nel caso fosse apparso il seguente errore durante la compilazione:

Running in noclean mode. Mistakes will not be cleaned up.

initdb: cannot be run as root

Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process.

ripetete la procedura ma con l’user differente da root come detto più volte.

3- durante l’installazione delle rpm compilate.

Error: Missing Dependency: libpq.so.3 is needed by package dovecot

ripetete la procedura abilitando il repository centosplus.

4- durante l’inizializzazione del database

initdb: non può essere eseguito da root

Effettuate il log in (usando per esempio "su") con l'utente

(non privilegiato) che controllerà il processo server.

non si è eseguito il comando come utente postgres usare su postgres.

5- Se hai dimenticato la password ti root di postgres ti consiglio di guardare qui.

6- se in fase di inizializzazione si è sbagliato o, si vuole azzerare il database in modo rapito e rifare l’initdb andiamo cancellare tutto il contenuto della directory di lavoro di postgre /var/lib/pgsql/data/ reinizializiamo il database e riespandiamo i templates delle configurazioni.

PREREQUISITI:

(per una preparazione di un ambiente di sviluppo appropriato vi consiglio di dare un’occhiata qui.)

Per compilare i sorgenti e creare le rpm di installazione bisogna essere in un ambiente di build, il che non è adatto per un server di produzione dato che implica l’installazione di GCC.

per potersi creare un ambiente di build semplice si può procedere come segue:

yum install gcc

e le relative dipendenze che sono scaricate automaticamente; più i pacchetti che occorreranno via via, mi riferisco ai devel, che in un ambiente di produzione sono superflui.
 

RIFERIMENTI:

- http://wiki.contribs.org/Postgres
- http://emnaz.blogspot.com2009/06/install-postgres-83-on-sme-server.html
- http://www.bortzmeyer.org/postgresql-unicode.html
- http://www.casarini.org/blog/2009/postgresql-84-e-il-locale-it_it/
- http://www.postgresql.org/docs/8.3/static/app-postgres.html
Non me ne vogliano i più esperti, per non essere molto stringato nella mia guida, ma questa vuol essere, oltre che, un mio appunto personale, un riferimento a chi capisce poco di programmazione, inoltre come riferimento per trovare una corrispondenza con errori ai quali, con difficoltà ho trovato risposte in interent.