Add Vagrant support for development
parent
9ab404cc56
commit
e35570cf48
|
@ -17,5 +17,6 @@ data/
|
|||
dist/
|
||||
node_modules/
|
||||
local/
|
||||
.vagrant
|
||||
|
||||
RUNNING_PID
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
Vagrant.configure(2) do |config|
|
||||
config.vm.box = "ubuntu/vivid64"
|
||||
|
||||
# Use this script to set up and compile the Lila installation. We set
|
||||
# `privileged` to `false` because otherwise the provisioning script will run
|
||||
# as root. This isn't a problem to install packages globally (`apt-get
|
||||
# install`), but `sbt publish-local` will publish to `root`'s home directory!
|
||||
# Then we would not be able to use those packages when logged in as
|
||||
# `vagrant`.
|
||||
config.vm.provision "shell", path: "bin/provision-vagrant.sh", privileged: false
|
||||
|
||||
# IP address to use to connect to the virtual machine. This should be an
|
||||
# entry in your hosts file. We use a static IP so that the developer doesn't
|
||||
# have to keep adding new entries to their hosts file.
|
||||
config.vm.network "private_network", ip: "192.168.34.34"
|
||||
|
||||
# From https://stefanwrobel.com/how-to-make-vagrant-performance-not-suck. You
|
||||
# may want to set `cpus` and `mem` yourself.
|
||||
config.vm.provider "virtualbox" do |v|
|
||||
host = RbConfig::CONFIG['host_os']
|
||||
|
||||
# Fraction of memory of host OS to allocate to VM. More is better!
|
||||
memory_fraction = 0.5
|
||||
|
||||
# Give VM allocated system memory & access to all cpu cores on the host
|
||||
if host =~ /darwin/
|
||||
cpus = `sysctl -n hw.ncpu`.to_i
|
||||
# sysctl returns Bytes and we need to convert to MB
|
||||
mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024
|
||||
elsif host =~ /linux/
|
||||
cpus = `nproc`.to_i
|
||||
# meminfo shows KB and we need to convert to MB
|
||||
mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024
|
||||
else # sorry Windows folks, I can't help you
|
||||
cpus = 2
|
||||
mem = 4096
|
||||
end
|
||||
|
||||
mem *= memory_fraction
|
||||
mem = mem.to_i
|
||||
|
||||
# Needed to use multiple CPUs.
|
||||
v.customize ["modifyvm", :id, "--ioapic", "on"]
|
||||
|
||||
v.customize ["modifyvm", :id, "--cpus", cpus]
|
||||
v.customize ["modifyvm", :id, "--memory", mem]
|
||||
end
|
||||
end
|
|
@ -1,8 +1,9 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
dir=`mktemp -d`
|
||||
dir=$(mktemp -d)
|
||||
echo "Building in $dir"
|
||||
cd $dir
|
||||
cd "$dir"
|
||||
|
||||
rm -rf scalalib
|
||||
git clone https://github.com/ornicar/scalalib
|
||||
|
@ -28,4 +29,4 @@ cd maxmind-geoip2-scala
|
|||
sbt publish-local
|
||||
cd ..
|
||||
|
||||
rm -rf $dir
|
||||
rm -rf "$dir"
|
||||
|
|
|
@ -0,0 +1,221 @@
|
|||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
# We add environment variables to these files.
|
||||
readonly PROFILES=("$HOME/.bash_profile" "$HOME/.bashrc")
|
||||
|
||||
# Directory containing the lila source code.
|
||||
readonly LILA_DIR='/vagrant'
|
||||
|
||||
# The HTTP port to listen on.
|
||||
readonly PORT=9663
|
||||
|
||||
# List of packages to install with apt.
|
||||
readonly DEPENDENCIES=(
|
||||
git
|
||||
sbt
|
||||
npm
|
||||
zsh
|
||||
|
||||
mongodb
|
||||
nginx
|
||||
|
||||
gcc
|
||||
make
|
||||
closure-compiler
|
||||
openjdk-8-jdk
|
||||
)
|
||||
|
||||
error() {
|
||||
echo >>/dev/stderr "ERROR: $*"
|
||||
}
|
||||
|
||||
info() {
|
||||
echo "INFO: $*"
|
||||
}
|
||||
|
||||
setup_application_config() {
|
||||
cat >"$LILA_DIR/conf/application.conf" <<'CONF'
|
||||
include "base"
|
||||
|
||||
net {
|
||||
domain = "l.org"
|
||||
asset.domain = "en.l.org"
|
||||
extra_ports = []
|
||||
}
|
||||
|
||||
ai {
|
||||
hash_size = 128
|
||||
threads = 1
|
||||
instances = 4
|
||||
debug = false
|
||||
play {
|
||||
movetime = 500 ms
|
||||
}
|
||||
analyse {
|
||||
movetime = 2000 ms
|
||||
}
|
||||
}
|
||||
|
||||
geoip {
|
||||
file = "data/GeoLite2-City.mmdb"
|
||||
}
|
||||
CONF
|
||||
}
|
||||
|
||||
# Set compilation options so that we don't run out of memory.
|
||||
setup_environment_variables() {
|
||||
for i in "${PROFILES[@]}"; do
|
||||
echo >>"$i" "export JAVA_OPTS='-Xms64M -Xmx3072M -Xss4M -XX:ReservedCodeCacheSize=64m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC'"
|
||||
done
|
||||
|
||||
. -- "${PROFILES[0]}"
|
||||
}
|
||||
|
||||
# For sbt: http://www.scala-sbt.org/release/tutorial/Installing-sbt-on-Linux.html
|
||||
update_apt() {
|
||||
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
|
||||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
|
||||
|
||||
sudo apt-get update
|
||||
}
|
||||
|
||||
install_dependencies() {
|
||||
sudo apt-get install -y -- "${DEPENDENCIES[@]}"
|
||||
|
||||
# `npm` relies on a `node` executable, but we have `nodejs`.
|
||||
# https://github.com/joyent/node/issues/3911
|
||||
sudo ln -sf '/usr/bin/nodejs' '/usr/bin/node'
|
||||
|
||||
# Installed `npm` is too old, upgrade it.
|
||||
sudo npm update -g
|
||||
sudo npm install -g npm
|
||||
|
||||
sudo npm install -g gulp
|
||||
}
|
||||
|
||||
setup_nginx() {
|
||||
local nginx_conf
|
||||
nginx_conf=$(mktemp)
|
||||
|
||||
sed "s#LILA_DIR#$LILA_DIR#g" >"$nginx_conf" <<'CONF'
|
||||
server {
|
||||
listen 80;
|
||||
|
||||
server_name l.org ~^\w\w\.l\.org$;
|
||||
|
||||
error_log /var/log/nginx/lila.error.log;
|
||||
access_log /var/log/nginx/lila.access.log;
|
||||
|
||||
charset utf-8;
|
||||
|
||||
location /assets {
|
||||
alias LILA_DIR/public;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_read_timeout 90s;
|
||||
proxy_pass http://127.0.0.1:9663/;
|
||||
}
|
||||
|
||||
location /ai/ {
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://127.0.0.1:9663/ai/;
|
||||
}
|
||||
|
||||
error_page 500 501 502 503 /oops/servererror.html;
|
||||
error_page 504 /oops/timeout.html;
|
||||
error_page 429 /oops/toomanyrequests.html;
|
||||
location /oops/ {
|
||||
root LILA_DIR/public/;
|
||||
}
|
||||
location = /robots.txt {
|
||||
root LILA_DIR/public/;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name ~^socket\.\w\w\.l\.org$;
|
||||
charset utf-8;
|
||||
location / {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_pass http://127.0.0.1:9663/;
|
||||
}
|
||||
}
|
||||
CONF
|
||||
|
||||
sudo mv -- "$nginx_conf" '/etc/nginx/sites-available/default'
|
||||
sudo nginx -s reload
|
||||
}
|
||||
|
||||
setup_mongodb() {
|
||||
# Default MongoDB database path. `mongod` will fail to launch if this
|
||||
# doesn't exist.
|
||||
sudo mkdir -p /data/db
|
||||
|
||||
sudo service mongodb start
|
||||
}
|
||||
|
||||
build_lila() {
|
||||
cd -- "$LILA_DIR"
|
||||
git submodule update --init --recursive
|
||||
|
||||
./ui/build &
|
||||
./bin/install-stockfish &
|
||||
./bin/gen/geoip &
|
||||
./bin/build-deps.sh &
|
||||
wait
|
||||
|
||||
sbt compile
|
||||
}
|
||||
|
||||
get_ip_address() {
|
||||
ifconfig eth1 | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1
|
||||
}
|
||||
|
||||
main() {
|
||||
setup_application_config
|
||||
setup_environment_variables
|
||||
|
||||
update_apt
|
||||
install_dependencies
|
||||
setup_nginx
|
||||
setup_mongodb
|
||||
build_lila
|
||||
|
||||
local ip_address
|
||||
ip_address=$(get_ip_address)
|
||||
|
||||
info 'Lila is all set up! Add this entry entry to your hosts file on your'
|
||||
info 'host machine (not the virtual machine, or else I would have done it'
|
||||
info 'for you):'
|
||||
info
|
||||
info " $ip_address l.org en.l.org de.l.org le.l.org fr.l.org es.l.org l1.org socket.en.l.org socket.le.l.org socket.fr.l.org ru.l.org el.l.org hu.l.org socket.hu.l.org"
|
||||
info
|
||||
info 'Then run "vagrant ssh" and carry out these steps inside your SSH'
|
||||
info 'connection:'
|
||||
info
|
||||
info ' 1. cd /vagrant'
|
||||
info " 2. sbt run -Dhttp.port=$PORT"
|
||||
info " 3. Leave 'sbt run' running inside your virtual machine and visit"
|
||||
info " http://en.l.org on your host machine. It won't load. This is"
|
||||
info ' expected.'
|
||||
info ' 4. Wait until sbt run has finished launching. (After it has'
|
||||
info ' finished, relevant output will be printed. If the most recent'
|
||||
info ' message is'
|
||||
info
|
||||
info ' (Server started, use Ctrl+D to stop and go back to the console...)'
|
||||
info
|
||||
info ' then you have not waited long enough.)'
|
||||
info ' 5. Visit http://en.l.org again. It should load now.'
|
||||
}
|
||||
|
||||
main
|
Loading…
Reference in New Issue