<?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[Commando.io Blog]]></title><description><![CDATA[Manage servers easily online.]]></description><link>http://blog.commando.io/</link><generator>Ghost 0.6</generator><lastBuildDate>Sun, 12 Apr 2026 08:51:01 GMT</lastBuildDate><atom:link href="http://blog.commando.io/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Zoho Site24x7 Integration With Commando.io]]></title><description><![CDATA[How to run commands automatically on servers triggered from a Zoho Site24x7 monitor.]]></description><link>http://blog.commando.io/zoho-site24x7-integration/</link><guid isPermaLink="false">393dfc43-a0ba-46d0-a9ae-8add17e86071</guid><category><![CDATA[commando]]></category><category><![CDATA[devops]]></category><category><![CDATA[site24x7]]></category><category><![CDATA[commando.io]]></category><category><![CDATA[monitoring]]></category><category><![CDATA[zoho]]></category><category><![CDATA[servers]]></category><category><![CDATA[bash]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Mon, 06 Nov 2017 00:46:00 GMT</pubDate><content:encoded><![CDATA[<p>Today we are going to demo how to run commands automatically on servers triggered from a <a href="https://www.site24x7.com/"><strong>Zoho Site24x7</strong></a> monitor. Site24x7 allows you to configure an array of monitors such as website, DNS, port, POP, SMTP, SSL, FTP, and SOAP. The marriage of Site24x7 and <a href="https://commando.io"><strong>Commando.io</strong></a> allows you to automatically respond to outage events and trigger executions on servers.</p>

<p>The recipe we are going to execute is a simple bash script that <a href="https://public.recipes/vTzTzZ">restarts php-fpm</a>. You can expand on this and write more complicated recipes. As a reminder, you may write recipes in bash, perl, python, ruby, go, node.js and can even inject <a href="http://blog.commando.io/introducing-recipe-arguments/">arguments at execution</a>.</p>

<p>Pricing for Site24x7 starts at $9 a month and $12 a month for <a href="https://commando.io/pricing.html"><strong>Commando.io</strong></a>. Below is a short video walkthrough, so sit back grab some popcorn and start automating your infrastructure today!</p>

<iframe src="https://player.vimeo.com/video/241350280?title=0&byline=0&portrait=0" width="500" height="303" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen></iframe>]]></content:encoded></item><item><title><![CDATA[HTTPS - Google Cloud Storage vs Amazon S3]]></title><description><![CDATA[A high level HTTPS security and performance comparison table between Google Cloud Storage and Amazon Simple Storage Service (S3).]]></description><link>http://blog.commando.io/https-google-cloud-storage-vs-amazon-s3/</link><guid isPermaLink="false">5e0266f9-7e5d-4bf3-843a-a45461402bd2</guid><category><![CDATA[ssl]]></category><category><![CDATA[poodle]]></category><category><![CDATA[amazon-web-services]]></category><category><![CDATA[aws]]></category><category><![CDATA[SPDY]]></category><category><![CDATA[OCSP]]></category><category><![CDATA[tls]]></category><category><![CDATA[heartbleed]]></category><category><![CDATA[OCSP-stapling]]></category><category><![CDATA[google-cloud-storage]]></category><category><![CDATA[s3]]></category><category><![CDATA[aws-s3]]></category><category><![CDATA[https]]></category><category><![CDATA[google-cloud]]></category><category><![CDATA[HSTS]]></category><category><![CDATA[forward-secrecy]]></category><category><![CDATA[gcp]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Mon, 28 Mar 2016 20:54:00 GMT</pubDate><content:encoded><![CDATA[<p><img src="http://blog.commando.io/content/images/2016/03/gcs-vs-s3-1.png" alt="Google Cloud Storage vs Amazon S3" title=""><br></p>

<p><em>Last Updated: 11/10/2017</em></p>

<p>Below is a high level HTTPS security and performance comparison table between <strong><a href="https://cloud.google.com/storage/">Google Cloud Storage</a></strong> and <strong><a href="https://aws.amazon.com/s3/">Amazon Simple Storage Service</a></strong> <em>(S3)</em>. While cost, performance, and reliability are certainly factors in making a cloud storage decision the scope of this post is specifically limited to HTTPS. <br><br></p>

<style type="text/css">  
.bold {font-weight: bold !important}
.red {color: red}
</style>  

<table class="tg">  
  <tr>
    <th class="tg-yw4l"></th>
    <th class="tg-yw4l bold">Google Cloud Storage</th>
    <th class="tg-yw4l bold">Amazon Simple Storage Service</th>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Qualys SSL Labs Link</td>
    <td class="tg-yw4l"><a href="https://goo.gl/StJma1">https://goo.gl/StJma1</a></td>
    <td class="tg-yw4l"><a href="https://goo.gl/ORZfWe">https://goo.gl/ORZfWe</a></td>
  </tr><tr>
    <td class="tg-yw4l bold">Qualys SSL Labs score</td>
    <td class="tg-yw4l">A</td>
    <td class="tg-yw4l">A</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">SSL certificate issuer</td>
    <td class="tg-yw4l">Google Internet Authority G2</td>
    <td class="tg-yw4l">DigiCert Baltimore CA-2 G2</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Key</td>
    <td class="tg-yw4l">RSA 2048 bits</td>
    <td class="tg-yw4l">RSA 2048 bits</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Signature algorithm</td>
    <td class="tg-yw4l">SHA256withRSA</td>
    <td class="tg-yw4l">SHA256withRSA</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Additional chain certificates</td>
    <td class="tg-yw4l">3 <i>(3599 bytes)</i><br><i>(Note: one of the chained certs uses a weak signature algorithm SHA1)</i></td>
    <td class="tg-yw4l">2 <i>(2690 bytes)</i></td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Protocol support</td>
    <td class="tg-yw4l">TLS 1.2, TLS 1.1, TLS 1.0</td>
    <td class="tg-yw4l">TLS 1.2, TLS 1.1, TLS 1.0</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Secure renegotiation</td>
    <td class="tg-yw4l">Supported</td>
    <td class="tg-yw4l">Supported</td>
  </tr>
  <tr>
    <td class="tg-yw4 bold">BEAST attack</td>
    <td class="tg-yw4l">Not mitigated server-side</td>
    <td class="tg-yw4l">Not mitigated server-side</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">POODLE (SSLv3)</td>
    <td class="tg-yw4l">No, SSL 3 not supported</td>
    <td class="tg-yw4l">No, SSLv3 not supported</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">POODLE (TLS)</td>
    <td class="tg-yw4l">No</td>
    <td class="tg-yw4l">No</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Downgrade attack prevention</td>
    <td class="tg-yw4l">Yes, TLS_FALLBACK_SCSV</td>
    <td class="tg-yw4l">Yes, TLS_FALLBACK_SCSV</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">RC4 cipher support</td>
    <td class="tg-yw4l">No</td>
    <td class="tg-yw4l">No</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Heartbleed</td>
    <td class="tg-yw4l">No</td>
    <td class="tg-yw4l">No</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Forward secrecy</td>
    <td class="tg-yw4l">With modern browsers</td>
    <td class="tg-yw4l">With modern browsers</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Next procol support</td>
    <td class="tg-yw4l">h2 spdy/3.1 http/1.1</td>
    <td class="tg-yw4l">None</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Session resumption <i>(caching)</i></td>
    <td class="tg-yw4l">Yes</td>
    <td class="tg-yw4l">No <i>(IDs assigned but not accepted)</i></td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Session resumption <i>(tickets)</i></td>
    <td class="tg-yw4l">Yes</td>
    <td class="tg-yw4l">No</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">OCSP stapling</td>
    <td class="tg-yw4l">No</td>
    <td class="tg-yw4l">No</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Strict transport security <i>(HSTS)</i> by default</td>
    <td class="tg-yw4l">No</td>
    <td class="tg-yw4l">No</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">HSTS preloading</td>
    <td class="tg-yw4l">No</td>
    <td class="tg-yw4l">No</td>
  </tr>
  <tr>
    <td class="tg-yw4l bold">Public key pinning <i>(HPKP)</i></td>
    <td class="tg-yw4l">No</td>
    <td class="tg-yw4l">No</td>
  </tr>
</table>]]></content:encoded></item><item><title><![CDATA[Redis is easy. Redis is trivial. Redis is HARD!]]></title><description><![CDATA[We all love Redis. It handles all of our key/value and queuing needs. Single server Redis is easy. Primary/slave replication is trivial. SD and HA is HARD!]]></description><link>http://blog.commando.io/redis-is-easy-trivial-hard/</link><guid isPermaLink="false">c55af55f-1b68-4d65-8716-ceebd94d4397</guid><category><![CDATA[redis]]></category><category><![CDATA[redis-replication]]></category><category><![CDATA[redis-sentinel]]></category><category><![CDATA[redis-ha]]></category><category><![CDATA[redis.conf]]></category><category><![CDATA[redis-primary]]></category><category><![CDATA[redis-slave]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Fri, 19 Jun 2015 03:44:26 GMT</pubDate><content:encoded><![CDATA[<p>We all love <a href="https://redis.io">Redis</a>. It handles all of our key/value and queuing needs.</p>

<h3 id="singleserverredisiseasy">Single server Redis is easy</h3>

<pre><code>// redis1.ourdomain.io //
sudo apt-get install redis-server
</code></pre>

<h3 id="primaryslavereplicationistrivial">Primary/slave replication is trivial</h3>

<pre><code>// redis2.ourdomain.io //
sudo apt-get install redis-server

# edit /etc/redis/redis.conf
slaveof redis1.ourdomain.io 6379

sudo service redis-server restart
</code></pre>

<h3 id="automaticservicediscoveryandfailoverishard">Automatic service discovery and failover is HARD</h3>

<p>The minimum number of servers for automatic service discovery and high availability using <a href="https://redis.io/topics/sentinel">Sentinel</a> is 3. So we need another server.</p>

<pre><code>// redis3.ourdomain.io //
sudo apt-get install redis-server

# edit /etc/redis/redis.conf
slaveof redis1.ourdomain.io 6379
</code></pre>

<p>The default redis-server package on Ubuntu does not include an init script for redis-sentinel, so on <strong>each server</strong> we have to set that up.</p>

<pre><code>cd /etc/init.d
sudo touch redis-sentinel
sudo chmod +x redis-sentinel
</code></pre>

<p>Put the following into <code>/etc/init.d/redis-sentinel</code> on <strong>each server:</strong></p>

<pre><code>#!/bin/bash
### BEGIN INIT INFO
# Provides:          redis sentinel
# Required-Start:    $all
# Required-Stop:    $all
# Default-Start:    2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts redis sentinel
# Description:      Starts redis sentinel using start-stop-daemon
### END INIT INFO

NAME=redis-sentinel
BIN=/usr/bin/redis-server
SENTINEL_PID=/var/run/redis/sentinel.pid
CMD=$1

start() {
        echo "Starting $NAME ..."
        exec 2&gt;&amp;1 $BIN /etc/redis/sentinel.conf --sentinel | logger -t sentinel &amp;
        echo $! &gt; "${SENTINEL_PID}";
}

stop() {
        PID=`cat $SENTINEL_PID`
        echo "Stopping $NAME ($PID) ..."
        kill $PID
}

restart() {
        echo "Restarting $NAME ..."
        stop
        start
}

case "$CMD" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                restart
                ;;
        *)
                echo "Usage $0 {start|stop|restart}"
esac
</code></pre>

<p>Now we need to setup the redis-sentinel service to start at boot on <strong>each server.</strong></p>

<pre><code>sudo apt-get install sysv-rc-conf
sysv-rc-conf redis-sentinel on
</code></pre>

<p>Now in <code>/etc/redis/sentinel.conf</code> on <strong>each server</strong> add the following lines:</p>

<pre><code> daemonize yes
 pidfile "/var/run/redis/sentinel.pid"
 loglevel verbose
 logfile "/var/log/redis/sentinel.log"
 sentinel monitor mymaster redis1.mydomain.io 6379 2
 sentinel down-after-milliseconds mymaster 10000
 sentinel failover-timeout mymaster 60000
 sentinel parallel-syncs mymaster 1
</code></pre>

<p>Now in <code>/etc/redis/redis.conf</code> on <strong>each server</strong> add the following lines:</p>

<pre><code>  repl-ping-slave-period 5
  slave-serve-stale-data no
  repl-backlog-size 8mb
  min-slaves-to-write 1
  min-slaves-max-lag 10
</code></pre>

<p>Assuming that all worked, let's try and start all <code>redis-server</code> and <code>redis-sentinel</code> daemons on <strong>each server</strong>:</p>

<pre><code> sudo service redis-server start
 sudo service redis-sentinel start
</code></pre>

<h3 id="testingitallout">Testing it all out</h3>

<p>Let's take down the primary Redis server for 2 minutes, and see if Sentinel kicks in.</p>

<pre><code> // redis1.mydomain.io //
 redis-cli -p 6379 DEBUG sleep 120
</code></pre>

<p>And finally check which server is the Redis primary on <code>redis2.mydomain.io</code>:</p>

<pre><code> // redis2.mydomain.io //
 redis-cli -p 26379
     127.0.0.1:26379&gt; SENTINEL get-master-addr-by-name mymaster
</code></pre>]]></content:encoded></item><item><title><![CDATA[The Commando.io command line interface]]></title><description><![CDATA[The Commando.io CLI is an interface to the API and includes support for tasks like running executions, viewing groups, servers, recipes, and executions.]]></description><link>http://blog.commando.io/commando-cli/</link><guid isPermaLink="false">3ff9c46d-92c0-422a-bba8-6d0d14b7085d</guid><category><![CDATA[api]]></category><category><![CDATA[commando]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><category><![CDATA[cli]]></category><category><![CDATA[command line]]></category><category><![CDATA[cli.commando.io]]></category><category><![CDATA[command line interface]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Fri, 15 May 2015 00:28:07 GMT</pubDate><content:encoded><![CDATA[<p>We are excited to announce the release of the Commando.io <strong><a href="http://cli.commando.io">command line interface (CLI)</a></strong>. The Commando.io CLI is an interface to the API and includes support for tasks like running executions, viewing groups, servers, recipes, and executions. It is written in bash for maximum portability, and the only dependencies are <code>curl</code>, <code>sed</code>, <code>grep</code>, and <code>mktemp</code>.</p>

<p>The CLI is a perfect solution for triggering deployments on servers via a git hook, or automating infrastructure without harnessing the entire <a href="https://docs.commando.io">Commando.io API</a>, and writing a bunch of boilerplate code.</p>

<p><img src="http://blog.commando.io/content/images/2015/05/commando-cli.gif" alt="Commando.io CLI"></p>]]></content:encoded></item><item><title><![CDATA[Automatically import Linode servers into Commando.io]]></title><description><![CDATA[Instead of having to manually add Linode servers, you can now automatically import them which saves you time and is less error prone.]]></description><link>http://blog.commando.io/linode-integration/</link><guid isPermaLink="false">a966da6d-4872-4553-b199-161dd0bfa436</guid><category><![CDATA[commando]]></category><category><![CDATA[digitalocean]]></category><category><![CDATA[aws]]></category><category><![CDATA[rackspace]]></category><category><![CDATA[linode]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><category><![CDATA[ec2]]></category><category><![CDATA[linodes]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Mon, 20 Apr 2015 23:40:07 GMT</pubDate><content:encoded><![CDATA[<p><img src="http://blog.commando.io/content/images/2015/04/linode.png" alt="Linode"></p>

<p><a href="https://commando.io">Commando.io</a> is excited to announce integration with <a href="https://www.linode.com/?r=6cd575b56d25796ebdd824319e811371f218ec14">Linode</a>, adding to our existing integrations with Amazon AWS, DigitalOcean, and Rackspace. Instead of having to manually add Linode servers, you can now automatically import them which saves you time and is less error prone. We also automatically tag servers with the Linode datacenter and server size.</p>]]></content:encoded></item><item><title><![CDATA[Announcing execution scheduling]]></title><description><![CDATA[With scheduling you can automatically run commands on servers periodically in a cron like fashion via a centralized web-interface.]]></description><link>http://blog.commando.io/execution-scheduling/</link><guid isPermaLink="false">0145b720-c8e3-4d59-b413-1cd892ef74bf</guid><category><![CDATA[commando]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><category><![CDATA[scheduling]]></category><category><![CDATA[execution scheduling]]></category><category><![CDATA[cron]]></category><category><![CDATA[crontab]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Thu, 16 Apr 2015 20:40:04 GMT</pubDate><content:encoded><![CDATA[<p>We are pleased to announce execution scheduling in <strong><a href="https://commando.io">Commando.io</a></strong>. With scheduling you can automatically run commands on servers periodically in a cron like fashion via a centralized web-interface.</p>

<p>Some common use-cases are checking for package updates <em>(<a href="http://public.recipes/JHdgXs">http://public.recipes/JHdgXs</a>)</em>, running snapshot backups <em>(see our Google compute example <a href="http://public.recipes/BFz5wN">http://public.recipes/BFz5wN</a>)</em>, and other tasks normally stashed away into crontab on servers.</p>

<p>Learn about scheduling in one minute by watching the walkthrough video below.</p>

<iframe src="https://player.vimeo.com/video/125183845?title=0&byline=0&portrait=0" width="500" height="303" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen></iframe>]]></content:encoded></item><item><title><![CDATA[A new "swagger" for Commando.io]]></title><description><![CDATA[After a few weeks of mocks, designs, and Adobe Illustrator tomfoolery, we are proud to release the new Commando.io logo and brand.]]></description><link>http://blog.commando.io/a-new-swagger-for-commando/</link><guid isPermaLink="false">461f5b2c-c68e-4848-9a00-f6b5f4497340</guid><category><![CDATA[commando]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><category><![CDATA[logo]]></category><category><![CDATA[brand]]></category><category><![CDATA[branding]]></category><category><![CDATA[favicon]]></category><category><![CDATA[stickers]]></category><category><![CDATA[swag]]></category><category><![CDATA[swagger]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Fri, 10 Apr 2015 01:54:22 GMT</pubDate><content:encoded><![CDATA[<p>After a few weeks of mocks, designs, and Adobe Illustrator tomfoolery, we are proud to release the new <a href="https://commando.io">Commando.io</a> logo and brand.</p>

<p>We knew we wanted something simple, but also recognizable. We started experimenting with a glyph before the typeface, and came up with the concept of a cursor at the end of a C.</p>

<h1 id="logos">Logos</h1>

<p>For use on light backgrounds. <br>
<a href="https://storage.googleapis.com/commando/commando-logo.png">https://storage.googleapis.com/commando/commando-logo.png</a></p>

<p><img src="http://blog.commando.io/content/images/2015/04/commando-logo-2.png" alt="Commando.io"></p>

<p>For use on dark backgrounds. <br>
<a href="https://storage.googleapis.com/commando/commando-logo-dark.png">https://storage.googleapis.com/commando/commando-logo-dark.png</a></p>

<p><img src="http://blog.commando.io/content/images/2015/04/commando-logo-dark.png" alt="Commando.io"></p>

<p>Glyph (Favicon). <br>
<a href="https://storage.googleapis.com/commando/commando-glyph.png">https://storage.googleapis.com/commando/commando-glyph.png</a>
<img src="http://blog.commando.io/content/images/2015/04/250-250-favicon.png" alt="Commando.io"></p>

<h1 id="colorpalettes">Color palettes</h1>

<div style="width: 100%; background-color: #53b2e5; height: 100px"></div>  

<p><strong>Blue</strong> <br>
#53b2e5</p>

<div style="width: 100%; background-color: #31343c ; height: 100px"></div>  

<p><strong>Dark Gray</strong> <br>
#31343c</p>]]></content:encoded></item><item><title><![CDATA[Introducing recipe arguments]]></title><description><![CDATA[Recipe arguments are extremely powerful, and allow you to dynamically pass values into recipes at execution-time via our beautiful web-interface.]]></description><link>http://blog.commando.io/introducing-recipe-arguments/</link><guid isPermaLink="false">115e9039-4d2f-41d3-8a87-550c97be5bfd</guid><category><![CDATA[api]]></category><category><![CDATA[commando]]></category><category><![CDATA[recipe]]></category><category><![CDATA[arguments]]></category><category><![CDATA[recipe arguments]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Thu, 05 Mar 2015 08:53:33 GMT</pubDate><content:encoded><![CDATA[<p>We are excited to announce that <strong><a href="https://commando.io">Commando.io</a></strong> now supports recipe arguments. Recipe arguments are extremely powerful, and allow you to dynamically pass values into recipes at execution-time.</p>

<p>Learn about recipe arguments in one minute by watching our walkthrough video.</p>

<iframe src="http://blog.commando.io//player.vimeo.com/video/121110257?title=0&amp;byline=0&amp;portrait=0" width="500" height="311" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen></iframe>

<p>You specify recipe arguments with the following syntax in a recipe:</p>

<pre><code>{{ arg: $unique_key }}
</code></pre>

<p>At execution-time, in the web interface we will prompt for the value of each argument and inject them into the recipe.</p>

<p>When running API executions, you may pass recipe arguments with the <code>recipe_arguments</code> post parameter. See the <a href="https://docs.commando.io/v1/docs/run-an-execution">API documentation</a> for further details.</p>

<p>Enjoy recipe arguments, and have fun automating with Commando.io.</p>]]></content:encoded></item><item><title><![CDATA[Run executions via GitHub push]]></title><description><![CDATA[We are excited to announce that GitHub merged the Commando.io service integration into their platform. The integration allows you to run executions when you push to a GitHub repo.]]></description><link>http://blog.commando.io/run-executions-via-github-push/</link><guid isPermaLink="false">528790e5-376b-4d2a-9758-f3b95ca5f977</guid><category><![CDATA[commando]]></category><category><![CDATA[public-recipes]]></category><category><![CDATA[github]]></category><category><![CDATA[github-service]]></category><category><![CDATA[git]]></category><category><![CDATA[deployment]]></category><category><![CDATA[git-pull]]></category><category><![CDATA[git-clone]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Fri, 12 Dec 2014 00:06:00 GMT</pubDate><content:encoded><![CDATA[<p>We are excited to announce that GitHub merged the <a href="https://commando.io">Commando.io</a> service integration into their platform. The integration allows you to run executions when you push to a GitHub repo. This is a perfect opportunity to automatically run deployment scripts when you push code. </p>

<p>The Commando.io service integration can be found under repository settings in GitHub and clicking on <strong>Webhooks &amp; Services</strong>. Then simply click the <strong>Add service</strong> button and type in Commando.io. <em>As a reminder, you must be on a paid plan to utilize the Commando.io API and thus the GitHub service integration.</em></p>

<p><img src="http://blog.commando.io/content/images/2014/12/Screen-Shot-2014-12-11-at-3-32-08-PM.png" alt="GitHub Service Integration"></p>

<p>Finally, below is an <a href="http://public.recipes/t9mUIX">example public recipe</a> that calls <code>git clone</code> or <code>git pull</code> to automatically fetch a git repository. This is an ideal recipe to execute to deploy code from GitHub to your servers.</p>

<script src="https://gist.github.com/nodesocket/15dba9ebbcc9e119cc3a.js"></script>

<p>Enjoy the integration, and have fun automating with Commando.io.</p>]]></content:encoded></item><item><title><![CDATA[The perfect SSL NGINX configuration]]></title><description><![CDATA[Let's break the NGINX directives into two logical sections. The first being security and the second related to performance.]]></description><link>http://blog.commando.io/the-perfect-nginx-ssl-configuration/</link><guid isPermaLink="false">70b42d19-615f-4dec-ae8d-57263ae5b08e</guid><category><![CDATA[commando]]></category><category><![CDATA[sslv3]]></category><category><![CDATA[ssl]]></category><category><![CDATA[poodle]]></category><category><![CDATA[nginx]]></category><category><![CDATA[SPDY]]></category><category><![CDATA[OCSP]]></category><category><![CDATA[openssl]]></category><category><![CDATA[ssllabs]]></category><category><![CDATA[heartbleed]]></category><category><![CDATA[ssl-ciphers]]></category><category><![CDATA[BEAST]]></category><category><![CDATA[OCSP-stapling]]></category><category><![CDATA[HSTS]]></category><category><![CDATA[http/2]]></category><category><![CDATA[http2]]></category><category><![CDATA[strict-transport-security]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Fri, 14 Nov 2014 03:12:53 GMT</pubDate><content:encoded><![CDATA[<p><img src="http://blog.commando.io/content/images/2014/11/1-Tg9FYCN99FlNj0gn9u8s7A-5-2.jpeg" alt="NGINX" title="">  </p>

<p><em>Last Updated: 11/10/2017</em></p>

<p>At <strong><a href="https://commando.io">Commando.io</a></strong> we make sure we are always on top of any potential security exploits or vulnerabilities. Unfortunately, lately there has been a steady stream of SSL related issues <em>(<a href="http://heartbleed.com">Heartbleed</a> and <a href="https://www.openssl.org/~bodo/ssl-poodle.pdf">POODLE</a> come to mind)</em>. Fortunately patching some of the most prominent issues only requires updating a few <a href="https://nginx.org">NGINX</a> directives.</p>

<p>We figured we would share our SSL NGINX configuration blocks which are used on all Commando.io web servers. Let's break the NGINX directives into two logical sections. The first being <strong>security</strong> and the second related to <strong>performance</strong> and optimization.</p>

<h5 id="security">Security</h5>

<pre><code>http {  
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
}
</code></pre>

<p>The above configuration provides robust <a href="https://en.wikipedia.org/wiki/Forward_secrecy">perfect forward secrecy</a> and mitigates against POODLE by removing <em>SSLv3</em> support. It should also result in an A rating on Qualys SSL LABS as well. If you'd like an A+ rating, you'll need to implement <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security">strict transport security</a> as well.</p>

<p>See the Commando.io SSL LABS report at: <a href="https://www.ssllabs.com/ssltest/analyze.html?d=commando.io">https://www.ssllabs.com/ssltest/analyze.html?d=commando.io</a></p>

<p><strong>Note:</strong> This cipher suite does prevent some older clients <em>(specifically IE6 on Windows XP)</em> from establishing connections, but the majority of our traffic comes from users on Chrome so this is a non-factor for us. Evaluate your requirements by looking at your own traffic.</p>

<h5 id="performance">Performance</h5>

<pre><code>http {  
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/ssl/stapling.trusted.crt;  
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 10s;

    ssl_session_cache shared:SSL:32m;
    ssl_buffer_size 8k;
    ssl_session_timeout 60m;
    ssl_session_tickets off;
}

server {  
    # you may replace spdy with http2 if your version of NGINX supports HTTP/2
    listen 443 deferred ssl spdy;
}
</code></pre>

<p>The first set of performance directives enables <a href="https://en.wikipedia.org/wiki/OCSP_stapling">OCSP stapling</a>. We've written a dedicated <a href="http://blog.commando.io/ssl-ocsp-stapling-with-nginx">blog post on OCSP stapling previously</a>, so check that out for more information.</p>

<p>Next, we enable NGINX SSL cache, which provides SSL session resumption support. We allocate a shared 32MB of space <em>(one megabyte can store about 4000 sessions according to the <a href="https://nginx.org/en/docs/http/ngx_http_ssl_module.html">NGINX documentation</a>)</em>. We set a 60 minute timeout on SSL sessions and also set <code>ssl_buffer_size</code> to 8K to minimize time to first byte <em>(the NGINX default is 16K)</em>.</p>

<p>Finally, in the server block we enable the <a href="https://stackoverflow.com/questions/8449058/what-does-the-deferred-option-mean-in-nginxs-listen-directive">deferred</a> directive and turn on <a href="https://en.wikipedia.org/wiki/SPDY">SPDY</a> support. You may replace spdy with http2 if your version of NGINX supports <a href="https://en.wikipedia.org/wiki/HTTP/2">HTTP/2</a>. Verify that SPDY is enabled on your site with <a href="https://spdycheck.org/#commando.io">SPDYCheck</a> a great service by <a href="https://zoompf.com">zoompf</a>. </p>

<p>We'd also like to recommend a great service we recently found and signed up for called <a href="https://snitch.io">Snitch</a>. Snitch will automatically check your SSL certificate and configuration at specified intervals. It looks for upcoming expiration, security issues, and performance recommendations and then alerts you of anything that needs attention.</p>]]></content:encoded></item><item><title><![CDATA[We are Commando.io. We have users in 1,495 cities]]></title><description><![CDATA[We are proud to announce that Commando.io users are in 1,495 different cities around the world.]]></description><link>http://blog.commando.io/we-are-commando-io/</link><guid isPermaLink="false">1edf7c06-e82d-4501-b88e-681fe73f94cf</guid><category><![CDATA[commando]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Thu, 16 Oct 2014 19:00:00 GMT</pubDate><media:content url="http://blog.commando.io/content/images/2014/11/1-B4PJsQft_5a3XheappgJDA.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.commando.io/content/images/2014/11/1-B4PJsQft_5a3XheappgJDA.png" alt="We are Commando.io. We have users in 1,495 cities"><p>We are proud to announce that <a href="https://commando.io">Commando.io</a> users are in 1,495 different cities around the world. We are super humbled and at the same time excited by our growth.</p>

<p>Thanks to our users. Thanks to our team. Thanks to everybody who makes Commando.io possible.</p>]]></content:encoded></item><item><title><![CDATA[All Commando.io web servers now mitigate against POODLE]]></title><description><![CDATA[All Commando.io web servers now disable SSLv3 to mitigate against the recently discovered SSL POODLE vulnerability.]]></description><link>http://blog.commando.io/all-web-servers-now-mitigate-against-poodle/</link><guid isPermaLink="false">399c481c-77f4-43be-85be-61747682053a</guid><category><![CDATA[commando]]></category><category><![CDATA[sslv3]]></category><category><![CDATA[ssl]]></category><category><![CDATA[poodle]]></category><category><![CDATA[commandoio]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Wed, 15 Oct 2014 19:00:00 GMT</pubDate><content:encoded><![CDATA[<p><img src="http://blog.commando.io/content/images/2014/11/1-EGVtC69mYcurcq4qiZSdUA-3.jpeg" alt="POODLE"></p>

<p>All <a href="https://commando.io">Commando.io</a> web servers now disable SSLv3 to mitigate against the recently discovered <a href="https://www.openssl.org/~bodo/ssl-poodle.pdf">SSL POODLE</a> vulnerability.</p>

<p>View our <a href="https://www.ssllabs.com/ssltest/analyze.html?d=commando.io">SSL Labs report</a>.</p>

<p><em>(<a href="https://www.flickr.com/photos/52158815@N05/4805120137/in/photolist-9rWvpW-3aLHBx-9UWRzC-e3mnHa-6YHkaK-UnWtj-2iCqqr-8jBuQk-8jBuNV-8jEGub-8jEGpA-8jEGpY-eXpJR-yJnpv-6ayYnU-L4bHZ-w3Gsf-6aJUty-96T6kR-a46rer-ecSdH-vM8DV-7oKAZ9-5mw5DV-abSe45-5c64yN-5BfJNN-87BUbB-7NUjGo-69a6XN-6mP1Tk-aBsSNN-ah5jvq-5hjv3-5YpP5e-5cXhi6-6PUpbq-5GfVMi-2KkBx-s9L27-FuwB5-79rc4h-79rc7U-xmWvz-kNTcNy-2MedRW-h6eSA-4DFen9-9gmHod-6fgCQd/">Poodle image via Flickr</a>, CC license.)</em></p>]]></content:encoded></item><item><title><![CDATA[Introducing the Commando.io API]]></title><description><![CDATA[After months of building, testing, and optimizing, today we are thrilled to publicly release the Commando.io API. ]]></description><link>http://blog.commando.io/introducing-the-commando-io-api/</link><guid isPermaLink="false">aef419ab-c193-4d96-9ed2-d1fedd63b68f</guid><category><![CDATA[commado]]></category><category><![CDATA[api]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Tue, 30 Sep 2014 18:00:00 GMT</pubDate><content:encoded><![CDATA[<p>After months of building, testing, and optimizing, today we are thrilled to publicly release the <strong><a href="https://docs.commando.io">Commando.io API</a></strong>. The API opens up amazing possibilities around automatically running executions on servers.</p>

<p>We think this is going to be a game changer. Imagine running an execution via a git hook. Or, how about running an execution when a PagerDuty alert is triggered to automatically fix the issue. We can’t wait to see how you automate your infrastructure and deployments with the Commando.io API.</p>

<p>The Commando.io API is only available to users on paid plans. However, if you <strong><a href="https://commando.io">sign up</a></strong> for a paid plan today, you’ll instantly get a $25 credit at <a href="https://m.do.co/c/f435670a9030">DigitalOcean</a>.</p>

<p>Below is a short video walkthrough of the API, so sit back, grab some popcorn and check it out.</p>

<iframe src="http://blog.commando.io//player.vimeo.com/video/107547330?title=0&amp;byline=0&amp;portrait=0" width="500" height="311" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen></iframe>]]></content:encoded></item><item><title><![CDATA[The root of all evil. How to configure sudo on servers with Commando.io]]></title><description><![CDATA[A common question when setting up Commando.io is how can we add servers without using the root user. The answer is sudo.]]></description><link>http://blog.commando.io/the-root-of-all-evil-how-to-configure-sudo-on-servers/</link><guid isPermaLink="false">6ec25856-044c-4d05-bb4e-f67fbc4b1da3</guid><category><![CDATA[commando]]></category><category><![CDATA[root]]></category><category><![CDATA[digitalocean]]></category><category><![CDATA[droplet]]></category><category><![CDATA[sudo]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Sun, 04 May 2014 19:00:00 GMT</pubDate><content:encoded><![CDATA[<p>A common question when setting up <a href="https://commando.io">Commando.io</a> is how can we add servers without using the root user. The answer is <em>sudo</em>. Sudo allows unprivileged users or groups to execute with the security privileges of another user or group <em>(in our case root)</em>. Essentially this allows delegating root permissions to non-root users.</p>

<p>We created a short three minute <a href="https://vimeo.com/93800083">video</a> walking through the entire process using Commando.io and a CentOS 6.5 droplet on <a href="https://m.do.co/c/f435670a9030">DigitalOcean</a>. In the video, we show how to create a maintenance user, and then allow this user to run yum commands to install, remove, or update packages using sudo without prompting for a password. The same principle can be applied to creating a deploy user that is allowed to restart services such as nginx or apache.</p>

<iframe src="http://blog.commando.io//player.vimeo.com/video/93800083?title=0&amp;byline=0&amp;portrait=0" width="500" height="281" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen></iframe>

<p>Below are public links to the two recipes in the video for reference.</p>

<p><strong>(RECIPE) CREATE MAINTENANCE USER</strong> <br>
<a href="https://public.recipes/U5oFoM">https://public.recipes/U5oFoM</a></p>

<p><strong>(RECIPE) INSTALL RUBY</strong> <br>
<a href="https://public.recipes/tlYP2e">https://public.recipes/tlYP2e</a></p>]]></content:encoded></item><item><title><![CDATA[Two-Factor Authentication Now Supported]]></title><description><![CDATA[Commando.io is excited to announce support for two-factor authentication via Google Authenticator.]]></description><link>http://blog.commando.io/two-factor-authentication-now-supported/</link><guid isPermaLink="false">b6945ef2-0165-449b-9d7f-80812c0eb05f</guid><category><![CDATA[commando]]></category><category><![CDATA[two-factor-auth]]></category><category><![CDATA[twofa]]></category><category><![CDATA[google-authenticator]]></category><category><![CDATA[2fa]]></category><category><![CDATA[commandoio]]></category><category><![CDATA[online ssh]]></category><category><![CDATA[web ssh]]></category><category><![CDATA[devops]]></category><category><![CDATA[distributed ssh]]></category><dc:creator><![CDATA[Justin]]></dc:creator><pubDate>Thu, 24 Apr 2014 19:00:00 GMT</pubDate><content:encoded><![CDATA[<h4 id="weareseriousaboutsecurity">We are serious about security.</h4>

<p><a href="https://commando.io">Commando.io</a> is excited to announce support for two-factor authentication via <a href="https://support.google.com/accounts/answer/1066447?hl=en">Google&copy; Authenticator</a>. When you enable 2FA, it adds an additional layer of security to your Commando.io account. When logging in, after providing your e-mail address and password, you will be asked for a two-factor authentication code that is delivered to your mobile device. This additional step ensures that a malicious person who has discovered your password will not be able to log in to your account.</p>

<p>We strongly urge all users to enable two-factor authentication. Simply log in, navigate to the users page, and click the button above your user details.</p>

<p><img src="http://blog.commando.io/content/images/2014/11/1-uqoDFUUxQVaY8IHPJ8l4bw.png" alt="Johnny Appleseed User"></p>]]></content:encoded></item></channel></rss>