forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
276 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,5 +17,6 @@ data/ | |
dist/ | ||
node_modules/ | ||
local/ | ||
.vagrant | ||
|
||
RUNNING_PID |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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:https://' -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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: https://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:https://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 https://127.0.0.1:9663/; | ||
} | ||
location /ai/ { | ||
proxy_set_header Host $http_host; | ||
proxy_set_header X-Forwarded-For $remote_addr; | ||
proxy_pass https://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 https://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 " https://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 https://en.l.org again. It should load now.' | ||
} | ||
|
||
main |