diff --git a/.gitignore b/.gitignore index 4fbb073..d18a48a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ +/.vagrant/ /vendor/ + /composer.lock diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..10c567a --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,16 @@ +Vagrant.configure(2) do |config| + config.vm.box = "ubuntu/xenial64" + config.vm.define "replicator-dev" + config.vm.hostname = "replicator" + config.vm.network "private_network", type: "dhcp" + config.vm.synced_folder ".", "/vagrant", create: true, mount_options: ["dmode=777,fmode=777"] + + # Get rid of ubuntu-xenial-16.04-cloudimg-console.log + config.vm.provider "virtualbox" do |vb| + vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ] + end + + # Provision the box. + config.vm.provision :shell, privileged: false, path: "./scripts/vagrant/provision.sh" + config.vm.provision :shell, privileged: false, path: "./scripts/vagrant/up.sh", run: "always" +end diff --git a/composer.json b/composer.json index 2a7d349..039d7db 100644 --- a/composer.json +++ b/composer.json @@ -30,11 +30,18 @@ "require-dev": { "squizlabs/php_codesniffer": "^3.3", "phpcompatibility/php-compatibility": "^8.2", - "wp-coding-standards/wpcs": "^1.0" + "wp-coding-standards/wpcs": "^1.0", + "johnpbloch/wordpress": "^4.9" }, "scripts": { "wpcs": [ "vendor/bin/phpcs src" + ], + "wp": [ + "./scripts/vagrant/wp-cli.sh" ] + }, + "extra": { + "wordpress-install-dir": "docker/data/www/wp" } } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..39026ea --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: '3' + +services: + + mysql: + image: mysql:5 + volumes: + - "./docker/data/db:/var/lib/mysql" + restart: always + environment: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: password + + phpfpm: + image: 10up/phpfpm + depends_on: + - mysql + volumes: + - ".:/var/www/html/wp-cli-replicator" + - "./docker/data/www:/var/www/html" + - "./docker/config/php-fpm/php.ini:/usr/local/etc/php/php.ini" + restart: always diff --git a/docker/config/php-fpm/php.ini b/docker/config/php-fpm/php.ini new file mode 100644 index 0000000..0a52732 --- /dev/null +++ b/docker/config/php-fpm/php.ini @@ -0,0 +1,7 @@ +# Custom PHP settings + +upload_max_filesize = 100M +post_max_size = 100M + +[mail function] +sendmail_path = /usr/sbin/ssmtp -t diff --git a/docker/data/.gitignore b/docker/data/.gitignore new file mode 100644 index 0000000..2d94f79 --- /dev/null +++ b/docker/data/.gitignore @@ -0,0 +1,3 @@ +* +!/www +!.gitignore diff --git a/docker/data/www/.gitignore b/docker/data/www/.gitignore new file mode 100644 index 0000000..cc7a6af --- /dev/null +++ b/docker/data/www/.gitignore @@ -0,0 +1 @@ +/wp/ diff --git a/scripts/vagrant/provision.sh b/scripts/vagrant/provision.sh new file mode 100755 index 0000000..dfaee84 --- /dev/null +++ b/scripts/vagrant/provision.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -e + +# Always land in the synced directory. Should we change the home directory instead? +echo "cd /vagrant" >> ~/.bashrc + +# Map wp to wp-cli inside the container. +sudo ln -s /vagrant/scripts/vagrant/wp-cmd.sh /usr/local/bin/wp + +# Map binary name to source URL. +REPOS=( + "docker-compose,https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m`" + "composer,https://getcomposer.org/download/1.7.2/composer.phar" +) + +# Add Docker repo. +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + +sudo apt-get update +sudo apt-get install -y \ + docker-ce avahi-daemon zip unzip php-cli php-curl php-dom php-zip php-zip + +# Ensure we can run docker commands without extra permissions. +sudo usermod -a -G docker "$USER" + +# Install various binary scripts. +for repo_set in "${REPOS[@]}"; do + while IFS=',' read -ra repo; do + dest_path="/usr/local/bin/${repo[0]}" + + if [ ! -f "$dest_path" ]; then + echo "Installing ${repo[1]} to $dest_path" + + sudo curl -sL "${repo[1]}" -o "$dest_path" + sudo chmod +x "$dest_path" + fi + done <<< "$repo_set" +done diff --git a/scripts/vagrant/up.sh b/scripts/vagrant/up.sh new file mode 100755 index 0000000..08fb260 --- /dev/null +++ b/scripts/vagrant/up.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +# TODO Remove sudo once we figure out how to reload user groups. +sudo docker-compose -f /vagrant/docker-compose.yml up --detach --remove-orphans + +# Install WordPress. +. /vagrant/scripts/vagrant/wp-install.sh + +echo "Environment is ready!" diff --git a/scripts/vagrant/wp-cli.sh b/scripts/vagrant/wp-cli.sh new file mode 100755 index 0000000..0ad676c --- /dev/null +++ b/scripts/vagrant/wp-cli.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +# wp is an alias we defined during provision. +vagrant ssh -c "wp ${*:1}" diff --git a/scripts/vagrant/wp-cmd.sh b/scripts/vagrant/wp-cmd.sh new file mode 100644 index 0000000..3f37fab --- /dev/null +++ b/scripts/vagrant/wp-cmd.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +docker-compose --file /vagrant/docker-compose.yml exec -T --user www-data phpfpm wp "${@:1}" diff --git a/scripts/vagrant/wp-install.sh b/scripts/vagrant/wp-install.sh new file mode 100644 index 0000000..80e26c4 --- /dev/null +++ b/scripts/vagrant/wp-install.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +wp core install \ + --title="Replicator CLI" \ + --admin_user=admin \ + --admin_email=admin@example.com