![](http://1.bp.blogspot.com/-y33gCqgy8P4/XRL6FkCQs6I/AAAAAAAARhk/slqzjcVouKkWTr_YuYZd0c7wLWu01DgwQCLcBGAs/s1600/ISPConfig3_Ubuntu_1904.png)
ISPConfig is an open source web hosting control panel let's you configure the following services through its browser based interface:
Manage multiple servers from one control panel
Web server management (Apache2 and nginx)
Mail server management (with virtual mail users)
DNS server management (BIND and MyDNS)
Virtualization (OpenVZ)
Administrator, reseller and client login
Configuration mirroring and clusters
Open Source software (BSD license)
Prerequisites
To follow this tutorial, you will need one Ubuntu 18.04 server installed either on a (Physical or Virtual) machine with a non-root user having sudo privileges.
Setting Timezone and Hostname
sudo timedatectl set-timezone Asia/Karachi
sudo hostnamectl set-hostname labserver.layloyar.com
Set Up Default Shell
sudo dpkg-reconfigure dash
![](http://1.bp.blogspot.com/-GxGrN6sGjv8/XMbQrxC8gfI/AAAAAAAARWY/vzqZy57ZOgY8anCkRpPskoIo6a65ACifQCLcBGAs/s1600/ISPConfig3_dash_default_shell.png)
Uninstall Apparmor
sudo service apparmor stop
sudo apt autoremove apparmor apparmor-utils
Output
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package 'apparmor-utils' is not installed, so not removed
The following packages will be REMOVED:
apparmor snapd
0 upgraded, 0 newly installed, 2 to remove and 87 not upgraded.
After this operation, 69.4 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 66906 files and directories currently installed.)
Removing snapd (2.37.1.1+18.04) ...
Removing apparmor (2.12-4ubuntu5.1) ...
Processing triggers for mime-support (3.60ubuntu1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Installing Postfix and Database
sudo apt -y install postfix postfix-mysql postfix-doc mariadb-client mariadb-server openssl getmail4 rkhunter binutils dovecot-imapd dovecot-pop3d dovecot-mysql dovecot-sieve dovecot-lmtpd
During installation postfix will present you following screen, choose Internet Site and press OK
![](http://2.bp.blogspot.com/-oBGF3J-61-I/XMbRCcN7j8I/AAAAAAAARWk/pI4-LXDVLYsvQu8RrUWjooudzeVSE1smQCLcBGAs/s1600/ISPConfig3_postfix_configuration-1.png)
Enter you FQDN on this screen and press OK
![](http://2.bp.blogspot.com/-vGnjMmn8h2w/XMbRCJStZJI/AAAAAAAARWg/Kin6pKQ6cToS6v6gMVX8HuRaqBdOhqwWwCLcBGAs/s1600/ISPConfig3_postfix_configuration-2.png)
Edit master.cf file and add or replace the following contents:
sudo nano /etc/postfix/master.cf
Change this:
#submission inet n - y - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_tls_auth_only=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
#smtps inet n - y - - smtpd
# -o syslog_name=postfix/smtps
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
to this:
#submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_tls_auth_only=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
#smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
Save and close.
This will look smiliar to like below.
![](http://2.bp.blogspot.com/-uraO46XbwqE/XMbSCP1kLwI/AAAAAAAARW0/0BAr8p_n0XAeLSaUSc9xg3Y9IKC1rxHQwCLcBGAs/s1600/ISPConfig3_postfix_configuration-3.png)
Now restart postfix service to take changes into effect
sudo systemctl restart postfix
Output:
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2019-04-29 10:11:55 PKT; 14s ago
Process: 27934 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 27934 (code=exited, status=0/SUCCESS)
Apr 29 10:11:55 labserver systemd[1]: Starting Postfix Mail Transport Agent...
Apr 29 10:11:55 labserver systemd[1]: Started Postfix Mail Transport Agent.
Now edit 50-server.cnf file and replace the following
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Change this:
bind-address = 127.0.0.1
to this:
#bind-address = 127.0.0.1
Save and close.
This will look similiar to like below
![](http://2.bp.blogspot.com/-LjZKKCSYI3o/XMbS5alkSrI/AAAAAAAARXA/kmTGw8-ygL0A3-mudZ5e2VdfGS8AsSvRACLcBGAs/s1600/ISPConfig3_mysql_mariadb.conf.d_50-server.cnf.png)
Securing MySQL
sudo mysql_secure_installation
Output:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
You already have a root password set, so you can safely answer 'n'.
Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Login to mysql prompt and execute the following.
sudo mysql -u root -p
update mysql.user set plugin = 'mysql_native_password' where user='root';
Output:
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
exit
![](http://1.bp.blogspot.com/-NtrWTZCyQuI/XMbTU8QAFsI/AAAAAAAARXI/C6FBvYPc6PcziMLcTHOgzDIfOwqtWgf0ACLcBGAs/s1600/ISPConfig3_mysql_native_password.png)
Edit debian.cnf file and update the following.
sudo nano /etc/mysql/debian.cnf
Change this:
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = root
password =
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password =
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
to this:
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = root
password = TypePasswordHere
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password = TypePasswordHere
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
Save and close.
This will look smiliar to like below.
![](http://1.bp.blogspot.com/-S0CkS_9SJhk/XMbTuQQ39TI/AAAAAAAARXQ/S-RUUQmq_ZUoLXT0XX3a5qPR7HkaXaMegCLcBGAs/s1600/etc_mysql_debian.cnf.png)
Restart database service to take changes into effect.
sudo systemctl restart mysql
Installing SpamAssassin
sudo apt -y install amavisd-new spamassassin clamav clamav-daemon unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl postgrey
sudo freshclam
Ignore these errors
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
sudo systemctl start clamav-daemon
sudo wget https://git.ispconfig.org/ispconfig/ispconfig3/raw/stable-3.1/helper_scripts/ubuntu-amavisd-new-2.11.patch --directory-prefix=/tmp
sudo cp -pf /usr/sbin/amavisd-new /usr/sbin/amavisd-new-orignal
sudo patch < /tmp/ubuntu-amavisd-new-2.11.patch
Output:
patching file amavisd-new
Hunk #2 succeeded at 34363 (offset 1 line).
Installing Metronome XMPP Server
sudo apt -y install git lua5.1 liblua5.1-0-dev lua-filesystem libidn11-dev libssl-dev lua-zlib lua-expat lua-event lua-bitop lua-socket lua-sec luarocks luarocks
sudo luarocks install lpc
Output:
Installing https://luarocks.org/lpc-1.0.0-2.src.rock
gcc -O2 -fPIC -I/usr/include/lua5.1 -c lpc.c -o lpc.o
gcc -shared -o lpc.so lpc.o
install -d /usr/local/lib/luarocks/rocks/lpc/1.0.0-2/lib
install lpc.so /usr/local/lib/luarocks/rocks/lpc/1.0.0-2/lib
lpc 1.0.0-2 is now installed in /usr/local (license: MIT/X11)
sudo adduser --no-create-home --disabled-login --gecos 'Metronome' metronome
Output:
Adding user `metronome' ...
Adding new group `metronome' (1001) ...
Adding new user `metronome' (1001) with group `metronome' ...
Not creating home directory `/home/metronome'.
sudo git clone https://github.com/maranda/metronome.git /opt/metronome
Output:
Cloning into '/opt/metronome'...
remote: Enumerating objects: 185, done.
remote: Counting objects: 100% (185/185), done.
remote: Compressing objects: 100% (132/132), done.
remote: Total 13177 (delta 96), reused 122 (delta 49), pack-reused 12992
Receiving objects: 100% (13177/13177), 4.08 MiB | 404.00 KiB/s, done.
Resolving deltas: 100% (7646/7646), done.
cd /opt/metronome
sudo ./configure --ostype=debian --prefix=/usr
Output:
Looking for Lua... lua5.1 found in $PATH: /usr/bin
Checking Lua includes... lua.h found in /usr/include/lua5.1/lua.h
Writing configuration...
Installation prefix: /usr
Metronome configuration directory: /etc/metronome
Using Lua from: /usr
Done. You can now run 'make' to build.
sudo make
sudo make install
Installing Apache, PHP, phpMyAdmin
sudo apt -y install apache2 apache2-doc apache2-utils libapache2-mod-php php7.2 php7.2-common php7.2-gd php7.2-mysql php7.2-imap phpmyadmin php7.2-cli php7.2-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt imagemagick libruby libapache2-mod-python php7.2-curl php7.2-intl php7.2-pspell php7.2-recode php7.2-sqlite3 php7.2-tidy php7.2-xmlrpc php7.2-xsl memcached php-memcache php-imagick php-gettext php7.2-zip php7.2-mbstring php-soap php7.2-soap
Select apache2 and press Ok
![](http://3.bp.blogspot.com/-PqHOvFPlKFI/XMbUKTL6WNI/AAAAAAAARXg/gCPS4FJ3XSUuwYXNfIbSS5COQ3x1FZ6_QCLcBGAs/s1600/ISPConfig3_configuring_phpmyadmin-1.png)
Press Yes
![](http://4.bp.blogspot.com/-HlRRJh832FE/XMbUKc9TmaI/AAAAAAAARXY/c9lCLUdOi3AdPTuJt5C9MCKZYUFDq5nawCLcBGAs/s1600/ISPConfig3_configuring_phpmyadmin-2.png)
Type your desired password here and press Ok.
![](http://3.bp.blogspot.com/-jDoNNVmUgGA/XMbUKCcOr6I/AAAAAAAARXc/DNSuj0-k23MV6Rz-VDRHoRo1hYrLxWs8ACLcBGAs/s1600/ISPConfig3_configuring_phpmyadmin-3.png)
Type confirm password and press Ok.
![](http://2.bp.blogspot.com/-5qe7jwmbijM/XMbULTCDwlI/AAAAAAAARXk/ZN98Ba-pXa45j77YRSiJh4YK9KVRWysvQCLcBGAs/s1600/ISPConfig3_configuring_phpmyadmin-4.png)
sudo a2enmod suexec rewrite ssl actions include cgi
Output:
Enabling module suexec.
Enabling module rewrite.
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
Enabling module actions.
Considering dependency mime for include:
Module mime already enabled
Enabling module include.
Enabling module cgi.
To activate the new configuration, you need to run:
systemctl restart apache2
sudo a2enmod dav_fs dav auth_digest headers
Output:
Considering dependency dav for dav_fs:
Enabling module dav.
Enabling module dav_fs.
Module dav already enabled
Considering dependency authn_core for auth_digest:
Module authn_core already enabled
Enabling module auth_digest.
Enabling module headers.
To activate the new configuration, you need to run:
systemctl restart apache2
Keeping security into consideration we need to disable HTTP_PROXY header.
sudo nano /etc/apache2/conf-available/httpoxy.conf
<IfModule mod_headers.c>
RequestHeader unset Proxy early
</IfModule>
Save adn close.
![](http://1.bp.blogspot.com/-ZIArDSkTus4/XMbVDAm4RYI/AAAAAAAARX4/0NBj9LMczsMUoI4u2Mvo2ta3YKTUDNZeACLcBGAs/s1600/ISPConfig3_HTTP_PROXY_header_disable.png)
Enable the config file by running:
sudo a2enconf httpoxy
Output:
Enabling conf httpoxy.
To activate the new configuration, you need to run:
systemctl reload apache2
Installing PHP Opcode cache
sudo apt -y install php7.2-opcache php-apcu
sudo systemctl restart apache2
Installing PHP-FPM
sudo apt -y install php7.2-fpm
sudo a2enmod actions proxy_fcgi alias
Output:
Module actions already enabled
Considering dependency proxy for proxy_fcgi:
Enabling module proxy.
Enabling module proxy_fcgi.
Module alias already enabled
To activate the new configuration, you need to run:
systemctl restart apache2
Installing HHVM
sudo apt -y install hhvm
Installing Let's Encrypt
sudo apt -y install certbot
Installing Mailman
sudo apt -y install mailman
Select your desired language and press Ok.
![](http://3.bp.blogspot.com/-idVdT6u4Pnc/XMbVkplLZrI/AAAAAAAARYE/gIkRqnI8PWQ9vDRoYB3gpjmnbzIttCb9QCLcBGAs/s1600/ISPConfig3_mailman_configuration-1.png)
Press Ok.
![](http://2.bp.blogspot.com/-c4VW9KFJAog/XMbVku90Z5I/AAAAAAAARYI/jwlsxZzK_PQiZJshI_JwEpMq4FY_wyGOQCLcBGAs/s1600/ISPConfig3_mailman_configuration-2.png)
Type following command and respond to the following highlited
sudo newlist mailman
Enter the email of the person running the list: support@layloyar.com
Initial mailman password:TypePasswordHere
To finish creating your mailing list, you must edit your /etc/aliases (or
equivalent) file by adding the following lines, and possibly running the
`newaliases' program:
## mailman mailing list
mailman: "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join: "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request: "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman"
Hit enter to notify mailman owner...
sudo nano /etc/aliases
Add the following contents into the file:
mailman: "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join: "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request: "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman"
Save and close.
![](http://3.bp.blogspot.com/-t20sbH6TOC0/XMbVkiUs9PI/AAAAAAAARYA/C_p1y8G44IEoa5Pqr03xoYmN3hLyxndeACLcBGAs/s1600/ISPConfig3_mailman_configuration-3.png)
sudo newaliases
sudo systemctl restart postfix
sudo ln -s /etc/mailman/apache.conf /etc/apache2/conf-available/mailman.conf
sudo a2enconf mailman
Output:
Enabling conf mailman.
To activate the new configuration, you need to run:
systemctl reload apache2
Restart Apache services to take changes into effect
sudo systemctl restart apache2
sudo systemctl start mailman
Installing PureFTPd
sudo apt -y install pure-ftpd-common pure-ftpd-mysql quota quotatool
sudo nano /etc/default/pure-ftpd-common
Change following from false to true:
VIRTUALCHROOT=true
Save and close.
![](http://1.bp.blogspot.com/-s9KDTiXPKKE/XMbWf0QRfqI/AAAAAAAARYc/epuYv82ZlEQDqIABblAKkmQw6Jn5ZBzZwCLcBGAs/s1600/ISPConfig3_pure_ftpd_common_configuration-2.png)
Now generate an ssl certificate to secure PureFTPD communication
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
Output:
Generating a 2048 bit RSA private key
..................................................................................................+++
......+++
writing new private key to '/etc/ssl/private/pure-ftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PK
State or Province Name (full name) [Some-State]:Sindh
Locality Name (eg, city) []:Karachi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Laying
Organizational Unit Name (eg, section) []:Services
Common Name (e.g. server FQDN or YOUR name) []:labserver.layloyar.com
Email Address []:support@layloyar.com
sudo chmod 600 /etc/ssl/private/pure-ftpd.pem
sudo systemctl restart pure-ftpd-mysql
Set Up PureFTPd Qouta
sudo nano /etc/fstab
apend the following line:
UUID=cf9de5a1-9a14-4ce4-bae6-1fa672a45f2b / ext4 errors=remount-ro,usrjquota=quota.user,grpjquota=quota.group,jq
fmt=vfsv0 0 1
Save and close.
sudo mount -o remount /
sudo quotacheck -avugm
Output:
quotacheck: Scanning /dev/sda2 [/] done
quotacheck: Cannot stat old user quota file //quota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file //quota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old user quota file //quota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file //quota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Checked 13608 directories and 95629 files
quotacheck: Old file not found.
quotacheck: Old file not found.
sudo quotaon -avug
Output:
/dev/sda2 [/]: group quotas turned on
/dev/sda2 [/]: user quotas turned on
Installing BIND DNS Server
sudo apt -y install bind9 dnsutils haveged
sudo systemctl enable haveged
Output:
Synchronizing state of haveged.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable haveged
sudo systemctl start haveged
Installing Vlogger, Webalizer, and AWStats
sudo apt -y install vlogger webalizer awstats geoip-database libclass-dbi-mysql-perl
sudo nano /etc/cron.d/awstats
Change this:
MAILTO=root
*/10 * * * * www-data [ -x /usr/share/awstats/tools/update.sh ] && /usr/share/awstats/tools/update.sh
# Generate static reports:
10 03 * * * www-data [ -x /usr/share/awstats/tools/buildstatic.sh ] && /usr/share/awstats/tools/buildstatic.sh
to this:
#MAILTO=root
#*/10 * * * * www-data [ -x /usr/share/awstats/tools/update.sh ] && /usr/share/awstats/tools/update.sh
# Generate static reports:
#10 03 * * * www-data [ -x /usr/share/awstats/tools/buildstatic.sh ] && /usr/share/awstats/tools/buildstatic.sh
Save and close.
![](http://3.bp.blogspot.com/-TEmYCKSFMrw/XMbW89lRqBI/AAAAAAAARYk/ZGi22ZLf4PQ1x7T3PG5P7dlke9_wo9W8QCLcBGAs/s1600/ISPConfig3_cron.d_awstats.png)
Installing Jailkit
sudo apt -y install build-essential autoconf automake1.11 libtool flex bison debhelper binutils
wget http://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz --directory-prefix=/tmp
cd /tmp
sudo tar xvfz /tmp/jailkit-2.19.tar.gz
sudo echo 5 > /tmp/jailkit-2.19/debian/compat
cd /tmp/jailkit-2.19
sudo ./debian/rules binary
sudo dpkg -i /tmp/jailkit*.deb
Output:
Selecting previously unselected package jailkit.
(Reading database ... 99559 files and directories currently installed.)
Preparing to unpack /tmp/jailkit_2.19-1_amd64.deb ...
Unpacking jailkit (2.19-1) ...
Setting up jailkit (2.19-1) ...
Processing triggers for ureadahead (0.100.0-20) ...
Processing triggers for systemd (237-3ubuntu10.12) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Installing fail2ban
sudo apt -y install fail2ban
sudo nano /etc/fail2ban/fail.local
Add following contents into file:
[pure-ftpd]
enabled = true
port = ftp
filter = pure-ftpd
logpath = /var/log/syslog
maxretry = 3
[dovecot]
enabled = true
filter = dovecot
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/mail.log
maxretry = 5
[postfix]
enabled = true
port = smtp
filter = postfix
logpath = /var/log/mail.log
maxretry = 3
Save and close.
![](http://3.bp.blogspot.com/-q0Rzm2kIJvQ/XMbXE3KA3zI/AAAAAAAARYo/Om_4Qj-6W7kvmdMmzXmY2XtxF_5mpF3bgCLcBGAs/s1600/ISPConfig3_fail2ban_fail.local.png)
Installing Roundcube Webmail
sudo apt -y install roundcube roundcube-core roundcube-mysql roundcube-plugins javascript-common libjs-jquery-mousewheel php-net-sieve tinymce
Press Yes.
![](http://2.bp.blogspot.com/-jzakclPLWBE/XMbXN7DyhII/AAAAAAAARYs/e4_i0rWsoGANlB2lcQHIgONrenn5MvrygCLcBGAs/s1600/ISPConfig3_configure_database_roundcube-1.png)
Type your desired password here and press Ok.
![](http://2.bp.blogspot.com/-f8uDPefa_Dw/XMbXXVQmyiI/AAAAAAAARY0/jHtYOnMpBOAdFmWeLkzKKQFnKsKrlwD0wCLcBGAs/s1600/ISPConfig3_configure_database_roundcube-2.png)
Type confirm password and press Ok.
![](http://4.bp.blogspot.com/-6-M_geM_-s8/XMbXXeyKH9I/AAAAAAAARY8/0iVmxiki14Icw2om7rcUmt09S0LJdqA0gCLcBGAs/s1600/ISPConfig3_configure_database_roundcube-3.png)
sudo nano /etc/apache2/conf-enabled/roundcube.conf
Change this:
# Those aliases do not work properly with several hosts on your apache server
# Uncomment them to use it or adapt them to your configuration
# Alias /roundcube /var/lib/roundcube
<Directory /var/lib/roundcube/>
Options +FollowSymLinks
# This is needed to parse /var/lib/roundcube/.htaccess. See its
# content before setting AllowOverride to None.
AllowOverride All
<IfVersion >= 2.3>
Require all granted
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
# Protecting basic directories:
<Directory /var/lib/roundcube/config>
Options -FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/lib/roundcube/temp>
Options -FollowSymLinks
AllowOverride None
<IfVersion >= 2.3>
Require all denied
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Deny from all
</IfVersion>
</Directory>
<Directory /var/lib/roundcube/logs>
Options -FollowSymLinks
AllowOverride None
<IfVersion >= 2.3>
Require all denied
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Deny from all
</IfVersion>
</Directory>
to this:
# Those aliases do not work properly with several hosts on your apache server
# Uncomment them to use it or adapt them to your configuration
Alias /roundcube /var/lib/roundcube
Alias /webmail /var/lib/roundcube
<Directory /var/lib/roundcube/>
AddType application/x-httpd-php .php
Options +FollowSymLinks
# This is needed to parse /var/lib/roundcube/.htaccess. See its
# content before setting AllowOverride to None.
AllowOverride All
<IfVersion >= 2.3>
Require all granted
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
# Protecting basic directories:
<Directory /var/lib/roundcube/config>
Options -FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/lib/roundcube/temp>
Options -FollowSymLinks
AllowOverride None
<IfVersion >= 2.3>
Require all denied
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Deny from all
</IfVersion>
</Directory>
<Directory /var/lib/roundcube/logs>
Options -FollowSymLinks
AllowOverride None
<IfVersion >= 2.3>
Require all denied
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Deny from all
</IfVersion>
</Directory>
Save and close.
![](http://2.bp.blogspot.com/-wJinsbFpaGQ/XMbXXbCJAtI/AAAAAAAARY4/AmzF11mNgF0NddMDL3ZzdggmcEbbSb5VgCLcBGAs/s1600/ISPConfig3_configure_database_roundcube-4.png)
Restart apache service to take changes into effect.
sudo systemctl restart apache2
sudo nano /etc/roundcube/config.inc.php
change this:
$config['default_host'] = '';
to this:
$config['default_host'] = 'localhost';
Save and close.
Installing ISPConfig 3.1
sudo git clone https://git.ispconfig.org/ispconfig/ispconfig3.git /opt/ispconfig3
Output:
Cloning into '/opt/ispconfig3'...
remote: Enumerating objects: 114299, done.
remote: Counting objects: 100% (114299/114299), done.
remote: Compressing objects: 100% (24666/24666), done.
remote: Total 114299 (delta 89363), reused 113481 (delta 88785)
Receiving objects: 100% (114299/114299), 28.88 MiB | 691.00 KiB/s, done.
Resolving deltas: 100% (89363/89363), done.
sudo php -q /opt/ispconfig3/install/install.php
--------------------------------------------------------------------------------
_____ ___________ _____ __ _ ____
|_ _/ ___| ___ \ / __ \ / _(_) /__ \
| | \ `--.| |_/ / | / \/ ___ _ __ | |_ _ __ _ _/ /
| | `--. \ __/ | | / _ \| '_ \| _| |/ _` | |_ |
_| |_/\__/ / | | \__/\ (_) | | | | | | | (_| | ___\ \
\___/\____/\_| \____/\___/|_| |_|_| |_|\__, | \____/
__/ |
|___/
--------------------------------------------------------------------------------
>> Initial configuration
Operating System: Ubuntu 18.04.2 LTS (Bionic Beaver)
Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with <ENTER>.
Tap in "quit" (without the quotes) to stop the installer.
Select language (en,de) [en]:ENTER
Installation mode (standard,expert) [standard]:ENTER
Full qualified hostname (FQDN) of the server, eg server1.domain.tld [labserver.layloyar.com]:ENTER
MySQL server hostname [localhost]:ENTER
MySQL server port [3306]:ENTER
MySQL root username [root]:ENTER
MySQL root password []: TypePasswordHere
MySQL database to create [dbispconfig]:ENTER
MySQL charset [utf8]:ENTER
Configuring Postgrey
Configuring Postfix
Generating a 4096 bit RSA private key
.......................++
............................................................................++
writing new private key to 'smtpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PK
State or Province Name (full name) [Some-State]:Sindh
Locality Name (eg, city) []:Karachi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Laying
Organizational Unit Name (eg, section) []:Services
Common Name (e.g. server FQDN or YOUR name) []:labserver.layloyar.com
Email Address []:support@layloyar.com
postconf: warning: unmatched request: "maildrop.unix"
Configuring Dovecot
Configuring Spamassassin
Configuring Amavisd
[INFO] service Rspamd not detected
Configuring Getmail
Configuring Jailkit
Configuring Pureftpd
Configuring BIND
Configuring Apache
Configuring vlogger
Configuring Ubuntu Firewall
Configuring Fail2ban
Configuring Apps vhost
Installing ISPConfig
ISPConfig Port [8080]:ENTER
Admin password [a2f2180d]: TypePasswordHere
Re-enter admin password []: TypePasswordHere
Do you want a secure (SSL) connection to the ISPConfig web interface (y,n) [y]:ENTER
Generating RSA private key, 4096 bit long modulus
..........++
................................++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PK
State or Province Name (full name) [Some-State]:Sindh
Locality Name (eg, city) []:Karachi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Laying
Organizational Unit Name (eg, section) []:Services
Common Name (e.g. server FQDN or YOUR name) []:labserver.layloyar.com
Email Address []:support@techsupportpk.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:ENTER
An optional company name []:ENTER
writing RSA key
Symlink ISPConfig LE SSL certs to postfix? (y,n) [y]:ENTER
Symlink ISPConfig LE SSL certs to pureftpd? Creating dhparam file takes some times. (y,n) [y]:ENTER
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
............................................................................
Configuring DBServer
Installing ISPConfig crontab
no crontab for root
no crontab for getmail
Detect IP addresses
Restarting services ...
Testing 2 seconds throughput of /dev/random ... 1081519 bytes OK
Installation completed.
When you are finished with the above, you can access ISPConfig 3 web control panel by accessing https://labserver.layloyar.com:8080 or https://ip_address:8080 and you will be presented following login screen.
Since we are using self signed certificate therefore we have to ignore this warnning by clicking Advanced
![](http://1.bp.blogspot.com/-DTOimax1LmY/XMbZxT2t0KI/AAAAAAAARZQ/FfXbfuWEcKE_wcf5IR087lzCq4Hye6j7QCLcBGAs/s1600/ISPConfig3_web_gui-1.png)
Click proceed to (unsafe)
![](http://1.bp.blogspot.com/-9DET2TuHxYw/XMbZxXQes4I/AAAAAAAARZU/fyyH3LbgK8IA4mgBJRUENLbJdnnE19rRACLcBGAs/s1600/ISPConfig3_web_gui-2.png)
Enter usernmae admin and password you have created earlier
![](http://4.bp.blogspot.com/-aD9JKwtevrY/XMbZxY4YEoI/AAAAAAAARZY/qKTYlJXnx5cQFB7JuNBtT5niYmBLwskGgCLcBGAs/s1600/ISPConfig3_web_gui-3.png)
This is your ispcong dashboard.
![](http://1.bp.blogspot.com/-VBZOWncq9jw/XMbZycbGf2I/AAAAAAAARZc/suMSwmAsXoc50fAwGVaQfWoRWVVCbs4NACLcBGAs/s1600/ISPConfig3_web_gui-4.png)
Wrapping up
You have successfully deployed your first ispconfig 3 on your Ubuntu 18.04 server.