I will be moving to northern Idaho in less than a month and will need somewhere else to host homelab during the time it takes to do so. I already have an Amazon account, so I'll most likely spin up their smallest ec2 instance and upload it to that. I'm still going to need a Public IP to point cloudflare at and a few other things I'm sure. I'll go over all of that here. You can download the source code from github to follow along.

AWS

Defaults will normally work for this

A default VPC

Subnet within the VPC

An ssh key pair generated to access the ec2 instance.

An Elastic IP address linked to the instance to point DNS at.

t2.micro ubuntu ec2 instance

A security group Enable 22 while we provision (disable after finished) Enable port 80 for http traffic



EC2 Creation

I started up a t2.micro ubuntu 16.04 instance

1 Core vCPU (up to 3.3 GHz)

1 GiB Memory RAM

8 GB Storage

FREE TIER ELIGIBLE

Download the pem file at the end of creation to access the instance.

chown it to restrict permission to the file and allow it to be added ssh-agent

chmod 600 homelab.pem ssh-add homelab.pem

Next create an Elastic IP and link it to the instance from the 'Actions' drop down. With this newly acquired public IP we can now get to business with provisioning our new machine and deploying ghost to the cloud.

First lets test that we can login.

Be sure and use the default user [email protected]<ip_address> for a newly created ubuntu instance

Ansible provisioning

Next I'll create an aws_inv.ini file for ansible to access this machine with a few key variables

hostname

username

ip address

network interface for swarm configs

swarm availability mode

aws_inv.ini

[manager] homelab [manager:vars] ansible_host=52.25.231.162 ansible_user=ubuntu swarm_iface=eth0 swarm_availability=active

If we test ansible now, we'll see this error output.

ansible -i aws_inv.ini all -m ping homelab | FAILED! => { "changed": false, "module_stderr": "Connection to 52.25.231.162 closed.\r

", "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r

", "msg": "MODULE FAILURE", "rc": 0 }

Easy enough to fix this by installing python on the system first.

ssh [email protected] sudo apt-get update && sudo apt-get install python

Now with python installed we should get a pong back.

ansible -i aws_inv.ini all -m ping homelab | SUCCESS => { "changed": false, "ping": "pong" }

Install the base

With that, we are ready to kick off a few scripts to get everything installed and running. First I need to update my site.yml file and take out the custom setup I have in there that I only needed for my laptop, like ignoring lid closure, etc...

Starter site.yml file to build on and add any dependencies needed.

site.yml

--- - hosts: all become: true become_method: sudo tasks: - name: apt-get update && install deps apt: update_cache: yes name: "{{ item }}" state: present with_items: - vim - wget - rsync - make tags: - setup - deps

Run this against the instance

ansible-playbook -i aws_inv.ini site.yml PLAY [all] ******************************************************************************************************************** TASK [Gathering Facts] ******************************************************************************************************** ok: [homelab] TASK [apt-get update && install deps] ***************************************************************************************** changed: [homelab] => (item=[u'vim', u'wget', u'rsync', u'make']) PLAY RECAP ******************************************************************************************************************** homelab : ok=2 changed=1 unreachable=0 failed=0

Install docker and enable swarm mode

Next I will install docker and start a one node swarm cluster for hosting the ghost blog using an ansible playbook

ansible-playbook -i aws_inv.ini swarm.yml

After that finishes running I can log into the instance and see that docker is in-fact running and in swarm mode.

sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS i1hjapxrz3tfkddva4nztnqhs * ip-172-31-0-177 Ready Active Leader

homelab backup

From my homelab I will tar up the docker volume in preparation to move it to AWS

tar -czvf content.tar.gz /data/ghost/content mv content.tar.gz /home/jahrik/

Pull it to my local workstation

scp 192.168.2.106:/home/jahrik/content.tar.gz . content.tar.gz 100% 19MB 7.3MB/s 00:02

SCP to AWS host

Move it up to the cloud

Log back in and Inflate it

sudo tar -xzvf content.tar.gz

Create the right directories to place it in.

sudo mkdir -p /data/ghost/content

And finally, move it into place

sudo cp -R data/ghost/content/* /data/ghost/content/

Start the docker service with a stack file

Clone the home_lab repository off github and start up the docker service.

git clone https://github.com/jahrik/home_lab.git cd home_lab # edit stack file and change: # - '2368:2368' # to # - '80:2368' vim ghost/ghost-stack.yml

Start it up

sudo docker stack deploy -c ghost/ghost-stack.yml ghost Creating network ghost_default Creating service ghost_blog

Tail the logs to it start up

Browse to the public IP 52.25.231.162 and I can see it running.

Redirect Cloudflare to the new public IP.

Test it all out.

homelab.business