diff --git a/.gitignore b/.gitignore index 4bcb0e2e3..e1fe49752 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ /provision/provision-post.sh /provision/github.token /provision/resources/ +/provision/utilities/ /provision/phpcs/ # Ignore custom trigger scripts in config/homebin. diff --git a/CHANGELOG.md b/CHANGELOG.md index c1d4d6fa8..7f009f08d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,39 @@ title: Changelog permalink: /docs/en-US/changelog/ --- -## 2.6.0 ( TBD ) +## 3.0.0 ( 17 May 2019 ) + +This version moves to an Ubuntu 18.04 box. It also moves the database data directory to a mounted folder. This means you can destroy and rebuild the VM without loss, but it also means **a `vagrant destroy` is necessary to update**. **Be sure to back up database tables you need beforehand**. + +If you have issues provisioning with the new shared database folder, you can disable it by adding `db_share_type: false` to the `general:` section of `vvv-custom.yml` then reprovisioning. This will return you to the VVV 2 behaviour. + +In the near future, we expect to use a box with PHP/etc preinstalled, this will be VVV 4.0. + +### Enhancements + + - The box was changed to use Ubuntu 18.04 LTS + - If cloning a git repo to create a new site fails, VVV will halt provisioning and warn the user + - Added tbe `git-svn` package, `git-svn` is used for bi-directional operation between subversion and git + - MongoDB was updated to v4.0 + - New `/srv/provision` and `/srv/certificates` shared folders + - Provisioners now log their output to a `logs/provisioners` folder, with each provision having its own subfolder + +### Bug Fixes + + - Added a VVV package mirror PPA + - Updated apt-get keys for several sources + - Prevented provisioning from occurring inside Ubuntu 14 VMs + - Fixed issues with Nginx restarting too fast and too often by reloading instead + - Fixed the permissions on the `db_restore` script + - The `/var/log` folder is no longer directly mounted, instead the `/var/log/php`, `/var/log/nginx`, `/var/log/provisioners` and `/var/log/memcached` subfolders are mounted. This improves compatibility + - The SQL import script for backups will now create the databases if they don't exist before importing + +### Removals + + - The deprecated domains `vvv.dev`, `vvv.local`, and `vvv.localhost`, were removed, the dashboard lives at `vvv.test`. + - Removed the `/vagrant` default shared folder + +## 2.6.0 ( 2nd April 2019 ) ### Enhancements diff --git a/README.md b/README.md index c966e34b7..908c745c2 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,33 @@ -# Varying Vagrant Vagrants +# Varying Vagrant Vagrants ( VVV ) -Varying Vagrant Vagrants is an open source [Vagrant](https://www.vagrantup.com) configuration focused on [WordPress](https://wordpress.org) development. +VVV is local developer environment, mainly aimed at [WordPress](https://wordpress.org) developers. It uses [Vagrant](https://www.vagrantup.com) and VirtualBox, and can be used ot build sites and contribute to WordPress. -The online documentation contains detailed [installation instructions](https://varyingvagrantvagrants.org/docs/en-US/installation/). +## How To Use -VVV is a [10up](https://10up.com) creation and [transitioned](http://10up.com/blog/varying-vagrant-vagrants-future/) to a community organization in 2014. +To use it, download and install [Vagrant](https://www.vagrantup.com) and [VirtualBox](https://www.virtualbox.org/). Then, clone this repository and run: -* **Latest Stable**: [2.5.0 master branch](https://github.com/Varying-Vagrant-Vagrants/VVV/tree/master) -* **Web**: [https://varyingvagrantvagrants.org/](https://varyingvagrantvagrants.org/) -* **Contributing**: Contributions are more than welcome. Please see our current [contributing guidelines](https://varyingvagrantvagrants.org/docs/en-US/contributing/). Thanks! +``` +vagrant plugin install vagrant-hostsupdater --local +vagrant up --provision +``` +When it's done, visit http://vvv.test. -VVV is under the [MIT License](LICENSE). +The online documentation contains more detailed [installation instructions](https://varyingvagrantvagrants.org/docs/en-US/installation/). -## Objectives -* Approachable development environment with a modern server configuration. -* Stable state of software and configuration in default provisioning. -* Excellent and clear documentation to aid in learning and scaffolding. +* **Web**: [https://varyingvagrantvagrants.org/](https://varyingvagrantvagrants.org/) +* **Contributing**: Contributions are more than welcome. Please see our current [contributing guidelines](https://varyingvagrantvagrants.org/docs/en-US/contributing/). Thanks! -VVV is ideal for developing themes and plugins, as well as for [contributing to WordPress core](https://make.wordpress.org/core/). ## Minimum System requirements - [Vagrant](https://www.vagrantup.com) 2.2.4+ - [Virtualbox](https://www.virtualbox.org) 5.2+ +- 8GB+ of RAM +- Virtualisation ( VT-X ) enabled in the BIOS ( Windows/Linux ) +- Hyper-V turned off ( Windows ) ## Software included -VVV is built on a Ubuntu 14.04 LTS (Trusty) base VM and provisions the server with current versions of several software packages, including: - -1. [Nginx](http://nginx.org/) (mainline) -1. [MariaDB](https://mariadb.org/) 10.1.x (drop-in replacement for MySQL) -1. [PHP FPM](http://php-fpm.org/) 7.2.x -1. [WP-CLI](http://wp-cli.org/) -1. [Memcached](http://memcached.org/) -1. [PHPUnit](https://phpunit.de/) -1. [Composer](https://github.com/composer/composer) -1. [NodeJs](https://nodejs.org/) v10 -1. [Mailhog](https://github.com/mailhog/MailHog) - -For a more comprehensive list, please see the [list of installed packages](https://varyingvagrantvagrants.org/docs/en-US/installed-packages/). - -## How to Use VVV - -VVV requires recent versions of both Vagrant and VirtualBox. - -[Vagrant](https://www.vagrantup.com) is a "tool for building and distributing development environments". It works with [virtualization](https://en.wikipedia.org/wiki/X86_virtualization) software such as [VirtualBox](https://www.virtualbox.org/) to provide a virtual machine sandboxed from your local environment. - -Besides VirtualBox, provider support is also included for Parallels, Hyper-V, VMWare Fusion, and VMWare Workstation. - -The online documentation contains detailed [installation instructions](https://varyingvagrantvagrants.org/docs/en-US/installation/). - -Full documentation can be found on the [varyingvagrantvagrants.org](https://varyingvagrantvagrants.org) website. - -## Contributors +For a comprehensive list, please see the [list of installed packages](https://varyingvagrantvagrants.org/docs/en-US/installed-packages/). -A full list of contributors can be found [here](https://github.com/Varying-Vagrant-Vagrants/VVV/graphs/contributors). diff --git a/Vagrantfile b/Vagrantfile index ed5481a61..a3b6fd0f7 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -1,6 +1,6 @@ # -*- mode: ruby -*- # vi: set ft=ruby ts=2 sw=2 et: -Vagrant.require_version ">= 2.1.4" +Vagrant.require_version ">= 2.2.4" require 'yaml' require 'fileutils' @@ -96,7 +96,7 @@ version = versionfile.read version = version.gsub('\n','') # whitelist when we show the logo, else it'll show on global Vagrant commands -if [ 'up', 'halt', 'resume', 'suspend', 'status', 'provision', 'reload' ].include? ARGV[0] then +if [ 'up', 'resume', 'status', 'provision', 'reload' ].include? ARGV[0] then show_logo = true end if ENV['VVV_SKIP_LOGO'] then @@ -130,6 +130,13 @@ if File.file?(File.join(vagrant_dir, 'vvv-custom.yml')) == false then FileUtils.cp( File.join(vagrant_dir, 'vvv-config.yml'), File.join(vagrant_dir, 'vvv-custom.yml') ) end +old_db_backup_dir = File.join(vagrant_dir, 'database/backups/' ) +new_db_backup_dir = File.join(vagrant_dir, 'database/sql/backups/' ) +if ( File.directory?( old_db_backup_dir ) == true ) && ( File.directory?( new_db_backup_dir ) == false ) then + puts "Moving db backup directory into database/sql/backups" + FileUtils.mv( old_db_backup_dir, new_db_backup_dir ) +end + vvv_config_file = File.join(vagrant_dir, 'vvv-custom.yml') vvv_config = YAML.load_file(vvv_config_file) @@ -142,10 +149,7 @@ if ! vvv_config['hosts'].kind_of? Hash then vvv_config['hosts'] = Array.new end -vvv_config['hosts'] += ['vvv.dev'] # Deprecated vvv_config['hosts'] += ['vvv.test'] -vvv_config['hosts'] += ['vvv.local'] -vvv_config['hosts'] += ['vvv.localhost'] vvv_config['sites'].each do |site, args| if args.kind_of? String then @@ -219,6 +223,10 @@ if ! vvv_config['vm_config'].kind_of? Hash then vvv_config['vm_config'] = Hash.new end +if ! vvv_config['general'].kind_of? Hash then + vvv_config['general'] = Hash.new +end + defaults = Hash.new defaults['memory'] = 2048 defaults['cores'] = 1 @@ -283,6 +291,22 @@ if show_logo then end end + if defined? vvv_config['vm_config']['wordcamp_contributor_day_box'] then + if vvv_config['vm_config']['wordcamp_contributor_day_box'] == true then + platform = platform + 'contributor_day_box ' + end + end + + if defined? vvv_config['general']['db_share_type'] then + if vvv_config['general']['db_share_type'] != true then + platform = platform + 'shared_db_folder_disabled ' + else + platform = platform + 'shared_db_folder_enabled ' + end + else + platform = platform + 'shared_db_folder_default ' + end + splashsecond = <<-HEREDOC #{yellow}Platform: #{yellow}#{platform} #{green}Vagrant: #{green}v#{Vagrant::VERSION}, #{blue}VirtualBox: #{blue}v#{virtualbox_version()} @@ -313,6 +337,9 @@ Vagrant.configure("2") do |config| # Configurations from 1.0.x can be placed in Vagrant 1.1.x specs like the following. config.vm.provider :virtualbox do |v| + # Move the ubuntu-bionic-18.04-cloudimg-console.log file to log directory. + v.customize ["modifyvm", :id, "--uartmode1", "file", File.join(vagrant_dir, "log/ubuntu-bionic-18.04-cloudimg-console.log")] + v.customize ["modifyvm", :id, "--memory", vvv_config['vm_config']['memory']] v.customize ["modifyvm", :id, "--cpus", vvv_config['vm_config']['cores']] v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] @@ -366,6 +393,11 @@ Vagrant.configure("2") do |config| end end + # The vbguest plugin has issues for some users, so we're going to disable it for now + if Vagrant.has_plugin?("vagrant-vbguest") + config.vbguest.auto_update = false + end + # SSH Agent Forwarding # # Enable agent forwarding on vagrant ssh commands. This allows you to use ssh keys @@ -380,13 +412,11 @@ Vagrant.configure("2") do |config| # Default Ubuntu Box # - # This box is provided by Ubuntu vagrantcloud.com and is a nicely sized (332MB) - # box containing the Ubuntu 14.04 Trusty 64 bit release. Once this box is downloaded + # This box is provided by Ubuntu vagrantcloud.com and is a nicely sized + # box containing the Ubuntu 18.04 Bionic 64 bit release. Once this box is downloaded # to your host computer, it is cached for future use under the specified box name. - # - # Note: We would like to update this to a newer box, but a naive update would - # destroy everybodies databases, it's not as simple as it first seems - config.vm.box = "ubuntu/trusty64" + #config.vm.box = "ubuntu/bionic64" + config.vm.box = "varying-vagrant-vagrants/ubuntu-18.04" # If we're at a contributor day, switch the base box to the prebuilt one if defined? vvv_config['vm_config']['wordcamp_contributor_day_box'] then @@ -397,22 +427,22 @@ Vagrant.configure("2") do |config| # The Parallels Provider uses a different naming scheme. config.vm.provider :parallels do |v, override| - override.vm.box = "parallels/ubuntu-14.04" + override.vm.box = "parallels/ubuntu-18.04" end # The VMware Fusion Provider uses a different naming scheme. config.vm.provider :vmware_fusion do |v, override| - override.vm.box = "puphpet/ubuntu1404-x64" + override.vm.box = "puphpet/ubuntu1804-x64" end # VMWare Workstation can use the same package as Fusion config.vm.provider :vmware_workstation do |v, override| - override.vm.box = "puphpet/ubuntu1404-x64" + override.vm.box = "puphpet/ubuntu1804-x64" end # Hyper-V uses a different base box. config.vm.provider :hyperv do |v, override| - override.vm.box = "bento/ubuntu-14.04" + override.vm.box = "bento/ubuntu-18.04" end config.vm.hostname = "vvv" @@ -470,33 +500,57 @@ Vagrant.configure("2") do |config| # virtual machine is destroyed with `vagrant destroy`, your files will remain in your local # environment. + # Disable the default synced folder to avoid overlapping mounts + config.vm.synced_folder '.', '/vagrant', disabled: true + config.vm.provision "file", source: "#{vagrant_dir}/version", destination: "/home/vagrant/version" + config.vm.provision "file", source: "#{vagrant_dir}/vvv-custom.yml", destination: "/home/vagrant/vvv-custom.yml" + $script = <<-SCRIPT +# cleanup +rm -rf /vagrant/* +mkdir -p /vagrant +touch /vagrant/provisioned_at +echo `date "+%Y%m%d-%H%M%S"` > /vagrant/provisioned_at +# copy over version and config files +cp -f /home/vagrant/version /vagrant +cp -f /home/vagrant/vvv-custom.yml /vagrant + +# symlink the certificates folder for older site templates compat +ln -s /srv/certificates /vagrant/certificates +SCRIPT + config.vm.provision "shell", + inline: $script + # /srv/database/ # # If a database directory exists in the same directory as your Vagrantfile, # a mapped directory inside the VM will be created that contains these files. # This directory is used to maintain default database scripts as well as backed # up MariaDB/MySQL dumps (SQL files) that are to be imported automatically on vagrant up - config.vm.synced_folder "database/", "/srv/database" - - # If the mysql_upgrade_info file from a previous persistent database mapping is detected, - # we'll continue to map that directory as /var/lib/mysql inside the virtual machine. Once - # this file is changed or removed, this mapping will no longer occur. A db_backup command - # is now available inside the virtual machine to backup all databases for future use. This - # command is automatically issued on halt, suspend, and destroy - if File.exists?(File.join(vagrant_dir,'database/data/mysql_upgrade_info')) then - config.vm.synced_folder "database/data/", "/var/lib/mysql", :mount_options => [ "dmode=777", "fmode=777" ] - - # The Parallels Provider does not understand "dmode"/"fmode" in the "mount_options" as - # those are specific to Virtualbox. The folder is therefore overridden with one that - # uses corresponding Parallels mount options. - config.vm.provider :parallels do |v, override| - override.vm.synced_folder "database/data/", "/var/lib/mysql", :mount_options => [] - end - # Neither does the HyperV provider - config.vm.provider :hyperv do |v, override| - override.vm.synced_folder "database/data/", "/var/lib/mysql", :mount_options => [] + config.vm.synced_folder "database/sql/", "/srv/database" + use_db_share = true + + if defined? vvv_config['general']['db_share_type'] then + if vvv_config['general']['db_share_type'] != false then + use_db_share = true + else + use_db_share = false end end + if use_db_share == true then + # Map the MySQL Data folders on to mounted folders so it isn't stored inside the VM + config.vm.synced_folder "database/data/", "/var/lib/mysql", create: true, owner: 112, group: 115, mount_options: [ "dmode=775", "fmode=664" ] + end + + # The Parallels Provider does not understand "dmode"/"fmode" in the "mount_options" as + # those are specific to Virtualbox. The folder is therefore overridden with one that + # uses corresponding Parallels mount options. + config.vm.provider :parallels do |v, override| + override.vm.synced_folder "database/data/", "/var/lib/mysql", create: true, owner: "mysql", group: "mysql", :mount_options => [] + end + # Neither does the HyperV provider + config.vm.provider :hyperv do |v, override| + override.vm.synced_folder "database/data/", "/var/lib/mysql", create: true, owner: "mysql", group: "mysql", :mount_options => [] + end # /srv/config/ # @@ -506,22 +560,35 @@ Vagrant.configure("2") do |config| # nginx as well as any pre-existing database files. config.vm.synced_folder "config/", "/srv/config" + # /srv/config/ + # + # Map the provision folder so that utilities and provisioners can access helper scripts + config.vm.synced_folder "provision/", "/srv/provision" + + # /srv/certificates + # + # This is a location for the TLS certificates to be accessible inside the VM + config.vm.synced_folder "certificates/", "/srv/certificates", create: true + # /var/log/ # # If a log directory exists in the same directory as your Vagrantfile, a mapped # directory inside the VM will be created for some generated log files. - config.vm.synced_folder "log/", "/var/log", :owner => "vagrant", :mount_options => [ "dmode=777", "fmode=777" ] + config.vm.synced_folder "log/memcached", "/var/log/memcached", owner: "root", create: true, group: "syslog", mount_options: [ "dmode=777", "fmode=666" ] + config.vm.synced_folder "log/nginx", "/var/log/nginx", owner: "root", create: true, group: "syslog", mount_options: [ "dmode=777", "fmode=666" ] + config.vm.synced_folder "log/php", "/var/log/php", create: true, owner: "root", group: "syslog", mount_options: [ "dmode=777", "fmode=666" ] + config.vm.synced_folder "log/provisioners", "/var/log/provisioners", create: true, owner: "root", group: "syslog", mount_options: [ "dmode=777", "fmode=666" ] # /srv/www/ # # If a www directory exists in the same directory as your Vagrantfile, a mapped directory # inside the VM will be created that acts as the default location for nginx sites. Put all # of your project files here that you want to access through the web server - config.vm.synced_folder "www/", "/srv/www", :owner => "www-data", :mount_options => [ "dmode=775", "fmode=774" ] + config.vm.synced_folder "www/", "/srv/www", owner: "vagrant", group: "www-data", mount_options: [ "dmode=775", "fmode=774" ] vvv_config['sites'].each do |site, args| if args['local_dir'] != File.join(vagrant_dir, 'www', site) then - config.vm.synced_folder args['local_dir'], args['vm_dir'], :owner => "www-data", :mount_options => [ "dmode=775", "fmode=774" ] + config.vm.synced_folder args['local_dir'], args['vm_dir'], owner: "vagrant", group: "www-data", :mount_options => [ "dmode=775", "fmode=774" ] end end @@ -696,7 +763,7 @@ Vagrant.configure("2") do |config| # scripting. See the individual files in config/homebin/ for details. config.trigger.after :up do |trigger| trigger.name = "VVV Post-Up" - trigger.run_remote = { inline: "/vagrant/config/homebin/vagrant_up" } + trigger.run_remote = { inline: "/srv/config/homebin/vagrant_up" } trigger.on_error = :continue end config.trigger.before :provision do |trigger| @@ -705,32 +772,32 @@ Vagrant.configure("2") do |config| end config.trigger.after :provision do |trigger| trigger.name = "VVV Post-Provision" - trigger.run_remote = { inline: "/vagrant/config/homebin/vagrant_provision" } + trigger.run_remote = { inline: "/srv/config/homebin/vagrant_provision" } trigger.on_error = :continue end config.trigger.before :reload do |trigger| trigger.name = "VVV Pre-Reload" - trigger.run_remote = { inline: "/vagrant/config/homebin/vagrant_halt" } + trigger.run_remote = { inline: "/srv/config/homebin/vagrant_halt" } trigger.on_error = :continue end config.trigger.after :reload do |trigger| trigger.name = "VVV Post-Reload" - trigger.run_remote = { inline: "/vagrant/config/homebin/vagrant_up" } + trigger.run_remote = { inline: "/srv/config/homebin/vagrant_up" } trigger.on_error = :continue end config.trigger.before :halt do |trigger| trigger.name = "VVV Pre-Halt" - trigger.run_remote = { inline: "/vagrant/config/homebin/vagrant_halt" } + trigger.run_remote = { inline: "/srv/config/homebin/vagrant_halt" } trigger.on_error = :continue end config.trigger.before :suspend do |trigger| trigger.name = "VVV Pre-Suspend" - trigger.run_remote = { inline: "/vagrant/config/homebin/vagrant_suspend" } + trigger.run_remote = { inline: "/srv/config/homebin/vagrant_suspend" } trigger.on_error = :continue end config.trigger.before :destroy do |trigger| trigger.name = "VVV Pre-Destroy" - trigger.run_remote = { inline: "/vagrant/config/homebin/vagrant_destroy" } + trigger.run_remote = { inline: "/srv/config/homebin/vagrant_destroy" } trigger.on_error = :continue end end diff --git a/config/apt-keys/mariadb.key b/config/apt-keys/mariadb.key index 25305f224..2017c9398 100644 --- a/config/apt-keys/mariadb.key +++ b/config/apt-keys/mariadb.key @@ -1,352 +1,105 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 -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 -=1WLn ------END PGP PUBLIC KEY BLOCK----- +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 +=RFwu +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/config/apt-keys/keyserver_ubuntu.key b/config/apt-keys/ondrej_keyserver_ubuntu.key similarity index 100% rename from config/apt-keys/keyserver_ubuntu.key rename to config/apt-keys/ondrej_keyserver_ubuntu.key diff --git a/config/apt-keys/varying-vagrant-vagrants_keyserver_ubuntu.key b/config/apt-keys/varying-vagrant-vagrants_keyserver_ubuntu.key new file mode 100644 index 000000000..b99deb6cf --- /dev/null +++ b/config/apt-keys/varying-vagrant-vagrants_keyserver_ubuntu.key @@ -0,0 +1,28 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.6 +Comment: Hostname: keyserver.ubuntu.com + +mQINBFxe5lABEACi7rpjuCauLNhn/Sacn4+7r2u/3gPhVwxAp6/rUbbwxaMy0sxk7xvOS/Nt +KHmJk8YZ73BrARg6/v6bejyVAVA0hFNqXw7fY6e4WK53hgvILcibFcZLRAnsSoHvqamil8+X +xBdM3JZJkNRF5Gkky9pCx59zmDeLtYzoBMksAPcZA279sQxYOzlazCtj5ZhvDRdwzl0As5HC +TVZYkUfAOWC3NQrHOHLAHk4DpAZzzi5JCp68Jif/sR3d9fH3nupzxVTZ9pHMoBEuxIZct3ep +S9JX7DUo2xdCMbtDoHVtZrRTkiL0HtvX/k5RP55iwsLOuPeyI5B29Il7A29ru6vACmPS+2yt +Qa7JTXGRnXEZfPcfhehy5BpeVsRdb5AIkCqnMrt9X2L7n8LWlTb7p6EZcsfS+lOq6HrQqc5E +IbRhwpeoBcFBdiCK6YrH4ymJJZmCI+qXvVCNFtj2+bgo+9l1tzkG3Pe+yqWbDsOxTJyF7+dy +MUEQ20arw6OnJaPa9uqJxzEHh5ff84DdIVmnyyX2IT4Z0HYZH5rywpPk56Db2ds5wyEFdrno +V5l5vy54AVkICNgHOBcVsmnElK06jAGwx8LvjuDWpxUUWN2s1W4hqaQljTOabO53M+88tBpn +4hlaHzo/FTNiJmwu5iYUWtcuYJgNZi+jQ19QD9LiBaCfVpOLOQARAQABtCpMYXVuY2hwYWQg +UFBBIGZvciBWYXJ5aW5nIFZhZ3JhbnQgVmFncmFudHOJAjgEEwECACIFAlxe5lACGwMGCwkI +BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEF7jW7hrpWsdJ7sP/2RUvubz1+WZlyEvIX3D5rzf +A51gqMWtR/3pH/4kOuQq1P+oOocqrhZ3QA3SDVTVnYzbXnBDsedzhUeFBgnqwtjx2/qP+GN6 +Gdt854BA7EUhJDeqiHJSZnpZUwJiS533Mi+TSqy1spr8E74BV6sykNYPdSe6oVK/IFcj1lFk +/pwNROpNRPGHzwXNFO4xZvY6DVSV1V3JneI7XuNvt7Ogyk2KrLuwJaltj6ehl9ttu0gDbvcR +2HZu4+1WNdvFBtStSleAUSi6l0T5Btw97IctNwPs6GXJSWIPn9Vstf35WfkBfNa8SLxnEgEp +1JAWrDMg7LLUvNa6ZUHHSI7u391xqI9fzlCcskUdS2m+u7yOFDUWn/P5KjpJods1DSLwIBLT +M0fHHohPwh+F/tkzJRtHp0pZyZocA4LjM1PdfNuo3uYo7VaxDSPTS7Z0z0IIizO7Oe8dLLPi +gj8niYo90F3+aEyGX3e1MqFDLNPU4trSEodgPwEmG3BBOxJoQxXIU6bv1EkqmAdrUYrIxBiI +gpFvBd46u3+IKiicJM7bYVC7dT500j2ts23oeIpY2uZN59VBAAENhbmVdMODN5+UAfFGvYTD +oB77MB6nTaKAyBe/bZvovhs0unc4sHBgTJKR8ybhNnLb7pQ85lrteaK8CfCS7LgsU6pw3ppY +nKjJb9M77pYg +=M83a +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/config/apt-source-append.list b/config/apt-source-append.list index 877270365..4669294ad 100644 --- a/config/apt-source-append.list +++ b/config/apt-source-append.list @@ -2,25 +2,26 @@ # versions of various packages that are installed # Provides Nginx mainline -deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx -deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx +deb http://nginx.org/packages/mainline/ubuntu/ bionic nginx +deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx # Provides PHP7 -deb http://ppa.launchpad.net/ondrej/php/ubuntu trusty main -deb-src http://ppa.launchpad.net/ondrej/php/ubuntu trusty main +deb http://ppa.launchpad.net/ondrej/php/ubuntu bionic main +deb-src http://ppa.launchpad.net/ondrej/php/ubuntu bionic main + +# VVV mirror packages +deb http://ppa.launchpad.net/varying-vagrant-vagrants/php/ubuntu bionic main +deb-src http://ppa.launchpad.net/varying-vagrant-vagrants/php/ubuntu bionic main # MariaDB 10.3 repository list - created 2018-06-19 13:36 UTC # http://downloads.mariadb.org/mariadb/repositories/ -deb [arch=amd64,i386] http://mirrors.coreix.net/mariadb/repo/10.3/ubuntu trusty main -deb-src http://mirrors.coreix.net/mariadb/repo/10.3/ubuntu trusty main - -deb [arch=amd64,i386] http://mirrors.coreix.net/mariadb/repo/10.1/ubuntu trusty main -deb-src http://mirrors.coreix.net/mariadb/repo/10.1/ubuntu trusty main +deb [arch=amd64,i386] http://mirrors.coreix.net/mariadb/repo/10.3/ubuntu bionic main +deb-src http://mirrors.coreix.net/mariadb/repo/10.3/ubuntu bionic main # Provides Node.js -deb https://deb.nodesource.com/node_10.x trusty main -deb-src https://deb.nodesource.com/node_10.x trusty main +deb https://deb.nodesource.com/node_11.x bionic main +deb-src https://deb.nodesource.com/node_11.x bionic main # git lfs (large file storage plugin for git) -deb https://packagecloud.io/github/git-lfs/ubuntu/ trusty main -deb-src https://packagecloud.io/github/git-lfs/ubuntu/ trusty main +deb https://packagecloud.io/github/git-lfs/ubuntu/ bionic main +deb-src https://packagecloud.io/github/git-lfs/ubuntu/ bionic main diff --git a/config/bash_profile b/config/bash_profile index cfa312782..93765a96d 100644 --- a/config/bash_profile +++ b/config/bash_profile @@ -66,7 +66,7 @@ export GOPATH=$HOME/gocode export PATH="$PATH:/srv/www/phpcs/scripts/" # Vagrant scripts -export PATH="$PATH:/vagrant/config/homebin/" +export PATH="$PATH:/srv/config/homebin/" # nvm path export NVM_DIR="/srv/config/nvm" diff --git a/config/homebin/db_restore b/config/homebin/db_restore old mode 100644 new mode 100755 diff --git a/config/homebin/vagrant_destroy b/config/homebin/vagrant_destroy index c34070cb3..ac1201b04 100755 --- a/config/homebin/vagrant_destroy +++ b/config/homebin/vagrant_destroy @@ -7,9 +7,9 @@ # Look for a custom trigger file. If this exists, we'll assume that # all trigger actions should be handled by this custom script. If # it does not exist, then we'll handle some basic tasks. -if [[ -f /vagrant/config/homebin/vagrant_destroy_custom ]]; then +if [[ -f /srv/config/homebin/vagrant_destroy_custom ]]; then echo "Executing vagrant_destroy_custom" - /vagrant/config/homebin/vagrant_destroy_custom + /srv/config/homebin/vagrant_destroy_custom else - /vagrant/config/homebin/db_backup + /srv/config/homebin/db_backup fi \ No newline at end of file diff --git a/config/homebin/vagrant_halt b/config/homebin/vagrant_halt index 057aacb15..657745c98 100755 --- a/config/homebin/vagrant_halt +++ b/config/homebin/vagrant_halt @@ -7,9 +7,9 @@ # Look for a custom trigger file. If this exists, we'll assume that # all trigger actions should be handled by this custom script. If # it does not exist, then we'll handle some basic tasks. -if [[ -f /vagrant/config/homebin/vagrant_halt_custom ]]; then +if [[ -f /srv/config/homebin/vagrant_halt_custom ]]; then echo "Executing vagrant_halt_custom" - /vagrant/config/homebin/vagrant_halt_custom + /srv/config/homebin/vagrant_halt_custom else - /vagrant/config/homebin/db_backup + /srv/config/homebin/db_backup fi \ No newline at end of file diff --git a/config/homebin/vagrant_provision b/config/homebin/vagrant_provision index 02122d276..7ec0f36ff 100755 --- a/config/homebin/vagrant_provision +++ b/config/homebin/vagrant_provision @@ -14,9 +14,9 @@ echo "Post Vagrant provision script" -if [[ -f /vagrant/config/homebin/vagrant_provision_custom ]]; then +if [[ -f /srv/config/homebin/vagrant_provision_custom ]]; then echo "Custom vagrant provision script found, executing vagrant_provision_custom" - /vagrant/config/homebin/vagrant_provision_custom + /srv/config/homebin/vagrant_provision_custom fi echo "Restarting Nginx and MySQL" diff --git a/config/homebin/vagrant_suspend b/config/homebin/vagrant_suspend index c59614d0a..cc1f5a46f 100755 --- a/config/homebin/vagrant_suspend +++ b/config/homebin/vagrant_suspend @@ -7,9 +7,9 @@ # Look for a custom trigger file. If this exists, we'll assume that # all trigger actions should be handled by this custom script. If # it does not exist, then we'll handle some basic tasks. -if [[ -f /vagrant/config/homebin/vagrant_suspend_custom ]]; then +if [[ -f /srv/config/homebin/vagrant_suspend_custom ]]; then echo "Executing vagrant_suspend_custom" - /vagrant/config/homebin/vagrant_suspend_custom + /srv/config/homebin/vagrant_suspend_custom else - /vagrant/config/homebin/db_backup + /srv/config/homebin/db_backup fi \ No newline at end of file diff --git a/config/homebin/vagrant_up b/config/homebin/vagrant_up index e2cf3c103..9fcad017d 100755 --- a/config/homebin/vagrant_up +++ b/config/homebin/vagrant_up @@ -10,9 +10,9 @@ echo "Post Vagrant up script" -if [[ -f /vagrant/config/homebin/vagrant_up_custom ]]; then +if [[ -f /srv/config/homebin/vagrant_up_custom ]]; then echo "Custom vagrant up script found, executing vagrant_up_custom" - /vagrant/config/homebin/vagrant_up_custom + /srv/config/homebin/vagrant_up_custom fi echo "Restarting Nginx and MySQL" diff --git a/config/memcached-config/memcached.conf b/config/memcached-config/memcached.conf index 67bbd12a1..108295526 100644 --- a/config/memcached-config/memcached.conf +++ b/config/memcached-config/memcached.conf @@ -12,7 +12,7 @@ -d # Log memcached's output to /var/log/memcached -logfile /var/log/memcached.log +logfile /var/log/memcached/memcached.log # Be verbose # -v diff --git a/config/mysql-config/vvv-core.cnf b/config/mysql-config/vvv-core.cnf new file mode 100644 index 000000000..7ac60e827 --- /dev/null +++ b/config/mysql-config/vvv-core.cnf @@ -0,0 +1,3 @@ +[mysqld] +innodb_use_native_aio = 0 +log_bin = ON diff --git a/config/php-config/php7.2-custom.ini b/config/php-config/php7.2-custom.ini index e176d7eb7..2cddd8cd2 100644 --- a/config/php-config/php7.2-custom.ini +++ b/config/php-config/php7.2-custom.ini @@ -38,7 +38,7 @@ track_errors = Off html_errors = 1 ; Log errors to specified file. -error_log = /var/log/php7.2_errors.log +error_log = /var/log/php/php7.2_errors.log ; Maximum size of POST data that PHP will accept. post_max_size = 1024M diff --git a/config/php-config/php7.2-fpm.conf b/config/php-config/php7.2-fpm.conf index 944322664..219a55bb8 100644 --- a/config/php-config/php7.2-fpm.conf +++ b/config/php-config/php7.2-fpm.conf @@ -29,7 +29,7 @@ pid = /var/run/php7.2-fpm.pid ; in a local file. ; Note: the default prefix is /var ; Default Value: log/php-fpm.log -error_log = /var/log/php7.2-fpm.log +error_log = /var/log/php/php7.2-fpm.log ; syslog_facility is used to specify what type of program is logging the ; message. This lets syslogd specify that messages from different facilities diff --git a/config/php-config/xdebug.ini b/config/php-config/xdebug.ini index 33b241e8b..f0cf340e2 100644 --- a/config/php-config/xdebug.ini +++ b/config/php-config/xdebug.ini @@ -189,7 +189,7 @@ xdebug.remote_host = "192.168.50.1" ; If set to a value, it is used as filename to a file to which all remote debugger communications are ; logged. The file is always opened in append-mode, and will therefore not be overwritten by default. ; There is no concurrency protection available. -xdebug.remote_log = /var/log/xdebug-remote.log +xdebug.remote_log = /var/log/php/xdebug-remote.log ; xdebug.remote_mode ; Type: string, Default value: req diff --git a/config/ssh_known_hosts b/config/ssh_known_hosts new file mode 100644 index 000000000..c48b9dd0a --- /dev/null +++ b/config/ssh_known_hosts @@ -0,0 +1,4 @@ +github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== +gitlab.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY= +gitlab.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsj2bNKTBSpIYDEGk9KxsGh3mySTRgMtXL583qmBpzeQ+jqCMRgBqB98u3z++J1sKlXHWfM9dyhSevkMwSbhoR8XIq/U0tCNyokEi/ueaBMCvbcTHhO7FcwzY92WK4Yt0aGROY5qX2UKSeOvuP4D6TPqKF1onrSzH9bx9XUf2lEdWT/ia1NEKjunUqu1xOB/StKDHMoX4/OKyIzuS0q/T1zOATthvasJFoPrAjkohTyaDUz2LN5JoH839hViyEG82yB+MjcFV5MU3N1l1QL3cVUCh93xSaua1N85qivl+siMkPGbO5xR/En4iEY6K2XPASUEMaieWVNTRCtJ4S8H+9 +bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw== diff --git a/database/backups/readme.txt b/database/backups/readme.txt deleted file mode 100644 index 0e97a7707..000000000 --- a/database/backups/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -SQL files created with mysqldump should be stored in database/backups so that they are automatically imported as the Vagrant VM boots up. - -For this to work properly, databases should be created in your database/init-custom.sql file as explained in database/init-custom.sql.sample. - -Once these original files have been imported, they will exist in database/data as the actual mysql data directory and will not need to be reimported on the next vagrant up. \ No newline at end of file diff --git a/database/import-sql.sh b/database/sql/import-sql.sh similarity index 69% rename from database/import-sql.sh rename to database/sql/import-sql.sh index cb0c332cf..2d34d9381 100755 --- a/database/import-sql.sh +++ b/database/sql/import-sql.sh @@ -8,7 +8,7 @@ # # For an import to work properly, the SQL file should be named `db_name.sql` in which # `db_name` matches the name of a database already created in {vvv-dir}/database/init-custom.sql -# or {vvv-dir}/database/init.sql. +# or {vvv-dir}/database/sql/init.sql. # # If a filename does not match an existing database, it will not import correctly. # @@ -27,12 +27,12 @@ run_restore=`cat ${VVV_CONFIG} | shyaml get-value general.db_restore 2> /dev/nul if [[ $run_restore == "False" ]] then - echo "Skipping DB import script\n" + echo "Skipping DB import script, disabled via the VVV config file\n" exit; fi # Move into the newly mapped backups directory, where mysqldump(ed) SQL files are stored -printf "\nStart MariaDB Database Import\n" +printf "\nStarting MariaDB Database Import\n" cd /srv/database/backups/ # Parse through each file in the directory and use the file name to @@ -43,19 +43,24 @@ then for file in $( ls *.sql ) do pre_dot=${file%%.sql} + + printf " * Creating the ${predot} table if it doesn't already exist, and granting the wp user access" + mysql -u root --password=root -e "CREATE DATABASE IF NOT EXISTS ${pre_dot}" + mysql -u root --password=root -e "GRANT ALL PRIVILEGES ON ${pre_dot}.* TO wp@localhost IDENTIFIED BY 'wp';" + mysql_cmd='SHOW TABLES FROM `'$pre_dot'`' # Required to support hypens in database names db_exist=`mysql -u root -proot --skip-column-names -e "$mysql_cmd"` if [ "$?" != "0" ] then - printf " * Error - Create $pre_dot database via init-custom.sql before attempting import\n\n" + printf " * Error - Create ${pre_dot} database via init-custom.sql before attempting import\n\n" else if [ "" == "$db_exist" ] then - printf "mysql -u root -proot $pre_dot < $pre_dot.sql\n" - mysql -u root -proot $pre_dot < $pre_dot.sql - printf " * Import of $pre_dot successful\n" + printf "mysql -u root -proot ${pre_dot} < ${pre_dot}.sql\n" + mysql -u root -proot ${pre_dot} < ${pre_dot}.sql + printf " * Import of ${pre_dot} successful\n" else - printf " * Skipped import of $pre_dot - tables exist\n" + printf " * Skipped import of ${pre_dot} - tables exist\n" fi fi done diff --git a/database/init-custom.sql.sample b/database/sql/init-custom.sql.sample similarity index 100% rename from database/init-custom.sql.sample rename to database/sql/init-custom.sql.sample diff --git a/database/init.sql b/database/sql/init.sql similarity index 100% rename from database/init.sql rename to database/sql/init.sql diff --git a/provision/provision-dashboard.sh b/provision/provision-dashboard.sh index 1e5d190d1..59e40f31f 100644 --- a/provision/provision-dashboard.sh +++ b/provision/provision-dashboard.sh @@ -4,6 +4,14 @@ REPO=$1 BRANCH=${2:-master} DIR="/srv/www/default/dashboard" +date_time=`cat /vagrant/provisioned_at` +logfolder="/var/log/provisioners/${date_time}" +logfile="${logfolder}/provisioner-dashboard.log" +mkdir -p "${logfolder}" +touch "${logfile}" +exec > >(tee -a "${logfile}" ) +exec 2> >(tee -a "${logfile}" >&2 ) + if [[ false != "dashboard" && false != "${REPO}" ]]; then # Clone or pull the resources repository if [[ ! -d ${DIR}/.git ]]; then @@ -12,7 +20,7 @@ if [[ false != "dashboard" && false != "${REPO}" ]]; then cd ${DIR} git checkout ${BRANCH} -q else - echo -e "\nUpdating dashboard..." + echo -e "\nUpdating dashboard on the ${BRANCH} branch..." cd ${DIR} git pull origin ${BRANCH} -q git checkout ${BRANCH} -q diff --git a/provision/provision-site.sh b/provision/provision-site.sh index 3f2556855..0c783dbba 100644 --- a/provision/provision-site.sh +++ b/provision/provision-site.sh @@ -10,6 +10,14 @@ NGINX_UPSTREAM=$6 VVV_PATH_TO_SITE=${VM_DIR} VVV_SITE_NAME=${SITE} +date_time=`cat /vagrant/provisioned_at` +logfolder="/var/log/provisioners/${date_time}" +logfile="${logfolder}/provisioner-site-${SITE}.log" +mkdir -p "${logfolder}" +touch "${logfile}" +exec > >(tee -a "${logfile}" ) +exec 2> >(tee -a "${logfile}" >&2 ) + VVV_CONFIG=/vagrant/vvv-config.yml if [[ -f /vagrant/vvv-custom.yml ]]; then VVV_CONFIG=/vagrant/vvv-custom.yml @@ -66,8 +74,8 @@ function vvv_provision_site_nginx() { sed -i "s#{upstream}#$NGINX_UPSTREAM#" "/etc/nginx/custom-sites/${DEST_NGINX_FILE}" if [ -n "$(type -t is_utility_installed)" ] && [ "$(type -t is_utility_installed)" = function ] && `is_utility_installed core tls-ca`; then - sed -i "s#{vvv_tls_cert}#ssl_certificate /vagrant/certificates/${VVV_SITE_NAME}/dev.crt;#" "/etc/nginx/custom-sites/${DEST_NGINX_FILE}" - sed -i "s#{vvv_tls_key}#ssl_certificate_key /vagrant/certificates/${VVV_SITE_NAME}/dev.key;#" "/etc/nginx/custom-sites/${DEST_NGINX_FILE}" + sed -i "s#{vvv_tls_cert}#ssl_certificate /srv/certificates/${VVV_SITE_NAME}/dev.crt;#" "/etc/nginx/custom-sites/${DEST_NGINX_FILE}" + sed -i "s#{vvv_tls_key}#ssl_certificate_key /srv/certificates/${VVV_SITE_NAME}/dev.key;#" "/etc/nginx/custom-sites/${DEST_NGINX_FILE}" else sed -i "s#{vvv_tls_cert}##" "/etc/nginx/custom-sites/${DEST_NGINX_FILE}" sed -i "s#{vvv_tls_key}##" "/etc/nginx/custom-sites/${DEST_NGINX_FILE}" @@ -84,9 +92,9 @@ function vvv_provision_hosts_file() { while read HOSTFILE; do while IFS='' read -r line || [ -n "$line" ]; do if [[ "#" != ${line:0:1} ]]; then - if [[ -z "$(grep -q "^127.0.0.1 $line$" /etc/hosts)" ]]; then + if [[ -z "$(grep -q "^127.0.0.1 ${line}$" /etc/hosts)" ]]; then echo "127.0.0.1 $line # vvv-auto" >> "/etc/hosts" - echo " * Added $line from $HOSTFILE" + echo " * Added ${line} from ${HOSTFILE}" fi fi done < "$HOSTFILE" @@ -101,14 +109,21 @@ fi if [[ false != "${REPO}" ]]; then # Clone or pull the site repository if [[ ! -d ${VM_DIR}/.git ]]; then - echo -e "\nDownloading ${SITE}, see ${REPO}" - noroot git clone --recursive --branch ${BRANCH} ${REPO} ${VM_DIR} -q + echo -e "\nDownloading ${SITE}, git cloning from ${REPO}" + git clone --recursive --branch ${BRANCH} ${REPO} ${VM_DIR} -q + if [ $? -eq 0 ]; then + echo "Site Template clone succesful" + else + echo "Git failed to clone the site template for ${SITE}. It tried to clone the ${BRANCH} of ${REPO} into ${VM_DIR}" + echo "VVV won't be able to provision ${SITE} without the template. Check that you have permission to access the repo, and that the filesystem is writable" + exit 1 + fi else echo -e "\nUpdating ${SITE}..." cd ${VM_DIR} - noroot git reset origin/${BRANCH} --hard -q - noroot git pull origin ${BRANCH} -q - noroot git checkout ${BRANCH} -q + git reset origin/${BRANCH} --hard -q + git pull origin ${BRANCH} -q + git checkout ${BRANCH} -q fi else echo "The site: '${SITE}' does not have a site template, assuming custom provision/vvv-init.sh and provision/vvv-nginx.conf" @@ -117,87 +132,88 @@ else fi fi -if [[ -d ${VM_DIR} ]]; then - # Look for site setup scripts - if [[ -f "${VM_DIR}/.vvv/vvv-init.sh" ]]; then - ( cd "${VM_DIR}/.vvv" && source vvv-init.sh ) - elif [[ -f "${VM_DIR}/provision/vvv-init.sh" ]]; then - ( cd "${VM_DIR}/provision" && source vvv-init.sh ) - elif [[ -f "${VM_DIR}/vvv-init.sh" ]]; then - ( cd "${VM_DIR}" && source vvv-init.sh ) +if [[ ! -d ${VM_DIR} ]]; then + echo "Error: The ${VM_DIR} folder does not exist, there is nothing to provision for the '${SITE}' site!" +fi + +# Look for site setup scripts +if [[ -f "${VM_DIR}/.vvv/vvv-init.sh" ]]; then + ( cd "${VM_DIR}/.vvv" && source vvv-init.sh ) +elif [[ -f "${VM_DIR}/provision/vvv-init.sh" ]]; then + ( cd "${VM_DIR}/provision" && source vvv-init.sh ) +elif [[ -f "${VM_DIR}/vvv-init.sh" ]]; then + ( cd "${VM_DIR}" && source vvv-init.sh ) +else + echo "Warning: A site provisioner was not found at .vvv/vvv-init.conf provision/vvv-init.conf or vvv-init.conf, searching 3 folders down, please be patient..." + SITE_INIT_SCRIPTS=$(find ${VM_DIR} -maxdepth 3 -name 'vvv-init.conf'); + if [[ -z $SITE_INIT_SCRIPTS ]] ; then + echo "Warning: No site provisioner was found, VVV could not perform any scripted setup that might install software for this site" else - echo "Warning: A site provisioner was not found at .vvv/vvv-init.conf provision/vvv-init.conf or vvv-init.conf, searching 3 folders down, please be patient..." - SITE_INIT_SCRIPTS=$(find ${VM_DIR} -maxdepth 3 -name 'vvv-init.conf'); - if [[ -z $SITE_INIT_SCRIPTS ]] ; then - echo "Warning: No site provisioner was found, VVV could not perform any scripted setup that might install software for this site" - else - for SITE_INIT_SCRIPT in $SITE_INIT_SCRIPTS; do - DIR="$(dirname "$SITE_INIT_SCRIPT")" - ( cd "${DIR}" && source vvv-init.sh ) - done - fi + for SITE_INIT_SCRIPT in $SITE_INIT_SCRIPTS; do + DIR="$(dirname "$SITE_INIT_SCRIPT")" + ( cd "${DIR}" && source vvv-init.sh ) + done fi +fi - # Look for Nginx vhost files, symlink them into the custom sites dir - if [[ -f "${VM_DIR}/.vvv/vvv-nginx.conf" ]]; then - vvv_provision_site_nginx $SITE "${VM_DIR}/.vvv/vvv-nginx.conf" - elif [[ -f "${VM_DIR}/provision/vvv-nginx.conf" ]]; then - vvv_provision_site_nginx $SITE "${VM_DIR}/provision/vvv-nginx.conf" - elif [[ -f "${VM_DIR}/vvv-nginx.conf" ]]; then - vvv_provision_site_nginx $SITE "${VM_DIR}/vvv-nginx.conf" +# Look for Nginx vhost files, symlink them into the custom sites dir +if [[ -f "${VM_DIR}/.vvv/vvv-nginx.conf" ]]; then + vvv_provision_site_nginx $SITE "${VM_DIR}/.vvv/vvv-nginx.conf" +elif [[ -f "${VM_DIR}/provision/vvv-nginx.conf" ]]; then + vvv_provision_site_nginx $SITE "${VM_DIR}/provision/vvv-nginx.conf" +elif [[ -f "${VM_DIR}/vvv-nginx.conf" ]]; then + vvv_provision_site_nginx $SITE "${VM_DIR}/vvv-nginx.conf" +else + echo "Warning: An nginx config was not found at .vvv/vvv-nginx.conf provision/vvv-nginx.conf or vvv-nginx.conf, searching 3 folders down, please be patient..." + NGINX_CONFIGS=$(find ${VM_DIR} -maxdepth 3 -name 'vvv-nginx.conf'); + if [[ -z $NGINX_CONFIGS ]] ; then + echo "Warning: No nginx config was found, VVV will not know how to serve this site" else - echo "Warning: An nginx config was not found at .vvv/vvv-nginx.conf provision/vvv-nginx.conf or vvv-nginx.conf, searching 3 folders down, please be patient..." - NGINX_CONFIGS=$(find ${VM_DIR} -maxdepth 3 -name 'vvv-nginx.conf'); - if [[ -z $NGINX_CONFIGS ]] ; then - echo "Warning: No nginx config was found, VVV will not know how to serve this site" - else - for SITE_CONFIG_FILE in $NGINX_CONFIGS; do - vvv_provision_site_nginx $SITE $SITE_CONFIG_FILE - done - fi + for SITE_CONFIG_FILE in $NGINX_CONFIGS; do + vvv_provision_site_nginx $SITE $SITE_CONFIG_FILE + done fi +fi - # Parse any vvv-hosts file located in the site repository for domains to - # be added to the virtual machine's host file so that it is self aware. - # - # Domains should be entered on new lines. - echo "Adding domains to the virtual machine's /etc/hosts file..." - hosts=`cat ${VVV_CONFIG} | shyaml get-values sites.${SITE_ESCAPED}.hosts 2> /dev/null` - if [ ${#hosts[@]} -eq 0 ]; then - echo "No hosts were found in the VVV config, falling back to vvv-hosts" - if [[ -f "${VM_DIR}/.vvv/vvv-hosts" ]]; then - echo "Found a .vvv/vvv-hosts file" - vvv_provision_hosts_file $SITE "${VM_DIR}/.vvv/vvv-hosts" - elif [[ -f "${VM_DIR}/provision/vvv-hosts" ]]; then - echo "Found a provision/vvv-hosts file" - vvv_provision_hosts_file $SITE "${VM_DIR}/provision/vvv-hosts" - elif [[ -f "${VM_DIR}/vvv-hosts" ]]; then - echo "Found a vvv-hosts file" - vvv_provision_hosts_file $SITE "${VM_DIR}/vvv-hosts" +# Parse any vvv-hosts file located in the site repository for domains to +# be added to the virtual machine's host file so that it is self aware. +# +# Domains should be entered on new lines. +echo "Adding domains to the virtual machine's /etc/hosts file..." +hosts=`cat ${VVV_CONFIG} | shyaml get-values sites.${SITE_ESCAPED}.hosts 2> /dev/null` +if [ ${#hosts[@]} -eq 0 ]; then + echo "No hosts were found in the VVV config, falling back to vvv-hosts" + if [[ -f "${VM_DIR}/.vvv/vvv-hosts" ]]; then + echo "Found a .vvv/vvv-hosts file" + vvv_provision_hosts_file $SITE "${VM_DIR}/.vvv/vvv-hosts" + elif [[ -f "${VM_DIR}/provision/vvv-hosts" ]]; then + echo "Found a provision/vvv-hosts file" + vvv_provision_hosts_file $SITE "${VM_DIR}/provision/vvv-hosts" + elif [[ -f "${VM_DIR}/vvv-hosts" ]]; then + echo "Found a vvv-hosts file" + vvv_provision_hosts_file $SITE "${VM_DIR}/vvv-hosts" + else + echo "Searching subfolders 4 levels down for a vvv-hosts file ( this can be skipped by using ./vvv-hosts, .vvv/vvv-hosts, or provision/vvv-hosts" + HOST_FILES=$(find ${VM_DIR} -maxdepth 4 -name 'vvv-hosts'); + if [[ -z $HOST_FILES ]] ; then + echo "Warning: No vvv-hosts file was found, and no hosts were defined in the vvv config, this site may be inaccessible" else - echo "Searching subfolders 4 levels down for a vvv-hosts file ( this can be skipped by using ./vvv-hosts, .vvv/vvv-hosts, or provision/vvv-hosts" - HOST_FILES=$(find ${VM_DIR} -maxdepth 4 -name 'vvv-hosts'); - if [[ -z $HOST_FILES ]] ; then - echo "Warning: No vvv-hosts file was found, and no hosts were defined in the vvv config, this site may be inaccessible" - else - for HOST_FILE in $HOST_FILES; do - vvv_provision_hosts_file $HOST_FILE - done - fi + for HOST_FILE in $HOST_FILES; do + vvv_provision_hosts_file $HOST_FILE + done fi - else - echo "Adding hosts from the VVV config entry" - for line in `cat ${VVV_CONFIG} | shyaml get-values sites.${SITE_ESCAPED}.hosts 2> /dev/null`; do - if [[ -z "$(grep -q "^127.0.0.1 $line$" /etc/hosts)" ]]; then - echo "127.0.0.1 $line # vvv-auto" >> "/etc/hosts" - echo " * Added $line from ${VVV_CONFIG}" - fi - done fi - - service nginx restart else - echo "Error: The ${VM_DIR} folder does not exist, and no repo was specified in the config file, there is nothing to provision for this site!" + echo "Adding hosts from the VVV config entry" + for line in `cat ${VVV_CONFIG} | shyaml get-values sites.${SITE_ESCAPED}.hosts 2> /dev/null`; do + if [[ -z "$(grep -q "^127.0.0.1 $line$" /etc/hosts)" ]]; then + echo "127.0.0.1 ${line} # vvv-auto" >> "/etc/hosts" + echo " * Added ${line} from ${VVV_CONFIG}" + fi + done fi +echo "Reloading Nginx" +service nginx reload + diff --git a/provision/provision-utility-source.sh b/provision/provision-utility-source.sh index 4141a8b68..55052053d 100644 --- a/provision/provision-utility-source.sh +++ b/provision/provision-utility-source.sh @@ -3,24 +3,41 @@ NAME=$1 REPO=$2 BRANCH=${3:-master} -DIR="/vagrant/provision/resources/${NAME}" +DIR="/srv/provision/utilities/${NAME}" -noroot() { - sudo -EH -u "vagrant" "$@"; -} +date_time=`cat /vagrant/provisioned_at` +logfolder="/var/log/provisioners/${date_time}" +logfile="${logfolder}/provisioner-utility-source-${NAME}.log" +mkdir -p "${logfolder}" +touch "${logfile}" +exec > >(tee -a "${logfile}" ) +exec 2> >(tee -a "${logfile}" >&2 ) if [[ false != "${NAME}" && false != "${REPO}" ]]; then - # Clone or pull the resources repository + # Clone or pull the utility repository if [[ ! -d ${DIR}/.git ]]; then - echo -e "\nDownloading ${NAME} resources, see ${REPO}" - noroot git clone ${REPO} --branch ${BRANCH} ${DIR} -q + echo "Cloning the \"${NAME}\" utility, see \"${REPO}\"" + git clone ${REPO} --branch ${BRANCH} ${DIR} -q cd ${DIR} - noroot git checkout ${BRANCH} -q + git checkout ${BRANCH} -q else - echo -e "\nUpdating ${NAME} resources..." + echo "Updating the \"${NAME}\" utility on the \"${BRANCH}\" branch..." cd ${DIR} - noroot git pull origin ${BRANCH} -q - noroot git checkout ${BRANCH} -q + git pull origin ${BRANCH} -q + git checkout ${BRANCH} -q + fi +else + if [[ false == "${NAME}" && false == "${REPO}" ]]; then + echo "Error: VVV tried to provision a utility, but no name or git repo was supplied, double check your vvv-custom.yml file is correct and has the right indentation" + exit 1 + fi + if [[ false == "${NAME}" ]]; then + echo -e "Error: While processing a utility, a utility with a blank name was found, with the git repo ${REPO}" + exit 1 + fi + + if [[ false == "${REPO}" ]]; then + echo -e "Error: While processing the ${NAME} utility, VVV could not find a git repository to clone" fi fi diff --git a/provision/provision-utility.sh b/provision/provision-utility.sh index 48b397576..55b1d65cc 100644 --- a/provision/provision-utility.sh +++ b/provision/provision-utility.sh @@ -1,6 +1,18 @@ #!/usr/bin/env bash -PROVISIONER="/vagrant/provision/resources/${1}/${2}/provision.sh" +date_time=`cat /vagrant/provisioned_at` +logfolder="/var/log/provisioners/${date_time}" +logfile="${logfolder}/provisioner-utility-${1}-${2}.log" +mkdir -p "${logfolder}" +touch "${logfile}" +exec > >(tee -a "${logfile}" ) +exec 2> >(tee -a "${logfile}" >&2 ) + +PROVISIONER="/srv/provision/utilities/${1}/${2}/provision.sh" + if [[ -f $PROVISIONER ]]; then + echo "Running utility provisioner for '${1}/${2}'" ${PROVISIONER} +else + echo "Tried to run the utility provisioner for '${1}/${2}' but ${PROVISIONER} doesn't exist" fi diff --git a/provision/provision.sh b/provision/provision.sh index fecfbfe90..974459330 100755 --- a/provision/provision.sh +++ b/provision/provision.sh @@ -8,8 +8,81 @@ # configurations included with Varying Vagrant Vagrants. export DEBIAN_FRONTEND=noninteractive +export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 +export COMPOSER_ALLOW_SUPERUSER=1 +export COMPOSER_NO_INTERACTION=1 + +date_time=`cat /vagrant/provisioned_at` +logfolder="/var/log/provisioners/${date_time}" +logfile="${logfolder}/provisioner-main.log" +mkdir -p "${logfolder}" +touch "${logfile}" +exec > >(tee -a "${logfile}" ) +exec 2> >(tee -a "${logfile}" >&2 ) + +codename=$(lsb_release --codename | cut -f2) +if [[ $codename == "trusty" ]]; then + r="\e[0;32m" + echo " " + echo '__ __ __ __' + echo '\ V\ V\ V / A message from the VVV team' + echo ' \_/\_/\_/ ' + echo -e " " + echo -e "We Have Some Good News and Some Bad News" + echo -e "----------------------------------------" + echo -e " " + echo -e "The good news is that you updated to VVV 3+! Thanks for taking " + echo -e "care of your install!" + echo -e " " + echo -e "The bad news is that your VM is still an Ubuntu 14 VM. VVV 3+ needs" + echo -e "Ubuntu 18, and requires a vagant destroy and a reprovision." + echo -e " " + echo -e " " + echo -e "\e[1;4;33mImportant: Destroying and reprovisioning will erase the database${r}" + echo -e " " + sqlcount=$(cd /srv/database/backups; ls -1q *.sql | wc -l) + if [[ $sqlcount -gt 0 ]]; then + echo -e "\e[0;33m " + echo -e "\e[0;33mLuckily, VVV backs up the database to database/backups, and " + echo -e "we found ${sqlcount} of those .sql files in database/backups from the last " + echo -e "time you ran vagrant halt." + + echo -e "These DB backups can be restored after updating with this command:" + echo -e "vagrant ssh -c \"db_restore\"${r}" + else + echo -e "\e[0;33m " + echo -e "\e[0;33mNormally VVV takes backups, but we didn't find any existing backups${r}" + echo -e " " + echo -e "How Do I Grab Database Backups?" + echo -e "--------------------------------" + echo -e " " + echo -e "If you've turned off database backups, or haven't turned off your VM" + echo -e "in a while, take the following steps:" + echo -e " " + echo -e " 1. downgrade back to VVV 2: git fetch --tags && git checkout 2.6.0" + echo -e " 2. turn on the VM but dont provision: vagrant up" + echo -e " 3. run the backup DB script: vagrant ssh -c \"db_backup\"" + echo -e " 4. turn off the VM: vagrant halt" + echo -e " 5. return to VVV 3+: git checkout develop" + echo -e " 6. you can now update your VM to VVV 3, see the instructions in the section above" + fi + echo -e " " + echo -e " " + echo -e "Updating Your VM To VVV 3+" + echo -e "--------------------------" + echo -e " " + echo -e "If you're happy and have your database files, you can update your VM to VVV 3+ with these commands:" + echo -e " " + echo -e " 1. destroy the VM: vagrant destroy" + echo -e " 2. provision a new VM: vagrant up --provision" + echo -e " 3. optionally restore backups: vagrant ssh -c \"db_restore\"" + echo -e " " + echo -e " " + echo -e " " + exit 1 +fi -source /vagrant/provision/provision-network-functions.sh +source /srv/provision/provision-network-functions.sh # By storing the date now, we can calculate the duration of provisioning at the # end of this script. @@ -71,6 +144,7 @@ apt_package_install_list=( subversion git git-lfs + git-svn zip unzip ngrep @@ -112,19 +186,26 @@ is_utility_installed() { return 1 } + + git_ppa_check() { # git # # apt-get does not have latest version of git, # so let's the use ppa repository instead. # - # Install prerequisites. - sudo apt-get install -y python-software-properties software-properties-common &>/dev/null - # Add ppa repo. - echo "Adding ppa:git-core/ppa repository" - sudo add-apt-repository -y ppa:git-core/ppa &>/dev/null - # Update apt-get info. - sudo apt-get update &>/dev/null + if grep -Rq "^deb.*ppa:git-core/ppa" /etc/apt/sources.list.d/*.list + then + # Install prerequisites. + sudo apt-get install -y python-software-properties software-properties-common &>/dev/null + # Add ppa repo. + echo " * Adding ppa:git-core/ppa repository" + sudo add-apt-repository -y ppa:git-core/ppa &>/dev/null + # Update apt-get info. + sudo apt-get update &>/dev/null + else + echo " * git-core/ppa already present, skipping" + fi } noroot() { @@ -188,6 +269,9 @@ profile_setup() { echo " * Copying /srv/config/bash_prompt to /home/vagrant/.bash_prompt" cp "/srv/config/bash_prompt" "/home/vagrant/.bash_prompt" fi + + echo " * Copying /srv/config/ssh_known_hosts to /etc/ssh/ssh_known_hosts" + cp -f /srv/config/ssh_known_hosts /etc/ssh/ssh_known_hosts } not_installed() { @@ -220,8 +304,28 @@ package_install() { # Use debconf-set-selections to specify the default password for the root MariaDB # account. This runs on every provision, even if MariaDB has been installed. If # MariaDB is already installed, it will not affect anything. - echo mariadb-server-10.1 mysql-server/root_password password "root" | debconf-set-selections - echo mariadb-server-10.1 mysql-server/root_password_again password "root" | debconf-set-selections + echo mariadb-server-10.3 mysql-server/root_password password "root" | debconf-set-selections + echo mariadb-server-10.3 mysql-server/root_password_again password "root" | debconf-set-selections + + echo -e "\n * Setting up MySQL configuration file links..." + + # Preconfigure mariadb + if grep -q 'mysql' /etc/group; then + echo " * mysql group exists" + else + echo " * creating mysql group" + groupadd -g 115 mysql + fi + + if id 112 >/dev/null 2>&1; then + echo " * mysql user present" + else + echo " * adding the mysql user" + useradd -u 112 -g mysql -G vboxsf -r mysql + fi + mkdir -p "/etc/mysql/conf.d" + echo " * Copying /srv/config/mysql-config/vvv-core.cnf to /etc/mysql/conf.d/vvv-core.cnf" + cp -f "/srv/config/mysql-config/vvv-core.cnf" "/etc/mysql/conf.d/vvv-core.cnf" # Postfix # @@ -239,7 +343,7 @@ package_install() { if [[ ! $( apt-key list | grep 'NodeSource') ]]; then # Retrieve the NodeJS signing key from nodesource.com echo "Applying NodeSource NodeJS signing key..." - apt-key add /vagrant/config/apt-keys/nodesource.gpg.key + apt-key add /srv/config/apt-keys/nodesource.gpg.key fi # Before running `apt-get update`, we should add the public keys for @@ -248,25 +352,31 @@ package_install() { if [[ ! $( apt-key list | grep 'nginx') ]]; then # Retrieve the Nginx signing key from nginx.org echo "Applying Nginx signing key..." - apt-key add /vagrant/config/apt-keys/nginx_signing.key + apt-key add /srv/config/apt-keys/nginx_signing.key fi if [[ ! $( apt-key list | grep 'Ondřej') ]]; then # Apply the PHP signing key echo "Applying the Ondřej PHP signing key..." - apt-key add /vagrant/config/apt-keys/keyserver_ubuntu.key + apt-key add /srv/config/apt-keys/ondrej_keyserver_ubuntu.key + fi + + if [[ ! $( apt-key list | grep 'Varying Vagrant Vagrants') ]]; then + # Apply the VVV signing key + echo "Applying the Varying Vagrant Vagrants mirror signing key..." + apt-key add /srv/config/apt-keys/varying-vagrant-vagrants_keyserver_ubuntu.key fi if [[ ! $( apt-key list | grep 'MariaDB') ]]; then # Apply the MariaDB signing key echo "Applying the MariaDB signing key..." - apt-key add /vagrant/config/apt-keys/mariadb.key + apt-key add /srv/config/apt-keys/mariadb.key fi if [[ ! $( apt-key list | grep 'git-lfs') ]]; then # Apply the PackageCloud signing key which signs git lfs echo "Applying the PackageCloud Git-LFS signing key..." - apt-key add /vagrant/config/apt-keys/git-lfs.key + apt-key add /srv/config/apt-keys/git-lfs.key fi # Update all of the package references before installing anything @@ -275,7 +385,7 @@ package_install() { # Install required packages echo "Installing apt-get packages..." - if ! apt-get -y --force-yes -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew install --fix-missing --fix-broken ${apt_package_install_list[@]}; then + if ! apt-get -y --allow-downgrades --allow-remove-essential --allow-change-held-packages -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew install --fix-missing --fix-broken ${apt_package_install_list[@]}; then apt-get clean return 1 fi @@ -305,16 +415,7 @@ latest_github_release() { tools_install() { # Disable xdebug before any composer provisioning. - sh /vagrant/config/homebin/xdebug_off - - local LATEST_NVM=$(latest_github_release "creationix/nvm") - - # nvm - mkdir -p "/srv/config/nvm" && - curl -so- https://raw.githubusercontent.com/creationix/nvm/$LATEST_NVM/install.sh | - METHOD=script NVM_DIR=/srv/config/nvm bash - - source /srv/config/nvm/nvm.sh + sh /srv/config/homebin/xdebug_off # npm # @@ -352,8 +453,8 @@ tools_install() { mv "composer.phar" "/usr/local/bin/composer" fi - if [[ -f /vagrant/provision/github.token ]]; then - ghtoken=`cat /vagrant/provision/github.token` + if [[ -f /srv/provision/github.token ]]; then + ghtoken=`cat /srv/provision/github.token` noroot composer config --global github-oauth.github.com $ghtoken echo "Your personal GitHub token is set for Composer." fi @@ -532,22 +633,26 @@ mailhog_setup() { chmod +x /usr/local/bin/mhsendmail fi - if [[ ! -e /etc/init/mailhog.conf ]]; then + if [[ ! -e /etc/systemd/system/mailhog.service ]]; then # Make it start on reboot - tee /etc/init/mailhog.conf < /dev/null 2>&1 &" -end script + tee /etc/systemd/system/mailhog.service < /dev/null 2>&1 & +[Install] +WantedBy=multi-user.target EOL fi + # Start on reboot + systemctl enable mailhog + echo " * Starting MailHog" - service mailhog start + systemctl start mailhog } mysql_setup() { @@ -653,10 +758,11 @@ php_codesniff() { # Sniffs WordPress Coding Standards echo -e "\nInstall/Update PHP_CodeSniffer (phpcs), see https://github.com/squizlabs/PHP_CodeSniffer" echo -e "\nInstall/Update WordPress-Coding-Standards, sniffs for PHP_CodeSniffer, see https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards" - cd /vagrant/provision/phpcs - noroot composer update --no-ansi --no-autoloader --no-progress + cd /srv/provision/phpcs + composer update --no-ansi --no-autoloader --no-progress - # Link `phpcbf` and `phpcs` to the `/usr/local/bin` directory + # Link `phpcbf` and `phpcs` to the `/usr/local/bin` directory so + # that it can be used on the host in an editor with matching rules ln -sf "/srv/www/phpcs/bin/phpcbf" "/usr/local/bin/phpcbf" ln -sf "/srv/www/phpcs/bin/phpcs" "/usr/local/bin/phpcs" @@ -694,12 +800,10 @@ cleanup_vvv(){ # Cleanup the hosts file echo "Cleaning the virtual machine's /etc/hosts file..." sed -n '/# vvv-auto$/!p' /etc/hosts > /tmp/hosts - echo "127.0.0.1 vvv.dev # vvv-auto" >> "/etc/hosts" - echo "127.0.0.1 vvv.local # vvv-auto" >> "/etc/hosts" - echo "127.0.0.1 vvv.localhost # vvv-auto" >> "/etc/hosts" echo "127.0.0.1 vvv.test # vvv-auto" >> "/etc/hosts" if [[ `is_utility_installed core tideways` ]]; then echo "127.0.0.1 tideways.vvv.test # vvv-auto" >> "/etc/hosts" + echo "127.0.0.1 xhgui.vvv.test # vvv-auto" >> "/etc/hosts" fi mv /tmp/hosts /etc/hosts } diff --git a/version b/version index 914ec9671..56fea8a08 100644 --- a/version +++ b/version @@ -1 +1 @@ -2.6.0 \ No newline at end of file +3.0.0 \ No newline at end of file diff --git a/vvv-config.yml b/vvv-config.yml index 6e5e4976c..7696dd354 100644 --- a/vvv-config.yml +++ b/vvv-config.yml @@ -72,7 +72,6 @@ utilities: - opcache-status # opcache management - phpmyadmin # Web based database client - webgrind # PHP Debugging - - trusted-hosts # GitHub etc - tls-ca # SSL/TLS certificates - mongodb # needed for Tideways/XHGui - tideways # PHP profiling tool, also installs xhgui