Installing & using Node & NPM on MacOS X

To install NPM & Node simply go to the Node web site and install the latest stable version from the downloads page; or use the link on the Node homepage.

To check the installation simply use the methods described below to check the respective versions of NPM & Node.


NPM stands for Node Package Manager and is a way to quick install packages for Node with all their dependencies.

To check your installed version of NPM from the terminal use:

npm -v

If you use NPM regularly you’ll get nudged occasionally to upgrade – if you see something similar to the following in your CLI, just follow the instructions:

A subtle nudge to update you NPM install – just follow the instructions.

If you need to update your version of NPM and you get errors with the above command, use the following to escalate your privileges:

sudo npm install -g npm stable

Afterwards, check your installed version:

All sorted, now running the latest stable version.


Node is basically JavaScript running on the backend of your server – it can easily replace other more traditional backend languages such as PHP and Java meaning you can use JavaScript for your full stack.

To check your installed version of Node from the terminal use:

node -v

To upgrade Node, simply use NPM with the following command:

Removing NPM & Node from MacOS X

To remove both NPM & Node from your Mac, use the following commands:

cd /usr/local/lib

sudo rm -rf ./node*

cd /usr/local/include

sudo rm -rf ./node*

cd /usr/local/bin

sudo rm -rf ./npm

sudo rm -rf ./node

cd ~

rm -rf ./.npm

You can check to see if your NPM & Node installs return anything using the version command:

node -v

If there are any other areas of NPM or Node that require removal, let me know in the comments.

Gaming Ubuntu Server

Set up a Don’t Starve Together server on Ubuntu Server 18.04

In this post we’ll be setting up a dedicated Don’t Starve Together server with Caves on Ubuntu Server 18.04 for use with Windows, Mac and Linux clients. Sadly, neither Playstation nor Xbox players will be able to connect.

If you’re not sure what I’m talking about, maybe check out the Don’t Starve Together pages on the Klei web site.

Klei describes Don’t Starve Together as an uncompromising wilderness survival game, all I know is it’s alot of fun to play with friends.

Like playing the game, setting it up is a lot less stressful once you know what to do…


Before we can begin setting up our game server, we need to install some dependencies:

dpkg --add-architecture i386;

apt install libstdc++6:i386 libgcc1:i386 libcurl4-gnutls-dev:i386 wget screen

New user

Create a new user to install all the relevant game files into – this keeps file management easy and means you can easily remove the installation at a later date if you need to.

adduser dont-starve

Switch to the new user:

su - dont-starve

SteamCMD install

Don’t Starve is downloaded and updated from the Steam platform. To do this we need to install the SteamCMD package.

First let’s make a folder for it to live in:

mkdir -p ~/steamcmd/

cd ~/steamcmd/

Download and unpack the SteamCMD package:

wget ""

tar -xvzf steamcmd_linux.tar.gz

We’re done with SteamCMD for now, head back to the home root:

cd ~

Get cluster token and cluster config

To configure your Don’t Starve Together server you should now head over to the Klei accounts website:

At the bottom of the DST page, you can create a new server:

Creating the Anxiety Hour Don’t Starve together server, Warly’s Kitchen

Once the new server has been created you’ll need to configure it. You can do this manually but it saves you alot of headaches to just use the wizard – click the `Configure` link under your new server key:

For a quick setup, use Klei’s configure wizard initially

Choose some settings that make sense to you, you can always change these at a later date in your config files if you need to.

Once filled in you can download the Zip archive, extract the content, and place the folder `MyDediServer` inside ~/.klei/DoNotStarveTogether/

Startup script

To start your game server you’ll need a startup script – create a new file in your home root:

vi ~/

Drop the following into this file:



function fail()
	echo Error: "$@" >&2
	exit 1

function check_for_file()
	if [ ! -e "$1" ]; then
		fail "Missing file: $1"

cd "$steamcmd_dir" || fail "Missing $steamcmd_dir directory!"

check_for_file ""
check_for_file "$dontstarve_dir/$cluster_name/cluster.ini"
check_for_file "$dontstarve_dir/$cluster_name/cluster_token.txt"
check_for_file "$dontstarve_dir/$cluster_name/Master/server.ini"
check_for_file "$dontstarve_dir/$cluster_name/Caves/server.ini"

./ +force_install_dir "$install_dir" +login anonymous +app_update 343050 +quit

check_for_file "$install_dir/bin"

cd "$install_dir/bin" || fail

run_shared+=(-cluster "$cluster_name")
run_shared+=(-monitor_parent_process $$)

"${run_shared[@]}" -shard Caves  | sed 's/^/Caves:  /' &
"${run_shared[@]}" -shard Master | sed 's/^/Master: /'

Save the file and make it executable:

chmod u+x ~/

Starting your server

If you are staying in your terminal screen while you play, you can simply run the bash script directly:


This will update your server and start it up ready to connect. You’ll see lots of text on the screen as it starts, this is the game console. Be aware that if you close your terminal window or disconnect from SSH you will also close your running game server.

If you want to start your server without entering the console, so you can close your terminal or SSH connection, then use screen like below – where DST is just a easily remembered name for the screen session:

screen -S DST -d -m ~/

To view the game console later, use the following command:

screen -d -r DST

Shutting down your server

From the game console you can shutdown your server using ctrl + c if needed.


Node Package Manager – Installing packages

The most common task at the beginning of a project is to install the necessary packages – to do this you’ll use the install command a few times:

npm install react --save

To save a few keystrokes, this can be shorted to:

npm i react -S

npm i react-dom -S

--save or -S install the package to the current project – the packages will show up in the package.json under dependencies with a version number, usually the latest:

  "dependencies": {
    "react": "^16.12.0"

Development dependencies

Not all dependencies need to be in the finished project, stuff like dev tools. To install a package only used during the development phase you can swap to --save-dev or -D:

npm i babel-core -D

This will install development dependencies under devDependencies in the package.json:

  "devDependencies": {
    "babel-core": "^6.26.3"

Multiple packages in one install

If you are installing multiple packages at the same time, you can combine your installs into one line:

npm i babel-core babel-loader babel-preset-react -D

It doesn’t really matter if something has already been installed:

  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^8.0.6",
    "babel-preset-react": "^6.24.1"

If you wanna get really hardcore with your installs, you can use the following syntax to combine common package names:

npm i babel-{core,loader} babel-preset-react -D

This hurts my head though.

Specific versions

If your project has very specific requirements for what packages are used, you can also load specific versions via NPM:

npm install lodash@4.1.8

Or the latest version in a major version:

npm install lodash@^4.0.0

What happens in the background?

Loading just 5 packages seems easy when you look at it like this, but if you check your projects node_modules folder you’ll see alot happened in the background:

Installing packages in NPM installs all the dependencies for every package.

Every package you install also brings with it all of its dependencies – this can add up quickly on a big project. Our 5 packages has installed 83 packages into our node_modules folder.

Not something you’d want to manage manually…

Apache Ubuntu Server

Enable Apache caching

To enable caching on Apache web server – simply type the following in on the CLI:

a2enmod expires

With this you can now add caching rules to your Virtual Host:

    <FilesMatch "\.(jpg|png|gif|mp4)$">
        ExpiresActive           On
        ExpiresDefault          "access plus 1 year"

    <FilesMatch "\.(css|js)$">
        ExpiresActive           On
        ExpiresDefault          "access plus 1 month"

Your application will need to manage expiring the cached files when things change.

PHP Ubuntu Server

Installing PHP on Ubuntu Server 18.04 for use in LAMP stack

Before doing any work on your Ubuntu Server, it’s a good idea to update your software repositories using:

apt update

Once that has completed, you can install PHP and some of the packages that integrate it into your stack:

apt install php libapache2-mod-php php-mysql

You may also want to just tidy up what files Apache looks for when someone requests a directory:

vi /etc/apache2/mods-enabled/dir.conf

<IfModule mod_dir.c>
    DirectoryIndex index.php index.html

As usual when making changes to apache, you’ll need to restart your service for changes to take affect:

systemctl restart apache2

Ubuntu Server

Quick set up for UFW or Ubuntu Firewall on Ubuntu Server 18.04

A quick and easy firewall is included with Ubuntu Server – it is easy to set up.

Before doing any work on your Ubuntu Server, it is good practice to update your software repositories using:

apt update

Before you start making changes to the firewall, it is a good idea to check its status:

ufw status

You can also list any running applications that have registered a profile with the firewall:

ufw app list

If you access your server via SSH then you need to allow that service before you enable the firewall:

ufw allow OpenSSH

If you are enbling a profile that has spaces in the name, simply wrap your service name in quotes:

ufw allow 'Apache Full'

Once you’re sure you’re happy with the firewall setup, enable your firewall:

ufw enable

You can now see what profiles are active by running:

ufw status

Apache Let's Encrypt Ubuntu Server

Installing Apache with Let’s Encrypt on Ubuntu Server 18.04

Before doing any work on your Ubuntu Server, it is good practice to update your software repositories using:

apt update

It’s also worth creating a document root for your new web sites – I generally create a dedicated folder in the root, with web sites and logs folders within:

mkdir /sites
mkdir /sites/logs
mkdir /sites/

To make life easier, make your web site folder reflect your domain name.

Installing Apache

To install Apache we simply use the apt command:

apt install apache2

Once installed you’ll need to do some configuration.

First of all let’s go to our apache hosts folder & create a .conf file specific to your new web site.

To keep things simple use the same naming convention you have used for the document root – ensure your config file is named with .conf at the end:

cd /etc/apache2/sites-available


Add the following to your file, you may find it easier to edit this beforehand:

<VirtualHost *:80>


    DocumentRoot    /sites/

    ErrorLog        /sites/logs/
    CustomLog       /sites/logs/ combined

    <Directory /sites/>
        Require all granted
        AllowOverride All


The only changes you really need to make at this stage is references to to reflect your web sites name.

Installing Let’s Encrypt

Because the version of Certbot in the Ubuntu repositories can be a little out of date, install directly from the PPA:

add-apt-repository ppa:certbot/certbot

apt install python-certbot-apache

Once installed you can run certbot to get a new certificate – on your first run you will need to enter your email address and opt in/out of some options.


Once you’ve run certbot and got your certificates you can simply check your web site and carry on with your day.

I prefer to tidy up my host files.

Firstly your HTTP config:


<VirtualHost *:80>


    DocumentRoot    /sites/

    RewriteEngine on
    RewriteRule ^{REQUEST_URI} [END,NE,R=permanent]


Secondly your HTTPS config:


<IfModule mod_ssl.c>
    <VirtualHost *:443>


        DocumentRoot            /sites/

        ErrorLog                /sites/logs/
        CustomLog               /sites/logs/ combined

        <Directory /sites/>
            Require all granted
            AllowOverride All

        SSLCertificateFile      /etc/letsencrypt/live/
        SSLCertificateKeyFile   /etc/letsencrypt/live/
        Include                 /etc/letsencrypt/options-ssl-apache.conf


Lastly, just to be sure all is still working, restart Apache:

systemctl reload apache2

Cert renewal

It’s a good idea to test your configuration using the following:

certbot renew --dry-run

When certbot is installed it adds a service to the cron.d so any certificates approaching its end-of-life will get renewed. Let’s Encrypt certificates are valid for 90 days, but the client will automatically renew after 60.

Ubuntu Server

Set up unattended-upgrades on Ubuntu Server 20.04

Setting up your Ubuntu Server to auto upgrade itself is pretty easy and will save you some piece of mind once set up.

As always when you are making changes to your server, make sure to update your software repositories using:

apt update

Once this has completed you can either upgrade any out of date packages or continue with setting up auto-update.

To get started, install the package:

apt install unattended-upgrades

Once complete you will need to configure your system – we’re using VI here but feel free to use your text editor of choice:

vi /etc/apt/apt.conf.d/50unattended-upgrades

By standard unattended-upgrades only installs security updates – I generally leave this so a daily update does affect my system setup.

Find these lines in the file below – in my version they were commented out, uncomment them and set your own preferences:

Unattended-Upgrade::Mail "my@email.address";
Unattended-Upgrade::MailReport "only-on-error";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";

To activate the unattended-upgrades you’ll need to edit a separate file – this one was empty by default for me:

vi /etc/apt/apt.conf.d/20auto-upgrades

Add your own preferences, or simply use the ones I used below – the values equate to days:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

You can test your unattended-upgrades by running the following:

unattended-upgrades --dry-run --debug