Support #647
Install JSbin On FreeBSD
Description
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.
UPDATE: This guide has been updated for FreeBSD 10.
WARNING: JSbin will only run on nodejs 0.10; as of 1 Oct. 2016 the ports tree does not have www/node010; so an older snapshot of the ports tree must be used. JSbin will not run on FreeBSD 10 otherwise.
Prepare the system¶
- Make sure the system is up to date and ports tree is installed:
pkg update && pkg upgrade
- Use the version of the ports tree with node010:
svn checkout svn://svn.freebsd.org/ports/branches/2016Q3 /usr/ports/
- Add the following to the make.conf file to use nginx while compiling passenger:
echo 'OPTIONS_UNSET+= DOCS NLS X11 EXAMPLES' >> /etc/make.conf echo 'OPTIONS_SET+= NODE010' >> /etc/make.conf
- Install a few dependencies:
pkg install portmaster libzmq2 nasm git sqlite3 pkgconf autoconf python gmake
- Install node010 and npm2 from the ports tree:
portmaster www/node010 www/npm2
- Install grunt-cli globally using npm:
npm install -g grunt grunt-cli
- Add a jsbin user to separate privileges:
pw add user -n jsbin -m -s /bin/sh -c "JSbin"
Install JSbin¶
- Install jsbin globally:
npm install --sqlite=/usr/local -g jsbin
- Create a new config file and edit it as necessary:
cp /usr/local/lib/node_modules/jsbin/config.default.json /usr/local/lib/node_modules/jsbin/config.local.json
- Edit the jsbin config file:
vi /usr/local/lib/node_modules/jsbin/config.local.json
- Modify the env, timezone, and url settings:
"env": "production", "timezone": "PST", "url": { "host": "jsbin.example.com", "prefix": "/", "ssl": true, "static": false, "runner": false }, "session": { "secret": "v09sfyka2e32vdxa9k297d1" }, "store": { "adapter": "sqlite", "sqlite": { "location": "jsbin.sqlite" }, },
- Modify the env, timezone, and url settings:
- Build the production environment files:
cd /usr/local/lib/node_modules/jsbin npm install grunt-contrib-uglify grunt-contrib-jshint grunt-contrib-concat grunt build
- Change the ownership of the jsbin site to the jsbin user:
chown -R jsbin /usr/local/lib/node_modules/jsbin
- Test JSbin:
su - jsbin jsbin
NOTE: Press Ctrl+C to kill the test server when finished.
- Go to http://jsbin.example.com:3000 in a web browser
- Exit from the jsbin user:
exit
Running JSbin with PM2¶
- Install pm2 globally:
npm install -g pm2
- Switch to the jsbin user:
su - jsbin
- Start jsbin using pm2:
pm2 start /usr/local/lib/node_modules/jsbin/bin/jsbin exit
JSbin Init Script¶
- Create a jsbin FreeBSD init script:
vi /usr/local/etc/rc.d/jsbin
- and add the following
#!/bin/sh # PROVIDE: jsbin # KEYWORD: shutdown . /etc/rc.subr name="jsbin" jsbin_port="3000" jsbin_proxy="off" start_cmd="${name}_start" stop_cmd="${name}_stop" jsbin_start() { echo "pm2 starting" su - jsbin -c "cd /usr/local/lib/node_modules/jsbin; /usr/bin/env PORT=${jsbin_port} JSBIN_PROXY=${jsbin_proxy} /usr/local/bin/pm2 --name ${name} start /usr/local/lib/node_modules/jsbin/bin/jsbin; exit" } jsbin_stop() { echo "pm2 stopping" su - jsbin -c "/usr/local/bin/pm2 delete ${name}; exit" } run_rc_command "$1"
- and add the following
- And make it executable:
chmod +x /usr/local/etc/rc.d/jsbin
- Start and enable jsbin at boot
echo 'jsbin_enable="YES"' >> /etc/rc.conf echo 'jsbin_proxy="on"' >> /etc/rc.conf service jsbin start
Install Nginx¶
- Install Nginx
pkg install nginx
- Start and enable nginx at boot:
echo 'nginx_enable="YES"' >> /etc/rc.conf service nginx start
- Create a configuration directory to make managing individual server blocks easier
mkdir /usr/local/etc/nginx/conf.d
- Edit the main nginx config file:
vi /usr/local/etc/nginx/nginx.conf
- And strip down the config file and add the include statement at the end to make it easier to handle various server blocks:
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; keepalive_timeout 65; # Load config files from the /etc/nginx/conf.d directory include /usr/local/etc/nginx/conf.d/*.conf; }
- And strip down the config file and add the include statement at the end to make it easier to handle various server blocks:
- Add a default site server block:
vi /usr/local/etc/nginx/conf.d/www.example.com.conf
- Add the following:
server { listen 80; server_name jsbin.example.com; root /usr/local/lib/node_modules/jsbin/public; index index.html; location @jsbin { proxy_pass http://localhost: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; proxy_redirect off; proxy_set_header X-Accel-Buffering no; proxy_set_header Connection ''; proxy_http_version 1.1; proxy_buffering off; proxy_cache off; proxy_set_header X-Forwarded-Proto https; } location / { add_header Pragma "public"; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; add_header Last-Modified $sent_http_Expires; add_header Access-Control-Allow-Origin *; try_files $uri $uri/ @jsbin; } }
- Add the following:
- And restart nginx:
service nginx restart
Resources¶
Updated by Daniel Curtis over 9 years ago
- Description updated (diff)
- Status changed from New to Rejected
Updated by Daniel Curtis over 9 years ago
- Description updated (diff)
- Status changed from Rejected to In Progress
- % Done changed from 0 to 50
Updated by Daniel Curtis over 9 years ago
- Description updated (diff)
- % Done changed from 50 to 80
Updated by Daniel Curtis over 9 years ago
- Status changed from In Progress to Resolved
- % Done changed from 80 to 100
Updated by Daniel Curtis about 8 years ago
- Description updated (diff)
- Target version changed from FreeBSD 9 to FreeBSD 10