#!/bin/bash
###
#
# forked from https://gist.github.com/1264701/08f93534ba177f173b9382b53c419cd0de5b07ea
# Copyright (c) 2011 Cake Development Corporation (http//cakedc.com)
#
# Ubuntu 12.10 based web server installation script
# Run this by executing the following from a fresh install of Ubuntu 12.10 server:
#
# bash -c "$(curl -fsSL https://raw.github.com/gist/4372049)" <mysqlPassword>
#
# Be sure to replace <mysqlPassword> with your intended MySQL Password.
# Also, run this as root, unless you enjoy failing.
#
# Its handy to install 'screen' if you want to ensure your remote connection to
# a server doesn't disrupt the installation process. If you want to do this, just
# do the following before running the main bash command:
#
# apt-get install screen -y
# screen
#
# To recover your session if you are disconnected, ssh to your server as root again,
# and type:
#
# screen -x
#
# Dependencies:
# - curl
#
# Todo:
# - SSL Configuration
#
###
EXPECTEDARGS=0
if [ $# -ne $EXPECTEDARGS -o "x$0" == "x" -o $0 == "bash" ]; then
echo "Usage:"
echo " Parameter 1: MySQL root password"
exit 1
fi
MYSQLPASS=$0
export DEBIAN_FRONTEND=noninteractive
########################################
## System Updates
########################################
apt-get update && apt-get dist-upgrade -y
apt-get install \
curl \
aptitude \
-y
apt-get upgrade -y
########################################
## Tools and Utilities
########################################
apt-get install \
git-core \
subversion \
xclip
-y
########################################
## MySQL
########################################
apt-get install \
mysql-client \
mysql-server \
-y
mysqladmin -u root password $MYSQLPASS
########################################
## PHP
########################################
apt-get install \
php5 \
php5-cli \
php5-common \
php5-curl \
php5-ffmpeg \
php5-fpm \
php5-gd \
php5-geoip \
php5-gmp \
php5-imagick \
php5-intl \
php5-json \
php5-mcrypt \
php5-memcached \
php5-mysql \
php-apc \
php-pear \
php5-xdebug \
-y
########################################
## Install PHPUnit via PEAR
########################################
### upgrade pear
pear upgrade pear
### install phpunit dependencies
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear channel-discover pear.symfony.com
pear install --alldeps phpunit/PHPUnit
########################################
## Install PHPQATools courtesy of http://phpqatools.org/ via PEAR
########################################
pear config-set auto_discover 1
pear install pear.phpqatools.org/phpqatools
########################################
## Install Phing courtesy of http://www.phing.info/docs/guide/stable/ via PEAR
########################################
pear channel-discover pear.phing.info
pear install phing/phing
########################################
## Install cakephp codesniffer
########################################
pear channel-discover pear.cakephp.org
pear install cakephp/CakePHP_CodeSniffer
########################################
## Install apigen
########################################
pear channel-discover pear.apigen.org
pear install pear.apigen.org/apigen
########################################
## Configure PHP-FPM
########################################
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
[www]
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
user = www-data
group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 2500
pm.status_path = /php-status
slowlog = log/$pool.log.slow
chdir = /
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M
ENDFILECONTENT
cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/www.conf.original
echo "$FILECONTENT" > /etc/php5/fpm/pool.d/www.conf
/etc/init.d/php5-fpm restart
########################################
## Nginx
########################################
apt-get install \
nginx \
-y
## CakePHP Configuration
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
include php.conf;
location / {
try_files $uri $uri/ /index.php?$uri&$args;
expires max;
access_log off;
}
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/cakephp.conf
## Common Configuration
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
index index.html;
location ~ /\.ht {
deny all;
}
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/common.conf
## FastCGI Configuration
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $ssl_session_id;
fastcgi_index index.php;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_connect_timeout 60;
fastcgi_read_timeout 180;
fastcgi_send_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/fastcgi_params
## Nginx Main Configuration
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 2;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/nginx.conf
## PHP Configuration
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
index index.php;
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/php.conf
## Default Site Configuration
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
server {
listen 80; ## listen for ipv4; this line is default and implied
root /usr/share/nginx/www;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ /index.html;
}
location /doc {
root /usr/share;
autoindex on;
allow 127.0.0.1;
deny all;
}
location /images {
root /usr/share;
autoindex off;
}
}
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/sites-available/default
## Example CakePHP Site
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
server {
listen 80;
client_max_body_size 2M;
server_name cakephpsite.com;
root /var/virtual/cakephp-2.3/cakephpsite.com/webroot;
access_log /var/log/nginx/cakephpsite.com-access.log;
include common.conf;
include cakephp.conf;
}
server {
listen 80;
client_max_body_size 2M;
server_name www.cakephpsite.com;
rewrite ^ http://cakephpsite.com$uri permanent;
}
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/sites-available/cakephp.example
## Example Plain PHP Site
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
server {
listen 80;
client_max_body_size 2M;
server_name phpsite.com;
root /var/virtual/phpsite.com;
access_log /var/log/nginx/phpsite.com-access.log;
include common.conf;
include php.conf;
}
server {
listen 80;
client_max_body_size 2M;
server_name www.phpsite.com;
rewrite ^ http://phpsite.com$uri permanent;
}
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/sites-available/php.example
/etc/init.d/nginx restart
########################################
## CakePHP and Sites
########################################
mkdir -p /var/virtual
mkdir -p /var/www
chown www-data:www-data /var/virtual /var/www
su www-data -c 'bash -c "
cd /var/virtual
git clone -b 2.3 git://github.com/cakephp/cakephp.git cakephp-2.3
"'
########################################
## Add www-data to sudoers
########################################
adduser www-data sudo
########################################
## Remove any unwanted packages
########################################
apt-get autoremove -y