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/html
inside 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.