Nachdem du bereits die Einführung durchgelesen hast und bei dir das Debian Betriebssystem läuft, können wir nun mit der eigentlichen Installation beginnen.

Wir bereiten nun die Installation vor und installieren die nötigen Pakete, sowie das Kopano Repository damit die Installation später gestartet werden kann.

sudo apt update
sudo apt install -y gnupg2 curl apt-transport-https

Da Kopano eine Lizenz benötigt, welche Ihr beim Kauf natürlich erhaltet müssen wir zuerst das Repository korrekt vorbereiten. In Debian wird “apt_auth.conf” verwendet, wenn man aus geschützten Repositorien Pakete Software laden will. Wir erstellen also eine neue Datei für das geschützte Kopano Repository.

sudo nano /etc/apt/auth.conf.d/kopano.conf
machine download.kopano.io/supported/core:/final/Debian_11/ login serial password XXXXXXXXXXXXXXXXXXXXXXXXX

Wir fügen nun den folgenden Inhalt in die kopano.conf Datei ein. Den 25-stelligen Key müsst ihr natürlich anpassen respk. die “X” ersetzen mit euren richtigen Zahlen und Buchstaben.

Als nächstes wird das Repository angelegt und die URL’s hinterlegt für die verschiedenen Applikationen. Es macht Sinn gleich alle Applikationen zu hinterlegen. Wichtig ist auch bei diesem Schritt dass man nicht vergisst die Lizenz zu hinterlegen. Das Z-Push Repository ist im Moment noch öffentlich erreichbar. Ich nehme an, dass dies später auch angepasst wird sobald Z-Push komplett überarbeitet wurde.

sudo nano /etc/apt/sources.list.d/kopano.list
deb https://serial:XXXXXXXXXXXXXXXXXXXXXXXXX@download.kopano.io/supported/core:/final/Debian_11/ ./
deb https://serial:XXXXXXXXXXXXXXXXXXXXXXXXX@download.kopano.io/supported/webapp:/final/Debian_11/ ./
deb https://download.kopano.io/zhub/z-push:/final/Debian_11/ ./

In der kopano.list haben wir gleich die Webapp sowie Z-Push auch hinzugefügt. Die Webapp ist das Webinterface von Kopano und Z-Push ist für die Synchronistation zuständig mit den Endgeräten.

Als nächstes importieren wir den Signing-Key, diese Art ist eigentlich nicht mehr unterstützt. Es funktioniert aber in Debian 11.6 noch. Leider weiss nicht wie es in Zukunft aussieht.

sudo curl -sS curl https://serial:XXXXXXXXXXXXXXXXXXXXXXXXX@download.kopano.io/supported/core:/final/Debian_11/Release.key | apt-key add -
apt update

Nun beginnen wir mit der Installation von Kopano. Als erstes wird die Maria Datenbank installiert.

sudo apt install -y mariadb-server

Als nächstes wird die Datenbank gesichert also gehärtet damit eine Basis Sicherheit gegeben ist. Mann sollte ein root Passwort setzen und die Testdatenbank entfernen und sowie sicherstellen dass man sich nur lokal als root anmelden kann. Die Fragen welche da gestellt werden habe hier nicht separat aufgeschrieben.

mysql_secure_installation

Wir erstellen eine Datenbank mit dem Namen “kopano”. Falls bereits eine Datenbank besteht dann werden wir diese Datenbank später überschreiben und zwar vor dem ersten Start von Kopano. Falls keine Datenbank besteht muss natürlich eine angelegt werden.

mysql -e "create database kopano;"

Nun legen wir einen Benutzer namens “kopano” an.

mysql -e "GRANT ALL PRIVILEGES on kopano.* to 'kopano'@'localhost' IDENTIFIED via unix_socket;"

Der Benutzer “kopano” erhält volle Zugriffsberechtigung via Unix Socket auf die Datenbank “kopano”.

Der Benutzer “root” erhält volle Zugriffsberechtigung auf die Datenbank “kopano”.

mysql -e "GRANT ALL PRIVILEGES on kopano.* to 'root'@'localhost' IDENTIFIED BY 'MariaDB-Root-PASSWORT' with grant option;"

Postfix Installation

Wir benötigen Postfix um die E-Mails aus Kopano an einen Smarthost zu senden. Postfix ist somit ein Mittelsmann da Kopano selber keinen Mail Transport Agent (MTA) hat. Es gibt auch andere MTA’s daher gibt es auch in diesem Bezug viele verschiedene Möglichkeiten. Ich habe Postfix gewählt, weil es einer der bekanntesten ist und Postfix existiert schon lange. Nun installieren wir Postfix mit dem nächsten Befehl.

sudo apt -y install postfix postfix-mysql

Automatisch wird der Postfix Installer gestartet, dieser führt euch in eurer Sprache durch die Installation. Für meine Bedürfnisse wähle ich die Variante “Internet mit Smarthost”. Dies aus dem Grund da wir die E-Mails “nur” an den richtigen E-Mail Server weiterleiten.

Im nächsten Schritt muss der FQDN gesetzt werden.

Der SMTP-Relay-Host kann leer gelassen werden.

Anschliessend wird die Installation von Postfix abgeschlossen und die Konfiguration (main.cf) sollte über den nachfolgenden Befehl verfügbar sein.

Als erstes bearbeiten wir die master.cf welche nämlich nicht korrekt eingerückt wird.

sudo nano /etc/postfix/master.cf

Danach muss die Zeile vom “smtp” korrekt eingerückt werden wie hier im Beispiel.

# ==========================================================================
smtp       inet  n       -       y       -       -       smtpd
#smtp      inet  n       -       y       -       1       postscreen

Damit Postfix mit Kopano kommuniziert müssen wir ein paar Einstellungen vornehmen. Die Einstellungen sind in der main.cf zu finden.

sudo nano /etc/postfix/main.cf

An dieser Stelle möchte ich euch zeigen um welche Thematik es genauer geht. Ich habe mehrere E-Mail Adressen von verschiedenen Domains. Via Postfix will ich über alle diese E-Mail Adressen, E-Mails versenden können. In der main.cf werden die folgenden beiden hinzugefügt.

smtp_sasl_password_maps = hash:/etc/kopano/postfix/sasl_passwd
sender_dependent_relayhost_maps = hash:/etc/kopano/postfix/sender_relay

Der folgende Teil wird erst nach der Installation von Kopano gemacht aber noch vor dem ersten Start von Kopano. Wir legen zuerst ein Unterverzeichnis an für Postfix und dies im /etc/kopano Ordner.

sudo mkdir /etc/kopano/postfix

Der Inhalt von sasl_passwd sieht wie folgt aus:

sudo nano /etc/kopano/postfix/sasl_passwd
meineemail@meinedomain.ch meineemail@meinedomain:PASSSWORT

Der Inhalt von sender_relay sieht wie folgt aus:

meineemail@meinedomain.ch [mailserver.hoststar.hosting]:587

Anschliessend müssen diese in Postmap konvertiert werden. Warum das genau gemacht werden muss, weiss ich nicht es ist aber auch so auf der Postfix Webseite beschrieben. Ich nehme an die Dateien müssen neu initialisiert werden.

postmap /etc/kopano/postfix/sasl_passwd
postmap /etc/kopano/postfix/sender_relay

Apache Installation

Für die Webapp wird ein Apache Server benötigt. Diesen installieren wir zuerst mit dem nächsten Befehl.

sudo apt install -y apache2 php php-common

In vielen Tutorials wird die Thematik mit dem Zertifikat nicht genauer erklärt und es wird angenommen dass alles klar ist. Gerade für Neulinge dürften sich hier grosse Fragezeichen ergeben. Ich setze einen Reverse Proxy ein und aus diesem Grund habe ich auch bereits Zertifikate. Diese werden durch Let’s Encrypt erstellt via einem Shell Script. Es ist aber nicht nötig ein solches Zertifikat einzusetzen zudem gibt es die Möglichkeit ein Zertifikat zu kaufen für 1 Jahr.
Mann kann aber auch selber Zertifikate herstellen das bietet zum einen Sicherheit und ist kein grosser Aufwand.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Das Zertifikat und der Key sind generiert und 365 Tage gültig. Danach muss dieser Schritt wiederholt werden. Teures Wissen welches ich mir erkaufen musste ist das Konfiguration Wissen zum Apache 2 Webserver. Es gibt dort verschiedene Ordner wo man die Konfigurationen abspeichert.

Konkret geht es um “sites-available” und “sites-enabled” und zwar sind im “enabled” Ordner nur Symlinks zu den Konfigurationen im “available” Ordner. Das bedeutet dass man logischerweise die Konfiguration auch nur im “available” Ordner anpassen muss und dann diese jeweils aktiviert.

sudo nano /etc/apache2/sites-available/default-ssl.conf

In der Konfiguration müssen nur 2 Zeilen geändert werden alles was ein Hashzeichen davor hat ist auskommentiert. SSL muss ausserdem aktiviert sein und bei ServerAdmin kann man seine Admin E-Mail Adresse hinterlegen. Wichtig für die Webapp muss DocumentRoot angepasst werden. Bitte die Konfigurationen genau anschauen und durchgehen.

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin meineemail@meinedomain.ch

                DocumentRoot /usr/share/kopano-webapp/
                ServerName XXXXXX.DEINEDOMAIN.ch
                # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
                # error, crit, alert, emerg.
                # It is also possible to configure the loglevel for particular
                # modules, e.g.
                #LogLevel info ssl:warn

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                # For most configuration files from conf-available/, which are
                # enabled or disabled at a global level, it is possible to
                # include a line for only one particular virtual host. For example the
                # following line enables the CGI configuration for this host only
                # after it has been globally disabled with "a2disconf".
                #Include conf-available/serve-cgi-bin.conf

                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on

                #   A self-signed (snakeoil) certificate can be created by installing
                #   the ssl-cert package. See
                #   /usr/share/doc/apache2/README.Debian.gz for more info.
                #   If both key and certificate are stored in the same file, only the
                #   SSLCertificateFile directive is needed.
                # SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
                # SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
                SSLCertificateChainFile /etc/ssl/certs/apache-selfsigned.crt
                #   Server Certificate Chain:
                #   Point SSLCertificateChainFile at a file containing the
                #   concatenation of PEM encoded CA certificates which form the
                #   certificate chain for the server certificate. Alternatively
                #   the referenced file can be the same as SSLCertificateFile
                #   when the CA certificates are directly appended to the server
                #   certificate for convinience.
                #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt

                SSLCertificateFile /home/USERNAME/hs-x.ch.cer

                #   Certificate Authority (CA):
                #   Set the CA certificate verification path where to find CA

Die Datei kann nach den Anpassungen gespeichert werden und mittels den nächsten beiden Befehlen aktiviert werden.

cd /etc/apache2/sites-available/
sudo a2ensite default-ssl.conf
sudo systemctl reload apache2

Kopano Installation

Nun können wir die Installation von Kopano-Core ausführen sowie die Webapp und Z-Push installieren. Bevor wir aber die Installation von Kopano ausführen sollte die alte Kopano Datenbank zurück geladen werden falls eine solche besteht. Wenn man keine bestehende Datenbank hat, muss man nichts weiteres unternehmen. Wichtig, falls eine bestehende Datenbank vorhanden ist muss evtl. die Datenbankversion angepasst werden. Das sollte direkt nach dem Restore geschehen, unter Kopano Befehle und Wissen ist weiteres dazu erklärt.

sudo apt install -y kopano-server-packages

Die Kopano Services sollen automatisch nach einem Neustart starten.

systemctl enable kopano-server
systemctl enable kopano-search
systemctl enable kopano-dagent
systemctl enable kopano-spooler

Die Standard Konfigurationsdateien für Kopano werden geholt und entzippt.

cp /usr/share/doc/kopano/example-config/spooler.cfg.gz /etc/kopano
cp /usr/share/doc/kopano/example-config/dagent.cfg.gz /etc/kopano
cp /usr/share/doc/kopano/example-config/server.cfg.gz /etc/kopano
cp /usr/share/doc/kopano/example-config/gateway.cfg /etc/kopano
cp /usr/share/doc/kopano/example-config/search.cfg /etc/kopano
cd /etc/kopano
gzip -d spooler.cfg.gz
gzip -d dagent.cfg
gzip -d server.cfg

Als nächstes müssen die Konfigurationsdateien bearbeitet werden.

sudo nano /etc/kopano/dagent.cfg
##############################################################
# DAGENT SETTINGS

# connection to the storage server
server_socket = file:///var/run/kopano/server.sock

##############################################################
# DAGENT SSL LOGIN SETTINGS
#
# Note: server_socket must be set to https://servername:portname/
#       to use this type of login method

# Login to the storage server using this SSL Key
#sslkey_file = /etc/kopano/ssl/dagent.pem

# The password of the SSL Key
#sslkey_pass = replace-with-dagent-cert-password

##############################################################
# DAGENT LOG SETTINGS

# Logging method (syslog, file)
log_method = auto

# Loglevel (0(none), 1(crit), 2(err), 3(warn), 4(notice), 5(info), 6(debug))
log_level       =       3

# Logfile for log_method = file, use '-' for stderr
log_file = /var/log/kopano/dagent.log

# Log timestamp - prefix each log line with timestamp in 'file' logging mode
log_timestamp = yes

Nun folgt die gateway.cfg

sudo nano /etc/kopano/gateway.cfg
##############################################################
# GATEWAY SETTINGS

# Space-separated list of address:port specifiers for where the server should
# listen for connections.
#
#    "*:143" — port 143, all protocols
#    "[::]:143" — port 143 on IPv6 only
#    "[2001:db8::1]:143" — port 143 on specific address only
#
# imaps is normally on 993, pop3s on 995.
#
#pop3_listen = *:110
#pop3s_listen =
#imap_listen = *:143
#imaps_listen =

server_bind     = 0.0.0.0

# Connection to the storage server.
# Please refer to the administrator manual or manpage why HTTP is used rather than the UNIX socket.
server_socket = http://localhost:236/kopano

# Set this value to a name to show in the logon greeting to clients.
# Leave empty to use DNS to find this name.
server_hostname =

# Whether to show the hostname in the logon greeting to clients.
server_hostname_greeting = no

# drop privileges and run the process as this user
run_as_user =

# drop privileges and run the process as this group
run_as_group = kopano

# create a pid file for stopping the service via the init.d scripts
pid_file = /var/run/kopano/gateway.pid

# create memory coredumps upon crash [no, systemdefault, yes]
coredump_enabled = systemdefault

# Only mail folder for IMAP or all subfolders (calendar, contacts, tasks, etc. too)
imap_only_mailfolders = yes

# Show Public folders for IMAP
imap_public_folders = yes

# IMAP clients may use IDLE command
imap_capability_idle = yes

# The maximum size of an email that can be uploaded to the gateway
imap_max_messagesize = 128M

# Internally issue the expunge command to directly delete e-mail marked for deletion in IMAP.
imap_expunge_on_delete = no

# Maximum count of allowed failed IMAP command counts per client
imap_max_fail_commands = 10

# Some MUAs are sending commands via idle causing the connection
# to reach imap_max_fail_commands and leaves the client in a
# broken state. The clients include Apple Mail. If you experience
# problems or uses Apple Mail set this option to yes
#imap_ignore_command_idle = no

# Disable all plaintext authentications unless SSL/TLS is used
#disable_plaintext_auth = no

# File with RSA key for SSL
#ssl_private_key_file = /etc/kopano/gateway/privkey.pem

#File with certificate for SSL
#ssl_certificate_file = /etc/kopano/gateway/cert.pem

# Verify client certificate
#ssl_verify_client = no

# Client verify file and/or path
#ssl_verify_file =
#ssl_verify_path =

# SSL protocols to use, space-separated list of protocols
# (SSLv3 TLSv1 TLSv1.1 TLSv1.2); prefix with ! to lock out a protocol.
#ssl_protocols =

# SSL ciphers to use, set to 'ALL' for backward compatibility
#ssl_ciphers = ALL:!LOW:!SSLv2:!EXP:!aNULL

# Prefer the server's order of SSL ciphers over client's
#ssl_prefer_server_ciphers = no

# Process model, using pthreads (thread) or processes (fork)
# Processes are potentially safer from a security point of view.
#process_model = thread

# For temporary files.
#tmp_path = /tmp

# Whether Gateway should filter HTML messages or not. Usually, WebApp
# takes care of this. Letting the gateways do this improves the user latency a
# bit, but uses more disk space. (yes/no)
#html_safety_filter = no

##############################################################
# GATEWAY LOG SETTINGS

# Logging method (syslog, file)
log_method = file

# Loglevel (0(none), 1(crit), 2(err), 3(warn), 4(notice), 5(info), 6(debug))
log_level = 6

# Logfile for log_method = file, use '-' for stderr
# Default: -
log_file = /var/log/kopano/gateway.log

# Log timestamp - prefix each log line with timestamp in 'file' logging mode
log_timestamp = yes

# Buffer logging in what sized blocks. 0 for line-buffered (syslog-style).
log_buffer_size = 4096

# Bypass authentification when connecting as an administrator to the UNIX socket.
#bypass_auth = no

Als nächstes machen wir die spooler.cfg

##############################################################
# SPOOLER SETTINGS

# Outgoing mailserver name or IP address
smtp_server = localhost

# Port number for outgoing mailserver
smtp_port = 25

# Server Unix socket location
# server_socket = file:///var/run/kopano/server.sock
# server_socket = file:///var/run/kopano
# server socket = http://localhost:236/kopano
# server_socket = /var/run/kopano


# drop privileges and run the process as this user
run_as_user =

# drop privileges and run the process as this group
run_as_group =

# create a pid file for stopping the service via the init.d scripts
pid_file = /var/run/kopano/spooler.pid

# create memory coredumps upon crash [no, systemdefault, yes]
coredump_enabled = systemdefault

# for temporary files
tmp_path = /tmp

##############################################################
# SPOOLER LOG SETTINGS

# Logging method (syslog, file)
log_method = file

# Loglevel (0(none), 1(crit), 2(err), 3(warn), 4(notice), 5(info), 6(debug))
log_level = 6

# Logfile for log_method = file, use '-' for stderr
log_file = /var/log/kopano/spooler.log

# Log timestamp - prefix each log line with timestamp in 'file' logging mode
log_timestamp = yes

# Buffer logging in what sized blocks. 0 for line-buffered (syslog-style).
log_buffer_size = 4096

# Dump raw messages into specified directory before sending to smtpd.
#log_raw_message_path = /var/lib/kopano
#log_raw_message_stage1 = no

##############################################################
# SPOOLER SSL LOGIN SETTINGS
#
# Note: server_socket must be set to https://servername:portname/
#       to use this type of login method

# Login to the storage server using this SSL Key
#sslkey_file = /etc/kopano/ssl/spooler.pem

# The password of the SSL Key
#sslkey_pass = replace-with-server-cert-password

##############################################################
# SPOOLER THREAD SETTINGS

# Maximum number of threads used to send outgoing messages
max_threads = 5

##############################################################
# SPOOLER FAXING SETTINGS

# When sending an email that must go to a fax address, the address
# will be rewritten to <phonenumber>@<fax_domain>
#fax_domain =

# If the received number starts with a '+', it will be replaced by
# the fax_international value.
# e.g. +3112345678@fax.local will be rewritten to 003112345678@fax.local
#fax_international = +

##############################################################
# SPOOLER DELEGATE SETTINGS

# Set this value to 'yes' to let the spooler always send emails with
# delegates (other user than yourself in the From: header)
# In installations before 6.20, this value was always 'yes'.
# IMPORTANT: This feature overrides "send-as" functionality.
#always_send_delegates = no

# Set this value to 'no' if you do NOT want to allow redirected e-mails
# being sent with their original 'FROM' header
allow_redirect_spoofing = yes

# Copies the sent mail of delegates and send-as mails in the
# "Sent Items" folder of the representer.
copy_delegate_mails = yes

# Allow to forward and sent a meeting request as delegate Kopano and
# SMTP user.
allow_delegate_meeting_request = yes

# Allow users to send email to the 'everyone' group
allow_send_to_everyone = yes

##############################################################
# SPOOLER OUTPUT SETTINGS

# Set this value to 'yes' to always send meeting request information
#   using TNEF method (winmail.dat attachments).
#   Otherwise, the meeting request information is sent using
#   iCalendar (calendar.ics attachment).
# Mail bodies created in RTF text format will also use TNEF.
always_send_tnef = no

# The us-ascii charset will be upgraded to this charset, to allow more
# use of high-characters.
charset_upgrade = windows-1252

# Request SMTP Delivery Status Notifications if the MTA support it
enable_dsn = yes

##############################################################
# SPOOLER GROUP EXPANSION

# Set this value to 'yes' if groups should be expanded to their
# members; This means that the receiving party will see the names
# of the group members in the To: header for example. If set to
# 'no', the name of the group will appear in the headers.
#
# Note: groups with email addresses are never expanded
#expand_groups = no

##############################################################
# SPOOLER ARCHIVING SETTINGS

# Enable archive_on_send to automatically archive all outgoing
# messages.
# This will do nothing if no archive is attached to the source mailbox.
#archive_on_send = no

##############################################################
# SPOOLER PLUGIN SETTINGS

# Enable the spooler plugin framework
plugin_enabled = yes

# Path to the spooler plugin manager
plugin_manager_path = /usr/share/kopano-spooler/python

# Path to the activated spooler plugins.
#   This folder contains symlinks to the kopano plugins and custom scripts. The plugins are
#   installed in '/usr/share/kopano-spooler/python/plugins/'. To activate a plugin create a symbolic
#   link in the 'plugin_path' directory.
#
# Example:
#  $ ln -s /usr/share/kopano-spooler/python/plugins/disclaimer.py /var/lib/kopano/spooler/plugins/disclaimer.py
plugin_path = /var/lib/kopano/spooler/plugins

Als letztes wird noch die server.cfg bearbeitet. Hier müssen wir auch später für Fetchmail noch einmal die Berechtigungen kontrollieren. Ich trage hier den Benutzer “fetchmail” direkt ein. Wenn man anstatt Fetchmail ein anderes Programm benutzt muss das angepasst werden.

sudo nano /etc/kopano/server.cfg
# If a directive is not used (i.e. commented out), the built-in server default
# is used, so to disable certain features, the empty string value must explicitly be
# set on them.

##############################################################
# SERVER SETTINGS

# Space-separated list of address:port specifiers for where the server should
# listen for unencrypted connections.
#
#    "*:236" — port 236, all protocols
#    "[::]:236" — port 236 on IPv6 only
#    "[2001:db8::1]:236" — port 236 on specific address only
#    To disable unencrypted connections, set to an empty value.
#
server_listen = *:236

# Space-separated list of paths for where to listen for AF_LOCAL
# connections.
# To disable, set to an empty value.
#
#server_pipe_name = /var/run/kopano/server.sock

# Space-separated list of paths for where to listen for AF_LOCAL
# connections to handle with raised priority.
# To disable, set to an empty value.
#
#server_pipe_priority = /var/run/kopano/prio.sock

# Name for identifying the server in a multi-server environment
#server_name =

# Override the hostname of this server, used by Kerberos SSO if enabled
#server_hostname =

# Database engine (mysql)
database_engine = mysql

# Allow connections from normal users through the Unix socket
allow_local_users = yes

# local admin users who can connect to any store (use this for the kopano-dagent)
# field is SPACE separated
# eg: local_admin_users = root vmail
# Default: root
local_admin_users = root kopano fetchmail

# With owner_auto_full_access=true, the owner of an object is, in addition to
# any ACLs, implicitly granted "read", "create-in" and "is-visible" rights,
# even if the store belongs to another user, for example, when it has been
# moved via kopano-storeadm -D,-A.
#
#owner_auto_full_access = true

# e-mail address of the Kopano System user
#system_email_address = postmaster@localhost

# drop privileges and run the process as this user
run_as_user = kopano
# drop privileges and run the process as this group
#run_as_group = kopano

# create a pid file for stopping the service via the init.d scripts
#pid_file = /var/run/kopano/server.pid

# Use given allocator library. Values like libtcmalloc.so.4,
# libtcmalloc_minimal.so.4 and libjemalloc.so.2 would work.
#allocator_library = libtcmalloc_minimal.so.4

# create memory coredumps upon crash [no, systemdefault, yes]
#coredump_enabled = systemdefault

# session timeout for clients. Values lower than 300 will be upped to 300
# automatically. If the server hears nothing from a client in session_timeout
# seconds, then the session is killed.
#session_timeout = 300

# for temporary files
#tmp_path = /tmp

##############################################################
# LOG SETTINGS

# Logging method (syslog, file), syslog facility is 'mail'
#log_method = auto

# Logfile (for log_method = file, '-' for stderr)
#log_file = -

# Loglevel (0(none), 1(crit), 2(err), 3(warn), 4(notice), 5(info), 6(debug))
#log_level = 3

# Log timestamp - prefix each log line with timestamp in 'file' logging mode
#log_timestamp = yes

# Buffer logging in what sized blocks. 0 for line-buffered (syslog-style).
#log_buffer_size = 0

##############################################################
# AUDIT LOG SETTINGS

# Audit logging is by default not enabled
#audit_log_enabled = no

# Audit logging method (syslog, file), syslog facility is 'authpriv'
#audit_log_method = syslog

# Audit logfile (for log_method = file, '-' for stderr)
#audit_log_file = /var/log/kopano/audit.log

# Audit loglevel (0=no logging, 1=full logging)
#audit_log_level = 1

# Audit log timestamp - prefix each log line with timestamp in 'file' logging mode
#audit_log_timestamp = 1

##############################################################
# MYSQL SETTINGS (for database_engine = mysql)

# MySQL hostname to connect to for database access
mysql_host = localhost

# MySQL port to connect with (usually 3306)
mysql_port = 3306

# The user under which we connect with MySQL
mysql_user = kopano

# The password for the user (leave empty for no password)
mysql_password = MEINGEHEIMESSQLPASSWORT

# Override the default MySQL socket to access mysql locally
# Works only if the mysql_host value is empty or 'localhost'
#mysql_socket =

# Database to connect to
#mysql_database = kopano

# MySQL engine, per default it is InnoDB, which is the only supported
# database engine. It is NOT advised to use a non-transactional engine
# like MyISAM, Aria, etc.
#mysql_engine = InnoDB

# Where to place attachments. Value can be 'database', 'files' or 's3'
attachment_storage = database

# Enable fsync as method to make sure attachments are stored on disk where
# supported and will not be buffered by OS and/or filesystem. Please note
# this setting will lower attachment write performance depending on your
# environment but enhances data safety with disaster recovery.
# Only affects 'files' attachment storage backend.
#attachment_files_fsync = yes

# When attachment_storage is 'files', use this path to store the files
# When attachment_storage is 's3', use this path to set a prefix to all
# attachment data of a certain cluster, for example 'attach'
#attachment_path = /var/lib/kopano/attachments

# Compression level for attachments when attachment_storage is 'files'.
# Set compression level for attachments disabled=0, max=9
#attachment_compression = 6

##############################################################
# S3 STORAGE SETTINGS (for attachment_storage = s3)

# The hostname of the entry point to the S3 cloud where the bucket is located
# If you are using minio or another S3 compatible implementation that
# is using another port, you can specify the port with hostname:port.
#attachment_s3_hostname = s3-eu-west-1.amazonaws.com

# The region where the bucket is located, e.g. "eu-west-1"
#attachment_s3_region =

# The protocol that should be used to connect to S3, 'http' or 'https' (preferred)
#attachment_s3_protocol =

# The URL style of the bucket, "virtualhost" or "path"
#attachment_s3_uristyle =

# The access key id of your S3 account
#attachment_s3_accesskeyid =

# The secret access key of your S3 account
#attachment_s3_secretaccesskey =

# The bucket name in which the files will be stored
#attachment_s3_bucketname =

##############################################################
#  SSL SETTINGS

# Space-separated list of address:port specifiers for where to listen for
# TLS-encrypted connections.
#
#    "*:237" — port 237, all protocols
#    "[::]:237" — port 237 on IPv6 only
#    "[2001:db8::1]:237" — port 237 on specific address only
#    To disable encrypted connections, set to an empty value.
#
#server_listen_tls =

# Required Server certificate, contains the certificate and the private key parts
#server_ssl_key_file = /etc/kopano/ssl/server.pem

# Password of Server certificate
#server_ssl_key_pass =

# Required Certificate Authority of server
#server_ssl_ca_file = /etc/kopano/ssl/cacert.pem

# Path with CA certificates, e.g. /etc/ssl/certs
#server_ssl_ca_path =

# SSL protocols to use, space-separated list of protocols
# (SSLv3 TLSv1 TLSv1.1 TLSv1.2); prefix with ! to lock out a protocol.
#server_ssl_protocols =

# SSL ciphers to use, set to 'ALL' for backward compatibility
#server_ssl_ciphers = ALL:!LOW:!SSLv2:!EXP:!aNULL

# Prefer the server's order of SSL ciphers over client's
#server_ssl_prefer_server_ciphers = no

# Path of SSL Public keys of clients
#sslkeys_path = /etc/kopano/sslkeys

##############################################################
# THREAD SETTINGS

# Number of server threads
#threads = 8

# Watchdog frequency. The number of watchdog checks per second.
#watchdog_frequency = 1

# Watchdog max age. The maximum age in ms of a task before a
# new thread is started.
#watchdog_max_age = 500

# SOAP recv timeout value (time between requests)
#server_recv_timeout = 5

# SOAP read timeout value (time during requests)
#server_read_timeout = 60

# SOAP send timeout value
#server_send_timeout = 60

##############################################################
#  OTHER SETTINGS

# Softdelete clean cycle (in days) 0=never running
#softdelete_lifetime = 30

# Sync lifetime, removes all changes remembered for a client after x days of inactivity
#sync_lifetime = 90

# Set to 'yes' if you have Kerberos, NTLM or OpenID Connect correctly configured for single sign-on
#enable_sso = no

# Set to 'yes' if you want to show the GAB to your users
#enable_gab = yes

# Let address book tables start out with zero entries until a criteria is (un)set
#abtable_initially_empty = no

# Authentication can be through plugin (default, recommended), pam or kerberos
#auth_method = plugin

# If auth_method is set to pam, you should provide the pam service name
#pam_service = passwd


#############################################################
# CACHE SETTINGS
#
# To see the live cache usage, use 'kopano-stats --system'.

# Size in bytes of the 'cell' cache (should be set as high as you can afford to set it)
#cache_cell_size = 256M

# Size in bytes of the 'object' cache
#cache_object_size = 16M

# Size in bytes of the 'indexed object' cache
#cache_indexedobject_size = 32M

# Size in bytes of the userquota details
#cache_quota_size = 1M

# Lifetime for userquota details
#cache_quota_lifetime = 1

# Size in bytes of the acl cache
#cache_acl_size = 1M

# Size in bytes of the store id/guid cache
#cache_store_size = 1M

# Size in bytes of the 'user id' cache (this is allocated twice)
#cache_user_size = 1M

# Size in bytes of the 'user details' cache
#cache_userdetails_size = 25M

# Lifetime for user details
#cache_userdetails_lifetime = 0

# Size in bytes of the server details (multiserver setups only)
#cache_server_size = 1M
# Lifetime for server details (multiserver setups only)
#cache_server_lifetime = 30


##############################################################
#  QUOTA SETTINGS

# The default Warning Quota Level. Set to 0 to disable this level.
# The user will receive an email when this level is reached. Value is in Mb. Default value is 0.
#quota_warn = 0

# The default Soft Quota Level. Set to 0 to disable this level.
# The user will still receive mail, but sending new mail is prohibited, until objects are removed from the store.
# VALUE is in Mb. Default value is 0.
#quota_soft = 0

# The default Hard Quota Level. Set to 0 to disable this level.
# The user can not receive and send mail, until objects are removed from the store.
# Value is in Mb. Default value is 0.
#quota_hard = 0

# The default Warning Quota Level for multitenant public stores. Set to 0 to disable this level.
# The tenant administrator will receive an email when this level is reached. Value is in Mb. Default value is 0.
#companyquota_warn = 0


##############################################################
#  USER PLUGIN SETTINGS

# Name of the plugin that handles users
# Required, default = db
# Values: ldap, unix, db
#user_plugin = db

# configuration file of the user plugin, examples can be found in /usr/share/doc/kopano/example-config
#user_plugin_config = /etc/kopano/ldap.cfg

# scripts which create stores for users from an external source
# used for ldap and unix plugins only
#createuser_script = /usr/lib/kopano/userscripts/createuser
#deleteuser_script = /usr/lib/kopano/userscripts/deleteuser
#creategroup_script = /usr/lib/kopano/userscripts/creategroup
#deletegroup_script = /usr/lib/kopano/userscripts/deletegroup
#createcompany_script = /usr/lib/kopano/userscripts/createcompany
#deletecompany_script = /usr/lib/kopano/userscripts/deletecompany

# Set this option to 'yes' to skip the creation and deletion of new users
# The action will be logged, so you can see if your changes to the plugin
# configuration are correct.
#user_safe_mode = no

##############################################################
# OPENID CONNECT SETTINGS

# Enable OpenID Connect Issuer Identifier
# When set, the server attempts OIDC discovery using the configured issuer
# identifier on startup. An Issuer Identifier is a case sensitive URL using the
# https scheme that contains scheme, host, and optionally, port number and path
# components. This no Issuer Identifier is set, OIDC support is disabled.
#kcoidc_issuer_identifier =

# Disable TLS validation for OpenID Connect requests
# When set to yes, TLS certificate validation is skipped for all requests
# related to OpenID connect. This is insecure and should not be used in
# production setups.
#kcoidc_insecure_skip_verify = no

# Timeout in seconds when to give up OpenID Connect discovery
# When the OIDC initialize timeout is reached, server continues startup without
# OIDC and all OIDC validation will fail until the discovery completes. When
# set to 0, the server startup does not wait for OIDC discovery at all.
#kcoidc_initialize_timeout = 60

##############################################################
# MISC SETTINGS

# Enable multi-tenancy environment
# When set to true it is possible to create tenants within the
# kopano instance and assign all users and groups to particular
# tenants.
# When set to false, the normal single-tenancy environment is created.
#enable_hosted_kopano = false

# Enable multi-server environment
# When set to true it is possible to place users and tenants on
# specific servers.
# When set to false, the normal single-server environment is created.
#enable_distributed_kopano = false

# Display format of store name
# Allowed variables:
#  %u Username
#  %f Full name
#  %c Tenant's name
#storename_format = %f

# Loginname format (for Multi-tenancy installations)
# When the user does not login through a system-wide unique
# username (like the email address) a unique name is created
# by combining the username and the tenantname.
# With this configuration option you can set how the
# loginname should be built up.
#
# Note: Do not use the = character in the format.
#
# Allowed variables:
#  %u Username
#  %c Teantname
#
#loginname_format = %u

# Everyone is a special internal group, which contains every user and group
# You may want to disable this group from the Global Addressbook by setting
# this option to 'yes'. Administrators will still be able to see the group.
#hide_everyone = no

# System is a special internal user, which has super-admin privileges
# You may want to disable this user from the Global Addressbook by setting
# this option to 'yes'. Administrators will still be able to see the user.
#hide_system = yes

# Use Indexing service for faster searching.
# Enabling this option requires the kopano-search service to
# be running.
#search_enabled = yes

# Path to the kopano-search service, this option is only required
# if the server is going to make use of the indexing service.
#search_socket = file:///var/run/kopano/search.sock
# Time (in seconds) to wait for a connection to the kopano-search service
# before terminating the indexed search request.
#search_timeout = 10

# Allow enhanced ICS operations to speedup synchronization with cached profiles.
#enable_enhanced_ics = yes

# SQL Procedures allow for some optimized queries when streaming with enhanced ICS.
# This is default disabled because you must set 'thread_stack = 256k' in your
# MySQL server config under the [mysqld] tag and restart your MySQL server.
#enable_sql_procedures = no

# Synchronize GAB users on every open of the GAB (otherwise, only on
# kopano-admin --sync)
#sync_gab_realtime = yes

# Disable features for users. This list is space separated.
# Currently valid values: imap pop3 mobile outlook webapp
#disabled_features = imap pop3

# Maximum number of deferred records in total
#max_deferred_records = 0

# Maximum number of deferred records per folder
#max_deferred_records_folder = 20

# Restrict the permissions that admins receive to folder permissions only. Please
# read the server.cfg manpage before enabling this option so you really understand
# the implications
#restrict_admin_permissions = no

# The maximum level of attachment recursion; Defines the number of
# attachment-in-attachment in-attachment levels are allowed when saving and
# replicating objects in the database. If you really want a higher level of
# recursion than about 20, you probably have to increase MySQL's stack_size
# to allow replication to work properly.
#embedded_attachment_limit = 20

# Header to detect whether a connection has been received through a proxy. The
# value of the header is not inspected. If the header exists then the connection
# is taken to be received via a proxy. An empty value disables proxy detection
# and the value of '*' is used to indicate that all connections are proxied
#proxy_header =

# Enable/disable reminders for shared stores
#shared_reminders = yes

Nun sind alle Vorbereitungen abgeschlossen und Kopano zum ersten mal gestartet werden. Wichtig, wenn man Postfix und Fetchmail einsetzt sollte man nun die Konfiguration für Postfix zuerst fertig machen. Damit ist sender_relay und sasl_passwd gemeint. Falls eine bestehende Installation abgelöst wird und ein Reverse Proxy im Einsatz ist, sollte man auch dort die Änderungen auf die neue IP usw. nun noch bearbeiten.

sudo systemctl start kopano-server

Wenn man alles richtig gemacht startet der Kopano-Server Prozess.

● kopano-server.service - Kopano Groupware Core Storage Server
     Loaded: loaded (/lib/systemd/system/kopano-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-03-05 12:17:02 CET; 4s ago
       Docs: man:kopano-server(8)
             man:kopano-server.cfg(5)
             man:kopano-admin(8)
   Main PID: 19916 (kopano-server)
      Tasks: 31 (limit: 4671)
     Memory: 21.8M
        CPU: 883ms
     CGroup: /system.slice/kopano-server.service
             └─19916 /usr/sbin/kopano-server -F

Kopano Benutzer einrichten

Nun richten wir einen Kopano Benutzer ein falls Ihr keine bestehende Datenbank zum zurück laden habt.

kopano-admin -c KOPANOBENUTZERNAME -p PASSWORT -e benutzer@meinedomain.ch -f "Vorname Nachname"

Nach diesem Schritte sollte es nun möglich sein sich einzuloggen via Webapp. Somit steht einmal die Grundbasis. Als nächstes wird Fetchmail konfiguriert welches die E-Mails abholt.

Fetchmail Installation

In meiner Konfiguration benutze ich Fetchmail dazu die E-Mails von einem Smarthost abzuholen. Das bedeutet die E-Mails werden von zb. Gmx oder einem anderen E-Maildienst entgegengenommen und dort zwischengespeichert. Fetchmail holt diese E-Mails regelmässig ab (alle X-Minuten) und speichert diese in die Kopano Datenbank. Damit Fetchmail funktioniert muss ein MTA installiert sein das ist unserem Fall Postfix. Fetchmail kann keine E-Mails speichern, es holt nur E-Mails ab und gibt diese an einen Benutzer weiter. Es kann E-Mails von verschiedenen Domains demselben Benutzer zuweisen oder unterschiedlichen.

sudo apt install fetchmail
nano /etc/default/fetchmail

Die Einstellung “START_DAEMON” muss noch auf “yes” geändert werden.

# This file will be used to declare some vars for fetchmail
#
# Uncomment the following if you dont want localized log messages
# export LC_ALL=C

# Declare here if we want to start fetchmail. 'yes' or 'no'
START_DAEMON=yes

Mit diesen 3 Befehlen wurde fetchmail installiert und konfiguriert dass der Deamon automatisch startet.

Die Fetchmail Datei “fetchmailrc” muss nun bearbeitet werden.

sudo nano /etc/fetchmailrc

Pro E-Mail Adresse welche vom Smarthost abgeholt wird kann ein Eintrag gemacht werden. Dazu kann einfach eine neue Zeile eingefügt werden mit den Angaben der neuen E-Mail Adresse. Die Fetchmail Accounts in der Übersicht.

#.fetchmailrc
set syslog;
set postmaster "kopanotest@test.ch";
# set no bouncemail
set no softbounce;
# accounts
poll testserver.hoststar.hosting proto pop3 user kopanotest@test.ch pass TESTPASSWORT options ssl smtpaddress localhost forcecr mda "/usr/sbin/kopano-dagent -s KOPANOBENTUTZER";

Da ich ja komplette Tutorials mache muss nun noch ein letzter wichtiger Schritt unternommen werden.

In der server.cfg muss noch der Fetchmail Benutzer hinzugefügt werden. Ansonsten hat Fetchmail keine Berechtigung auf den Kopano-Dagent zuzugreifen.

sudo nano /etc/kopano/server.cfg

Das betrifft die Zeile mit: local_admin_users, die sollte dann wie in diesem Beispiel aussehen.

# local admin users who can connect to any store (use this for the kopano-dagent)
# field is SPACE separated
# eg: local_admin_users = root vmail
# Default: root
local_admin_users = root kopano fetchmail

# With owner_auto_full_access=true, the owner of an object is, in addition to
# any ACLs, implicitly granted "read", "create-in" and "is-visible" rights,
# even if the store belongs to another user, for example, when it has been
# moved via kopano-storeadm -D,-A.

In der Webapp ist nun das erste E-Mail ersichtlich. Natürlich muss dafür die Webapp installiert sein, damit man das sehen kann. Die Webapp installieren wir als nächstes.

Webapp Posteingang
Webapp Posteingang

Webapp Installation

Die Kopano Webapp ist unerlässlich, sie bietet das Userinterface an und ermöglicht dann das arbeiten mit Kopano. Dazu gibt es noch einen Client welcher auf Mac oder Windows installiert werden kann. Dieser öffnet aber eigentlich nur die Webseite vermittelt aber den Eindruck einer fix installierten Software.

Die Webapp wird mit dem nächsten Befehl ausgeführt.

sudo apt install -y kopano-webapp

Der Apache 2 Webserver muss neu gestartet werden.

sudo systemctl reload apache2
phpenmod kopano
sudo systemctl enable apache2
sudo systemctl reload apache2

Aktivierung aller Module in Apache 2, diese müssten nun alle aktiv sein auch SSL / TLS. Mit dem 2 Befehl wird die darauf folgende Liste aufgeführt. Nach der Liste folgt eine weitere Erläuterung dazu.

sudo a2enmod ssl
apache2ctl -M

core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
filter_module (shared)
mime_module (shared)
mpm_prefork_module (shared)
negotiation_module (shared)
php7_module (shared)
reqtimeout_module (shared)
setenvif_module (shared)
socache_shmcb_module (shared)
 
ssl_module (shared)
status_module (shared)

headers_module (shared)
rewrite_module (shared)
perl_module

sudo systemctl enable apache2
sudo systemctl reload apache2

Zuerst wird das SSL Modul geladen, die anderen Module sollten standardmässig aktiv sein. Die untersten 3 Module welche mit Abstand aufgelistet sind, sind wohl eher optional. Die Webapp und Z-Push funktionieren auch ohne diese Module. Am Schluss wird der Apache 2 neu geladen.

Z-Push Installation

Z-Push ist notwendig um die Daten auf Tablets und Mobiltelefone zu synchronisieren. Erst damit ergibt sich ein echter Mehrwehrt einer Groupware wie Kopano. Die Installation ist recht einfach.

sudo apt install -y z-push-kopano z-push-config-apache

Wieder laden wir den Apache 2 Webserver neu.

sudo systemctl reload apache2

Android Exchange Konto einrichten

Auf Android sieht dann die Installation wie folgt aus. Ein neues E-Mail Konto einrichten und Exchange anwählen.

Android Exchange Konto hinzufügen
Android Exchange Konto hinzufügen

Anschliessend

E-Mail erfassen

Sobald man eine E-Mail Adresse erfasst, kann man auf “Manuell einrichten” klicken. Das müssen wir machen, es gäbe noch die Möglichkeit via AutoDiscovery. Das kenne ich aber nicht und ist für mich auch nicht notwendig.

Exchange Einstellungen

Unter E-Mail Adresse wird die E-Mail Adresse eingetragen von der man versenden wird. Wenn man nur eine E-Mail hat dann diese Eintragen. Wen mehrere E-Mails in ein Kopano Konto geladen werden dann muss die Hauptemailadresse hinterlegt werden. Wichtig, vom Smartphone aus kann dann nur mit dieser Hauptemail versendet werden. Das Passwort ist das Kopano Passwort welches angelegt wurde mit dem Kopano Benutzer. Anschliessend folgt unter “Domain\Nutzername” der Kopano Benutzer.

Unter “Server” wird die Domain eingetragen wo der Kopano Server erreichbar ist. Natürlich wird “SSL/TLS” angewählt als Verbindungsart.

Kopano Datenbank sichern

NFS Verbindung zu externem Laufwerk herstellen. Man muss nicht zwingend eine NFS Verbindung machen CIFS wäre auch möglich. Ich sichere die Datenbank gerne auf einen externen Pfad als nur auf demselben virtuellen Maschine wie der Kopano Server. Zudem muss ich gewöhnerlicherweise NFS-Common zuerst installieren daher ist dieser Befehl hier auch erwähnt.

sudo apt install -y nfs-common
sudo mount 192.168.XXX.XXX:/SERVERPFAD/ /home/BENUTZERNAME/backups

Nun kommt der wichtige Befehl um eine Kopano Datenbank zu sicher, wichtig sind dabei die beiden Optionen –single-transacation und –routines. Der Pfad sowie der Name der Backupdatei kann natürlich varieren. Auch der Benutzername und der Datenbankname ist individuell und kann nicht allgemein gesagt werden.

mysqldump -u BENUTZERNAME -p DATENBANKNAME --single-transaction --routines > /home/BENUTZERNAME/backups/kopanobackup.sql

Standardmässig wird mit Debian 11 die MariaDB V.10.5 oder höher installiert. Die Anmeldung kann mit Root Account gemacht werden falls noch keine Benutzer angelegt wurden.

mysql
SHOW DATABASES;

Ich habe dies nun gemacht nachdem ich die “kopano-server-packages” und “mariadb-server” installiert habe. Die folgende Ausgabe habe ich erhalten. Man sieht nun was angelegt wurde bei der Installation. Mit diesen Informationen soltle es nun möglich sein eine Datenbank zu sichern oder nachzuschauen was für Datenbanken auf einem MariaDB Server vorhanden sind. In diesem Fall wäre der DATENBANKNAME “mysql”.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.016 sec)

Kopano Datenbank zurück laden (restore)

Wenn man bereits eine Kopano Datenbank hat, will man diese Datenbank natürlich zurückladen damit man die alten E-Mails wieder hat. Für Installationen welche komplett neu sind ist das natürlich nicht relevant. Wichtig: wenn man die Dokumente nicht in der Datenbank gespeichert hat, dann sind diese auf dem Filesystem abgelegt und müssen natürlich mit gesichert werden. Ich habe die Dokumente in der Datenbank gespeichert und muss dies nicht separat machen. Unter Kopano Befehle findet ihr ausserdem eine paar Hilfreiche Tricks. Es ist unter umständen nötig, dass Ihr direkt nach dem Restore die Datenbank Version anpasst.