photography, coffee, technology and more

Auto deploy hugo site

As some of you know, I’m running this site through with the Hugo site generator. Hugo has many advantages, but one big disadvantage is that to update my site it takes a lot of steps:

  1. Write the markdown code
  2. Generate the site through hugo
  3. Commit the site to github
  4. Connect to Gandi simple hosting through sftp and replace all files because all files are seen as new
  5. Check permissions after upload

Although only 5 steps this usually takes around 20 minutes to complete.

Earlier this evening I stumbled upon a blogpost on Gandi cookbook about auto deploy sites through git on gandi simple hosting. I followed their tutorial and added an extra bash script so that now all it takes me is 1 command and a commit message.

To make sure that the info doesn’t get lost and for those having using hugo, unix and gandi simple hosting all combined, these are the steps necessary:

Bash script for automating hugo generation and git commit + push

First let’s make a bash script to automate the hugo build and the git commit and push.

We are using the ability of hugo to have a deploy directory specified, this is because I have my source code also in a git repository and I want my dev code separate from my live code.

create a file in your home dir on your local system. And paste the following code, change the file paths off course.

echo -e "\033[1mDeleting files\033[0m" && \
rm -rf && \
echo -e "\033[1mGenerating hugo site\033[0m" && \
echo -e "\033[1mGit commit + push\033[0m" && \
read -p "Commit description: " desc
git add . && \
git add -u && \
git commit -m "$desc" && \
git push &&
git add . && \
git add -u && \
git commit -m "$desc" && \
git push

Now make a dir ~/bin if it doesn’t already exists and copy the script to that directory.

After a reboot or after manually adding the ~/bin path to your ~/.profile you should be able to run the script from everywhere on your system as yourself, however not as root, sudo or another user.

Auto deploy github to simple hosting

  • Create a simple hosting instance, I had already one PHP/MYSQL version
  • Go to the admin panel and activate ssh access in your simple hosting
  • Connect to your ssh and navigate to the htdocs of the vhost you want to auto deploy

cd /srv/data/web/vhosts/[replace with your vhost]/htdocs

  • Remove all existing files, make sure you have a backup if the instance is not new

rm -rf *

  • Clone your github repository use the dot at the end of the line, to make sure the repository gets cloned without making a subdirectory

git clone[username]/[repositoryname].git .

  • Check that the files are there

ls -la

  • Make a php file with the following content, I named it pull.php

nano pull.php

  • paste the following code in there

<?php `git pull`; // This will execute the `git pull` command on your instanceheader ("Cache-Control: max-age=1"); // Lower the cache while we're here so the changes take effect faster echo "hello!"; // So you can confirm the file is in the right place by browsing to the URL ?>

  • Make the php file executable

chmod +x pull.php

  • Check if the file works by browsing to its URL, [domain]/pull.php
  • Go to the settings of your github repository and select webhooks and services
  • Create a new webhook, where you paste the url of the pull.php, leave all other settings at default
  • Do an update to check if it works

DISCLAIMER: For me it all works very well, but don’t change any of the files on the simple hosting without using git or you will have to restart the procedure.

Unix/OS X aliases I use frequently

This is a list of aliases I like to use on either Mac OS X and/or Linux.

add them in ~/.bash_profile to use over reboots.

  • set ls -all to la alias la='ls -all'
  • Built in Raspberry pi temperature check alias checktemp='/opt/vc/bin/vcgencmd measure_temp'
  • Check your external IP through alias ip='curl'
  • Check your external IP details through alias iplookup='echo $(curl -s$(curl -s'
  • Directly go to my dropbox folder on OS X alias dropbox='cd /Volumes/Macintosh\ HD/Dropbox/'

Boot Arch Linux from USB on Raspberry Pi 2

At the moment I’m setting up a backup system in Arch Linux and minimise the risk of sd-card corruption, I’m going to run the OS from a usb stick (you can also use an usb drive if you want). I’m using this guide as a basis. It’s meant for Raspbian, but I adapted the procedure below to Arch linux.

In the guide above we are going to follow the extended procedure. Because that way we are sure that every time we boot we have the correct stick.

To make sure our stick is recognised by Arch we run lsblk

you should see something similar like this:

   sda           8:0    1  7.6G  0 disk 
   `-sda1        8:1    1  7.6G  0 part 
   mmcblk0     179:0    0  3.7G  0 disk 
   |-mmcblk0p1 179:1    0  100M  0 part 
   `-mmcblk0p2 179:2    0  3.6G  0 part /

The drive we want in my case the sda drive. Make note we are going to need that drive name.

Let us first install gdisk

sudo pacman -S gdisk

once that finishes, we are going to use gdisk on the usb stick.

sudo gdisk /dev/sda

Enter d to delete partion(s).

Enter n to create a new primary partition (number 1) and use the full capacity by hitting return a few times until done note: if you want more partitions use +xxxM to create a different size and repeat n till there is no space left or you have your number of partitions

Now write the new information to the stick by entering “w”

You should get something like this output

  Command (? for help): d
  Using 1
  Command (? for help): n
  Partition number (1-128, default 1): 
  First sector (34-15826910, default = 40) or {+-}size{KMGTP}: 
  Last sector (40-15826910, default = 15826910) or {+-}size{KMGTP}: 
  Current type is 'Linux filesystem'
  Hex code or GUID (L to show codes, Enter = 8300): 
  Changed type of partition to 'Linux filesystem'
  Command (? for help): w
  Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
  Do you want to proceed? (Y/N): y
  OK; writing new GUID partition table (GPT) to /dev/sda.
  The operation has completed successfully.

Now repeat the gdisk command and use i

sudo gdisk /dev/sda

you’ll get an output like:

  Using 1
  Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
  Partition unique GUID: 0ED53DE0-0BD6-4F15-AC97-A4D0494CEF18
  First sector: 40 (at 20.0 KiB)
  Last sector: 15826910 (at 7.5 GiB)
  Partition size: 15826871 sectors (7.5 GiB)
  Attribute flags: 0000000000000000
  Partition name: 'Linux filesystem'

The Partition unique GUID is the one we need, in the next step:

sudo cp /boot/cmdline.txt /boot/cmdline.txt.old

let’s copy the original cmdline.txt file and edit it:

sudo nano /boot/cmdline.txt

replace the root=/mnt/… with root=PARTUUID=youruniqueidentifier

  root=PARTUUID=0ED53DE0-0BD6-4F15-AC97-A4D0494CEF18 rw rootwait console=ttyAMA0,115200 console=tty1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 kgdboc=ttyAMA0,115200 elevator=noop

We now continue with formatting, mounting, installing rsync (which we use later on again as backup system) and the mirroring

   sudo mke2fs -t ext4 -L rootfs /dev/sda1
   sudo mount /dev/sda1 /mnt
   sudo pacman -S rsync
   sudo rsync -axv / /mnt

Now we need to get a unique identifier for the fstab drive information:

sudo tune2fs -l /dev/sda1

You get a lot of info, but the most important part is the Filesystem UUID

  Filesystem volume name:   rootfs
  Last mounted on:          /mnt
  Filesystem UUID:          b8389d09-e7a6-4358-9501-9a309938d30d
  Filesystem magic number:  0xEF53
  Filesystem revision #:    1 (dynamic)

Next we can enter the information into the filesystem table, /etc/fstab (on the stick, not the SD card). Add the following line:

   /dev/disk/by-uuid/b8389d09-e7a6-4358-9501-9a309938d30d    /   ext4    defaults,noatime  0       1

That should be it, try to reboot now, if it boots, type lsblk if you see a / under MOUNTPOINT next to your usb drive, it means you are running from the usb.

   sda           8:0    1  7.6G  0 disk 
   `-sda1        8:1    1  7.6G  0 part /
   mmcblk0     179:0    0  3.7G  0 disk 
   |-mmcblk0p1 179:1    0  100M  0 part 
   `-mmcblk0p2 179:2    0  3.6G  0 part

Banggood: ATmega328P Arduino Nano V3

ATmega328P Arduino Compatible Nano V3

This worked at the moment of writing, I can’t guarantee it will work for future versions of the boards nor OS X

For those just wanting the tutorial, go here

I while ago I discovered the chinese website Banggood, which has almost everything you want at low prices. Which is very good for my new arduino hobby.

So next to some other components I ordered the ATmega328P Arduino Compatible Nano V3 5-pack which means I got 5 Arduino nano clones for 15 euro + free shipping, which is just a steal. I have to be honest I was a bit scared to order them, because of all the mixed reviews on the net. On the other hand the max I would loose is 15 euro.

I knew however before ordering that the USB chipset was probably going to require some extra attention.

So once I received the order yesterday, I immediately tried the solutions offered in the comments on Banggood, but I did not manage to get it working. So I turned to google for the rescue. There were several other solutions, but none worked as it should. However the one that got it all working for me was the tutorial of kiguino.

I’m saying nothing new here, but just because it took me some time on google, I’m reblogging it here, for future reference and maybe help somebody else.

Tutorial for install on Mac OS X Yosmite (latest test 10.10.3)

  1. Download the driver at the developers website (!! Only the driver from december 2013, works with 10.10)
  2. Unzip and install by right clicking and selecting open.
  3. Do NOT restart yet
  4. Open terminal and paste sudo nvram boot-args="kext-dev-mode=1"
  5. Reboot
  6. The driver should be installed, on my arduino’s it installed as /dev/cu.usbserialmodem1410 or /dev/cu.usbserialmodem1420 depending on the port it was connected to and the device I was using.

Terminal: Git commands cheat sheet

To start a repository from the command line:

git init
git add .
git commit -m "initial import"

When files are added to .gitignore and are not removed, use following commands and commit.

git rm -r --cached .
git add .
git commit -m "fixed untracked files"