Meteor makes everything easy. Except for deploying your app on your own server, since they want you to use their solution “Galaxy”. Setting up your own infrastructure can be daunting, especially when you want to host multiple meteor apps on one server. Here I’m going to describe how this can be done using nginx.
Step 1) Configuring nginx
After installing nginx
sudo apt-get update
sudo apt-get install nginx
you can use the following setup in your /etc/ngnix/nginx.conf
:
# Change YOUR_TOKEN to your prerender token and uncomment that line if you want to cache urls and view crawl stats # Change example.com (server_name) to your website url # Change /path/to/your/root to the correct value events { worker_connections 768; # multi_accept on; } http { upstream project1 { server localhost:8081; } upstream project2 { server localhost:8082; } server { listen 80; server_name project1.com project1.org; client_max_body_size 20M; location / { proxy_pass http://project1; proxy_read_timeout 1000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } server { listen 80; server_name project2.com; client_max_body_size 20M; location / { proxy_pass http://project; proxy_read_timeout 1000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }
Step 2) Setting up a meteor project folder
In order to have only one deploy script (aka code duplication is bad), it’s useful to have all meteor apps in one folder. Therefore your directory structure should be somewhat like:
meteor-projects --project1 --project2
Step 3) Setting up the server
You need to install a bit of stuff on your server in order for meteor to work:
install.sh
#!/bin/bash sudo apt-get update sudo apt-get upgrade sudo apt-get install -y build-essential #install node curl -sL https://deb.nodesource.com/setup | sudo bash - sudo apt-get install nodejs -y #install npm modules npm install -g forever npm install -g phantomjs #install mongo sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list sudo apt-get update sudo apt-get install -y mongodb-org sudo service mongod start #install meteor curl https://install.meteor.com/ | sh #utils sudo apt-get install graphicsmagick
Put this somewhere on your server, then chmod +x install.sh
and run it ./install.sh
.
Step 4) Configuring properties
There are variables to your project, you can put them into a properties.sh
file inside of each project:
#!/bin/bash server=root@46.101.140.209 domain=project1.com name=project1 port=8081
Note that I’ve set it up in a way, that name
should be identical to your folder name.
Step 5) Writing a deploy script
Put those files into your meteor-projects
folder:
meteor-projects/deploy.sh
#!/bin/bash source ${1}/properties.sh cd ${name} meteor build compiled ssh ${server} mkdir ${name} scp -r compiled ${server}:${name}/compiled rm -rf compiled scp ../helper.sh ${server}:${name}/helper.sh scp properties.sh ${server}:${name}/properties.sh ssh ${server} chmod +x ${name}/helper.sh ssh ${server} ${name}/helper.sh
meteor-projects/helper.sh
#!/bin/bash cd $(dirname $0) source properties.sh tar -xvzf compiled/*.tar.gz rm -rf compiled # rebuild native packages cd bundle/programs/server && npm install cd ~ # setup environment variables export MONGO_URL="mongodb://127.0.0.1:27017/${name}" export ROOT_URL="http://${domain}" export PORT=${port} # start the server forever stop ${name}/bundle/main.js forever start ${name}/bundle/main.js
Things should be ready now!
In order to deploy, perform chmod +x deploy.sh
and run ./deploy.sh project1
or ./deploy.sh project2
. This should upload & run your meteor files.