Support #647
Updated by Daniel Curtis almost 9 years ago
This is a guide on installing JSbin on FreeBSD. *NOTE*: -After working on getting JSbin to install on FreeBSD for many hours, I was unable to get it working.- *UPDATE*: I found that +JSbin works on node v0.10+, the default nodejs version for FreeBSD is v0.12. Once I installed the older version JSbin installed correctly. h2. Prepare the system * Make sure the system is up to date: <pre> pkg update && pkg upgrade </pre> * Install a few dependencies: <pre> pkg install node010 portmaster libzmq2 nasm git sqlite3 pkgconf autoconf python pkg2ng </pre> * Install node010 and npm from the ports tree: <pre> portmaster www/npm </pre> *# *NOTE*: Make sure to check *[X]node010* when configuring the npm port * Install grunt-cli globally using npm: <pre> npm install -g grunt grunt-cli </pre> * Add a jsbin user to separate privileges: <pre> pw add user -n jsbin -m -s /bin/sh -c "JSbin" </pre> h2. Install JSbin * Install jsbin globally: <pre> npm install --sqlite=/usr/local -g jsbin </pre> * Create a new config file and edit it as necessary: <pre> cp /usr/local/lib/node_modules/jsbin/config.default.json /usr/local/lib/node_modules/jsbin/config.local.json </pre> * Edit the jsbin config file: <pre> vi /usr/local/lib/node_modules/jsbin/config.local.json </pre> #* Modify the env, timezone, and url settings: <pre> "env": "production", "timezone": "PST", "url": { "host": "jsbin.example.com", "prefix": "/", "ssl": false, "static": "http://jsbin.example.com/", "runner": "http://jsbin.example.com/" false }, </pre> #* While editing the jsbin config file, add the session secret key: <pre> "session": { "secret": "v09sfyka2e32vdxa9k297d1" }, </pre> * Build the production environment files: <pre> cd /usr/local/lib/node_modules/jsbin npm install grunt-contrib-uglify grunt-contrib-jshint grunt-contrib-concat grunt build </pre> * Change the ownership of the jsbin site to the jsbin user: <pre> chown -R jsbin /usr/local/lib/node_modules/jsbin </pre> * Test JSbin: <pre> su - jsbin env PORT=3000 jsbin </pre> * Go to http://jsbin.example.com:3000 in a web browser * Exit from the jsbin user: <pre> exit </pre> h2. Running JSbin with PM2 * Install pm2 globally: <pre> npm install -g pm2 </pre> * Switch to the jsbin user: <pre> su - jsbin </pre> * Start jsbin using pm2: <pre> pm2 start /usr/local/lib/node_modules/jsbin/bin/jsbin exit </pre> h2. JSbin FreeBSD Boot Script * Create a jsbin FreeBSD init script: <pre> vi /usr/local/etc/rc.d/jsbin </pre> #* and add the following <pre> #!/bin/sh # PROVIDE: jsbin # KEYWORD: shutdown . /etc/rc.subr name="pm2" jsbin_config="${jsbin_config-"/usr/local/lib/node_modules/jsbin/config.local.json"}" jsbin_port="${jsbin_port-"3000"}" start_cmd="${name}_start" stop_cmd="${name}_stop" pm2_start() { echo "pm2 starting" su - jsbin -c "cd /usr/local/lib/node_modules/jsbin; /usr/local/bin/pm2 start /usr/local/lib/node_modules/jsbin/bin/jsbin -- -c ${jsbin_config} -p ${jsbin_port}; exit" } pm2_stop() { echo "pm2 stopping" su - jsbin -c "/usr/local/bin/pm2 kill; exit" } run_rc_command "$1" </pre> * And make it executable: <pre> chmod +x /usr/local/etc/rc.d/jsbin </pre> * Start and enable jsbin at boot <pre> echo 'jsbin_enable="YES"' >> /etc/rc.conf service jsbin start </pre> h2. Install Nginx * Install Nginx <pre> portmaster www/nginx </pre> * Start and enable nginx at boot: <pre> echo 'nginx_enable="YES"' >> /etc/rc.conf service nginx start </pre> * Create a configuration directory to make managing individual server blocks easier <pre> mkdir /usr/local/etc/nginx/conf.d </pre> * Edit the main nginx config file: <pre> vi /usr/local/etc/nginx/nginx.conf </pre> #* And strip down the config file and add the include statement at the end to make it easier to handle various server blocks: <pre> #user nobody; worker_processes 1; error_log /var/log/nginx-error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # Load config files from the /etc/nginx/conf.d directory include /usr/local/etc/nginx/conf.d/*.conf; } </pre> * Add a *default site server block*: <pre> vi /usr/local/etc/nginx/conf.d/www.example.com.conf </pre> #* Add the following: <pre> server { listen 80; server_name jsbin.example.com; location @jsbin { proxy_pass http://jsbin.example.com:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { try_files $uri $uri/ @jsbin; } } </pre> * And restart nginx: <pre> service nginx restart </pre> h2. Resources * https://github.com/jsbin/jsbin/blob/master/docs/running-your-own-jsbin.md