<feed xmlns="http://www.w3.org/2005/Atom"><title>Dylan Smith</title><link href="https://www.dylansmith.com/atom.xml" rel="self" type="application/atom+xml"/><link href="https://www.dylansmith.com/" rel="alternate" type="text/html"/><updated>2025-11-29T00:00:00+00:00</updated><id>https://www.dylansmith.com/</id><author><name>Dylan Smith</name></author><generator>Hugo -- gohugo.io</generator><entry><title>Dropbox Based Static Site</title><link href="https://www.dylansmith.com/2017/09/dropbox-based-static-site/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2017/09/dropbox-based-static-site/</id><updated>2017-09-06T16:23:41+00:00</updated><summary>How I'm using Dropbox to Sync Content and Deploy Hugo</summary><content type="html">&lt;p&gt;This site is built using &lt;a href="http://gohugo.io"&gt;Hugo&lt;/a&gt;, a blazing-fast static site generator based on the Go programming language. I&amp;rsquo;ve put together a writing and publishing workflow that can be used across devices, including mobile, that I&amp;rsquo;m really happy with. It&amp;rsquo;s not for everyone, but if you favor Markdown as I do, and want to have all your content in a single managed place, it could be a good solution for you. This post outlines how I went about setting it all up.&lt;/p&gt;
&lt;h2 id="docker-all-of-it"&gt;Docker all of it&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href="https://github.com/jojomi/docker-hugo"&gt;docker-hugo&lt;/a&gt; to run all Hugo commands, both locally and on the server. This way I don&amp;rsquo;t have to manage Go or any dependencies. It just works.&lt;/p&gt;
&lt;h3 id="local-development"&gt;Local development&lt;/h3&gt;
&lt;p&gt;To start a new Hugo project using the Docker image, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm --name hugo-init -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:/src jojomi/hugo hugo new site src
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Be sure to do this in a Dropbox sub-directory so that your content syncs across devices and, most importantly, on the server (we&amp;rsquo;ll get to that part).&lt;/p&gt;
&lt;p&gt;Now you can start watching the site in development mode using:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -it --name hugo-watch -e &lt;span class="nv"&gt;HUGO_WATCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; -p &lt;span class="s2"&gt;&amp;#34;1313:1313&amp;#34;&lt;/span&gt; -v &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PWD&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/src&amp;#34;&lt;/span&gt;:/src -v &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PWD&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/output&amp;#34;&lt;/span&gt;:/output jojomi/hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will start the Hugo server on port 1313, which is why we map that port to the host.&lt;/p&gt;
&lt;p&gt;(If you are following along and just created a new Hugo site, at this point you will only see a blank page. You will have to create or download a Hugo theme to get started. This overview will not go into the details of customizing and configuring Hugo itself. I&amp;rsquo;ll save that for another essay.)&lt;/p&gt;
&lt;p&gt;At this point, the root of your project will have two directories:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ProjectDirectory/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ output/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ src/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Docker Hugo container should always be run from the base of the project since it will be linking volumes in the container to the &lt;code&gt;src&lt;/code&gt; and &lt;code&gt;output&lt;/code&gt; directories.&lt;/p&gt;
&lt;h3 id="on-the-server"&gt;On the server&lt;/h3&gt;
&lt;p&gt;Make sure Docker and docker-compose are available on the server. I won&amp;rsquo;t go into Docker installation in this post. DigitalOcean has a &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04"&gt;great post&lt;/a&gt; outlining the process.&lt;/p&gt;
&lt;p&gt;Also required for the next few steps is Python 2.7 and inotify-tools. The latter can be installed with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install inotify-tools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I run Dropbox with a customized Dropbox &lt;a href="https://hub.docker.com/r/dylansm/dropbox/"&gt;Docker image&lt;/a&gt;. To set up Dropbox on Ubuntu, run the following command, which will automatically pull the latest image:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d --restart&lt;span class="o"&gt;=&lt;/span&gt;always --name&lt;span class="o"&gt;=&lt;/span&gt;dropbox -v ~/dropbox:/home/user/Dropbox -v ~/.dropbox:/home/user/.dropbox dylansm/dropbox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will link the running container to two directories, &lt;code&gt;dropbox&lt;/code&gt;, which will hold your Dropbox-synced files, and &lt;code&gt;.dropbox&lt;/code&gt;, which will hold the Dropbox configuration files.&lt;/p&gt;
&lt;p&gt;In order to link to your Dropbox account you will need to view the Docker Dropbox container logs. An authorization URL should be visible by issuing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker logs dropbox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copy and paste the URL in a browser and log in to your Dropbox account to associate the container with your Dropbox account.&lt;/p&gt;
&lt;h3 id="exclusions"&gt;Exclusions&lt;/h3&gt;
&lt;p&gt;If you are an active Dropbox user, you may wish to use the selective sync feature to exclude all files and folders that are not related to your website.&lt;/p&gt;
&lt;p&gt;Do this by issuing the exclude command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it dropbox dropbox-cli exclude add &amp;lt;dir or file name&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can list as many directories and files as you like in a single command. After a few moments, excluded files should disappear from your Dropbox directory.&lt;/p&gt;
&lt;h3 id="build-your-site-by-saving-a-file"&gt;Build your site by saving a file&lt;/h3&gt;
&lt;p&gt;The following steps will set up a watcher that rebuilds the site when a text file has been modified.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In the root of the &lt;code&gt;src&lt;/code&gt; directory of your project, either on your local development box or on the server, create a file called &lt;code&gt;rebuild.txt&lt;/code&gt; (you can call it whatever you want as long as you reference it correctly in the following steps). This will be the file that, on save, will sync to the server and trigger a site build.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the server, create an empty file in the home directory called .websitename_last_build (replace websitename with the name your website). This file will store the last modified date of the dropbox-synced rebuild.txt file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now visit the &lt;a href="https://www.dropbox.com/developers/apps"&gt;Dropbox for Developers Apps page&lt;/a&gt; and create a new application. Grant it full Dropbox permissions and generate an access token by clicking Generate button under the OAuth 2 section. Copy the access code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a directory called bin in your server home directory. The first file we will add is a Python script to check the status of the rebuild.txt file and, if it changes, store the last modification date to the file created in step two &lt;code&gt;.websitename_last_build &lt;/code&gt;. Save the following as ~/bin/dropbox.py and be sure to paste your access code into the headers dict at the top:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://api.dropboxapi.com/2/files/list_revisions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Bearer YOUR-ACCESS-CODE-HERE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/Sites/servername.com/src/rebuild.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;last_modified&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;entries&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;server_modified&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/serveruser/.servername.com_last_build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;last_build&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/serveruser/.servername.com_last_build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;last_build&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;last_modified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_modified&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/serveruser/bin/hugo_build.sh sitename.com www&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_build&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Don&amp;rsquo;t forget to replace the access key in the headers dictionary near the top. Also, change the server user from &amp;lsquo;serveruser&amp;rsquo; to the correct user name.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Next, create the file &lt;code&gt;~/bin/hugo_build&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Building &lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;START_DATE_WITH_TIME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date +&lt;span class="s2"&gt;&amp;#34;%Y-%m-%d %H-%M-%S&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Start: &lt;/span&gt;&lt;span class="nv"&gt;$START_DATE_WITH_TIME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;production_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/serveruser/dropbox/Sites/&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;/src&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;production_build&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/var/www/www.&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;/public&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm --name hugo-production -e &lt;span class="nv"&gt;HUGO_BASEURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://www.&lt;span class="nv"&gt;$1&lt;/span&gt;/ -v &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$production_path&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;:/src -v &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$production_build&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;:/output jojomi/hugo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown -R serveruser:serveruser &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$production_build&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;END_DATE_WITH_TIME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date +&lt;span class="s2"&gt;&amp;#34;%Y-%m-%d %H-%M-%S&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;End: &lt;/span&gt;&lt;span class="nv"&gt;$END_DATE_WITH_TIME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Create a third file &lt;code&gt;~/bin/watch_build&lt;/code&gt; that has the following:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; watch &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/serveruser/dropbox/Sites/websitename.com/src/rebuild.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; inotifywait -qe MOVE_SELF &lt;span class="nv"&gt;$FILE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /usr/bin/python /home/serveruser/bin/dropbox.py &amp;gt;&amp;gt; /home/serveruser/logs/build.log 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; watch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;After creating these files make sure they are executable:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x ~/bin/dropbox.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x ~/bin/hugo_build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x ~/bin/watch_build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Now we will set up the server directory so that when Hugo builds the site it will be generated at /var/www/www.websitename/public&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /var/www/www.websitename
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R serveruser:serveruser /var/www
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Be sure to use the correct server user name.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a docker-compose.yml file with the following content:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-docker" data-lang="docker"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx-proxy:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; image: jwilder/nginx-proxy:alpine&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; volumes:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /var/run/docker.sock:/tmp/docker.sock:ro&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /etc/letsencrypt/live/websitename.com:/etc/nginx/certs:ro&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /etc/nginx/vhost.d&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /usr/share/nginx/html&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; ports:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - 443:443&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - 80:80&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; restart: always&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;letsencrypt:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; image: jrcs/letsencrypt-nginx-proxy-companion:latest&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; environment:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - &lt;span class="nv"&gt;DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;true&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; restart: always&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; volumes_from:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - nginx-proxy&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; volumes:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /etc/letsencrypt/live/websitename.com:/etc/nginx/certs:rw&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /var/run/docker.sock:/var/run/docker.sock:ro&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;web:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; image: nginx:alpine&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; environment:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - &lt;span class="nv"&gt;VIRTUAL_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;websitename.com, www.websitename.com&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - &lt;span class="nv"&gt;LETSENCRYPT_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;websitename.com, www.websitename.com&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - &lt;span class="nv"&gt;LETSENCRYPT_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your@email.com&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; restart: always&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; volumes:&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /var/www/www.websitename.com/public:/usr/share/nginx/html&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt; - /var/www/www.websitename.com/etc/nginx/conf.d/:/etc/nginx/conf.d&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will start up an nginx-proxy and another instance of nginx to host the static site. It will also set up a letsencrypt SSL certificate, which is super cool, too.&lt;/p&gt;
&lt;p&gt;Important note: if you do not have a domain resolving at the address your server is using do not include the letsencrypt block or the volume link to the letsencrypt certificates, or any of the environment variables that reference letsencrypt. If you do, the site will error-out until the service can verify that the domain is yours and correctly set up.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you build the server manually at least once before automating the process with the scripts above. This will deploy Hugo to the public directory under our website directory:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm --name hugo-production -e &lt;span class="nv"&gt;HUGO_BASEURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://www.websitename.com/ -v /home/serveruser/dropbox/Sites/mysite/src:/src -v /var/www/www.websitename.com/public:/output jojomi/hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Start up the web server by issuing the following in the same directory where you created the above docker-compose.yml file:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this point, you should be able to bring up your website but modifying &lt;code&gt;rebuild.txt&lt;/code&gt; will not yet trigger a build because our watcher isn&amp;rsquo;t running. We&amp;rsquo;ll use Ubuntu&amp;rsquo;s systemd to load &lt;code&gt;~/bin/watch_build&lt;/code&gt; at system start time and continue watching for changes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create the following under &lt;code&gt;/etc/systemd/system/watch-build.service&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;docker.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/serveruser/bin/watch_build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;default.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Modify permissions and enable service:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;744&lt;/span&gt; /home/serveruser/bin/watch_build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;664&lt;/span&gt; /etc/systemd/system/watch-build.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; watch-build.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Start the service with:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start watch-build.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If all went according to plan, you can view the status of the loaded service with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl list-units &lt;span class="p"&gt;|&lt;/span&gt; grep watch-build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &amp;ldquo;loaded active running&amp;rdquo; next to the service name.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That was a lot. With any luck, you can now build your Hugo site by editing src/rebuild.txt in any text editor and you should see the changes live on production within moments. Since your content is stored in Dropbox things will stay in sync, as well, across all your devices.&lt;/p&gt;</content></entry><entry><title>The Rhizome Telecaster</title><link href="https://www.dylansmith.com/2015/10/the-rhizome-telecaster/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2015/10/the-rhizome-telecaster/</id><updated>2015-10-17T00:00:00+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="Rhizome Telecaster build"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/rzi_tele.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/rzi_tele.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/rzi_tele.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/rzi_tele.jpg&amp;resize=true" title="Rhizome Telecaster build"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This guitar project was simple but the result is one of the best guitars I&amp;rsquo;ve ever assembled. I ordered a Warmoth pre-made swamp ash body that features contour cutouts that make it really comfortable. The neck is a custom-ordered slim profile AAA flame maple with ebony top (without dots). The fretboard radius is an unorthodox 12″ that I really like (the classic Telecaster fretboard radius is usually a much rounder 7.5″ to 9.5″).&lt;/p&gt;
&lt;p&gt;The bridge is a &lt;a href="http://www.callahamguitars.com/"&gt;Callaham Vintage T&lt;/a&gt; that gives it a fantastic vintage twang or percussiveness while still being relatively easy to dial in a near-perfect intonation setup.&lt;/p&gt;
&lt;p&gt;The pickups are &lt;a href="http://www.lollarguitars.com/"&gt;Jason Loller &amp;lsquo;52 T Series&lt;/a&gt;, which are hand-wound to 1952 Telecaster specs.&lt;/p&gt;
&lt;p&gt;This project strikes a great balance, for me, between modern refinement and classic tone (and aesthetics).&lt;/p&gt;
&lt;figure class="post-image zoombox" data-caption="Rhizome Telecaster build"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/rzi_tele_vert.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/rzi_tele_vert.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/rzi_tele_vert.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/rzi_tele_vert.jpg&amp;resize=true" title="Rhizome Telecaster build"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</content></entry><entry><title>The Sparklemaster Guitar Project</title><link href="https://www.dylansmith.com/2015/04/the-sparklemaster-guitar-project/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2015/04/the-sparklemaster-guitar-project/</id><updated>2015-04-13T00:00:00+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="Custom guitar build"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/sparklemaster.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/sparklemaster.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/sparklemaster.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/sparklemaster.jpg&amp;resize=true" title="Custom guitar build"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This was the first time I&amp;rsquo;ve tried to paint a guitar that I assembled. Sparkle paint is very difficult to handle. I went through a couple of spray guns and more than one can of Big Daddy Roth Rattlebomb paint, which is usually used for hot-rod and motorcycle builds.&lt;/p&gt;
&lt;p&gt;The bridge is a &lt;a href="https://www.masterybridge.com"&gt;Mastery&lt;/a&gt; Offset Bridge with Vibrato. The pickups are &lt;a href="https://www.fralinpickups.com"&gt;Lindy Fralin&lt;/a&gt; Hum-cancelling P-90&amp;rsquo;s. Maple body and neck with rosewood fretboard.&lt;/p&gt;
&lt;p&gt;This guitar was sold to a collector in Hong Kong.&lt;/p&gt;</content></entry><entry><title>Powderbird Helicopter Ski Tours</title><link href="https://www.dylansmith.com/2015/03/powderbird-helicopter-ski-tours/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2015/03/powderbird-helicopter-ski-tours/</id><updated>2015-03-20T00:00:00+00:00</updated><summary>Ruby on Rails website development</summary><content type="html">&lt;figure class="post-image zoombox" data-caption="Powderbird Website"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/powderbird.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/powderbird.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/powderbird.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/powderbird.jpg&amp;resize=true" title="Powderbird Website"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As Technical Director, Lead Programmer and Project Manager on the Powderbird website redesign with &lt;a href="https://whoisowenjones.com"&gt;Owen Jones &amp;amp; Partners&lt;/a&gt;, I had an opportunity to harness a powerful group of technologies to tell this adventure ski tour company&amp;rsquo;s story with immersive photography, design and copy. I built a flexible CMS to allow for easy management of front-end design, assets and copy, as well as a back-end that handles ski tour reservations and user management.&lt;/p&gt;</content></entry><entry><title>Guitar Amp Project</title><link href="https://www.dylansmith.com/2015/03/guitar-amp-project/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2015/03/guitar-amp-project/</id><updated>2015-03-01T00:00:00+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="Tweed Champ clone with tremolo."&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/amp_triptych.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/amp_triptych.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/amp_triptych.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/amp_triptych.jpg&amp;resize=true" title="Tweed Champ clone with tremolo."&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This project used the &amp;ldquo;Champ Ultra&amp;rdquo; chassis from &lt;a href="https://www.ceriatone.com"&gt;Ceriatone&lt;/a&gt; without tubes or transformers, which I sourced and soldered separately.&lt;/p&gt;
&lt;p&gt;The head and speaker cabinets are made with hand-cut dovetail-joined maple. The speaker cabinet holds a Celestion Gold 10&amp;quot; speaker.&lt;/p&gt;</content></entry><entry><title>Case Study: International Institute for Analytics</title><link href="https://www.dylansmith.com/2015/02/case-study-international-institute-for-analytics/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2015/02/case-study-international-institute-for-analytics/</id><updated>2015-02-19T00:00:00+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="International Institute for Analytics"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/iia.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/iia.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/iia.jpg"&gt;
&lt;img
alt="Post Image"
class="border"
tabindex="0"
src="/.netlify/images?url=/images/640/iia.jpg&amp;resize=true" title="International Institute for Analytics"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;When Jack Phillips and Andrew Lightman met with me at &lt;a href="https://whoisowenjones.com"&gt;Owen Jones&lt;/a&gt; to kick off development of the new IIA website, I knew immediately that their level of engagement was going to have a hugely positive influence on the project. When stakeholders participate in discovery and stay engaged throughout a project, from requirements-gathering through development and testing, it has a much greater chance of being successful than those lacking that kind of engagement.&lt;/p&gt;
&lt;h3 id="overcoming-technical-biases"&gt;Overcoming Technical Biases&lt;/h3&gt;
&lt;p&gt;At first, the rewards I was seeking weren&amp;rsquo;t centered in the client&amp;rsquo;s needs. From a technical perspective, I was hoping there was going to be a richer feature-set than that typically met by an off-the-shelf CMS solution. My interest was in building a custom website that would address complex features and provide rich technical challenges and engineering experience.&lt;/p&gt;
&lt;p&gt;This is why initial requirements-gathering sessions are so important. By listening to the customer &amp;ndash; by listening to each other &amp;ndash; we agreed that the best solution was to go with a PHP-based CMS with a rich feature set. I was able to overcome biases I was barely capable of acknowledging and feel solid about the best direction for the project. Only after weighing the benefits and drawbacks of each approach with the customer could I really see this. Best of all, the client felt informed and positive about the technical direction, as well.&lt;/p&gt;
&lt;h3 id="meeting-creative-challenges"&gt;Meeting Creative Challenges&lt;/h3&gt;
&lt;p&gt;Would an agency with a deeply creative spirit like Owen Jones be a good fit for a data-driven business analytics company? What imagery and visual elements could we employ to elevate the experience? How could we organize the content in such a way that the visual hierarchy of each page represented the hierarchy of business objectives?&lt;/p&gt;
&lt;p&gt;These, of course, are the kind of questions people often ask themselves at creative agencies, especially when confronted with the challenge of creating brand experiences for clients in market segments that don&amp;rsquo;t easily translate to visual solutions.&lt;/p&gt;
&lt;p&gt;The branding and creative direction developed by &lt;a href="http://www.brandyshearer.com"&gt;Brandy Shearer&lt;/a&gt; set a great tone for the site, with well-balanced typographic choices and emblematic image treatment. But beyond the visual solutions put in place, the underlying creative collaboration and discovery between our two teams amounted to a truly creative outcome and a great, highly usable final product.&lt;/p&gt;
&lt;h3 id="results"&gt;Results&lt;/h3&gt;
&lt;p&gt;The new site saw a definitive increase in traffic in the first year after deployment. The publishing and editorial workflows that contributors and editors relied on were greatly improved, as well. Out-of-date and buggy plug-ins no longer plagued site administrators, and security was also greatly improved.&lt;/p&gt;
&lt;p&gt;Equally important was the fact that both teams found success working with, and learning from, each other throughout the highly collaborative project.&lt;/p&gt;</content></entry><entry><title>Hand-built Modular Synthesizer Case</title><link href="https://www.dylansmith.com/2015/01/hand-built-modular-synthesizer-case/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2015/01/hand-built-modular-synthesizer-case/</id><updated>2015-01-13T00:00:00+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="Hand-made Eurorack case."&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/modular_2.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/modular_2.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/modular_2.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/modular_2.jpg&amp;resize=true" title="Hand-made Eurorack case."&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This hand-built case is dovetailed walnut. The juxtaposition between the organic and space-race aesthetic is what made this project appealing. It houses a combination of &lt;a href="https://www.verboselectronics.com"&gt;Verbos Electronics&lt;/a&gt; and &lt;a href="https://www.makenoisemusic.com"&gt;Make Noise&lt;/a&gt; modules. The sounds it makes seem to be limitless.&lt;/p&gt;
&lt;figure class="post-image zoombox" data-caption="Hand-made Eurorack case."&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/modular.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/modular.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/modular.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/modular.jpg&amp;resize=true" title="Hand-made Eurorack case."&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</content></entry><entry><title>Case Study: Adobe Community Building Tool</title><link href="https://www.dylansmith.com/2014/10/case-study-adobe-community-building-tool/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2014/10/case-study-adobe-community-building-tool/</id><updated>2014-10-02T00:00:00+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="Features included leaderboard, profile creation and news feed."&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/gatherfeed_1.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/gatherfeed_1.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/gatherfeed_1.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/gatherfeed_1.jpg&amp;resize=true" title="Features included leaderboard, profile creation and news feed."&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This internal project with &lt;a href="https://www.whoisowenjones.com"&gt;Owen Jones &amp;amp; Partners&lt;/a&gt; was one of the more fun projects I had the opportunity to work on with Adobe. I was able to apply a test-driven development approach to building an experience that was easy, fast and intuitive to use. The goal was to build a community platform where students could post videos, photos and written content, and be rated by program managers, who could communicate back through a custom messaging system. mini-Facebook with a scoring algorithm.&lt;/p&gt;
&lt;figure class="post-image zoombox" data-caption="Other features included notifications, comments and likes"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/gatherfeed_2.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/gatherfeed_2.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/gatherfeed_2.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/gatherfeed_2.jpg&amp;resize=true" title="Other features included notifications, comments and likes"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</content></entry><entry><title>Unstuck iPad App</title><link href="https://www.dylansmith.com/2012/09/unstuck-ipad-app/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2012/09/unstuck-ipad-app/</id><updated>2012-09-10T00:00:00+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="Unstuck iPad App"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/unstuck_ipad_app.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/unstuck_ipad_app.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/unstuck_ipad_app.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/unstuck_ipad_app.jpg&amp;resize=true" title="Unstuck iPad App"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This native iOS app was written in Objective-C. A significant portion of the work focused on fine tuning the movement of various text and graphical elements across multiple pages. The project was particularly well suited for the screen-by-screen approach to becoming &amp;ldquo;unstuck.&amp;rdquo;&lt;/p&gt;</content></entry><entry><title>Struck Redesign</title><link href="https://www.dylansmith.com/2012/04/struck-redesign/" rel="alternate" type="text/html"/><id>https://www.dylansmith.com/2012/04/struck-redesign/</id><updated>2012-04-10T22:08:22+00:00</updated><content type="html">&lt;figure class="post-image zoombox" data-caption="Struck home page in 2010"&gt;
&lt;picture&gt;
&lt;source media="(min-width: 2000px)" srcset="/.netlify/images?url=/images/2560/struck.jpg"&gt;
&lt;source media="(min-width: 451px)" srcset="/.netlify/images?url=/images/1280/struck.jpg"&gt;
&lt;source media="(max-width &lt;= 450)" srcset="/.netlify/images?url=/images/640/struck.jpg"&gt;
&lt;img
alt="Post Image"
tabindex="0"
src="/.netlify/images?url=/images/640/struck.jpg&amp;resize=true" title="Struck home page in 2010"&gt;
&lt;/picture&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Looking back at the Struck website redesign I worked on in 2012, it&amp;rsquo;s interesting to compare favorably the refinements of today&amp;rsquo;s site over the original. Much of the design has been cleaned up and, I think, improved. However, the core layout and lazy-loading functionality remains very much intact today, which feels like a testament to the underlying technology stack and implementation I chose as Technical Director. In addition to managing the project, I was responsible for the front-end development work on the site, and helping guide the Rails development.&lt;/p&gt;</content></entry></feed>