wiki:AlternativeSetup

Alternative Setup

1 Vorbereitende Installationen

1.1 Installation der Programmerzeugungstools

Bevor mit der Installation von PostgreSQL und PostGIS begonnen werden kann, muss dafür gesorgt werden, dass diese aus ihrem Sourcecode erzeugt werden können. Dies ist notwendig, da für die aktuellsten Versionen noch keine Binaries vorliegen. Folgendes Tool muss installiert werden:
Xcode Tools für Mac OS X 10.5 http://developer.apple.com/tools/xcode

1.2 Installation des Paketmanagers MacPorts

Da nun die notwendigen Tools für das Kompilieren von Sourcecode vorliegen, kann der Paketmanager MacPorts verwendet werden um die für den Server notwendigen Softwarepakete zu installieren. Der Vorteil bei MacPorts liegt darin, dass es nicht nur die Software sondern auch ihre Abhängigkeiten bereitstellt. Da es ein konsolenbasiertes Programm ist, lassen sich auch wunderbar Skripte erstellen mit denen sich z.B. automatische Softwareupdates konfigurieren lassen. Zu finden ist MacPorts unter der folgenden Adresse:

http://www.macports.org

Updates von MacPorts lassen sich ebenfalls mittels eines Konsolenkommandos durchführen:

als root:	/opt/local/bin/port selfupdate

2. Installation des Datenbanksystems

Nachdem die vorbereitenden Maßnahmen abgeschlossen sind, kann jetzt mit der Installation des Datenbanksystems fortgefahren werden. Da sie mit Hilfe von MacPorts durchgeführt wird, läuft die gesamte Installation von PostgreSQL und PostGIS auf der Konsole ab.

2.1 Installation von PostgreSQL

Für PostgreSQL müssen 2 Pakete installiert werden, PostgreSQL selbst und der Serverdienst von PostgreSQL. Dazu wird auf der Konsole das folgende Kommando ausgeführt:

als root:	/opt/local/bin/port  –k  install  postgresql83  postgresql83-server

Insofern die Konfigurationsdatei für die postgres-Installation nicht verändert wurde, sind die Dateien von postgres unter dem Ordner /opt/local/lib/postgresql83 zu finden. Desweiteren wurde ein neuer, eingeschränkter Benutzer (postgres) angelegt, der künftig die Datenbankverwaltung übernimmt.

2.2 Festlegen des Standarddatenbankordners und Datenbankinitialisierung

Nachdem jetzt auch PostgreSQL installiert ist, muss noch ein Standarddatenbankverzeichnis generiert werden. Dieses beinhaltet später die vom Server angebotenen Datenbanken und kann beliebig gewählt werden. Da der User postgres für Datenbankverwaltung zuständig sein soll, müssen ihm entsprechende Rechte gewährt werden. Im Anschluss daran kann die Datenbank initialisiert werden, was dann über den User postgres geschieht:

als root:	mkdir  -p  /database/chinagis
		chown  -R  postgres:postgres  /database/chinagis
als postgres:	/opt/local/lib/postgresql83/bin/initdb -D  /database/chinagis

Da der Standarddatenbankordner gewöhnlich /opt/local/var/db/postgresql83 lautet, wird später versucht die History für Datenbankeingaben auf Konsolenebene in diesem Ordner zu speichern. Um Fehlern vorzubeugen wird dieser daher noch zusätzlich erstellt:

als root:	mkdir  -p  /opt/local/var/db/postgresql83
		chown  -R  postgres:postgres  /opt/local/var/db

2.3 Autostart für PostgreSQL einrichten

Damit der Datenbankserver mit dem Systemstart seinen Dienst aufnimmt, muss der Serverdienst automatisch gestartet werden. Dies erfolgt über das folgende Kommando:

als root:	launchctl load -w /Library/LaunchDaemons/org.macports.postgresql83-server.plist

2.4 Datenbankgastbenutzer anlegen

Da der Server später aus dem Internet erreichbar sein wird und auch seine Daten von jedermann abgerufen werden können, wird ein Gastbenutzer angelegt, der nur Daten aus der Datenbank lesen darf. Mit folgendem Kommando wird der Gastuser erstellt:

als postgres:	/opt/local/lib/postgresql83/bin/createuser guest --no-createdb --no-createrole --no-superuser -p "guest"

Alternativ kann auch das folgende Kommando verwendet werden, die Rollenvergabe wird dabei automatisch abgefragt.

als postgres:	/opt/local/lib/postgresql83/bin/createuser guest -p "guest"

2.5 Installation von PostGIS und GEOS vorbereiten

Im Gegensatz zur Installation von PostgreSQL sollte die Konfigurationsdatei für die Installation von PostGIS angepasst werden. Dies ist notwendig um Kompatibilitätsprobleme zwischen den von OS X mitgelieferten Bibliotheken und den von PostGIS vorzubeugen. Daher wird der Installationsordner von PostGIS auf das User-Verzeichnis umgelenkt.

bearbeiten als root: 	/opt/local/var/macports/sources/rsync.macports.org/release/ports/databases/postgis/Portfile
ersetze: 		build.args  "ICONV_LDFLAGS=\"-L${prefix}/lib -liconv\"
durch: 			build.args  "ICONV_LDFLAGS=\"-L$/usr/lib -liconv\"

2.6 Installation von PostGIS und GEOS

Die nun entsprechend vorbereitete Installation erfolgt auf die gleiche Art und Weise wie zuvor bei PostgreSQL über das folgende Kommando:

als root:	/opt/local/bin/port -k  install  postgis

GEOS muss dank MacPorts nicht extra installiert werden, da es gleich automatisch mit integriert wird.

2.7 Erstellung einer Testdatenbank (optional)

Um die Funktion von PostgreSQL und PostGIS zu überprüfen, kann man mit wenigen Befehlen eine Testdatenbank erstellen und diese mit der PostGIS Erweiterung ausstatten:

als postgres:	/opt/local/lib/postgresql83/bin/pg_ctl start -D /database/chinagis -l /database/chinagis/logfile
		/opt/local/lib/postgresql83/bin/createdb testdatenbank --encoding "UTF-8"
		/opt/local/lib/postgresql83/bin/createlang plpgsql testdatenbank
		/opt/local/lib/postgresql83/bin/psql -f /opt/local/share/postgis/lwpostgis.sql testdatenbank

3. Installation des Datenbankwebinterfaces

3.1 Installation von Apache2

Der Apache 2 Webserver wird benötigt um das Webinterface zur Steuerung der Datenbank benutzen zu können. Da Mac OS X Apache bereits mitliefert, muss dieser nur noch aktiviert werden, was in den Servereinstellungen unter Webserver eingestellt werden kann. Der Rootordner des mitgelieferten Apache befindet sich in /Library/WebServer/Documents/? .

3.2 Installation von PHP5

Obwohl PHP5 bereits von Mac OS X 10.5 mitgeliefert wird, muss eine andere Version installiert werden. Der Grund dafür liegt darin, dass die mitgelieferte Variante das dynamische Einbinden von Erweiterungen nicht zulässt. Aufgrund dessen kann die Webschnittstelle phpPG Admin, die zur Administration der Datenbank auf Webebene eingesetzt werden soll, nicht eingebunden werden.

Um dieses Manko zu beheben, wird eine neue PHP-Version aus dem Internet geladen. Diese ist unter der Adresse http://www.entropy.ch/software/macosx/php zu finden. Nachdem sie heruntergeladen und in den Ordner /usr/local/php5 entpackt wurde, müssen noch Änderungen in der Konfiguration des Apache gemacht werden.

bearbeiten als root: 	/etc/apache2/httpd.conf editieren
ersetze:		LoadModule php5_module libexec/apache2/libphp5.so
durch:			LoadModule php5_module local/php5/libphp5.so

füge hinzu:		AddHandler  application/x-httpd-php .php
			AddHandler  application/x-httpd-php-source .phps

Danach ist nur noch ein Neustart des Apache-Servers notwendig:

als root:	apachectl restart

3.3 Installation von phpPG Admin

Sobald der Apache und PHP5 laufen, kann das Webinterface in Angriff genommen werden. Dieses liegt bereits als fertiges Paket auf der Webseite http://phppgadmin.sourceforge.net vor und muss nur in den Documents-Ordner des Apache entpackt werden. Als Beispiel wird der Ordner /Library/WebServer/Documents?/pgwebadmin angenommen. Das Webinterface lässt sich jetzt über die Adresse http://localhost/pgwebadmin aufrufen. Im Anmeldefenster lassen sich die Benutzerdaten des Datenbankusers eingeben, wobei die Anmeldung als postgres standardmäßig verboten wird. Damit ein Login über den User postgres möglich ist muss noch der folgende Eintrag geändert werden:

bearbeite als root: 	/Library/WebServer/Documents/pgwebadmin/conf/config.inc.php
ersetze:		$conf[‘extra_login_security‘] = true
durch:			$conf[‘extra_login_security‘] = false

Wurde dieser Eintrag geändert so ist jetzt eine Anmeldung über das Webinterface möglich. Dieses bietet den gleichen Funktionsumfang wie die Software PG Admin, allerdings läuft es lokal auf dem Server und muss daher nicht auf dem Remoterechner installiert werden.

4. Inbetriebnahme der Chinagis-Datenbank

Nachdem jetzt alle vorbereitenden Maßnahmen abgeschlossen sind, kann jetzt mit dem Aufsetzen der eigentlichen Datenbank begonnen werden, damit diese dann produktiv eingesetzt werden kann.

4.1 Erzeugung der Chinagis-Datenbank

Die Daten für die Chinagis-Datenbank liegen bereits in einem rohen Format als ArcMap Geo-Shapes vor und wurden in den Ordner /database/rawdata gelegt. Ebenso liegt bereits ein Importskript vor, welches eine Datenbank erstellt und die Daten importiert. Bei diesem wurden noch einige Änderungen an den Konstanten vorgenommen um es an die vorliegende Verzeichnisstruktur anzugleichen. Das Skript wird dann mit dem User postgres ausgeführt und sieht wie folgt aus:

#! /bin/bash


#USAGE: $binpathpostgis/shp2pgsql [<options>] <shapefile> #[<schema>.]<table>
#OPTIONS:
#  -s <$srid>  Set the $srid field. If not specified it defaults to -1.
#  (-d|a|c|p) These are mutually exclusive options:
#      -d  Drops the table, then recreates it and populates
#          it with current shape file data.
#      -a  Appends shape file into current table, must be
#          exactly the same table schema.
#      -c  Creates a new table and populates it, this is the
#          default if you do not specify any options.
#      -p  Prepare mode, only creates the table.
#  -g <geometry_column> Specify the name of the geometry column
#     (mostly useful in append mode).
#  -D  Use postgresql dump format (defaults to sql insert statments.
#  -k  Keep postgresql identifiers case.
#  -i  Use int4 type for all integer dbf fields.
#  -I  Create a GiST index on the geometry column.
#  -S  Generate simple geometries instead of MULTI geometries.
#  -w  Use wkt format (for postgis-0.x support - drops M - drifts coordinates).

#  -W <$encoding> Specify the character $encoding of Shape's
#     attribute column. (default : "ASCII")
#  -N <policy> Specify NULL geometries handling policy (insert,skip,abort)
#  -n  Only import DBF file.
#  -? Display this help screen

# If the *.shp can not be imported, may be, the UTF-8 is not correctly saved: 
# Open the *.dbf with NeoOffice (choose Encoding UTF-8)and save again with UTF-8!

#_____________________
# VARIABLE DEFINITIONS

database=chinagis
srid="2333"
encod="UTF-8"
binpath=/opt/local/lib/postgresql83/bin
binpathpostgis=/opt/local/bin
dbpath=/database/chinagis
datapath=/database/rawdata

#_____________________
#

# restarting postgres
$binpath/pg_ctl restart -w -l $dbpath/logfile -D $dbpath -m i

# dropping the old database
$binpath/dropdb $database

# creating a new database
$binpath/createdb $database --encoding $encod
$binpath/createlang plpgsql $database
$binpath/psql -f $binpathpostgis/../share/postgis/lwpostgis.sql $database

$binpathpostgis/shp2pgsql -s $srid -S -W $encod $datapath/v4_1820_lks_pgn_utf/v4_1820_lks_pgn_utf.shp public.v4_1820_lks_pgn_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -W $encod $datapath/v4_1820_rvr_lin_utf/v4_1820_rvr_lin_utf.shp public.v4_1820_rvr_lin_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -S -W $encod $datapath/v4_time_cnty_pts_utf/v4_time_cnty_pts_utf.shp public.v4_time_cnty_pts_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -W $encod $datapath/v4_time_pref_pgn_utf/v4_time_pref_pgn_utf.shp public.v4_time_pref_pgn_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -S -W $encod $datapath/v4_time_pref_pts_utf/v4_time_pref_pts_utf.shp public.v4_time_pref_pts_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -W $encod $datapath/v4_time_prov_pgn_utf/v4_time_prov_pgn_utf.shp public.v4_time_prov_pgn_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -S -W $encod $datapath/v4_time_prov_pts_utf/v4_time_prov_pts_utf.shp public.v4_time_prov_pts_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -W $encod $datapath/v4_time_reg_pgn_utf/v4_time_reg_pgn_utf.shp public.v4_time_reg_pgn_utf $database | $binpath/psql -d $database

$binpathpostgis/shp2pgsql -s $srid -S -W $encod $datapath/v4_time_reg_pts_utf/v4_time_reg_pts_utf.shp public.v4_time_reg_pts_utf $database | $binpath/psql -d $database

# VACUUM
$binpath/vacuumdb -d $database –z

4.2 Zugriffsrechte für Gastbenutzer einrichten

Wie bereits erwähnt sollte der Gastbenutzer nur Leserechte für die Datenbank besitzen. Daher müssen diese Rechte jetzt entsprechend konfiguriert werden. Dies kann mittels Konsolenzugriff auf die Daten erfolgen oder über die Webschnittstelle. Die Zugriffsrechte auf die Datenbank sehen wie folgt aus: der Gast darf die Datenbank verwenden ( USAGE ) und auch temporäre Tabellen anlegen ( TEMPORARY ). Das Recht Tabellen permanent anzulegen wird ihm jedoch verwehrt.

Desweiteren müssen Zugriffsrechte für die jeweiligen Tabellen festgelegt werden. Hier werden ihm nur die Rechte gegeben Daten abzurufen ( SELECT ), Fremdschlüssel zu erzeugen ( REFERENCES ) und Trigger zu erzeugen ( TRIGGER ). Das Einfügen ( INSERT ), Verändern ( UPDATE ) und Löschen von Daten ( DELETE ) und das erzeugen von Regeln ( RULE ) werden ihm verwehrt.

Mit Hilfe der Webschnittstelle lassen sich die Rechte festlegen indem die Datenbank bzw. die Tabellen angewählt werden und der Reiter "Privileges" angewählt wird. Auf Konsolenebene werden dazu die Befehle grant (gewähren) und revoke (verwehren) verwendet. Vergeben kann diese Rechte jeder, der selbst das entsprechende Recht dazu hat. In diesem Fall wäre dies der User postgres.

4.3 Datenbankserver für Remotezugriff konfigurieren

Bisher ist der Zugriff auf das Datenbanksystem nur lokal möglich. Der Remote-Zugriff ist zwar schon über das Webinterface möglich, aber auch nur da es auf dem Server läuft und somit einen lokalen Zugriff tätigt. Damit man auch von Außen Zugriff auf das Datenbanksystem bekommt, müssen entsprechende Konfigurationseinträge wie folgt gesetzt werden.

bearbeite als root:	/database/chinagis/postgresql.conf
ersetze:		#listen_adresses ‘localhost‘
durch:			listen_adresses = ‘*‘

ersetze:		#port = 5432
durch:			port = 5432

bearbeite als root:	/database/chinagis/pg_hba.conf
füge hinzu:		host	all	postgres	141.14.0.0	255.255.0.0	trust
füge hinzu:		host	all	guest		0.0.0.0		0.0.0.0		trust

Mit diesen Einstellungen ist es erlaubt, dass sich der Gastbenutzer von jeder beliebigen IP-Adresse auf die Datenbank zugreifen darf. Der User postgres hingegen darf derzeit nur aus dem 141.14.0.0/16 Netz zugreifen. Dies muss abgeändert werden, wenn die externe Nutzung des postgres Users erwünscht ist. Damit diese Änderungen aktiv werden, muss die Datenbank neu gestartet werden:

als postgres: 	/opt/local/lib/postgresql83/bin/pg_ctl restart -D /database/chinagis -l /database/chinagis/logfile

Nach dem Neustart der Datenbank kann man nun auch remote auf die Datenbank zugreifen, etwa mit Tools wie PG Admin und Udig.

4.4 Usereinschränkungen im Überblick

guest : hat von überall Zugriff auf die Chinagis-Datenbank, aber nur Leserechte

postgres : hat derzeit nur Zugriffsrechte aus dem 141.14.0.0/16 Netz, dafür aber Vollzugriff auf die Chinagis-Datenbank und verteilt Zugriffsrechte

Was ist wo zu finden?

Apache-Konfigurationsordner: /etc/Apache2

Apache-Rootdir: /Library/WebServer/Documents?

Chinagis-Datenbank: /database/chinagis

MacPort Binaries: /opt/local/bin

MacPort Portfiles: /opt/local/var/macports/sources/rsync.macports.org/release/ports

PHP5: /usr/local/php5

phpPGAdmin: /Library/WebServer/Documents?/pgwebadmin

Postgis-Librarys: /usr/lib/

Postgis-Tools & Binaries: /opt/local/bin

Postgres-Installationsordner: /opt/local/lib/postgresql83

Softwarequellen

MacPorts: http://www.macports.org

PHP5: http://www.entropy.ch/software/macosx/php

PHP PG Webadmin: http://phppgadmin.sourceforge.net

PG Admin: http://pgadmin.org

UDig: http://udig.refractions.net

Xcode Tools: http://developer.apple.com/tools/xcode

Literaturquellen

http://www.postgresql.org/docs/

http://docs.moodle.org/en/Step_by_Step_Installation_on_a_Mac_OS_X_10.5_Server

http://www.lincolnritter.com/blog/2007/12/04/installing-postgresql-postgis-and-more-on-os-x-leopard/

Last modified 14 years ago Last modified on Feb 23, 2010, 9:35:01 AM