A super-simple Vagrant LAMP stack bootstrap (installable with one command)

As I have to setup servers inside Vagrant quite often, sometimes 10 times per day, I started to use provisioning: Using a list of commands that will be executed automatically when Vagrant sets up a new box. This saves a shitload of time. To do so, I’m using a reduced-to the max Vagrantfile that
- sets up a Ubuntu 14.04 LTS “Trustry Thar” 64bit box
- makes the box accessable by the host at IP
192.168.33.22 - syncs the current folder with
/var/www/htmlinside the box (permanently, in both directions) - automatically perform all the commands in bootstrap.sh directly after setting up the box for the first time
and a bootstrap.sh that holds your chosen password and your chosen project folder name and does this:
- update, upgrade
- create the project folder inside /var/www/html
- install Apache 2.4, PHP 5.5, MySQL, PHPMyAdmin, git and Composer
- sets the pre-chosen password for MySQL and PHPMyAdmin
- activates mod_rewrite and add AllowOverride All to the vhost settings
The files
The Vagrantfile looks like this:
# -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # Every Vagrant virtual environment requires a box to build off of. config.vm.box = "ubuntu/trusty64" # Create a private network, which allows host-only access to the machine using a specific IP. config.vm.network "private_network", ip: "192.168.33.22" # Share an additional folder to the guest VM. The first argument is the path on the host to the actual folder. # The second argument is the path on the guest to mount the folder. config.vm.synced_folder "./", "/var/www/html" # Define the bootstrap file: A (shell) script that runs after first setup of your box (= provisioning) config.vm.provision :shell, path: "bootstrap.sh" end
and the bootstrap.sh that looks like this
#!/usr/bin/env bash
# Use single quotes instead of double quotes to make it work with special-character passwords
PASSWORD='12345678'
PROJECTFOLDER='myproject'
# create project folder
sudo mkdir "/var/www/html/${PROJECTFOLDER}"
# update / upgrade
sudo apt-get update
sudo apt-get -y upgrade
# install apache 2.5 and php 5.5
sudo apt-get install -y apache2
sudo apt-get install -y php5
# install mysql and give password to installer
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password $PASSWORD"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $PASSWORD"
sudo apt-get -y install mysql-server
sudo apt-get install php5-mysql
# install phpmyadmin and give password(s) to installer
# for simplicity I'm using the same password for mysql and phpmyadmin
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/dbconfig-install boolean true"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/app-password-confirm password $PASSWORD"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/mysql/admin-pass password $PASSWORD"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/mysql/app-pass password $PASSWORD"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect apache2"
sudo apt-get -y install phpmyadmin
# setup hosts file
VHOST=$(cat <<EOF
<VirtualHost *:80>
DocumentRoot "/var/www/html/${PROJECTFOLDER}"
<Directory "/var/www/html/${PROJECTFOLDER}">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF
)
echo "${VHOST}" > /etc/apache2/sites-available/000-default.conf
# enable mod_rewrite
sudo a2enmod rewrite
# restart apache
service apache2 restart
# install git
sudo apt-get -y install git
# install Composer
curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Installation
To use this, simply get both files here in the repo, put them inside a folder and do a
vagrant up
Make sure you already have the ubuntu/trusty64 box loaded, if not, do
vagrant box add ubuntu/trusty64
Voila, 5mins later you’ll have a fully installed box, syncing with your local folder.