<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Grateful ☕]]></title><description><![CDATA[Grateful ☕]]></description><link>https://grateful.cafe/</link><image><url>https://grateful.cafe/favicon.png</url><title>Grateful ☕</title><link>https://grateful.cafe/</link></image><generator>Ghost 3.40</generator><lastBuildDate>Thu, 16 Apr 2026 13:51:31 GMT</lastBuildDate><atom:link href="https://grateful.cafe/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[What is our objective in life?]]></title><description><![CDATA[<p>One of my mentors often reminds me that when you are going into a meeting, ask yourself –</p><p>		What is the objective of this meeting?</p><p>		What is it that we want to get out of this meeting?</p><p>If we go into that meeting with a clear objective, our actions will be</p>]]></description><link>https://grateful.cafe/what-is-our-objective-in-life/</link><guid isPermaLink="false">5dcad708ab68650001a927ff</guid><dc:creator><![CDATA[y]]></dc:creator><pubDate>Tue, 12 Nov 2019 17:34:40 GMT</pubDate><content:encoded><![CDATA[<p>One of my mentors often reminds me that when you are going into a meeting, ask yourself –</p><p>		What is the objective of this meeting?</p><p>		What is it that we want to get out of this meeting?</p><p>If we go into that meeting with a clear objective, our actions will be that much more directed – and the likelihood that we will come out of that meeting having met that objective will be greater.</p><p>This is true not just for meetings, but also in our lives.</p><p>Let us ask ourselves the question:</p><p>		What is it that we want out of this life?</p><p>Often when we are asked this question, our thoughts may go toward: a good education, a  rewarding career, a loving family, a comfortable home, financial security, and so forth.</p><p>But is that our life's objective?</p><p>Let's ask the question in a slightly different way – </p><p>		What do we want to walk away with at the end of this life?</p><p>Those things we often identify as our objectives, those things toward which we direct our efforts – are those things going to go with us? Or are they just things that we need as we go through this life?</p><p>Let’s consider the question with an analogy of taking a flight.</p><p>Not a flight up and down one coast of the US, or even a flight from one coast to the other. Let’s say we want to go from the US to Australia.</p><p>This is probably an 18 hour flight.</p><p>Now, as much as we may enjoy traveling, I don’t think any of us particularly relishes the idea of sitting in an airplane for <em>18 hours</em>! </p><p>But we do it! We get on that plane and we sit in it for those 18 hours!</p><p>Why?</p><p>Because we want to go to Australia.</p><p>That is our objective when we get on that airplane.</p><p>Now, when we get on that flight, there are several things we are probably going to do over those 18 hours.</p><p>We’ll probably eat a number of meals. We may watch a movie, perhaps some shows or documentaries. We’ll likely have to use the bathroom. It’s an 18 hour flight, so we’ll try to get some sleep.</p><p>What was the purpose of getting on that airplane?</p><p>Was it to eat airplane food?</p><p>Was it to watch movies on a little screen at our seat?</p><p>Was it to use the cramped airplane bathrooms?</p><p>Was it to sleep in a tiny seat?</p><p>Even if we’re flying business class or first class,  the meals we prepare and enjoy at home taste far better. We likely have a larger TV at home than the one at our airplane seat. Our bathrooms in our homes are far more spacious. Our beds at home are far more comfortable.</p><p>Why did we get on that airplane?</p><p>We got on that airplane so that we could get to Australia.</p><p>That was our objective when we got on that airplane – to get ourselves to Australia.</p><p>Yes, we did all of those other things while we were on that airplane. But those other things were not our purpose. They were necessary so that we could get through those 18 hours. But they were not our purpose.</p><p>Our purpose in getting on that airplane was so that we could get to Australia.</p><p>Imagine, now, that after being on that airplane for 18 hours, we come out to find that we’re not in Australia.</p><p>We are not at our intended destination.</p><p>We are right where we started – in the US.</p><p>In fact, we never even leave the gate.</p><p>We just sat right there, at that gate, for 18 hours.</p><p>How would we feel?</p><p>Would we think that was 18 hours well spent, that we really enjoyed the airplane food and got some good sleep? Let's do this again tomorrow!</p><p>Or would we think – good Lord! I just wasted all that time with nothing to show for it! And I still need to get to Australia!!</p><p>So let us ask ourselves – first, what is our purpose in life? What do I want to walk away with at the end of this life? What is actually going to go with me?</p><p>All of these things we often spend most of our lives focused on – our education, our career, our families, our homes, our possessions – are they going to go with us in the end? Or are they things we need for our journey of life, like the airplane food and the in-flight entertainment and the bathroom on the airplane?</p><p>So what will go with us?</p><p>Let us first understand that.</p><p>Having established that objective, let us ask ourselves, on a daily basis – </p><p>Is my airplane pulling away from the gate? Is it going down the runway? Is it taking off? And is it flying toward my destination?</p><p>Are my thoughts, my words, my actions taking me toward my objective? Or am I just sitting at the gate? Or worse – am I moving away from my objective?</p><p>We can apply this test to every situation throughout our day. Is the choice I am making taking me toward my objective or away from it?</p><p>At the end of each day, we can reflect on the day's events and consider – did I move toward my objective or away from it?</p><p>If I moved toward my objective, how can I make sure I continue to do that tomorrow? If I moved away from my objective, what should I do differently tomorrow?</p><p>So, what is our objective?</p><p>And are we moving toward our objective or away from it?</p><p>I hope your day takes you toward your objective!</p>]]></content:encoded></item><item><title><![CDATA[Running Ghost in Docker with Caddy]]></title><description><![CDATA[Want to host your own Ghost blog? This article describes how you can run Ghost in a Docker container, backed by a MySQL database and fronted with Caddy.]]></description><link>https://grateful.cafe/running-ghost-in-docker-with-caddy/</link><guid isPermaLink="false">5cc843b63e89f10001c57dfa</guid><dc:creator><![CDATA[y]]></dc:creator><pubDate>Wed, 01 May 2019 14:42:00 GMT</pubDate><content:encoded><![CDATA[<p>I thought it may be appropriate that the topic of my first article here be about how I set up <a href="https://ghost.org">Ghost</a>. As I'm sure you'll find via a web search, a number of people have written about how they deployed Ghost.</p><p>As they say, there is more than one way to make a cup of chai. They don't really say that, but I really like a good cup of chai! :)</p><h2 id="why-ghost">Why Ghost</h2><p>There are a number of publishing platforms out there. <a href="https://wordpress.org/">WordPress</a>, <a href="http://medium.com">Medium</a>, <a href="http://medium.com">Joomla</a>, <a href="https://blogger.com">Blogger</a>, and the list goes on.</p><p>Because I operate other servers, I preferred a solution I could host myself. I also wanted it to be secure, simple to run, and also simple to use. And <a href="https://ghost.org">Ghost</a> met all of these requirements. I specially liked that it allows you to write markdown!</p><h2 id="building-blocks">Building Blocks</h2><p>At least at this time, I didn't see the need to dedicate a server to my blog. I also wanted to make it easy to move my blog if traffic ever warrants a dedicated server. By server, I don't mean a physical server. I've done my share of running my own physical servers in colocation facilities back in the day. I feel grateful for cloud providers like <a href="https://m.do.co/c/87714d828016">DigitalOcean</a> (this is a referral link – I appreciate the support if you find this article useful, but at the same time respect if you'd like a <a href="https://digitalocean.com">non-referral link</a>), <a href="https://aws.amazon.com/">AWS</a>, <a href="https://cloud.google.com">Google Cloud</a>, and <a href="https://azure.microsoft.com/">Azure</a>, that make it super easy to deploy resources across the globe as you need them. Tools like <a href="https://terraform.io">Terraform</a> from <a href="https://hashicorp.com">HashiCorp</a> make it easy to provision resources in a consistent manner and at scale across these cloud providers.</p><h3 id="docker">Docker</h3><p>I decided I preferred a containerized installation. <a href="https://docker.com">Docker</a> comes with its benefits and tradeoffs. The benefits include ease and consistency of installation, and ease of relocation when the time comes. Tradeoffs include the complexity of running in a container when you need to troubleshoot something. I have other applications already running in containers, and decided the benefits outweighed the tradeoffs.</p><h3 id="caddy">Caddy</h3><p>I wanted to be able to front my blog with <a href="https://caddyserver.com/features">Caddy</a>. Caddy is an open source web server written in go that provides effortless, automated TLS encryption using <a href="https://letsencrypt.org/">LetsEncrypt</a> out of the box.</p><h3 id="mysql">MySQL</h3><p>Ghost requires MySQL for a production install, and since I already had a MySQL server running, I created a database for Ghost.</p><h2 id="installation">Installation</h2><h3 id="docker-1">Docker</h3><p>We won't go into the installation of Docker in this blog post. I had used <a href="https://docs.docker.com/install/linux/docker-ce/ubuntu/">this guide</a> as the basis for installing Docker.</p><h3 id="caddy-1">Caddy</h3><p>We won't go into the installation of Caddy in this blog post. I had used the <a href="https://caddyserver.com/docs">Caddy Documentation</a> as the basis for installing Caddy.</p><p>Let's add an entry to our <code>Caddyfile</code> for our Ghost blog.</p><pre><code>&lt;fqdn&gt; {
  proxy / 127.0.0.1:2368 {
    transparent
  }
  log / /var/log/caddy/&lt;fqdn&gt;.access.log "{combined}"
  errors /var/log/caddy/&lt;fqdn&gt;.error.log
  tls &lt;email address&gt;
}</code></pre><p>Below is my Caddy configuration for my Ghost blog that is running on the same server as Caddy.</p><pre><code>blog.example.io {
  proxy / 127.0.0.1:2368 {
    transparent
  }
  log / /var/log/caddy/blog.example.io.access.log "{combined}"
  errors /var/log/caddy/blog.example.io.error.log
  tls secops@example.io
}</code></pre><p>In the first line, <code>&lt;fqdn&gt;</code> indicates the fully qualified domain name of your blog server. You should have a DNS record that resolves to the IP address of the server on which you are running Caddy.</p><p>In the second line, <code>proxy /</code> indicates that we are going to proxy all requests to <code>127.0.0.1:2368</code>, the address and port where Ghost will be listening.</p><p>In the third line, <code>transparent</code> tells Caddy to pass the host information from the original request.</p><p>In he fifth and sixth lines, <code>log</code> and <code>errors</code> tells Caddy where to write the access log and error log, respectively. Note that these are the logs for Caddy, which are separate from the log for Ghost.</p><p>In the seventh line, <code>tls &lt;email address&gt;</code> tells Caddy the email address to use for requesting the TLS certificate from LetsEncrypt.</p><h3 id="mysql-1">MySQL</h3><p>We also won't go into the installation of MySQL, but you want to make sure that the Ghost container / server is able to connect to your MySQL database server.</p><p>Let's create a database for our Ghost blog.</p><pre><code>create database blogdb;</code></pre><p>Let's add a user for ghost to our MySQL database server.</p><pre><code>create user ghost@'%' identified by '&lt;password&gt;';</code></pre><p>Let's grant that user all privileges on the database we just created.</p><pre><code>grant all on blogdb.* to 'ghost'@'%';</code></pre><p>Note that <code>%</code> allows the user Ghost to connect from any IP address. Please feel free to adjust this further if you prefer.</p><h3 id="ghost">Ghost</h3><p>Let's create a directory for our Ghost data.You may want mount a volume at this path. You may also want to create a Docker volume for this purpose.</p><pre><code>mkdir -p /data/ghost/content</code></pre><p>Let's create a script called <code>/data/ghost/run.sh</code> to run Ghost.</p><pre><code>#!/bin/bash

docker run \
  -d \
  --name ghost \
  --network=host \
  -v /data/ghost/content:/var/lib/ghost/content \
  -e url=https://blog.example.io/ \
  -e database__client=mysql \
  -e database__connection__host=127.0.0.1 \
  -e database__connection__user=ghost \
  -e database__connection__password='&lt;password&gt;' \
  -e database__connection__database=blogdb \
  -e NODE_ENV=production \
  --restart=always \
  ghost:2.21.0</code></pre><p>The <code>-d</code> flag indicates that we should detach from the container once it starts.</p><p>The <code>--name ghost</code> flag specifies the name of the container, making it easier to interact with afterward.</p><p>The <code>--network=host</code> flag specifies to use the host networking driver. This is not strictly a requirement, but how I prefer to run Ghost. An alternative approach for exposing the port on which the container listens is to use the <code>-p</code> flag. For example: <code>-p 127.0.0.1:2368:2368</code>.</p><p>The <code>-v /data/ghost/content:/var/lib/ghost/content</code> flag specifies to map the <code>/data/ghost/content</code> directory on the host to <code>/var/lib/ghost/content</code> in the container.</p><p>The <code>-e</code> flag specify environment variables for the container.</p><p>The <code>--restart=always</code> flag specifies to always restart the container.</p><p>Finally, <code>ghost:2.21.0</code> specifies the docker image to run.</p><p>Let's make this script executable.</p><pre><code>chmod 0755 /data/ghost/run.sh</code></pre><p>Let's run this script to start the container.</p><pre><code>/data/ghost/run.sh</code></pre><p>Let's check the logs for our container.</p><pre><code>docker logs -f ghost</code></pre><p>Let's try connecting to our blog to configure ghost.</p><pre><code>https://blog.example.io/ghost</code></pre><p>From here, follow the prompts to configure your blog.</p><p>Thank you so much for reading, and have a most wonderful day! :)</p>]]></content:encoded></item></channel></rss>