MeteorJS on Raspberry Linux ARM

Probably in the future we'll have cluster of autobalanced low power arm servers, in the meanwhile we have the Raspberry Pi, which is already a quite popular computer to be a media center or an hackable/silent/small/cheap home server.

The Meteor framework is quite easy to install on a mainstran architecture x86_64 with GNU/Linux or OSX as operative system,.. unfortunatly it is a bit more complicated on Windows, FreeBSD or Linux ARM.

Let's see some issues you could find installing MeteorJS on Linux ARM.

Raspbian Debian or Archlinux ARM?

I like Debian/Ubuntu stability and PPA repository for bleding-edge software, but on ARM I chose Archlinux ARM for its systemd and MongoDB 2.6.1 out-of-the-box support. Yes, currently only Arch packages MongoDB on ARM probably because there are some open issues mainstream.

sudo pacman -Sy nodejs mongodb python2 make gcc

Python2 and the gcc are there because you need to recompile some x86_64 native stuff bundled with meteor_apps to ARM/32-bit architecture.

Where is NodeJS 0.10.28 for Linux ARM?

Arch packages Node 0.10.30-1, MeteorJS needs Node 0.10.29, but Node 0.10.29 binaries are missing on ARM. The official NodeJS site ship node-v0.10.28-linux-arm-pi.tar.gz, so what to do?

Install the distro nodejs package from the distro and use "n" to switch to another binary release.

sudo npm install -g n
sudo n v0.10.28

Fix MongoDB on ARM

Yes, Archlinux installs MongoDB but it has broken permissions :( and even if you fix it it still dies without error codes :((

Here is a quick workaround hack, run mongodb as root :D

# /etc/systemd/system/multi-user.target.wants/mongodb.service 
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
[Service]

User=mongodb

User=root
ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb.conf --dbpath /var/lib/mongodb
[Install]
WantedBy=multi-user.target

And now it should be up and running :)

sudo systemctl start mongodb
sudo systemctl status mongodb

  • mongodb.service - High-performance, schema-free document-oriented database
       Loaded: loaded (/usr/lib/systemd/system/mongodb.service; enabled)
       Active: active (running) since Wed 2014-08-13 10:02:45 CEST; 13s ago
     Main PID: 531 (mongod)
       CGroup: /system.slice/mongodb.service
               `-531 /usr/bin/mongod --quiet --config /etc/mongodb.conf --dbpath /var/lib/mongodb
    Aug 13 10:02:45 alarmpi systemd[1]: Starting High-performance, schema-free document-oriented database...
    Aug 13 10:02:45 alarmpi systemd[1]: Started High-performance, schema-free document-oriented database.
    Aug 13 10:02:52 alarmpi mongod[531]: 2014-08-13T10:02:52.276+0200
    Aug 13 10:02:54 alarmpi mongod[531]: 2014-08-13T10:02:52.721+0200 warning: 32-bit servers don't have journaling enabled by d...bility.
    Aug 13 10:02:54 alarmpi mongod[531]: 2014-08-13T10:02:52.738+0200
    Hint: Some lines were ellipsized, use -l to show in full.

Fix Meteor specific node requirement

On the development computer you run meteor bundle myapp.tgz, on the Raspberry home server tar -xvzf myapp.tgz and you'll get a bundle/ directory with your meteor_app and node dependencies.

"These steps are needed everytime you update your app", so create a script if you plan to update your code often.

# recompile for ARM native meteor deps
cd bundle/programs/server/node_modules/ # or bundle/server/node_modules on older Meteor versions
rm -rf fibers bcrypt
npm install fibers@1.0.1 bcrypt@0.7.7
npm install
cd -

Downgrade nodejs to release compatible with MeteorJS and ARM architecture

open `bundle/programs/server/boot.js` and replace:

var MIN_NODE_VERSION = 'v0.10.29';

to

var MIN_NODE_VERSION = 'v0.10.28';

Now you should be able to run you app with:

PORT=3000 MONGO_URL=mongodb://localhost:27017/myapp node bundle/main.js

Persistence and boot startup with systemd

Cool the app works but I need it at boot and after mongodb! No prob.

# /etc/systemd/system/multi-user.target.wants/myapp.service 
[Unit]
Description=My cool Meteor app on Linux ARM Raspberry
After=mongodb.target
[Service]
User=myuser

User=root # if you want port 80

Environment=PORT=3000 MONGO_URL=mongodb://localhost:27017/myapp
ExecStart=/usr/local/bin/node /home/myuser/Apps/bundle/main.js
[Install]
WantedBy=multi-user.target

Then

sudo systemctl start myapp
sudo systemctl enable myapp # to automatically start on boot or reboot

Done. You should see your app on http://my-pi-ip:3000 or http://my-pi-name.local:3000

And your app logs are at:

journalctl -u myapp

PS: the command to upgrade Archlinux "pacman -Syu" will "brick" your Raspberry installation,.. so if you want to upgrade all the packages choose carefully the package to update, like Linux kernel and low level libs.