Diese Anleitung basiert auf Ubuntu 16.04 LTS. Momentan ist Ubuntu Server 18.04 die aktuelle LTS-Version und wir empfehlen PHP 7.0 als Basis für 1CRM. Die Anleitungen werden wir so bald wie möglich aktualisieren.
Die Schritt-für-Schritt-Anleitung ist keine Garantie für einen funktionierenden oder sicheren CRM-Server, da diese beiden (sehr wünschenswerten) Eigenschaften entscheidend von einer Vielzahl von externen Parametern abhängen.
Wie bereits beschrieben, setzen wir bei der Verwaltung unserer Server auf Ubuntu LTS und ISPConfig als Verwaltungsoberfläche.
In diesem HowTo gehen wir etwas weiter in die Tiefe und setzen ein gewisses Linux-Grundwissen voraus. Damit Sie den CRM-Server auch später sinnvoll verwalten können, ist ein wenig Linux-Wissen hilfreich und sogar dringend erforderlich, wenn Sie den Server später über das Internet erreichbar machen wollen.
Was ist ISPConfig?
ISPConfig steht für Internet Service Provider Configuration und ist eine Open-Source-Software zur Verwaltung der für Webserver relevanten Dienste wie ftp, E-Mail, MySQL und Firewall. Mit ISPConfig lassen sich auch Kunden von Webhostern verwalten und damit deren Internet-Domains, E-Mail-Konten etc. ISPConfig bringt nicht nur Vorteile für spezialisierte Webhoster. Wenn Sie es im Intranet als Basis des CRM-Systems verwenden, können Sie über ISPConfig alle Einstellungen des Webservers verwalten und ohne großen Aufwand ein Testsystem einrichten und z. B. auch Backups verwalten.
Das brauchen Sie für Ihren CRM-Server
Meistens ist es bei uns so, dass z. B. ein Mailserver bereits existiert, genau wie der DNS. FTP wollen wir auf unseren Servern gar nicht haben, daher reduziert sich die Einrichtung im Vergleich zu einem vollständigen Webserver-System mit ISPConfig auf:
Laden Sie sich die aktuelle LTS-Version des Ubuntu Servers herunter.
# System updaten
apt update
apt upgrade
# Ubuntu neustarten
reboot
Wechseln Sie von der Systemshell Dash
auf Bash
als Default-Shell mit folgendem Befehl und wählen Sie anschließend No
:
dpkg-reconfigure dash
ISPConfig hat mit der Ubuntu-Standard-Shell Dash
Probleme und lässt sich nur mit der Bash
-Shell installieren.
# AppArmor deaktivieren und entfernen
service apparmor stop
update-rc.d -f apparmor remove
apt remove apparmor apparmor-utils
AppArmor
ist eine Sicherheitssoftware, mit der sich Zugriffe von Programmen über das Netzwerk kontrollieren lassen. An sich eine gute Sache. Doch leider führt der Einsatz von AppArmor immer wieder zu Problemen: Zugriffe, die wir haben wollen, werden als negativ eingestuft und gesperrt. Aus diesem Grund deaktivieren wir AppArmor und schützen uns an anderer Stelle mit einer sinnvoll konfigurierten Firewall.
# Automatische Zeitsynchronisation installieren
apt -y install ntp ntpdate
Installieren Sie den MTA Postfix
, MariaDB
, OpenSSL
und den Rootkit-Scanner RKHunter
:
apt -y install postfix postfix-doc mariadb-client mariadb-server openssl rkhunter binutils
Bei der Installation von Postfix
öffnet sich ein Fenster für die Konfiguration des E-Mail-Dienstes.
Variante 1: Wählen Sie Smarthost
, wenn Ihr Server nur lokal erreichbar sein soll.
Variante 2: Wählen Sie Internet-Site
, wenn Ihr Server öffentlich über das Internet erreichbar sein soll.
Konfigurieren Sie nun MariaDB folgendermaßen, damit die CRM-Datenbank über das Netz erreichbar ist:
Aufrufen der Konfigurationsdatei:
# Konfigurationsdatei mit dem Editor Vi aufrufen
vi /etc/mysql/mariadb.conf.d/50-server.cnf
[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure
#bind-address = 127.0.0.1
[...]
In der Standard-Konfiguration lässt MySQL einen Netzwerk-Zugriff nur über den Localhost zu.
service mysql restart
mysql_secure_installation
Wählen Sie bei den Abfragen folgende Werte:
Enter current password for root (enter for none)
: Enter drücken
Set root password? [Y/n]
: y für Ja
New password
: MariaDB Root-Passwort eingeben
Re-enter new password
: Passwort wiederholen
Remove anonymous users? [Y/n]
: y für Ja
Disallow root login remotely? [Y/n]
: y für Ja
Reload privilege tables now? [Y/n]
: y für Ja
Bei dieser Anleitung setzen wir nicht auf den Standard-LAMP-Stack, sondern ersetzen den Apache durch NGINX. Mit NGINX haben wir hervorragende Performance-Erfahrungen in Kombination mit PHP 5.5 und 1CRM als CRM-System gemacht.
Teilweise erreicht die unten beschriebene Konfiguration etwa 40 % mehr Geschwindigkeit als unsere Apache-Fcgi-PHP Konfigurationen. Eine allgemeine Aussage kann man hiervon jedoch nicht ableiten. Wir werden die unterschiedlichen Systeme aber natürlich im Auge behalten und weitere Erfahrungen berichten.
# NGINX installieren
apt install -y nginx
# NGINX starten
service nginx start
PHP 7.0
:
#PHP-Installation vorbereiten
apt install -y python-software-properties
add-apt-repository -y ppa:ondrej/php
apt update
apt upgrade
#PHP installieren
apt -y install php7.0-opcache php7.0-fpm php7.0 php7.0-common php7.0-gd php7.0-mysql php7.0-imap php7.0-cli php7.0-cgi php-pear php-authp php7.0-mcrypt mcrypt imagemagick php7.0-curl php7.0-intl php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl memcached php-memcache php-imagick php-gettext php7.0-zip php7.0-mbstring php7.0-soap
Optional können Sie PHP 7.1
installieren:
apt -y install php7.1-opcache php7.1-fpm php7.1 php7.1-common php7.1-gd php7.1-mysql php7.1-imap php7.1-cli php7.1-cgi php7.1-mcrypt php7.1-curl php7.1-intl php7.1-pspell php7.1-recode php7.1-sqlite3 php7.1-tidy php7.1-xmlrpc php7.1-xsl php7.1-zip php7.1-mbstring php7.1-soap
phpenmod mcrypt
phpenmod mbstring
phpenmod imap
phpenmod soap
APC
als PHP-Cache, um die Performance zu verbessern:
apt install -y php-apcu
vi /etc/php/7.0/fpm/php.ini
[...]
cgi.fix_pathinfo=0
[...]
date.timezone="Europe/Berlin"
[...]
memory_limit = 512M
[...]
post_max_size = 200M
[...]
upload_max_filesize = 100M
[...]
memory_limit
und die Upload-Größen
werden später von 1CRM benörigt.
service php7.0-fpm reload
add-apt-repository ppa:certbot/certbot
apt update
apt install certbot
Quota
:
apt install -y quota quotatool
Hierzu muss die Datei /etc/fstab
angepasst werden:
# mount -o remount /
# quotacheck -avugm
Fehlermeldungen sind dabei normal:
quotaon -avug
apt -y install build-essential autoconf automake1.11 libtool flex bison debhelper binutils
cd /tmp
wget https://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz
tar xvfz jailkit-2.19.tar.gz
cd jailkit-2.19
./debian/rules binary
cd ..
dpkg -i jailkit_2.19-1_*.deb
rm -rf jailkit-2.19*
Fail2ban
:
apt install -y fail2ban
service nginx restart
cd /tmp
wget -O ispconfig.tar.gz https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=stable-3.1
tar xfz ispconfig.tar.gz
cd ispconfig3*/install/
php -q install.php
Verwenden Sie den Experten-Modus, da nicht alle möglichen Dienste für ISPConfig installiert wurden, sondern nur die erforderlichen für einen CRM-Web-Server und wählen Sie folgende Antworten:
Configure Mail (y,n) [y]
: n für Nein
Force configure pureftpd (y,n) [y]
: n für Nein
Configure DNS Server (y,n) [y]
: n für Nein
Configure Web Server (y,n) [y]
: y für Ja
Force configure OpenVZ (y,n) [y]
: n für Nein
Configure Firewall Server (y,n) [y]
: n für Nein
Force configure Metronome XMPP Server (y,n) [y]
: n für Nein
Es gibt ein hervorragendes Handbuch für ISPConfig, was Till Brehm und Falko Timme für 5 € verkaufen – bitte schlagen Sie zu und unterstützen Sie die Weiterentwicklung von ISPConfig: https://www.howtoforge.com/download-the-ispconfig-3-manual.
Jetzt ist ISPConfig über https://ihr.server.de:8080
. Das Standard-Passwort admin
für den Benutzer sollte so schnell wie möglich geändert werden!
Passen Sie die NGINX vhost-Konfiguration
etwas an, damit jsmin
und die API unter 1CRM auszuführen. Diese muss vor der Bearbeitung in den custom-Konfigurationsordner
kopiert werden:
cd /usr/local/ispconfig/server
cp conf/nginx_vhost.conf.master conf-custom/
vi conf-custom/nginx_vhost.conf.master
ISPConfig bindet PHP im Standard über die Verwendung eines @php-Templates ein. Entfernen Sie dieses und verwenden stattdessen einen regulären Ausdruck, der auch ein Routing über eine PHP-Datei erlaubt, wie es z.B. jsmin oder diverse PHP-Frameworks machen. Entfernen Sie HHVM komplett aus der Konfiguration, da es nicht installiert wurde. Das Diff sieht wie folgt aus:
--- ../conf/nginx_vhost.conf.master 2017-06-28 12:12:21.042308712 +0200
+++ nginx_vhost.conf.master 2017-06-28 13:30:17.126343612 +0200
@@ -150,57 +150,30 @@
alias /usr/share/awstats/icon;
}
- location ~ \.php$ {
- try_files <tmpl_var name='rnd_php_dummy_file'> @php;
- }
<tmpl_if name='php' op='==' value='php-fpm'>
- location @php {
- try_files $uri =404;
- include /etc/nginx/fastcgi_params;
+ location ~ ^(.+\.php)(.*)$ {
+ fastcgi_split_path_info ^(.+\.php)(.*)$;
+ if (!-f $document_root$fastcgi_script_name) {
+ return 404;
+ }
+ include /etc/nginx/fastcgi_params;
<tmpl_if name='use_tcp'>
fastcgi_pass 127.0.0.1:<tmpl_var name='fpm_port'>;
</tmpl_if>
<tmpl_if name='use_socket'>
fastcgi_pass unix:<tmpl_var name='fpm_socket'>;
</tmpl_if>
- fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- #fastcgi_param PATH_INFO $fastcgi_script_name;
+ fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_intercept_errors on;
+ fastcgi_read_timeout 600s;
+ fastcgi_buffer_size 128k;
+ fastcgi_buffers 8 256k;
+ fastcgi_busy_buffers_size 256k;
+ fastcgi_pass_header Authorization;
}
</tmpl_else>
- <tmpl_if name='php' op='==' value='hhvm'>
- location @php {
- try_files $uri =404;
- include /etc/nginx/fastcgi_params;
- fastcgi_pass unix:/var/run/hhvm/hhvm.<tmpl_var name='system_user'>.sock;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- #fastcgi_param PATH_INFO $fastcgi_script_name;
- fastcgi_intercept_errors on;
- error_page 500 501 502 503 = @phpfallback;
- }
-
- location @phpfallback {
- try_files $uri =404;
- include /etc/nginx/fastcgi_params;
-<tmpl_if name='use_tcp'>
- fastcgi_pass 127.0.0.1:<tmpl_var name='fpm_port'>;
-</tmpl_if>
-<tmpl_if name='use_socket'>
- fastcgi_pass unix:<tmpl_var name='fpm_socket'>;
-</tmpl_if>
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- #fastcgi_param PATH_INFO $fastcgi_script_name;
- fastcgi_intercept_errors on;
- }
- </tmpl_else>
-
- location @php {
+ location ~ ^(.+\.php)(.*)$ {
deny all;
}
- </tmpl_if>
</tmpl_if>
<tmpl_if name='cgi' op='==' value='y'>