+-----------------------------------------------------------------------
| Running sogo on OpenBSD
+-----------------------------------------------------------------------

General setup and configuration information about SOGo can be found
in /usr/local/share/doc/sogo/.

SOGo is designed with scalability in mind. All of the dependent components
like mail-, database-, or web server can run on different hosts, and
you can even choose to install your preferred software to fulfill those tasks.
You have to install those components manually on the servers where you
want to run them. An overview is given in the list below.

For your SOGo installation you would need the following components installed
somewhere. Either on the same host where you install SOGo, or distributed
over multiple systems, related to your needs:
- Memcached to speed up SOGo:
  * install the memcached package
- Web Server:
  * install the nginx or the apache-httpd package
- Database Server:
  * install postgresql-server package
  - or install mariadb-server package
- LDAP Server for user authentication shared addressbooks:
  * install openldap-server package
  - or use ldapd from base
- IMAP Server:
  * install cyrus-imapd package
  - or install dovecot package
  - or install courier-imap package
  - or install imap-uw package
- SMTP Server or local sendmail compatible binary:
  * install postfix package
  - or use smtpd from base
  - or install sendmail package
The alternatives marked with * are recommended. They are tested and verified
to work together by the SOGo port maintainer.
For the configuration of those components you should take a look at their
respective documentation.

The SOGo system user
====================
The system user and group intended to run the SOGo application server
is called _sogo. The users home directory is /var/sogo.

The SOPE database adaptor
=========================
The SOPE PostgreSQL database adaptor is automatically installed.
If you want to use a MySQL database as backend, you have to install
the sope-mysql package on the host where SOPE and SOGo are installed.

SOGo with nginx
===============
Since nginx configuration is not explained in the SOGo Manual, here is an example.
It's assumed that nginx(8) and SOGo run on the same host. Nginx(8) listens on port 80,
and SOGo is listening on its default port 20000.

Nginx runs in a chroot environment on OpenBSD, therefore you have to
copy some files into the server's chroot environment:

# mkdir -p /var/www/lib/sogo
# cp -R /usr/local/lib/GNUstep/SOGo/WebServerResources /var/www/lib/sogo/www

Edit /etc/nginx/nginx.conf

server {

    listen 80;
    root /var/www/lib/sogo/www/;
    proxy_http_version 1.1;

    location = /
    {
        rewrite ^ http://$server_name/SOGo;
        allow all;
    }

    # For IOS 7
    location = /principals/
    {
        rewrite ^ http://$server_name/SOGo/dav;
        allow all;
    }

    location = /.well-known/caldav/
    {
        rewrite ^ http://$server_name/SOGo/dav;
    }

    location = /.well-known/carddav/
    {
        rewrite ^ http://$server_name/SOGo/dav;
        allow all;
    }

    location ^~/SOGo
    {
        proxy_pass http://127.0.0.1:20000;
        proxy_redirect http://127.0.0.1:20000 default;
        # forward user's IP address
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header x-webobjects-server-protocol HTTP/1.0;
        proxy_set_header x-webobjects-remote-host 127.0.0.1;
        proxy_set_header x-webobjects-server-name $server_name;
        proxy_set_header x-webobjects-server-url $scheme://$host;
        proxy_set_header x-webobjects-server-port $server_port;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        client_max_body_size 50m;
        client_body_buffer_size 128k;
        break;
    }

    location /SOGo.woa/WebServerResources/
    {
        alias /var/www/lib/sogo/www/;
        allow all;
    }

    location /SOGo/WebServerResources/
    {
        alias /var/www/lib/sogo/www/;
        allow all;
    }

    location ^/SOGo/so/ControlPanel/Products/([^/]*)/Resources/(.*)$
    {
        alias /var/www/lib/sogo/$1.SOGo/Resources/$2;
    }

    location ^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$
    {
        alias /var/www/lib/sogo/$1.SOGo/Resources/$2;
    }
}

SOGo with apache-httpd package
==============================
The configuration of SOGo behind Apache is described in the manual.

A note on using CAS
===================
Using CAS is not tested by the maintainer. You have to copy
/usr/local/share/doc/sogo/cas-proxy-validate.py to
/var/www/cgi-bin. Within the script, you have to edit the config
array and the path to your python to fit your configurtaion.
The script also requires Python memcached, provided by
the py-memcached package.

A note on using Thunderbird integrator
======================================
If you are going to use Thunderbird integrator you will need the php
script installed on /usr/local/share/doc/sogo/updates.php.
You should copy it under /var/www/htdocs, install the php package and
follow the instuctions in the SOGo manual.

SOGo configuration example
==========================
Below you see an example SOGo configuration. The example assumes you have
the recommended server components installed as mentioned above.
You have to apply them as user _sogo using the defaults command, i.e:
defaults write sogod <key> <value>
In the example below it is assumed that all components run on the same host.
For details to each of the defaults consult the SOGo Administration manual.

sogod SOGoUserSources '(
    {
        CNFieldName = cn;
        IDFieldName = uid;
        IMAPHostFieldName = mailHost;
        UIDFieldName = uid;
        baseDN = "ou=people,dc=intern";
        bindDN = "cn=Manager,dc=intern";
        bindPassword = ManagerLDAPPassword;
        canAuthenticate = YES;
        displayName = "SOGo Accounts";
        hostname = localhost;
        id = public;
        isAddressBook = YES;
        port = 389;
    }
)'
sogod SOGoSMTPServer localhost
sogod SOGoIMAPServer localhost
sogod SOGoLanguage English
sogod SOGoTimeZone Europe/Berlin
sogod SOGoFoldersSendEMailNotifications YES
sogod SOGoMemcachedHost localhost
sogod SOGoMailingMechanism smtp
sogod WOLogFile /var/log/sogo/sogod.log
sogod WOPidFile /var/sogo/sogod.pid
sogod SOGoMailDomain my-domain.com
sogod OCSFolderInfoURL postgresql://_sogo:sogo@localhost:5432/sogo/sogo_folder_info
sogod SOGoProfileURL postgresql://_sogo:sogo@localhost:5432/sogo/sogo_user_profile
sogod OCSSessionsFolderURL postgresql://_sogo:sogo@localhost:5432/sogo/sogo_sessions_folder
sogod SOGoACLsSendEMailNotifications YES
sogod SOGoAppointmentSendEMailNotifications YES
sogod WOWorkersCount 4
sogod WOPort 127.0.0.1:20000
sogod SOGoDraftsFolderName INBOX.Drafts
sogod SOGoTrashFolderName INBOX.Trash
sogod SOGoSentFolderName INBOX.Sent
sogod SOGoZipPath /usr/local/bin/zip

Upgrading from older SOGo versions
==================================
Update the files in the chroot environment of apache as root:

# rm -rf /var/www/lib/sogo
# mkdir -p /var/www/lib/sogo
# cp -R /usr/local/lib/GNUstep/SOGo/WebServerResources /var/www/lib/sogo/www

Upgrade SOGo from < 2.3.0
==========================
With version 2.3.0, the database schema needs to be extended.

Run one of the following scripts as the SOGo system user _sogo. Choose the
script based on your database backend. The scripts will ask you for the database credentials.

# su _sogo "/usr/local/share/doc/sogo/sql-update-2.2.17_to_2.3.0.sh"
# su _sogo "/usr/local/share/doc/sogo/sql-update-2.2.17_to_2.3.0-mysql.sh"

Upgrade SOGo from < 3.0.0
=========================
With version 3.X you can update the database schema to the optional
9-table model. The conversion is not required, and you should only do it
when you are sure you know what you are doing.
The scripts require you have configured sogo via /etc/sogo/sogo.conf,
as well as they have to run with bash. You might install bash manually.
Use at your own risk.

# su _sogo "/usr/local/bin/bash /usr/local/share/doc/sogo/sql-update-3.0.0-to-combined.sh"
# su _sogo "/usr/local/bin/bash /usr/local/share/doc/sogo/sql-update-3.0.0-to-combined-mysql.sh"

Upgrade SOGo from < 4.0.0
=========================
Updating SOGo from version 3.X to 4.X requires an update of the database schema.

Run one of the following scripts as the SOGo system user _sogo. Choose the
based on your database backend. The scripts will ask you for the database credentials.

# su _sogo "/usr/local/share/doc/sogo/sql-update-3.2.10_to_4.0.0.sh"
# su _sogo "/usr/local/share/doc/sogo/sql-update-3.2.10_to_4.0.0-mysql.sh"

Upgrade SOGo from < 5.7.1
=========================
With version 5.7.1, the WOPort default has to be set, as it now tries to 
listen on IPv4 and IPv6 in parallel, which fails on OpenBSD.
The prior default was to listen on 127.0.0.1:20000. To get back the old behaviour,
run the following command:

# su _sogo "defaults write sogod WOPort 127.0.0.1:20000"
