What is ISPConfig?

ISPConfig is a web hosting control panel that allows you to configure the following services through a web browser: Apache or Nginx web server, Postfix mail server, Courier or Dovecot IMAP/POP3 server, MariaDB as MySQL replacement, BIND or MyDNS nameserver, PureFTPd, SpamAssassin, ClamAV, and many more. This setup covers the installation of Apache (instead of Nginx), BIND (instead of MyDNS), and Dovecot (instead of Courier).

This tutorial shows the installation of an Ubuntu 20.04 (Focal Fossa) web hosting server with Apache 2.4, Postfix, Dovecot, Bind, and PureFTPD to prepare it for the installation of ISPConfig 3.1 The resulting system will provide a Web, Mail, Mailinglist, DNS, and FTP Server.

In this tutorial, I use the hostname server1.example.com with the IP address 192.168.0.100 and the gateway 192.168.0.1  These settings might differ for you, so you have to replace them where appropriate.  Before proceeding further you need to have a basic minimal installation of Ubuntu 20.04.

I am not giving you more information about command one by one now. and 

# ******************* #
#      PASTE BREAK    #
# ******************* #
this meant to stop and start pasting to your terminatl next command
sudo passwd root

 

sudo -s

 

apt-get -y update && apt-get -y upgrade  
reboot
# ******************* #
# *** PASTE BREAK *** #
# ******************* #
# replace with your production envirment
ADMIN_EMAIL=youremail
ADMIN_NAME=“adminname”
MAILTO=$ADMIN_EMAIL
HOSTNAME=hostname
DOMAINNAME=domainname
TIME_ZONE=“Asia/Kuala_Lumpur”
LOCATION=“Kuala_lumpur”

PHP_VERSION=7.4
PHP_VERSION_SHORT=74

rm /etc/localtime; ln -s /usr/share/zoneinfo/$TIME_ZONE /etc/localtime 
ls -la /etc/localtime

echo 
# Kernel hostname 
kernel.hostname=$HOSTNAME.$DOMAINNAME
# Kernel domain name
kernel.domainname=`echo $DOMAINNAME`” >> /etc/sysctl.conf

echo -e “127.0.0.1\t`echo $HOSTNAME`.`echo $DOMAINNAME` `echo $HOSTNAME`” >> /etc/hosts
echo -e “::1\t`echo $HOSTNAME`.`echo $DOMAINNAME` `echo $HOSTNAME`” >> /etc/hosts

sudo hostnamectl set-hostname $HOSTNAME
sysctl -p /etc/sysctl.conf
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
#
# ******************* #
# *** PASTE BREAK *** #
# ******************* #
#######################################################
#   SSH Config improvements to login            #
#######################################################

# Set SSHD value for user
mkdir ~/.ssh

# Backup sshd settings
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.factory-defaults

sed -i ‘s/GSSAPIAuthentication yes/GSSAPIAuthentication no/’ /etc/ssh/ssh_config
echo ‘UseDNS yes’ >> /etc/ssh/sshd_config

# allow ssh root login
sudo sed -i ‘s/#PermitRootLogin prohibit-password/PermitRootLogin yes/’ /etc/ssh/sshd_config
# Enable root file edit for WinSCP
sudo echo 
#### added
sysadmin ALL=NOPASSWD: /usr/lib/openssh/sftp-server’ >> /etc/sudoers

service sshd restart
# ******************* #
# *** PASTE BREAK *** #
# ******************* #
#######################################################
#    file limits                      #
#######################################################
## setup high volume file access mode
ulimit -n 131070

 

## add below lines to 
echo -e “root\tsoft\tnofile\t120000
root\thard\tnofile\t300000
mysql\tsoft\tnofile\t120000
mysql\thard\tnofile\t300000
apache\tsoft\tnofile\t120000
apache\thard\tnofile\t300000
nginx\tsoft\tnofile\t120000
nginx\thard\tnofile\t300000″ >> /etc/security/limits.conf

 

#######################################################
#          Essential packages             #
#######################################################

 

dpkg-reconfigure dash
#click yes
#####################################################
#         Change the Default Shell      #
#####################################################

 

apt-get install open-vm-tools -y
systemctl enable open-vm-tools
systemctl start open-vm-tools

 

#####################################################
#          qemo useragent (optional)      #
#####################################################

 

sudo add-apt-repository universe
apt install qemu-guest-agent -y
#################################
#   disable ipv6                #
#################################

 

sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

 

echo 
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1′ >> /etc/sysctl.conf

 

sed -i ‘s/GRUB_CMDLINE_LINUX_DEFAULT=”.*”/GRUB_CMDLINE_LINUX_DEFAULT=”ipv6.disable=1″/’ /etc/default/grub
sed -i ‘s/GRUB_CMDLINE_LINUX=”.*”/GRUB_CMDLINE_LINUX=”ipv6.disable=1″/’ /etc/default/grub

 

#################################
#    Disable AppArmor           #
#################################

 

service apparmor stop
update-rc.d -f apparmor remove 
apt-get remove apparmor apparmor-utils

 

Synchronize the System Clock
#####################################################
#        Synchronize the System Clock     #
#####################################################
apt-get -y install ntp
#############################################################
# Install Postfix, Dovecot, MariaDB, rkhunter, and binutils #
#############################################################
service sendmail stop; update-rc.d -f sendmail remove
#The error message:
#
#Failed to stop sendmail.service: Unit sendmail.service not loaded.

 

apt-get -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 sudo

 

#You will be asked the following questions:
#General type of mail configuration: <– Internet Site
#System mail name: <– server1.example.com
echo ‘#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: “man 5 master” or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute “postfix reload” after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       –       –       –       –       smtpd
#smtp      inet  n       –       –       –       1       postscreen
#smtpd     pass  –       –       –       –       –       smtpd
#dnsblog   unix  –       –       –       –       0       dnsblog
#tlsproxy  unix  –       –       –       –       0       tlsproxy
submission inet n       –       –       –       –       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_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       –       –       –       –       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
#628       inet  n       –       –       –       –       qmqpd
pickup    unix  n       –       –       60      1       pickup
cleanup   unix  n       –       –       –       0       cleanup
qmgr      unix  n       –       n       300     1       qmgr
#qmgr     unix  n       –       n       300     1       oqmgr
tlsmgr    unix  –       –       –       1000?   1       tlsmgr
rewrite   unix  –       –       –       –       –       trivial-rewrite
bounce    unix  –       –       –       –       0       bounce
defer     unix  –       –       –       –       0       bounce
trace     unix  –       –       –       –       0       bounce
verify    unix  –       –       –       –       1       verify
flush     unix  n       –       –       1000?   0       flush
proxymap  unix  –       –       n       –       –       proxymap
proxywrite unix –       –       n       –       1       proxymap
smtp      unix  –       –       –       –       –       smtp
relay     unix  –       –       –       –       –       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       –       –       –       –       showq
error     unix  –       –       –       –       –       error
retry     unix  –       –       –       –       –       error
discard   unix  –       –       –       –       –       discard
local     unix  –       n       n       –       –       local
virtual   unix  –       n       n       –       –       virtual
lmtp      unix  –       –       –       –       –       lmtp
anvil     unix  –       –       –       –       1       anvil
scache    unix  –       –       –       –       1       scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  –       n       n       –       –       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# ====================================================================
#
# Recent Cyrus versions can use the existing “lmtp” master.cf entry.
#
# Specify in cyrus.conf:
#   lmtp    cmd=”lmtpd -a” listen=”localhost:lmtp” proto=tcp4
#
# Specify in main.cf one or more of the following:
#  mailbox_transport = lmtp:inet:localhost
#  virtual_transport = lmtp:inet:localhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
#
#cyrus     unix  –       n       n       –       –       pipe
#  user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
#
# ====================================================================
# Old example of delivery via Cyrus.
#
#old-cyrus unix  –       n       n       –       –       pipe
#  flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
#
# ====================================================================
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  –       n       n       –       –       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender – $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  –       n       n       –       –       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  –       n       n       –       –       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  –       n       n       –       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  –       n       n       –       –       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}’ > /etc/postfix/master.cf

 

service postfix restart

 

#We want MySQL to listen on all interfaces, not just localhost. Therefore, we edit /etc/mysql/mariadb.conf.d/50-server.cnf and comment out the line bind-address = 127.0.0.1:

 

nano /etc/mysql/mariadb.conf.d/50-server.cnf

 

##bind-address           = 127.0.0.1
#save and close

 

#Now we set a root password in MariaDB. Run:
mysql_secure_installation

#Enter current password for root (enter for none): <– press enter
#Set root password? [Y/n] <– y
#New password: <– Enter the new MariaDB root password here
#Re-enter new password: <– Repeat the password
#Remove anonymous users? [Y/n] <– y
#Disallow root login remotely? [Y/n] <– y
#Reload privilege tables now? [Y/n] <– y

#Set the password authentication method in MariaDB to native so we can use PHPMyAdmin later to connect as root user:
echo “update mysql.user set plugin = ‘mysql_native_password’ where user=’root’;” | mysql -u root

#Edit the file /etc/mysql/debian.cnf and set the MYSQL / MariaDB root password there twice in the rows that start with password.

nano /etc/mysql/debian.cnf

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = root
password = yourdbpassword
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password = yourdbpassword
socket = /var/run/mysqld/mysqld.sock
basedir = /usr

#Then we restart MariaDB:
service mysql restart

#Now check that networking is enabled. Run

netstat -tap | grep mysql
#tcp6 0 0 [::]:mysql [::]:* LISTEN 30591/mysqld

#############################################################
#        Install Amavisd-new, SpamAssassin, and Clamav      #
#############################################################
#To install amavisd-new, SpamAssassin, and ClamAV, we run

apt-get -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 libdbd-mysql-perl postgrey

#The ISPConfig 3 setup uses amavisd which loads the SpamAssassin filter library internally, so we can stop SpamAssassin to free up some RAM:

service spamassassin stop
update-rc.d -f spamassassin remove

#To start ClamAV use:

freshclam
service clamav-daemon start

#The following error can be ignored on the first run of freshclam.

ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).

#The amavisd-new program has currently a bug in Ubuntu 18.04 which prevents that emails get signed with Dkim correctly. Run the following commands to patch amavisd-new.

cd /tmp
wget https://git.ispconfig.org/ispconfig/ispconfig3/raw/stable-3.1/helper_scripts/ubuntu-amavisd-new-2.11.patch
cd /usr/sbin
cp -pf amavisd-new amavisd-new_bak
patch < /tmp/ubuntu-amavisd-new-2.11.patch

#In case you get an error for thelast ‘patch’ command, then Ubuntu has probably fixed the issue in the meantime, so it should be safe to ignore that error then.

#############################################################
#           Install Metronome XMPP Server (optional)        #
#############################################################

#The Metronome XMPP Server provides an XMPP chat server. This step is optional, if you do not need a chat server, then you can skip this step. No other ISPConfig functions depend on this software.
#Install the following packages with apt.

apt-get -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

luarocks install lpc

#Add a shell user for Metronome.

adduser –no-create-home –disabled-login –gecos ‘Metronome’ metronome

apt install -y python

#Download Metronome to the /opt directory and compile it.

cd /opt; git clone https://github.com/maranda/metronome.git metronome
cd ./metronome; ./configure –ostype=debian –prefix=/usr
make
make install

###################################################################
# Install Apache, PHP, phpMyAdmin, FCGI, SuExec, Pear, and mcrypt #       #
###################################################################

PHP_VERSION=7.4
PHP_VERSION_SHORT=74

apt-get -y install apache2 apache2-doc apache2-utils libapache2-mod-php php$PHP_VERSION php$PHP_VERSION-common php$PHP_VERSION-gd php$PHP_VERSION-mysql php$PHP_VERSION-imap phpmyadmin php$PHP_VERSION-cli php$PHP_VERSION-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt  imagemagick libruby libapache2-mod-python php$PHP_VERSION-curl php$PHP_VERSION-intl php$PHP_VERSION-pspell php$PHP_VERSION-sqlite3 php$PHP_VERSION-tidy php$PHP_VERSION-xmlrpc php$PHP_VERSION-xsl memcached php-memcache php-imagick php$PHP_VERSION-zip php$PHP_VERSION-mbstring php-soap php$PHP_VERSION-soap

sudo a2enmod php$PHP_VERSION
sudo update-alternatives –set php /usr/bin/php$PHP_VERSION
sudo update-alternatives –set phar /usr/bin/phar$PHP_VERSION
sudo update-alternatives –set phar.phar /usr/bin/phar.phar$PHP_VERSION
sudo update-alternatives –set phpize /usr/bin/phpize$PHP_VERSION
sudo update-alternatives –set php-config /usr/bin/php-config$PHP_VERSION
# apache
sudo ln -s /usr/share/phpmyadmin /usr/share/apache2/html

# apache
sudo ln -s /usr/share/phpmyadmin /var/www/html/dbadmin

#Web server to reconfigure automatically: <– apache2 
#Configure database for phpmyadmin with dbconfig-common? <– Yes
#MySQL application password for phpmyadmin: <– Press enter

#Then run the following command to enable the Apache modules suexec, rewrite, ssl, actions, and include (plus dav, dav_fs, and auth_digest if you want to use WebDAV):

a2enmod suexec rewrite ssl actions include cgi

a2enmod dav_fs dav auth_digest headers

#To ensure that the server cannot be attacked through the HTTPOXY vulnerability, I will disable the HTTP_PROXY header in apache globally. Create a new httpoxy.conf file with nano:

nano /etc/apache2/conf-available/httpoxy.conf

#Paste this content into the file:

<IfModule mod_headers.c>
    RequestHeader unset Proxy early
</IfModule>
#save and exit

a2enconf httpoxy
Restart Apache afterward:

service apache2 restart

#If you want to host Ruby files with the extension .rb on your websites created through ISPConfig, you must comment out the line application/x-ruby rb in /etc/mime.types:

nano /etc/mime.types
#comment out 
application/x-ruby                            
#save and exit
#(This is needed only for .rb files; Ruby files with the extension .rbx work out of the box.)
service apache2 restart

#PHP Opcode cache (optional)

apt-get -y install php$PHP_VERSION-opcache php$PHP_VERSION-apcu

#Now restart Apache:

service apache2 restart

#PHP-FPM

#To use PHP-FPM with Apache, we need the mod_proxy_fcgi Apache module, which is installed by default and needs just be enabled. We can install PHP-FPM and as follows:

apt-get -y install php$PHP_VERSION-fpm

a2enmod actions proxy_fcgi alias 
service apache2 restart
###################################################################
#           Install HHVM (HipHop Virtual Machine), optional       #
###################################################################
#In this step, we will install HHVM with apt. HHVM is a fast PHP engine developed by Facebook.

apt-get -y install hhvm

###################################################################
#                        Install Lets Encryp                     #
###################################################################
#ISPConfig 3.1 has built-in support for the free SSL Certificate Authority Let’s encrypt. The Let’s Encrypt function allows you to create free SSL Certificates for your website in ISPConfig.

#Now we will add support for Let’s encrypt.

apt-get -y install certbot

###################################################################
#                       Install Mailman                           #
###################################################################
#ISPConfig allows you to manage (create/modify/delete) Mailman mailing lists. If you want to make use of this feature, install Mailman as follows:

apt-get -y install mailman

#Languages to support: <– en (English)
#Missing site list <– Ok

#The error ‘Job for mailman.service failed because the control process exited with error code.’ can be ignored for now.
#Before we can start Mailman, a first mailing list called mailman must be created:

newlist mailman
#ENTER YOUR EMAIL:
#EMTER YOUR PASSWORD:
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”

#COPY AND PAST TO 

nano /etc/aliases

postmaster:    root
clamav: root
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”

#Run
newaliases

#afterward and restart Postfix:

service postfix restart

#Finally, we must enable the Mailman Apache configuration:

ln -s /etc/mailman/apache.conf /etc/apache2/conf-available/mailman.conf

#Activate the configuration with:

a2enconf mailman

#Restart Apache afterward:

service apache2 restart

#Then start the Mailman daemon:

service mailman start

###################################################################
#             Install PureFTPd and Quota                          #
###################################################################
#PureFTPd and quota can be installed with the following command:

apt-get -y install pure-ftpd-common pure-ftpd-mysql quota quotatool

#Edit the file /etc/default/pure-ftpd-common…

nano /etc/default/pure-ftpd-common

# and make sure that the start mode is set to standalone and set VIRTUALCHROOT=true:

[…]
STANDALONE_OR_INETD=standalone
[…]
VIRTUALCHROOT=true
[…]

#Now we configure PureFTPd to allow FTP and TLS sessions. FTP is a very insecure protocol because all passwords and all data are transferred in clear text. By using TLS, the whole communication can be encrypted, thus making FTP much more secure.
#If you want to allow FTP and TLS sessions, run

echo 1 > /etc/pure-ftpd/conf/TLS

#In order to use TLS, we must create an SSL certificate. I create it in /etc/ssl/private/, therefore I create that directory first:

mkdir -p /etc/ssl/private/

#Afterwards, we can generate the SSL certificate as follows:

openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

#Country Name (2 letter code) [AU]: <– Enter your Country Name (e.g., “DE”).
#State or Province Name (full name) [Some-State]:<– Enter your State or Province Name.
#Locality Name (eg, city) []:<– Enter your City.
#Organization Name (eg, company) [Internet Widgits Pty Ltd]:<– Enter your Organization Name (e.g., the name of your company).
#Organizational Unit Name (eg, section) []:<– Enter your Organizational Unit Name (e.g. “IT Department”).
#Common Name (eg, YOUR name) []:<– Enter the Fully Qualified Domain Name of the system (e.g. “server1.example.com”).
#Email Address []:<– Enter your Email Address.

#Change the permissions of the SSL certificate:

chmod 600 /etc/ssl/private/pure-ftpd.pem

#Then restart PureFTPd:

service pure-ftpd-mysql restart

###################################################################
#                Install BIND DNS Server                          #
###################################################################
#BIND can be installed as follows:

apt-get -y install bind9 dnsutils haveged

#Enable and start the haveged Daemon:
systemctl enable haveged
systemctl start haveged

###################################################################
#        Install Vlogger, Webalizer, and AWStats                  #
###################################################################
#Vlogger, Webalizer, and AWStats can be installed as follows:

apt-get -y install vlogger webalizer awstats geoip-database libclass-dbi-mysql-perl

#Open /etc/cron.d/awstats afterwards…

nano /etc/cron.d/awstats

#and comment out everything in that file:
#comment out everything

###################################################################
#                      Install Jailkit                            #
###################################################################
#Jailkit is needed only if you want to chroot SSH users. It can be installed as follows (important: Jailkit must be installed before ISPConfig – it cannot be installed afterwards!):

apt-get -y install build-essential autoconf automake1.11 libtool flex bison debhelper binutils

cd /tmp 
wget http://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz
tar xvfz jailkit-2.19.tar.gz
cd jailkit-2.19
echo 5 > debian/compat

#Then build the jailkit package by running this command:

./debian/rules binary

#You can now install the Jailkit .deb package as follows:

cd ..
dpkg -i jailkit_2.19-1_*.deb
rm -rf jailkit-2.19*

###################################################################
#                    Install fail2ban and UFW                     #
###################################################################
#This is optional but recommended, because the ISPConfig monitor tries to show the log:

apt-get -y install fail2ban

To make fail2ban monitor PureFTPd and Dovecot, create the file /etc/fail2ban/jail.local:

nano /etc/fail2ban/jail.local

[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

#Restart fail2ban afterwards:

service fail2ban restart

#To install the UFW firewall, run this apt command:

apt-get install ufw

###################################################################
#                    Install Roundcube Webmail                    #
###################################################################
#To install Roundcube Webmail, run:

apt-get -y install roundcube roundcube-core roundcube-mysql roundcube-plugins javascript-common libjs-jquery-mousewheel php-net-sieve tinymce

#Configure database for roundcube with dbconfig-common? <– Yes
#MySQL application password for roundcube: <– Press enter

nano /etc/apache2/conf-enabled/roundcube.conf

#and remove the # in front of the Alias line

nano /etc/roundcube/config.inc.php
# and change the default host to localhost:
$config[‘default_host’] = ‘localhost’;

#download and setup ispconfig

cd /usr/src/
wget https://github.com/roundcube/roundcubemail/releases/download/1.4.7/roundcubemail-1.4.7-complete.tar.gz
tar -zxf roundcubemail*
mv roundcubemail-1.4.7 /usr/share/roundcubemail

sudo adduser apache2 

chown -R apache2:apache2 /usr/share/roundcubemail
chown -R www-data:www-data /usr/share/roundcubemail 

echo ‘#
# Round Cube Webmail is a browser-based multilingual IMAP client
#
Alias /roundcubemail /usr/share/roundcubemail
Alias /webmail /usr/share/roundcubemail

# Define who can access the Webmail
# You can enlarge permissions once configured

#<Directory /usr/share/roundcubemail/>
#    <IfModule mod_authz_core.c>
#        # Apache 2.4
#        Require local
#    </IfModule>
#    <IfModule !mod_authz_core.c>
#        # Apache 2.2
#        Order Deny,Allow
#        deny from all
#        Allow from 127.0.0.1     
#        Allow from ::1
#    </IfModule>
#</Directory>

<Directory /usr/share/roundcubemail/>
        Options none
        AllowOverride All
        Require all granted
</Directory>

# Define who can access the installer
# keep this secured once configured

#<Directory /usr/share/roundcubemail/installer/>
#    <IfModule mod_authz_core.c>
#        # Apache 2.4
#        Require local
#    </IfModule>
#    <IfModule !mod_authz_core.c>
#        # Apache 2.2
#        Order Deny,Allow
#        Deny from all
#        Allow from 127.0.0.1
#        Allow from ::1
#    </IfModule>
#</Directory>

<Directory /usr/share/roundcubemail/installer>
        Options FollowSymLinks SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
</Directory>
# Those directories should not be viewed by Web clients.
<Directory /usr/share/roundcubemail/bin/>
    Order Allow,Deny
    Deny from all
</Directory>
<Directory /usr/share/roundcubemail/plugins/enigma/home/>
    Order Allow,Deny
    Deny from all
</Directory>’ > /etc/apache2/conf-available/roundcube.conf
# ******************* #
# <<< PASTE BREAK >>> #
# ******************* #
service apache2 restart
# sudo apt-get install dovecot-mysql
# sudo apt-get install dovecot-imapd dovecot-pop3d
# sudo apt-get install dovecot-lmtpd

sudo service dovecot restart

mysql -u root -p
DROP USER ’roundcube’@‘localhost’;
CREATE DATABASE IF NOT EXISTS roundcubemail;
CREATE USER ’roundcube’@‘localhost’ IDENTIFIED BY ‘mc2webserver#2020’;GRANT ALL PRIVILEGES on roundcubemail.* to [email protected] ;FLUSH PRIVILEGES;

#setup webmail server
#keep note to change port from 587 to 25
https://YourDomainName/webmail/installer/
# Disable roundcube installer

echo ‘#
# Round Cube Webmail is a browser-based multilingual IMAP client
#

Alias /roundcubemail /usr/share/roundcubemail
Alias /webmail /usr/share/roundcubemail

# Define who can access the Webmail
# You can enlarge permissions once configured

#<Directory /usr/share/roundcubemail/>
#    <IfModule mod_authz_core.c>
#        # Apache 2.4
#        Require local
#    </IfModule>
#    <IfModule !mod_authz_core.c>
#        # Apache 2.2
#        Order Deny,Allow
#        Deny from all
#        Allow from 127.0.0.1
#        Allow from ::1
#    </IfModule>
#</Directory>

<Directory /usr/share/roundcubemail/>
        Options none
        AllowOverride All
        Require all granted
</Directory>

# Define who can access the installer
# keep this secured once configured

<Directory /usr/share/roundcubemail/installer/>
    <IfModule mod_authz_core.c>
        # Apache 2.4
        Require local
    </IfModule>
    <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1
        Allow from ::1
    </IfModule>
</Directory>

# Those directories should not be viewed by Web clients.
<Directory /usr/share/roundcubemail/bin/>
    Order Allow,Deny
    Deny from all
</Directory>
<Directory /usr/share/roundcubemail/plugins/enigma/home/>
    Order Allow,Deny
    Deny from all
</Directory>’ > /etc/apache2/conf-available/roundcube.conf

service apache2 restart 

###################################################################
#                    install ISPConfig 3.2                       #
###################################################################

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

###########################################
#          default html                   #
###########################################
echo ‘<html>
<head></head>
<body style=”margin: 0; padding: 0;”><div style=”width: 100%; position: absolute; text-align: center; padding-top: 10%;”>
<strong>Bad vhost or missing Index file.</strong><br/>contact technical support.</div>  
</body>
</html>’ > /usr/share/apache2/default-site/index.html

echo “<html>
<head></head>
<body style=’margin: 0; padding: 0;’><div style=’width: 100%; position: absolute; text-align: center; padding-top: 10%;’>
default root for <strong><a href=\”https://`hostname`\”>`hostname`</a></strong></div> 
</body>
</html>” > /var/www/html/index.html
#############################################
#         Certbot SSL         #
#############################################

cp /etc/gai.conf /tmp/
sed -i ‘s/^#precedence \:\:f/precedence ::f/’ /etc/gai.conf

cd /usr/src/ 
sudo apt-get install software-properties-common -y

# ******************* #
# *** PASTE BREAK *** #
# ******************* #
sudo apt-get install python3-certbot-apache -y
# ******************* #
# *** PASTE BREAK *** #
# ******************* #

service apache2 start
service apache2 restart
#skip if wanna install ispconfig 
sudo certbot certonly –apache  –no-eff-email -m $ADMIN_EMAIL –agree-tos -d `hostname -f`
###########################################
#          Certbot SSL                    #
###########################################

cp /etc/gai.conf /tmp/
sed -i ‘s/^#precedence \:\:f/precedence ::f/’ /etc/gai.conf

rm -f /usr/local/ispconfig/interface/ssl/ispserver.crt
rm -f /usr/local/ispconfig/interface/ssl/ispserver.key
rm -f /usr/local/ispconfig/interface/ssl/ispserver.bundle

ln -s /etc/letsencrypt/live/`hostname -f`/chain.pem /usr/local/ispconfig/interface/ssl/ispserver.bundle
ln -s /etc/letsencrypt/live/`hostname -f`/cert.pem /usr/local/ispconfig/interface/ssl/ispserver.crt
ln -s /etc/letsencrypt/live/`hostname -f`/privkey.pem /usr/local/ispconfig/interface/ssl/ispserver.key

mkdir -p /usr/local/interface/acme/.well-known/acme-challenge/
 
service apache2 restart

The installer automatically configures all underlying services, so there is no manual configuration needed.

Afterward you can access ISPConfig 3 under http(s)://server1.example.com:8080/ or http(s)://192.168.0.100:8080/ (HTTP or HTTPS depends on what you chose during installation). Log in with the username admin and the password admin (you should change the default password after your first login):

ubuntu-ispconfig-login
ispconfig-3-2

The system is now ready to be used.

If you tried and it doesn’t work for you please write a commant to fix the code.