The SF Agile Marketing Meetup kicked off shortly after SprintZero last year. Since then we’ve had a swag of great presenters join us at the meetup. In case you missed any of the sessions I’ve put together a list of the presenters and their videos below.

Tip: If you want to follow these Agile Marketers you can find them on the Agile Marketing Twitter list.

Growth Hacking – Paul Willard

What is growth hacking? How does one get started? In this talk Paul Willard will inspire you to start learning more about your customers and set you on a path to becoming a Growth Engineer.

Filmed November 27, 2012, Atlassian HQ San Francisco

Best Practices from 100,000 A/B tests – Dan Siroker

The average conversion rate across the entire web is 2%. That means 98% of visitors to your website hit the back button and don’t convert into customers. The most powerful way to turn clicks into customers is to improve your website through A/B testing. In this talk Dan Siroker will inspire you to start testing today by sharing best practices & lessons learned from over 3,500 customers that have run over 100,000 A/B tests using Optimizely.

Filmed February 27, 2013, Atlassian HQ San Francisco

Mobile Customer Acquisition – Jiyoon Chung

Jiyoon has one of those great backgrounds as a technology development manager, quantitative analyst, and direct marketer that makes for highly sought after experience.  And she is one of the best distribution (Growth Hacking) mentors in the Bay Area, so we’re incredibly excited to learn a great deal from what she has to share.

Filmed April 23, 2013, Atlassian HQ San Francisco

Optimize Customer Segments at Scale – Juney Ham

Juney Ham, co-founder of Upside and former head of online marketing at Airbnb, shares how to find & optimize your customer segments and gain insights on them (at scale). Examples include: Optimizing traffic from travelers, to not only optimize for their destinations, but identifying the right origins and focusing on the right markets (e.g., Paris for Americans, but Bretagne for English, Nantes for French), and using Facebook Ads effectively through the right interest targeting (e.g., yoga as an interest to target prospective hosts).

Filmed May 21, 2013, Atlassian HQ San Francisco

Hack the Media – Colin Crook

Colin is a Partner at Knock Twice with 15 years experience working alongside technology entrepreneurs. He was part of a group that launched the Firefox web browser and its supporting community SpreadFirefox. It taught him the importance of community-marketing and PR. Since then, Colin has helped entrepreneurs launch their vision on stage at events like DEMO and TechCrunch Disrupt. He loves working alongside people who are passionately building things.

Filmed August 20, 2013, Artis Ventures

Tactics For a Badass Social Media Strategy – Jason Miller

Jason Miller is the Senior Content Marketing Manager at Linkedin where he leads the content marketing and social efforts for LinkedIn Marketing Solutions. Previously he was the Senior Manager, Social Media Strategy at Marketo. He was responsible for leading the company’s social media efforts by increasing engagement, optimizing for lead generation, and ultimately driving revenue. He is also a content creator specializing in visual content marketing.

Filmed September 24, 2013, Artis Ventures

Effective Database Marketing – Reema Batta

Reema is the Head of Database Marketing at Hotwire. She is responsible for leading CRM initiatives by increasing engagement, optimizing for mobile and ultimately driving revenue. She has over 8 years of experience in B2C web businesses within Finance, Analytics and Marketing roles. She was formerly the Head of Insights and Customer Analytics at Snapfish.com.

Filmed November 12, 2013, Artis Ventures

Growth Hacking Lessons from Square, Google, and Slide – Jared Fliesler

Jared is a partner at the Matrix Partners venture capital fund, recently leading the investment in Locality.  Prior to that, Jared’s customer growth teams added millions of customers and billions of dollars of revenue to Square, and prior to that as a Director of Product at Google and an leader of many growth areas at Slide.

Filmed December 10, 2013, Artis Ventures

Like this? React on Twitter

 

This is a guest blog by Daniel Wester, Chief Engineer in the Infrastructure & Operations group at Turner Broadcasting. I asked Daniel to share how they have scaled Bamboo as we are exploring similar at Twitter. Daniel will also be sharing the whole story at Atlassian Summit this October.

All opinions stated are mine and does not necessarily reflect those of Turner or any of its affiliates or partners.

At Turner Broadcasting System we build all of our code through the usage of Continuous Integration servers. We automate the deployment of the code to our servers using the artifacts from these builds. This means that our build servers are a crucial part in delivering new functionality (or applying fixes). One of the Continuous Integration servers that we use is Bamboo from Atlassian.

We require our Bamboo installs to be recoverable within minutes, even in the event of a hardware outage. The idea is for us to be able to flip the current primary server to be a standby server and promote a standby server to be the primary server in the event of a failure on the current primary server.

HA Bamboo Setup

First off, we’ll take a look at approaches to architecting Bamboo.

A normal Bamboo instance with a remote agent looks something like:

Standard Bamboo Setup

Our Bamboo HA setup at Turner looks like.

Screen Shot 2013-07-27 at 8.22.08 AM

nginx handles requests

Starting at the front-end, we have nginx web server in front of the Bamboo web application. This allows us to cache the pages for anonymous users in the event Bamboo does go down.

Before we get to nginx though, we have a Virtual IP Address for Bamboo. We point the public DNS entry to this VIP to allow us to move the Bamboo web application to any server without having change the DNS entry. You can accomplish nearly the same thing using a CNAME, just make sure the TTL is low.

Bamboo on standby

For the major instances of Bamboo we have standby servers. These are servers that have all of the required components and configuration in order to run Bamboo at a moments notice.

Bamboo can utilize a wide range of database backends. We selected MySQL and set up a master/master configuration that we utilize in an active/passive manner. Data is replicated between at least 2 MySQL database servers and the Bamboo web application reads/writes from one of them. We selected this approach as Bamboo uses the database heavily and by pinning it to a single database we can simplify the setup. More on this later.

Remote agents

We attempt to avoid running local build agents. In fact when we do – we treat them as remote build agents and install the build dependencies (Maven, Ant, Phing, Ruby gems etc) using our Configuration Management system. This allows us to shift build functionality easily between servers and avoid snowflake build agents. Build agents are installed using the Configuration Management system.

Taking this approach allows us to easily recreate Bamboo web application servers, and remote agents, in the case of failure. The build environment is known to be the same (if their target usage is supposed to be the same).

If you have multiple remote agents on your Bamboo server – look into using a Configuration Management system to install everything on your servers since it will make everything identical while giving you flexibility to have variations, including the declaration of the properties in Bamboo. See Configuring remote agent capabilities for instructions on automatically configuring build agents.

When we install the agent – we specify the http://public-dns/agentServer/ to be the public dns entry. This means that if we shut down the Bamboo web app for a couple of minutes (upgrades, server maintenance etc) – when it comes back up – the agents will just reconnect by hitting the http url. The url returns back the ActiveMQ cluster host and connects to it.

We use a monitoring framework to verify that the agent is running on the remote agent server and if it’s not it starts the Bamboo remote agent. All of this means that if we shut down the Bamboo web application the agents automatically reconnect when it comes back online.

Bamboo home directory

The Bamboo home directory contains a lot of temporary data (jms-store, local git cache directories, etc). It also contains the configuration of your Bamboo instance (bamboo.cfg.xml which has the MySQL database connection, the ActiveMQ connection string and your license). We rsync the Bamboo home directory on a regular basis to each of the standby servers.

However, this causes a problem as you need to have Bamboo to ignore two settings in the bamboo.cfg.xml – the database host and the jms connection string. While you can’t pass in the database host on the connection (if you can – please let me know) we run a local port proxy (there are several ways of doing it: iptables, haproxy and so on) that forwards connections on a port on localhost to the database host. That way we can easily swivel the database connection.

However the switching between the database isn’t completely manual – we use our Configuration Management system for that. We also don’t necessarily require downtime (depending on if the databases are in sync).

The jms connection is a bit more fun. We simply pass that in on the command line when we start Bamboo up.

-Dbamboo.jms.broker.client.uri=failover:\(tcp://10.0.10.12:54663?wireFormat.maxInactivityDuration=300000\)?maxReconnectAttempts=10\&initialReconnectDelay=15000

This makes Bamboo ignore the setting in bamboo.cfg.xml and we end up with a “clean” bamboo home directory. As with everything else – we use our Configuration Management system to actually write the proper values in place.

So there you go – that’s our Bamboo instance. All powered through Configuration Management systems – if we need to move any component – we simply flip the flags in the Configuration Management system and things just happen. The CM’s config incidentally is built and tested using Bamboo and the CM’s Bamboo instance is maintained through the CM.

Thanks for sharing how to configure Bamboo for an HA environment Daniel. Folks, don’t forget Daniel is sharing more on the Turner approach to Continuous Integration at Atlassian Summit this coming October 1 – 3 in San Francisco, be sure to check it out!

Just a short note to detail how I moved this site (and velocitycounts.com) to Linode. I was a bit annoyed with the poor performance I’ve been getting from the Dreamhost servers, and also from their support team. I can’t blame them though, they gave me exactly what I asked for at a very reasonable price. I’ll continue to use them for DNS hosting.

UPDATE: Even more stinging than the poor performance was learning that Dreamhost now has an option for high performance WordPress. Super, if only it was part of the standard offering and not $20 per month extra per domain. At any rate, that was not available when I made the decision to move. If this is too much for you then consider switching your existing WordPress One-Click Install on Dreamhost to their Optimized WordPress Hosting.

First, just some background on how I came to know that Dreamhost was not performing. I used a combination of Google PageSpeed Tools and WebPageTest.org to show that there was a lot of room for improvement. The common problem was the time to load the first byte and I learned that this is largely due to the fact that the shared hosting providers write sites to swap (disk) and pause the processes to get more sites on the same piece of hardware. Of course this means that the site is slow to wake back up after a period of inactivity as it has to load from disk and start that process again, leading to the 30 sec times to first byte.

With that in mind, here is how I moved from Dreamhost to Linode for my WordPress sites:

1) Signup for Linode, and choose the 64-bit Debian 7 image

2) Follow the Getting Started guide

3) Add the dotdeb sources

4) Install exim to send email (this is needed to send password reset emails from WordPress)

5) Install php-fpm, nginx, mysql, etc

sudo apt-get install nginx php5-fpm php5-mysql mysql-server

6) Perform a database backup on Dreamhost

(setup SSH access to your Dreamhost account for this if you haven’t done this already)

mysqldump --opt --user=username --password=password --host=yourMySQLHostname dbname > output.sql

7) Set up a MySQL database on your Linode host

8) Restore the DB on the Linode host

mysql -u username -p dbname < ~/output.sql

9) Copy your existing WordPress directory over

You could use SCP for this. I decided to chuck everything into a Bitbucket repo and version the wordpress install should I ever need to rollback (unlikely). It is not great for binary files – like images, videos, etc. – although most of those are hosted elsewhere and it is just the ones included with the WordPress theme.

The following instructions expect that you have created a directory under /srv/www/domain.com/public for the WordPress installation.

10) Set up the nginx-conf (server block, virtual host equivalent for those familiar with Apache)

I followed the instructions provided by Evan Solomon. Start by copying his config file and making changes relevant to your server and site. Then run

sudo ln -s /srv/www/domain.com/public/.nginx-conf /etc/nginx/sites-enabled/domain.com

11) Update the DNS records on Dreamhost to point to your Linode machine OR consider CloudFlare for minifying JS & CSS. If you use Cloudflare you’ll be switching your primary and secondary nameservers to them.

12) You’re good to go!

Enjoy this post? React on Twitter: