3 min read

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.