Skip to content

Instantly share code, notes, and snippets.

@a-r-m-i-n
Last active September 2, 2019 10:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save a-r-m-i-n/999445ebf60014ec68e009c180489668 to your computer and use it in GitHub Desktop.
Save a-r-m-i-n/999445ebf60014ec68e009c180489668 to your computer and use it in GitHub Desktop.
Generic Vagrantfile for TYPO3 extension development

TYPO3 Extension Box

Version: 1.2.0

URL: bit.ly/typo3-extension-box

This Vagrantfile ships a handy development environment for TYPO3 extensions. The shell based provision scripts, use Composer to fetch TYPO3 CMS and all required dependencies - for different TYPO3 versions:

  • TYPO3 CMS 8.7 LTS
  • TYPO3 CMS 9.5 LTS

Both use the Composer meta package t3/cms.

The provision scripts also provide such an overview page, for easy access: Overview page

Installation

  1. Just copy the Vagrantfile to the root of your extension
  2. adjust the first variables in Vagrant.configure("2") section
  3. perform vagrant up on CLI in your extension directory

Vagrant CLI output displays the URLs you can use, to open TYPO3 in your browser.

Requirements

All tools, required to run this stack, are open source/free available:

  • VirtualBox
  • Vagrant
  • Vagrant Plugins (fetch via CLI)
    • vagrant-bindfs vagrant plugin install vagrant-bindfs
    • vagrant-hostmanager vagrant plugin install vagrant-hostmanager
    • vagrant-winnfsd (Windows only) vagrant plugin install vagrant-winnfsd
  • Vagrant box ArminVieweg/ubuntu-bionic64-lamp (fetched automatically)

Because the provision scripts use Composer to fetch TYPO3 (and also your extension) it is required, to ship a minimal TYPO3 extension:

  • valid ext_emconf.php
  • valid composer.json (configured packageName must fit)

Changelog

  • 1.0.0 First version
  • 1.1.0 Fixed Mailcatcher link in overview.html; Use typo3_console to enable TYPO3 debug settings during provisioning
  • 1.1.1 Completed debug settings during provisiong
  • 1.2.0 Fixed missing .htaccess (8 & 9) and wrong entry point in site configuration (9) during provisioning
# -*- mode: ruby -*-
# vi: set ft=ruby :
# TYPO3 Extension Box
# Generic Vagrantfile for TYPO3 extension development
# Author: Armin Vieweg <armin@v.ieweg.de>
# Version: 1.2.0
# Date: 2019-02-03
# Link to this script: http://bit.ly/typo3-extension-box
# The following vagrant plugins are required:
# - vagrant-bindfs
# - vagrant-hostmanager
# - vagrant-winnfsd (Windows only)
#
# More infos for VM: http://bit.ly/bionic64-lamp
Vagrant.configure("2") do |config|
# Adapt these four settings for each new extension/box
extensionKey = "your_extension"
packageName = "vendor/your-extension"
staticIpAddress = "192.168.213.37"
extensionRepo = "https://github.com/to/your/git/repo" # Only used as help link
# Base configuration
config.vm.box = "ArminVieweg/ubuntu-bionic64-lamp"
hostname = extensionKey.gsub("_", "-")
config.vm.hostname = "#{hostname}.local"
config.hostmanager.aliases = ["www.#{hostname}.local"]
config.vm.network "private_network", type: "dhcp"
config.vm.provider "virtualbox" do |vb|
vb.memory = 4096
vb.cpus = 2
end
# Synchronization
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder ".", "/var/nfs", type: "nfs"
config.bindfs.bind_folder "/var/nfs", "/var/www/#{extensionKey}",
perms: "u=rwX:g=rwX:o=rD", force_user: "vagrant", force_group: "www-data"
# Hostmanager
config.hostmanager.enabled = true
config.hostmanager.manage_host = true
config.hostmanager.manage_guest = true
config.hostmanager.ignore_private_ip = false
config.hostmanager.include_offline = true
config.vm.define "default" do |node|
node.vm.network :private_network, ip: staticIpAddress
node.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
end
# Provisioning Scripts
# Set PHP to 7.2
config.vm.provision "shell", run: "once", privileged: true, name: "init", inline: <<-SHELL
/home/vagrant/enable-php/7.2.sh
SHELL
# Set up SSL certificate for given hostname
config.vm.provision "shell", run: "once", privileged: true, name: "update-ssl-certificate", inline: <<-SHELL
openssl genrsa -des3 -passout pass:xxxx -out /tmp/server.pass.key 2048 2>/dev/null
openssl rsa -passin pass:xxxx -in /tmp/server.pass.key -out /etc/apache2/ssl/apache.key 2>/dev/null
rm /tmp/server.pass.key
openssl req -new -key /etc/apache2/ssl/apache.key -out /tmp/server.csr \
-reqexts SAN -config <(cat /etc/ssl/openssl.cnf \
<(printf "\n[SAN]\nsubjectAltName=DNS:#{config.vm.hostname},DNS:www.#{config.vm.hostname}")) \
-subj "/C=DE/ST=North Rhine Westphalia/L=Cologne/O=Dev/OU=Dev/CN=#{config.vm.hostname}" 2>/dev/null
openssl x509 -req -days 1024 -in /tmp/server.csr -signkey /etc/apache2/ssl/apache.key \
-out /etc/apache2/ssl/apache.crt 2>/dev/null
rm /tmp/server.csr
echo "Created new SSL certificate for Apache, based on hostname: #{config.vm.hostname}"
SHELL
# Install TYPO3 8
config.vm.provision "shell", run: "once", privileged: false, name: "setup-typo3-8", inline: <<-SHELL
mkdir /var/www/typo3_8
cd /var/www/typo3_8
echo {} > composer.json
composer config repositories.#{extensionKey} path ../#{extensionKey}
composer config extra.typo3/cms.web-dir public
echo "Fetching TYPO3 CMS 8 using Composer..."
composer require t3/cms:"^8.0" #{packageName}:"*@dev" --no-progress --no-suggest --no-interaction
vendor/bin/typo3cms install:setup --force --database-user-name "root" --database-user-password "root" --database-host-name "localhost" --database-name "typo3_8" --database-port "3306" --database-socket "" --admin-user-name "admin" --admin-password "password" --site-name "EXT:#{extensionKey} Dev Environment" --site-setup-type "site"
vendor/bin/typo3cms configuration:set BE/debug true
vendor/bin/typo3cms configuration:set FE/debug true
vendor/bin/typo3cms configuration:set SYS/displayErrors 0
vendor/bin/typo3cms configuration:set SYS/systemLogLevel 0
vendor/bin/typo3cms configuration:set SYS/exceptionalErrors 12290
vendor/bin/typo3cms configuration:remove SYS/devIPmask
vendor/bin/typo3cms configuration:set MAIL/transport smtp
vendor/bin/typo3cms configuration:set MAIL/transport_smtp_server 127.0.0.1:1025
vendor/bin/typo3cms cache:flush
SHELL
config.vm.provision "shell", run: "once", privileged: true, name: "setup-typo3-8-root", inline: <<-SHELL
cd /var/www/typo3_8
wget -qO.htaccess https://raw.githubusercontent.com/TYPO3/TYPO3.CMS/TYPO3_8-7/_.htaccess
chmod 2775 . ./public/typo3conf ./public/typo3conf/ext
chown -R vagrant .
chgrp -R www-data .
echo -e "Alias /8 \"/var/www/typo3_8/public/\"\n<Directory \"/var/www/typo3_8/public/\">\nOrder allow,deny\nAllow from all\nRequire all granted\n</Directory>" > /etc/apache2/conf-available/typo3_8.conf
a2enconf typo3_8
SHELL
# Install TYPO3 9
config.vm.provision "shell", run: "once", privileged: false, name: "setup-typo3-9", inline: <<-SHELL
mkdir /var/www/typo3_9
cd /var/www/typo3_9
echo {} > composer.json
composer config repositories.#{extensionKey} path ../#{extensionKey}
composer config extra.typo3/cms.web-dir public
echo "Fetching TYPO3 CMS 9 using Composer..."
composer require t3/cms:"^9.0" #{packageName}:"*@dev" --no-progress --no-suggest --no-interaction
vendor/bin/typo3cms install:setup --force --database-user-name "root" --database-user-password "root" --database-host-name "localhost" --database-name "typo3_9" --database-port "3306" --database-socket "" --admin-user-name "admin" --admin-password "password" --site-name "EXT:#{extensionKey} Dev Environment" --site-setup-type "site"
vendor/bin/typo3cms configuration:set BE/debug true
vendor/bin/typo3cms configuration:set FE/debug true
vendor/bin/typo3cms configuration:set SYS/displayErrors 0
vendor/bin/typo3cms configuration:set SYS/systemLogLevel 0
vendor/bin/typo3cms configuration:set SYS/exceptionalErrors 12290
vendor/bin/typo3cms configuration:remove SYS/devIPmask
vendor/bin/typo3cms configuration:set MAIL/transport smtp
vendor/bin/typo3cms configuration:set MAIL/transport_smtp_server 127.0.0.1:1025
vendor/bin/typo3cms cache:flush
SHELL
config.vm.provision "shell", run: "once", privileged: true, name: "setup-typo3-9-root", inline: <<-SHELL
cd /var/www/typo3_9
cp /var/www/typo3_9/public/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/root-htaccess /var/www/typo3_9/public/.htaccess
sed -i s,base:\\ ht/,base:\\ 9/,g /var/www/typo3_9/config/sites/main/config.yaml
chmod 2775 . ./public/typo3conf ./public/typo3conf/ext
chown -R vagrant .
chgrp -R www-data .
echo -e "Alias /9 \"/var/www/typo3_9/public/\"\n<Directory \"/var/www/typo3_9/public/\">\nOrder allow,deny\nAllow from all\nRequire all granted\n</Directory>" > /etc/apache2/conf-available/typo3_9.conf
a2enconf typo3_9
SHELL
# Install Adminer
config.vm.provision "shell", run: "once", privileged: false, name: "setup-adminer", inline: <<-SHELL
mkdir /var/www/adminer
cd /var/www/adminer
echo "Fetching Adminer using Composer..."
composer require vrana/adminer --no-progress --no-suggest --no-interaction
SHELL
config.vm.provision "shell", run: "once", privileged: true, name: "setup-adminer-root", inline: <<-SHELL
echo -e "Alias /adminer \"/var/www/adminer/vendor/vrana/adminer/adminer/\"\n<Directory \"/var/www/adminer/vendor/vrana/adminer/adminer/\">\nOrder allow,deny\nAllow from all\nRequire all granted\n</Directory>" > /etc/apache2/conf-available/adminer.conf
a2enconf adminer
SHELL
# Finish initial provisioning
config.vm.provision "shell", run: "once", privileged: true, name: "finish", inline: <<-SHELL
printf "\ncd /var/www" >> /home/vagrant/.bashrc
service apache2 restart
su vagrant
printf '<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>EXT:#{extensionKey} Dev Environment</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous"></head><body><div class="container mt-5"> <div class="jumbotron mb-0"> <h1 class="display-4">EXT:#{extensionKey} <small class="lead text-nowrap">Dev Environment</small></h1> <hr class="my-5"> <div class="row mt-5"> ' > /var/www/html/index.html
printf '<div class="col"><div class="card"><div class="card-body"> <h2 class="h5 card-title mb-4">TYPO3 CMS 8.7 LTS</h2> <a href="/8" class="btn btn-secondary">Frontend</a> <a href="/8/typo3" class="btn btn-primary">Backend</a> <a href="/8/typo3/install.php" class="btn btn-danger">Install Tool</a> </div></div></div>' >> /var/www/html/index.html
printf '<div class="col"><div class="card"><div class="card-body"> <h2 class="h5 card-title mb-4">TYPO3 CMS 9.5 LTS</h2> <a href="/9" class="btn btn-secondary">Frontend</a> <a href="/9/typo3" class="btn btn-primary">Backend</a> <a href="/9/typo3/install.php" class="btn btn-danger">Install Tool</a> </div></div></div>' >> /var/www/html/index.html
printf '<div class="col"><div class="card"><div class="card-body"> <h2 class="h5 card-title mb-4">Tools</h2> <a href="/adminer" class="btn btn-secondary" title="Database tool (root/root)">Adminer</a> <a href="http://#{config.vm.hostname}:1080/" class="btn btn-primary" title="Fetches all mails send from inside the VM">Mailcatcher</a> </div></div></div>' >> /var/www/html/index.html
printf '</div></div><div class="row mt-0"> <div class="col"> <h2 class="h4 mt-5 mb-2">Credentials</h2> <p> Username and password for TYPO3 is: <code>admin</code> / <code>password</code> (also for install tool).<br>For MySQL/MariaDB you can use <code>root</code> / <code>root</code> to login. </p><h2 class="h4 mt-5 mb-3">Links</h2> <ul class="nav flex-column"> <li class="nav-item"> <a class="nav-link" href="#{extensionRepo}">Extension repository</a> </li></ul> </div></div></div></body></html>' >> /var/www/html/index.html
chown -R vagrant /var/www/html/index.html
chgrp -R www-data /var/www/html/index.html
SHELL
# Run always
config.vm.provision "shell", run: "always", privileged: false, name: "booting", inline: <<-SHELL
touch /var/www/typo3_8/public/typo3conf/ENABLE_INSTALL_TOOL
touch /var/www/typo3_9/public/typo3conf/ENABLE_INSTALL_TOOL
echo "Overview: http://#{config.vm.hostname}"
echo " TYPO3 8: http://#{config.vm.hostname}/8 | http://#{config.vm.hostname}/8/typo3 (BE Login: admin/password)"
echo " TYPO3 9: http://#{config.vm.hostname}/9 | http://#{config.vm.hostname}/9/typo3 (Install Tool: password)"
echo " Adminer: http://#{config.vm.hostname}/adminer (root/root)"
echo "Happy Coding!"
SHELL
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment