From d692db6c194ae2f9889e9ebaabd152b426ba93d1 Mon Sep 17 00:00:00 2001 From: Tom Russell Date: Tue, 5 Mar 2019 10:04:18 +0000 Subject: [PATCH] Sketch in vagrant provision script Known problem with npm install step: this will likely fail when run from a Windows host, when npm tries to create symlinks in the synced folder. Workaround may be to run `vagrant up` from within a shell with admin rights on the host machine (Windows security policy may disallow creation of symlinks otherwise). --- .gitignore | 3 + Vagrantfile | 41 ++++++++++++ provision/.bashrc | 123 ++++++++++++++++++++++++++++++++++++ provision/install_node.sh | 17 ----- provision/vm_provision.sh | 127 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 294 insertions(+), 17 deletions(-) create mode 100644 Vagrantfile create mode 100644 provision/.bashrc delete mode 100644 provision/install_node.sh create mode 100644 provision/vm_provision.sh diff --git a/.gitignore b/.gitignore index 99109a29..33d18401 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ app/tilecache/**/*.mbtiles # Notes TODO + +# VM +.vagrant diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 00000000..92d26d5f --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,41 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "bento/ubuntu-18.04" + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine and only allow access + # via 127.0.0.1 to disable public access + config.vm.network "forwarded_port", guest: 3000, host: 3000, host_ip: "127.0.0.1" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider "virtualbox" do |vb| + # # Display the VirtualBox GUI when booting the machine + # vb.gui = true + # + # # Customize the amount of memory on the VM: + # vb.memory = "1024" + # end + # + # View the documentation for the provider you are using for more + # information on available options. + + # Enable provisioning with a shell script. Additional provisioners such as + # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the + # documentation for more information about their specific syntax and use. + config.vm.provision "shell", path: "provision/vm_provision.sh" +end diff --git a/provision/.bashrc b/provision/.bashrc new file mode 100644 index 00000000..77900c94 --- /dev/null +++ b/provision/.bashrc @@ -0,0 +1,123 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# If set, the pattern "**" used in a pathname expansion context will +# match all files and zero or more directories and subdirectories. +#shopt -s globstar + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# colored GCC warnings and errors +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +# some more ls aliases +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# Add an "alert" alias for long running commands. Use like so: +# sleep 10; alert +alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +# use virtual env +source ~/colouringlondon/bin/activate + +# start in vagrant dir on login +cd /vagrant diff --git a/provision/install_node.sh b/provision/install_node.sh deleted file mode 100644 index ff0870de..00000000 --- a/provision/install_node.sh +++ /dev/null @@ -1,17 +0,0 @@ -set -x - -# node -NODE_VERSION=v8.11.3 -DISTRO=linux-x64 -wget -nc https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$DISTRO.tar.xz -sudo mkdir /usr/local/lib/node -sudo tar xf node-v8.11.3-linux-x64.tar.xz -C /usr/local/lib/node -sudo mv /usr/local/lib/node/node-$NODE_VERSION-$DISTRO /usr/local/lib/node/node-$NODE_VERSION -rm node-$NODE_VERSION-$DISTRO.tar.xz - -cat >> ~/.profile </dev/null 2>&1 || useradd --create-home vagrant + + +# +# Install OS packages +# + +apt-get update +# Install: +# - basics: build-essential git vim-nox +# - python with pip and venv: python3 python3-pip python3-dev +# - postgres and postgis: postgresql postgresql-contrib libpq-dev postgis postgresql-10-postgis-2.4 +# - spatial shared libs: gdal-bin libspatialindex-dev libgeos-dev libproj-dev +apt-get install -y \ + build-essential git vim-nox wget curl \ + python3 python3-pip python3-dev python3-venv \ + postgresql postgresql-contrib libpq-dev postgis postgresql-10-postgis-2.4 \ + gdal-bin libspatialindex-dev libgeos-dev libproj-dev + + +# +# Install node.js (node and npm) +# + +# node version and platform +NODE_VERSION=v8.11.3 +DISTRO=linux-x64 + +# download +wget -nc https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$DISTRO.tar.xz + +# extract +sudo mkdir /usr/local/lib/node +sudo tar xf node-$NODE_VERSION-$DISTRO.tar.xz -C /usr/local/lib/node +sudo mv /usr/local/lib/node/node-$NODE_VERSION-$DISTRO /usr/local/lib/node/node-$NODE_VERSION +rm node-$NODE_VERSION-$DISTRO.tar.xz + +# add to user PATH +cat >> /home/vagrant/.profile <> /etc/postgresql/10/main/pg_hba.conf +# Restart postgres to pick up config changes +service postgresql restart + +# Create vagrant role if not exists +su postgres -c "psql -c \"SELECT 1 FROM pg_user WHERE usename = 'vagrant';\" " \ + | grep -q 1 || su postgres -c "psql -c \"CREATE ROLE vagrant SUPERUSER LOGIN PASSWORD 'vagrant';\" " +# Create vagrant database if not exists +su postgres -c "psql -c \"SELECT 1 FROM pg_database WHERE datname = 'vagrant';\" " \ + | grep -q 1 || su postgres -c "createdb -E UTF8 -T template0 --locale=en_US.utf8 -O vagrant vagrant" + +# Run all 'up' migrations to create tables, data types, indexes +su postgres -c "ls /vagrant/migrations/*.up.sql 2>/dev/null | while read -r migration; do psql < $migration; done;" + + +# +# Install python packages +# + +# set up env +pyvenv colouringlondon +source colouringlondon/bin/activate + +# Install smif +pip install --upgrade pip +pip install --upgrade setuptools wheel +pip install -r /vagrant/etl/requirements.txt + +# Make virtualenv user-editable +chown -R vagrant:vagrant /home/vagrant/colouringlondon + + +# +# Install node modules +# + +# Install latest release of npm +npm install -g npm@next + +# Local fixed install of node modules +cd /vagrant/app && npm ci + + +# +# User config +# + +# Copy bash config to vagrant home (making sure to clean windows newlines using tr) +tr -d '\r' < /vagrant/provision/.bashrc > /home/vagrant/.bashrc +chown vagrant:vagrant /home/vagrant/.bashrc