mkvirtualserver (Source)

# This script is used to create virtual hosts.
# This script assumes the following:
# 1) This is a Debian/Ubuntu OS and Bash 4.x or higher is installed
# 2) The Apache defaults are in place but they can be changed in the script
#    Base dir is /var/www
#    Log dir is /var/log/apache2
#    Apache user is www-data
# 3) Git is installed
# 4) ACL is installed
# 5) There is a git user and
# 6) There is a /home/git/repositories directory
# But #2-6 can be changed in the script
# This uses the a2ensite command which is usually only available on
# Debian/Ubuntu systems.
# NOTE! Change the <your domain> in the third prompt to your domain
# Set up the default parameters
read -e -p "Enter the web home directory:" -i "/var/www" homedir
read -e -p "Enter the git repository base directory:" -i "/home/git/repositories" gitdir
read -e -p "Enter the domain name for the server:" -i "<your domain>" sn
read -e -p "Enter the Project name:" -i "" proj
if [ -z "$proj" ]; then
  echo "Project name cannot be blank!"
# Create the web directory and a index.php test file
cd $homedir
mkdir $proj
cd $homedir/$proj
mkdir "public_html"
# Set the owner and change permissions
chown -R www-data:www-data $homedir/$proj/
chmod -R '750' $homedir/$proj/public_html
# Setup the permissions so git can write to website
setfacl -Rm d:u:www-data:rwx,u:git:rwx $homedir/$proj
# Create the git directory and a bare git repository
cd $gitdir
mkdir $proj.git
cd $gitdir/$proj.git
git init --bare
cat >hooks/post-receive <<EOF
GIT_WORK_TREE=$homedir/$proj/public_html git checkout -f
chmod ug+x hooks/post-receive
chown -R git:git $gitdir/$proj.git
# Create a directory for your apache errors log
mkdir /var/log/apache2/$proj/
# Creation the file with VirtualHost configuration in /etc/apache2/site-available/
echo "<VirtualHost *:80>
        ServerAdmin webadmin@localhost
        ServerName $proj.$sn
        ServerAlias www.$proj.$sn
        DocumentRoot $homedir/$proj/public_html/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        <Directory $homedir/$proj/public_html/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "'/usr/lib/cgi-bin'">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        ErrorLog /var/log/apache2/$proj/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/$proj/access.log combined
    Alias /doc/ "'/usr/share/doc/'"
    <Directory "'/usr/share/doc/'">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from ::1/128
</VirtualHost>" > /etc/apache2/sites-available/$proj
# Add the host to the hosts file
echo $proj.$sn >> /etc/hosts
# Enable the site
a2ensite $proj
# Reload Apache2
service apache2 reload