Installing Node.js + Ghost in an Ubuntu 14.04 LXC Container

| linux | javascript | ubuntu |

I had to set up a blog for an interaction design course that I am taking this semester. I figured this would be the perfect opportunity to play with Node.js and work with the absolutely beautiful Ghost blogging platform. I installed all of this on my primary Linode server that hosts this blog among other things. I like to keep my server neat, so whenever I am working with a new technology that I have not used before, especially when I know it is going to install a bunch of random files and run a bunch of random scripts that I will never be able to track down, I like to put it all into an LXC Container. Aside from a few snags, the installation was pretty straightforward. I followed theinstallation guide on the Ghost github site and had to make a couple small changes due to this issue. The interesting part of this was getting the container to be accessible from the outside world. I used apache’s mod_proxy module to forward requests to the new subdomain that I created directly to Ghost which was running in my LXC container. I have seen a couple different approaches to making containers accessible to the outside world but I think that this approach works well especially if you are hosting multiple sites on the same server.

Installing Your Container

I suppose this part is optional, you can just as well run this in a regular server or VM. However, if you like to put things into tiny little boxes like me, read on! The following should be run as root.
apt-get install lxc   

lxc-create -t download -n nodejs

During the template selection choose ubuntu, trusty, and amd64

Start the Container as a Daemon

lxc-start -n nodejs -d

Open a screen session to attach the container.

Why? Because “If it’s worth doing, it’s worth doing in screen”

screen -dRR node
lxc-attach -n nodejs

Installing Node.js and Ghost

Now that we have our shiny new container, lets get Node.js and Ghost installed. Since containers come with a very minimal set of software, we will install some additional utilities as well. The following should be run as root inside of your container. The only change I had to make from the official install guide was installing nodejs-legacy along with all the other stuff. Take a look at the issue linked to above if you are interested in more information.
apt-get install wget unzip nodejs npm nodejs-legacy   

Create a Directory for your Ghost blog and go into it

mkdir ghost cd ghost

Download and Unzip Ghost

wget https://ghost.org/zip/ghost-0.5.8.zip
unzip ghost-0.5.8.zip

Install Ghost

npm install –production

Since we are in a container, in order to be able to access ghost from the host

machine we will need to edit the config.js file and change the values of 127.0.0.1 to 0.0.0.0.

vim config.js
:%s/127.0.0.0.1/0.0.0.0/g

Start Ghost

npm start

If all went well you should now see this in the terminal.
root@hci:/ghost# 

npm start
> ghost@0.5.8 start /ghost > node index Migrations: Up to date at version 003 Ghost is running in development Listening on 0.0.0.0:2368 Url configured as: http://localhost:2368 Ctrl+C to shut down

You can now exit the screen session by pressing Ctrl+a and then Ctrl+d to get back to the host.

Apache Proxy to Container

The last step of this is to set up the Virtual Host config file to proxy requests to our new Node.js container.
# Grab the IP address of your container   
lxc-ls --fancy   

Load the appropriate apache proxy modules

a2enmod proxy
a2enmod proxy_http

Configure the Virtual Host file to set up the proxy it should look something like this. Be sure to replace the IP address listed below with the IP address of your actual container.

<VirtualHost *:80>

Admin email, Server Name (domain name), and any aliases

ServerAdmin [email protected]
ServerName hci.levlaz.org

ProxyVia full
ProxyPreserveHost on

<proxy>

Order deny,allow
Allow from all

</proxy>

ProxyPass / https://10.0.3.101:2368/
ProxyPassReverse / https://10.0.3.101:2368/

</Virtualhost>

Restart apache to clean things up

service apache2 restart

You should now be able to access your Ghost blog by going to the domain that you set up in your virtual host config file. In order to set up Ghost for the first time, you will want to navigate to https://yoursite.com/ghost Ghost is a great product! This was a fun little project because it is a good exercise with LXC and proxying requests to containers. I hope you found this useful! If you have any questions or run into any issues please let me know in the comments below.

Thank you for reading! Share your thoughts with me on mastodon or via email.

Check out some more stuff to read down below.

Most popular posts this month

Recent Favorite Blog Posts

This is a collection of the last 8 posts that I bookmarked.

Articles from blogs I follow around the net

Script Doctoring

I’ve been having a number of communications problems in my interactions with my doctors at Kaiser lately, and it’s becoming one of those things where the burden and onus entirely is placed upon me to sort out, and that’s exhausting for the actually autist…

via Bix Dot Blog October 22, 2024

Blockchain company Forte acquires games studios, demands secrecy, shuts them down

Sometime in 2023, blockchain firm Forte acquired game studios Phoenix Labs and Rumble Games. However, it would be a year before this came to light, because according to a report from Game Developer, Forte demanded secrecy from employ…

via Web3 is Going Just Great October 22, 2024

Initial explorations of Anthropic's new Computer Use capability

Two big announcements from Anthropic today: a new Claude 3.5 Sonnet model and a new API mode that they are calling computer use. (They also pre-announced Haiku 3.5, but that's not available yet so I'm ignoring it until I can try it out myself.) Comp…

via Simon Willison's Weblog: Entries October 22, 2024

Generated by openring