-
Notifications
You must be signed in to change notification settings - Fork 27
Deployment
Stian Håklev edited this page Nov 10, 2017
·
6 revisions
If you are serving up to 40-50 students simultaneously logged in, I think that deploying FROG to a single server should be sufficient. We still need a better understanding of performance limits, and the code could probably be made a lot more efficient.
To serve 250+ students over https, this is how we currently do it.
We use Digital Ocean droplets, as well as two CHILI servers for Nginx load-balancing and SSL reverse proxying, because Let's Encrypt requires domain names, which we don't get from Digital Ocean. In the future, we want to investigate how to do the setup automatically, and possibly use Kubernetes.
- icchilisrv4: Will load-balance and SSL terminate the Meteor servers
- icchilisrv3: Will load-balance and SSL terminate the ShareDB servers
- icchilisrv1: SSL terminates file upload servers (if needed)
- frog-head: DO 1GB, runs Meteor, and Mongo for Meteor. Used by teacher
- frog1-3: DO 512MB, additional Meteor servers
- sharedb-head: DO 1GB, runs ShareDB, Mongo for ShareDB, Redis for ShareDB
- sharedb1-3: DO 512MB, additional ShareDB servers
- minio1-2: Optional file upload servers
- create all the DO clusters listed above, selecting any SSH keys needed, and Monitoring. Use most recent Ubuntu (16.04) image, location: Frankfurt
- a good idea is to add the servers to /etc/hosts, so make it easier to do
ssh sharedb-head
etc
- ssh into all of the new servers in different iTerm panes. Note that if you have previously used frog1 etc for different servers, you might have to remove these from
~/.ssh/known_hosts
- turn on
send input to all servers
- run
apt get
andapt upgrade
- apt install
autossh
-
ssh-keygen -t rsa -b 4096
(no password etc) cat ~/.ssh/id_rsa.pub
- now you need to copy all the SSH keys from
frog*
andsharedb1-3
tosharedb-head
, and fromfrog1-3
tofrog-head
- they should be added to~/.ssh/authorized_keys
, this will allow SSH login and autossh for port forwarding - install
mongodb
onsharedb-head
andfrog-head
, andredis-server
onsharedb-head
- change port for
mongodb
onsharedb-head
to27300
(edit/etc/mongodb.conf
, uncomment and setport
, thenservice mongodb restart
-
send input to all servers
, thentmux
- find the ip of
frog-head
andsharedb-head
, I'm going to usefrog-head
andsharedb-head
below, but it must be replaced by the actual IPs - for
frog*
andsharedb1-3
:/usr/lib/autossh/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -p 22 root@sharedb-head -L 27300:127.0.0.1:27300 -L 6379:127.0.0.1:6379
(this forwards Redis and Mongo for ShareDB)- make sure to type
yes
. It should not print anything, but also not return to the command prompt
- make sure to type
- for
frog1-3
:Ctrl+b c
for new tmux window, then/usr/lib/autossh/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -p 22 root@frog-head -L 27017:127.0.0.1:27017
- for
sharedb1-3
:
-
ctrl+b c
for new tmux window git clone https://github.com/chili-epfl/frog
- install node8:
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install -y nodejs
npm install -g forever
cd frog/sharedb; npm install
-
forever index.js
- you should see 'FROG ShareDB server started' - to test that ShareDB is functional, run
node test_sharedb_instance.js ws://sharedb1:3002
etc from your local computer
- git checkout (or update)
keybase://team/unilwip/frog-deploy
- update
mup.js
with the relevant ip addresses - run
mup setup
the first time you are dealing with new servers - run
mup deploy
every time you have made a code change - run
mup deploy --cached-build
if something went wrong with the deploy, but you don't want to rebuild the app - run
mup reconfig
if you only changedmup.js
orsettings.json
- Note: if you try to do
mup deploy
before having set up up theautossh
, the Docker container will fail to start, and be caught in a restart-loop` - Note: it is not unusual for
mup deploy
to take 10-15 minutes, so try to avoid changing code just before you are planning to run a graph`
- on
icchilisrv4.epfl.ch
, edit/etc/nginx/sites-available/default
, and update the ip addresses inupstream meteor
(listing all thefrog*
servers) - on
icchilisrv3.epfl.ch
, edit/etc/nginx/sites-available/default
, and update the ip addresses inupstream sharedb
(listing all thesharedb*
servers, make sure to include the port3002
) - on both, run
nginx -t
to verify the config, and thenservice nginx reload
- to test that ShareDB is functional, run
node test_sharedb_instance.js wss://icchilisrv3.epfl.ch
etc from your local computer
- you can check
docker ps
on any of thefrog*
servers, and you can tell whether the image is constantly rebooting or it's up for however many minutes since you deployed - you can visit individual Meteor servers (if you added the ips to your
/etc/hosts
, you can go tofrog-head/
etc in your browser) - you can visit
https://icchilisrv4.epfl.ch
- when visiting, look at the websockets in dev console, to see that both (Meteor and ShareDB) initialize, and there is no reloading or timeouts
- when you update code, you should only have to
mup deploy
, everything else should keep working
- export session from FROG teacher view
- ssh to
frog-head
, runand thenapt install -y zip mongodump -o frog mongodump --port 27300 -o sharebd zip -r export.zip *
scp root@frog-head:~/export.zip .
from your local computer - if you use a file server, ssh to each file server, zip all the files in
/mnt/data
, and copy them over in the same way