diff --git a/.gitignore b/.gitignore
index 90cbe058..3547f762 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/gw-resources/*
+.vagrant
diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644
index 00000000..7f17a159
--- /dev/null
+++ b/INSTALL.md
@@ -0,0 +1,123 @@
+# jquery-wp-content
+
+`jquery-wp-content` is a **custom replacement** for the `wp-content` directory which contains the plugins, themes and site configuration to run the jQuery multi-site WordPress network.
+
+## Warning
+
+Configuring your own services can result in different configurations from the prodution environment. It is strongly encouraged to use the virtual machine environment as described in [README.md](README.md).
+
+## Prerequisites
+
+This install guide assumes you have certain prerequisites already configured within your environment.
+
+* Apache
+* Mysql
+* PHP
+
+## Installation
+
+1. Configure your local webserver with a virtual host that covers the relevant jQuery domains, such as `*.jquery.com` and `*.jqueryui.com`, all pointing to the same root. For example, in Apache:
+
+```
+
+ ServerName local.jquery.com
+ ServerAlias *.jquery.com *.jqueryui.com *.jquery.org *.qunitjs.com *.sizzlejs.com *.jquerymobile.com
+ DocumentRoot "/srv/www/jquery"
+ php_value memory_limit 256M
+
+ Options All
+ AllowOverride All
+ Order allow,deny
+ Allow from all
+
+
+```
+
+Make sure that virtual hosts are enabled as well:
+
+```
+NameVirtualHost *:80
+```
+
+Both blocks of code should be pasted into `extra/httpd-vhosts.conf`.
+Be sure to check `httpd.conf` to verify there is a line that includes
+`httpd-vhosts.conf`. It may already exist, but be commented out.
+
+Check `httpd.conf` to ensure that the PHP module is enabled as well.
+
+You do not need to configure your `/etc/hosts` file for `local.*` because `jquery.com`'s DNS handles this for you. However, if you plan to work offline, you can use the following rules:
+
+```
+127.0.0.1 local.jquery.com local.api.jquery.com local.blog.jquery.com local.books.jquery.com local.codeorigin.jquery.com local.learn.jquery.com local.plugins.jquery.com
+127.0.0.1 local.jqueryui.com local.api.jqueryui.com local.blog.jqueryui.com
+127.0.0.1 local.jquerymobile.com local.api.jquerymobile.com local.blog.jquerymobile.com
+127.0.0.1 local.jquery.org local.brand.jquery.org local.contribute.jquery.org local.events.jquery.org local.irc.jquery.org local.meetings.jquery.org
+127.0.0.1 local.qunitjs.com local.api.qunitjs.com
+127.0.0.1 local.sizzlejs.com
+```
+
+1. Place the WordPress core files **at** the document root you chose. For example, if you used `/srv/www/jquery`, you should unzip or clone WordPress directly into that directory, *not* a directory below it. **Do not install WordPress.** You can do this any number of ways:
+ * Download the latest version from http://wordpress.org/latest.zip
+ * Check out the latest tag from http://core.svn.wordpress.org/tags/
+ * Clone the official WordPress Github mirror at https://github.com/WordPress/WordPress
+
+1. Clone `jquery-wp-content` inside of the directory where you put WordPress, so you have a file tree that looks like this:
+
+```
+├── jquery
+│ ├── gw-resources
+│ ├── index.php
+│ ├── jquery-wp-content
+│ ├── license.txt
+│ ├── readme.html
+│ ├── wp-activate.php
+│ ├── wp-admin
+│ ├── wp-blog-header.php
+│ ├── wp-comments-post.php
+│ ├── wp-config-sample.php
+│ ├── wp-content
+│ ├── ...
+│ └── xmlrpc.php
+```
+
+1. Create a MySQL database and user. You can choose any name you want for both. Follow the [WordPress instructions](http://codex.wordpress.org/Installing_WordPress#Step_2:_Create_the_Database_and_a_User) for a step by step guide.
+
+1. Copy `jquery-wp-content/wp-config-sample.php` and move it up one directory, to `wp-config.php`. Fill in your database credentials.
+
+1. Create an .htaccess file with the following content into that same document root:
+
+```
+RewriteEngine On
+RewriteBase /
+RewriteRule ^index\.php$ - [L]
+
+RewriteRule ^resources/?$ index.php [L]
+RewriteRule ^resources/(.+) gw-resources/%{HTTP_HOST}/$1 [L]
+
+# Add a trailing slash to the wp-admin of a subsite.
+RewriteRule ^([_0-9a-zA-Z\.-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
+
+RewriteCond %{REQUEST_FILENAME} -f [OR]
+RewriteCond %{REQUEST_FILENAME} -d
+RewriteRule ^ - [L]
+
+# Handle wp-admin, wp-includes, and root PHP files for subsites.
+RewriteRule ^[_0-9a-zA-Z\.-]+/((wp-admin|wp-includes).*) $1 [L]
+RewriteRule ^[_0-9a-zA-Z\.-]+/(.*\.php)$ $1 [L]
+
+RewriteRule . index.php [L]
+```
+
+1. Make sure that you have assigned your WordPress files and directories the correct permissions.
+For example, if your WordPress files are in the directory ```wordpress```, and you are running Apache under Mac OS X with the ```_www``` user:
+
+```
+sudo chown -R _www wordpress
+sudo chmod -R g+w wordpress
+```
+
+1. Restart your web server so the changes above are in use.
+
+1. Go to `http://local.jquery.com` and walk through the standard WordPress installation. `jquery-wp-content` includes a special install script that will initialize the entire network.
+
+1. Be sure to have node >= 0.8 installed on your system. Some sites, such as download.jqueryui.com, require that version or greater.
diff --git a/README.md b/README.md
index 62a7eb84..647daf1a 100644
--- a/README.md
+++ b/README.md
@@ -1,126 +1,84 @@
-# jQuery.com jquery-wp-content
+# jquery-wp-content
`jquery-wp-content` is a **custom replacement** for the `wp-content` directory which contains the plugins, themes and site configuration to run the jQuery multi-site WordPress network.
+Although we recommend using the pre-built VM, if you would like to manually install `jquery-wp-content` you will find instructions for installing in the [INSTALL.md](INSTALL.md) file in this directory. We strongly recommend using the VM as it will provide the same environment as our production servers.
## Prerequisites
-This install guide assumes you already have certain prerequisites already configured within your environment.
-
-* Apache
-* Mysql
-* PHP
-
-## Installation
-
-1. Configure your local webserver with a virtual host that covers the relevant jQuery domains, such as `*.jquery.com` and `*.jqueryui.com`, all pointing to the same root. For example, in Apache:
+This setup guide assumes you have certain prerequisites installed.
- ```
-
- ServerName local.jquery.com
- ServerAlias *.jquery.com *.jqueryui.com *.jquery.org *.qunitjs.com *.sizzlejs.com *.jquerymobile.com
- DocumentRoot "/srv/www/jquery"
- php_value memory_limit 256M
-
- Options All
- AllowOverride All
- Order allow,deny
- Allow from all
-
-
- ```
+* [Virtualbox >=4.3+](https://www.virtualbox.org/)
+* [Vagrant >=1.4.0](http://www.vagrantup.com/)
- Make sure that virtual hosts are enabled as well:
+## Vagrant and Virtualbox
- ```
- NameVirtualHost *:80
- ```
+We recommend the combination of Virtualbox and [Vagrant](http://www.vagrantup.com/about.html) for a local development environment. Vagrant simplifies download, installation, and management of the local environment VM with a few commands.
- Both blocks of code should be pasted into `extra/httpd-vhosts.conf`.
- Be sure to check `httpd.conf` to verify there is a line that includes
- `httpd-vhosts.conf`. It may already exist, but be commented out.
+### Setup
- Check `httpd.conf` to ensure that the PHP module is enabled as well.
+From the root of your `jquery-wp-content` clone run the following command:
- You do not need to configure your `/etc/hosts` file for `local.*` because `jquery.com`'s DNS handles this for you. However, if you plan to work offline, you can use the following rules:
+```
+vagrant up
+```
- ```
- 127.0.0.1 local.jquery.com local.api.jquery.com local.blog.jquery.com local.books.jquery.com local.codeorigin.jquery.com local.learn.jquery.com local.plugins.jquery.com
- 127.0.0.1 local.jqueryui.com local.api.jqueryui.com local.blog.jqueryui.com
- 127.0.0.1 local.jquerymobile.com local.api.jquerymobile.com local.blog.jquerymobile.com
- 127.0.0.1 local.jquery.org local.brand.jquery.org local.contribute.jquery.org local.events.jquery.org local.irc.jquery.org local.meetings.jquery.org
- 127.0.0.1 local.qunitjs.com local.api.qunitjs.com
- 127.0.0.1 local.sizzlejs.com
- ```
+This will start the VM for you, the output should look similar to what you see below.
-1. Place the WordPress core files **at** the document root you chose. For example, if you used `/srv/www/jquery`, you should unzip or clone WordPress directly into that directory, *not* a directory below it. **Do not install WordPress.** You can do this any number of ways:
- * Download the latest version from http://wordpress.org/latest.zip
- * Check out the latest tag from http://core.svn.wordpress.org/tags/
- * Clone the official WordPress Github mirror at https://github.com/WordPress/WordPress
+```
+Bringing machine 'default' up with 'virtualbox' provider...
+[default] Box 'jquery-wp-content' was not found. Fetching box from specified URL for
+the provider 'virtualbox'. Note that if the URL does not have
+a box for this provider, you should interrupt Vagrant now and add
+the box yourself. Otherwise Vagrant will attempt to download the
+full box prior to discovering this error.
+Downloading box from URL: http://boxes.jquery.com/jquery-wp-content.box
+Calculating and comparing box checksum...ime remaining: 0:00:01)
+Extracting box...
+Successfully added box 'jquery-wp-content' with provider 'virtualbox'!
+[default] Importing base box 'jquery-wp-content'...
+[default] Matching MAC address for NAT networking...
+[default] Setting the name of the VM...
+[default] Clearing any previously set forwarded ports...
+[default] Clearing any previously set network interfaces...
+[default] Preparing network interfaces based on configuration...
+[default] Forwarding ports...
+[default] -- 22 => 2222 (adapter 1)
+[default] Running 'pre-boot' VM customizations...
+[default] Booting VM...
+[default] Waiting for machine to boot. This may take a few minutes...
+[default] Machine booted and ready!
+[default] Setting hostname...
+[default] Configuring and enabling network interfaces...
+[default] Mounting shared folders...
+[default] -- /vagrant
+[default] -- /var/www/wordpress/jquery-wp-content
+```
-1. Clone `jquery-wp-content` inside of the directory where you put WordPress, so you have a file tree that looks like this:
+Complete the installation process by pointing your browser at http://vagrant.jquery.com/. Feel free to use any username/password/email combination that you choose, though keep note of the username and password as you will need them to deploy to your local VM.
- ```
- ├── jquery
- │ ├── gw-resources
- │ ├── index.php
- │ ├── jquery-wp-content
- │ ├── license.txt
- │ ├── readme.html
- │ ├── wp-activate.php
- │ ├── wp-admin
- │ ├── wp-blog-header.php
- │ ├── wp-comments-post.php
- │ ├── wp-config-sample.php
- │ ├── wp-content
- │ ├── ...
- │ └── xmlrpc.php
- ```
+You do not need to configure your `/etc/hosts` file for `vagrant.*` because `jquery.com`'s DNS handles this for you. However, if you plan to work offline, you can use the following rules:
-1. Create a MySQL database and user. You can choose any name you want for both. Follow the [WordPress instructions](http://codex.wordpress.org/Installing_WordPress#Step_2:_Create_the_Database_and_a_User) for a step by step guide.
+```
+172.27.72.27 vagrant.jquery.com vagrant.api.jquery.com vagrant.blog.jquery.com vagrant.books.jquery.com vagrant.codeorigin.jquery.com vagrant.learn.jquery.com vagrant.plugins.jquery.com
+172.27.72.27 vagrant.jqueryui.com vagrant.api.jqueryui.com vagrant.blog.jqueryui.com
+172.27.72.27 vagrant.jquerymobile.com vagrant.api.jquerymobile.com vagrant.blog.jquerymobile.com
+172.27.72.27 vagrant.jquery.org vagrant.brand.jquery.org vagrant.contribute.jquery.org vagrant.events.jquery.org vagrant.irc.jquery.org vagrant.meetings.jquery.org
+172.27.72.27 vagrant.qunitjs.com vagrant.api.qunitjs.com
+172.27.72.27 vagrant.sizzlejs.com
+```
-1. Copy `jquery-wp-content/wp-config-sample.php` and move it up one directory, to `wp-config.php`. Fill in your database credentials.
+### Stopping and Restarting the Virtual Machine
-1. Create an .htaccess file with the following content into that same document root:
+When you're not working on `jquery-wp-content` you'll probably want to run `vagrant halt` to turn off the VM to save yourself some system resources. Alternatively you can suspend the VM by using `vagrant suspend`. You can always start the VM by running `vagrant up`.
- ```
- RewriteEngine On
- RewriteBase /
- RewriteRule ^index\.php$ - [L]
+### Clean up
- RewriteRule ^resources/?$ index.php [L]
- RewriteRule ^resources/(.+) gw-resources/%{HTTP_HOST}/$1 [L]
-
- # Add a trailing slash to the wp-admin of a subsite.
- RewriteRule ^([_0-9a-zA-Z\.-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
-
- RewriteCond %{REQUEST_FILENAME} -f [OR]
- RewriteCond %{REQUEST_FILENAME} -d
- RewriteRule ^ - [L]
-
- # Handle wp-admin, wp-includes, and root PHP files for subsites.
- RewriteRule ^[_0-9a-zA-Z\.-]+/((wp-admin|wp-includes).*) $1 [L]
- RewriteRule ^[_0-9a-zA-Z\.-]+/(.*\.php)$ $1 [L]
-
- RewriteRule . index.php [L]
- ```
-
-1. Make sure that you have assigned your WordPress files and directories the correct permissions.
-For example, if your WordPress files are in the directory ```wordpress```, and you are running Apache under Mac OS X with the ```_www``` user:
-
- ```
- sudo chown -R _www wordpress
- sudo chmod -R g+w wordpress
- ```
-
-1. Restart your web server so the changes above are in use.
-
-1. Go to `http://local.jquery.com` and walk through the standard WordPress installation. `jquery-wp-content` includes a special install script that will initialize the entire network.
-
-1. Be sure to have node >= 0.8 installed on your system. Some sites, such as download.jqueryui.com, require that version or greater.
+Should you need to recover some harddrive space you can safely run the `vagrant destroy` command from within your `jquery-wp-content` clone. This will delete the VM image from your hard drive. **You will not lose any work by doing this.**
## Auto-Updates
-Changes pushed to master will be pulled onto the stage domain.
+
+Changes pushed to master are automatically pulled onto the stage domain.
## Copyright
diff --git a/Vagrantfile b/Vagrantfile
new file mode 100644
index 00000000..bbc3afa6
--- /dev/null
+++ b/Vagrantfile
@@ -0,0 +1,32 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+VAGRANTFILE_API_VERSION = "2"
+Vagrant.require_version ">= 1.4.0"
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+
+ # use the config key as the vm identifier
+ config.vm.box = "jquery-wp-content"
+ config.vm.box_download_checksum_type = "sha256"
+ config.vm.box_download_checksum = "3182bc50668e86022e7d50bc8c096774b49de40cfaffc77f4fad75ca6cf83d3d"
+
+ config.vm.box_url = "http://boxes.jquery.com/jquery-wp-content.box"
+
+ config.vm.synced_folder "./", "/var/www/wordpress/jquery-wp-content"
+
+ # assign an ip address in the hosts network
+ config.vm.network "private_network", ip: "172.27.72.27"
+
+ # set the hostname of the vm so puppet site.pp will react
+ # with the right node config
+ # config.vm.provision :shell, :inline => "hostname vagrant.jquery.com"
+ config.vm.hostname = "vagrant.jquery.com"
+
+ config.vm.provider "virtualbox" do |v|
+ # make sure that the name makes sense when seen in the vbox GUI
+ v.name = "jQuery Sites"
+
+ # Be nice to our users.
+ v.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
+ end
+end
diff --git a/uploads/.gitkeep b/uploads/.gitkeep
new file mode 100644
index 00000000..e69de29b