{"componentChunkName":"component---src-templates-blog-list-jsx","path":"/blog/25/","result":{"data":{"prismic":{"allFeaturedblogs":{"edges":[{"node":{"featured_blogs_enabled":true,"heading":[{"type":"paragraph","text":"Featured posts","spans":[]}],"featured_blog_1":{"__typename":"PRISMIC_Blog","_linkType":"Link.document","blog_header_image":{"dimensions":{"width":790,"height":395},"alt":null,"copyright":null,"url":"https://images.prismic.io/www-static/6d8d81b1-971a-4313-b033-b4e125cb14a0_MondoDB-blog-header-790x395.PNG?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Introducing DigitalOcean Managed MongoDB – a fully managed, database as a service for modern apps","spans":[]}],"blog_post_date":"2021-06-29","blog_post_content":[{"type":"paragraph","text":"MongoDB is one of the most popular databases, and it’s ideal for apps that evolve rapidly and need to handle huge volumes of data and traffic. It offers advantages like flexible document schemas, code-native data access, change-friendly design, and easy horizontal scale-out.","spans":[{"start":22,"end":44,"type":"hyperlink","data":{"link_type":"Web","url":"https://db-engines.com/en/ranking","target":"_blank"}}]},{"type":"paragraph","text":"However, building and maintaining MongoDB clusters from the ground up can be a huge undertaking. Developers often complain that they have to spend their valuable time and resources on database management. Well, we’ve been listening and have some great news: accessing and managing MongoDB on DigitalOcean just got a lot simpler!","spans":[]},{"type":"paragraph","text":"We are excited to announce that DigitalOcean Managed MongoDB is now in General Availability. Managed MongoDB is a fully managed, database as a service (DBaaS) offering from DigitalOcean, built in partnership with and certified by MongoDB Inc. It provides you all the technical capabilities that make MongoDB so beloved in the developer community. Together we have ensured that you will get access to all the latest releases of the MongoDB document database as they become available.","spans":[{"start":32,"end":91,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/managed-databases-mongodb/"}},{"start":230,"end":241,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.mongodb.com/","target":"_blank"}}]},{"type":"paragraph","text":"Managed MongoDB simplifies the MongoDB administration. Developers of all skill levels, even those who do not have prior experience in databases, can spin up MongoDB clusters in just a few minutes. We handle the provisioning, managing, scaling, updates, backups, and security of your MongoDB clusters, allowing you to offload the complex, time consuming –yet critical – database administration tasks to us. This empowers you to focus on what really matters: building awesome apps.","spans":[]},{"type":"embed","oembed":{"height":113,"width":200,"embed_url":"https://www.youtube.com/watch?v=NvHQSV7jnKA","type":"video","version":"1.0","title":"Create a MongoDB Database on DigitalOcean","author_name":"DigitalOcean","author_url":"https://www.youtube.com/c/Digitalocean","provider_name":"YouTube","provider_url":"https://www.youtube.com/","cache_age":null,"thumbnail_url":"https://i.ytimg.com/vi/NvHQSV7jnKA/hqdefault.jpg","thumbnail_width":480,"thumbnail_height":360,"html":"<iframe width=\"200\" height=\"113\" src=\"https://www.youtube.com/embed/NvHQSV7jnKA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>"}},{"type":"heading2","text":"Benefits of Managed MongoDB","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"list-item","text":"Easy set up and maintenance: We create the database clusters for you. Simply choose the cluster configuration (e.g., memory, disk size, number of nodes, etc.), and the data center in which you want to host the database. Follow a few simple steps and your database cluster will be up and running in a matter of minutes. You can spin up clusters using the cloud control panel, CLI, or API.\n\n","spans":[{"start":0,"end":28,"type":"strong"}]},{"type":"list-item","text":"Automatic daily backups with point in time recovery: Data is one of the most important assets of an app, so it’s critical to backup your database. We take backups of your entire clusters automatically on a daily basis, for free. We also provide a point in time recovery for 7 days, that way if things go wrong due to human error, machine error, or some combination of both, you can easily restore the database as it was at any point in the previous 7 days. \n\n","spans":[{"start":0,"end":52,"type":"strong"}]},{"type":"list-item","text":"Automatic updates and access to latest MongoDB releases: You get access to MongoDB 4.4. This is the latest release of MongoDB and comes packed with numerous enhancements like hedged reads, rust, and swift drivers. Since we have developed Managed MongoDB in partnership with MongoDB Inc, you will always get access to new releases as they become available. With Managed MongoDB, the updates happen automatically. Just select a date and time for the updates and we take care of the rest. This makes it easy to stay up to date with MongoDB releases without disrupting your business.\n\n","spans":[{"start":0,"end":56,"type":"strong"},{"start":148,"end":169,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.mongodb.com/new","target":"_blank"}}]},{"type":"list-item","text":"High availability with automated failover: If your database goes down, it can take down the entire app, leading to bad customer experiences. With Managed MongoDB, you can easily minimize the downtime for your database and make it highly available with standby nodes. Standby nodes add redundancy, so if for example the primary node fails, the standby node is immediately promoted to primary and begins serving requests while we provision a replacement standby node in the background.\n\n","spans":[{"start":0,"end":42,"type":"strong"}]},{"type":"list-item","text":"Scale up easily to handle traffic spikes: As your app gains traction and the usage grows, it’s important to have a database that can keep up with the increased demand. With Managed MongoDB, you can easily scale up the size of database nodes when needed.\n\n","spans":[{"start":0,"end":41,"type":"strong"}]},{"type":"list-item","text":"Secure by default: Since data is critical, it also needs to be secure. We encrypt data at rest with LUKS and in transit with SSL. When you create a new cluster, it’s placed in a VPC network by default that provides a more secure connection between resources. You can also restrict access to your nodes to prevent brute-force password and denial-of-service attacks.","spans":[{"start":0,"end":18,"type":"strong"},{"start":178,"end":189,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/docs/networking/vpc/"}}]},{"type":"heading2","text":"The need for Managed Databases","spans":[]},{"type":"paragraph","text":"DigitalOcean’s mission is to simplify cloud computing so developers, startups, and SMBs can spend more time building software that changes the world. While databases are a critical component to any application, building, maintaining, and scaling them can be complex and time consuming. For developers that are building apps for their business, database administration is often not a core focus area. But it’s quite common to find developers that write the code and then also roll up their sleeves to maintain databases. Such users would rather offload the tedious database administration and focus their limited time and energy on building and enhancing their apps. ","spans":[]},{"type":"paragraph","text":"With this in mind, we introduced Managed Databases a couple of years ago and are excited to add Managed MongoDB to our portfolio. With this release, DigitalOcean Managed Databases now supports the following engines:","spans":[{"start":33,"end":50,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/managed-databases/"}}]},{"type":"image","url":"https://images.prismic.io/www-static/87745cc1-1c5f-4463-b104-104b7fc30dc7_managed-databases-logos.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":849,"height":104}},{"type":"paragraph","text":"Managed MongoDB launch comes on the heels of DigitalOcean App Platform, a modern, reimagined PaaS (Platform as a Service) that we released a few months ago. App Platform makes it very easy to build, deploy, and scale apps and static sites. You can deploy code by simply pointing to your GitHub and GitLab repos, and App Platform will do all the heavy lifting of managing infrastructure, app runtimes, and dependencies. App Platform, along with Managed Databases, helps fulfill DigitalOcean’s mission by empowering developers, startups, and SMBs to focus more on their apps, and less on the underlying infrastructure and databases.","spans":[{"start":45,"end":70,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/app-platform/"}}]},{"type":"heading2","text":"How Managed MongoDB works","spans":[]},{"type":"paragraph","text":"DigitalOcean provides you with various compute options to build your apps like:","spans":[]},{"type":"list-item","text":"Droplets: On-demand, Linux virtual machines suitable for production business applications and personal passion projects.","spans":[{"start":0,"end":8,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/droplets/"}}]},{"type":"list-item","text":"DigitalOcean Kubernetes: Managed Kubernetes with automatic scaling, upgrades, and a free control plane.","spans":[{"start":0,"end":23,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/kubernetes/"}}]},{"type":"list-item","text":"DigitalOcean App Platform: A fully managed Platform as a Service.","spans":[{"start":0,"end":25,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/app-platform/"}}]},{"type":"paragraph","text":"No matter which compute option you choose to build your apps, you can easily add Managed MongoDB to it. In addition to this, Managed MongoDB also integrates with the Node.js 1-Click App from DigitalOcean Marketplace making it a lot easier to build Node.js apps.","spans":[{"start":166,"end":215,"type":"hyperlink","data":{"link_type":"Web","url":"https://marketplace.digitalocean.com/apps/nodejs"}}]},{"type":"heading2","text":"Simple, predictable pricing","spans":[]},{"type":"paragraph","text":"Just like all DigitalOcean products, Managed MongoDB provides simple, predictable pricing that allows you to control costs and prevent any surprise bills. You can spin up a database cluster for just $15/month, or a highly available three-node replica set for $45/month. Click here for more information.","spans":[{"start":270,"end":301,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/pricing/#managed-databases"}}]},{"type":"heading2","text":"Regional availability","spans":[]},{"type":"paragraph","text":"Managed MongoDB is currently available in the following regions:","spans":[]},{"type":"list-item","text":"NYC3 (New York, USA)","spans":[]},{"type":"list-item","text":"FRA1 (Frankfurt, Germany)","spans":[]},{"type":"list-item","text":"AMS3 (Amsterdam, Netherlands)","spans":[]},{"type":"paragraph","text":"We will be making Managed Mongo available in other regions soon. Please check out the release notes for most up to date information on regional availability.","spans":[{"start":86,"end":99,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/docs/release-notes/"}}]},{"type":"heading2","text":"Join us at deploy, DigitalOcean’s virtual user conference","spans":[]},{"type":"paragraph","text":"Today we have deploy, DigitalOcean’s signature user conference, which focuses on celebrating, educating, and connecting awesome builders from all over the world.","spans":[{"start":14,"end":20,"type":"hyperlink","data":{"link_type":"Web","url":"https://deploy.digitalocean.com/home"}}]},{"type":"paragraph","text":"Check out the keynote session from DigitalOcean's CEO, Yancey Spruill, in which he talks about where we're headed as a company and shares some exciting product updates. His keynote will be followed by sessions from community members, engineers, customers, and other experts that are building technologies and businesses powered by the cloud. With live Q&A and an active Discord server, there’s ample opportunity to engage and learn something new. Click here to attend the deploy conference.","spans":[{"start":14,"end":69,"type":"hyperlink","data":{"link_type":"Web","url":"https://deploy.digitalocean.com/agenda/session/552806"}},{"start":347,"end":384,"type":"hyperlink","data":{"link_type":"Web","url":"http://do.co/deploy-discord"}},{"start":461,"end":489,"type":"hyperlink","data":{"link_type":"Web","url":"http://do.co/deploy"}}]},{"type":"paragraph","text":"We are also launching a hackathon for DigitalOcean Managed MongoDB. Learn how you can participate, submit an app and get a t-shirt.","spans":[{"start":24,"end":66,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/mongodb-hackathon"}}]},{"type":"paragraph","text":"We hope you will give Managed MongoDB a try. Here are some sample datasets and sample apps that you can use to kick the tires. Check out the docs and let us know what you think!","spans":[{"start":22,"end":43,"type":"hyperlink","data":{"link_type":"Web","url":"https://cloud.digitalocean.com/databases/new?engine=mongodb"}},{"start":59,"end":90,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/do-community/mongodb-resources","target":"_blank"}},{"start":141,"end":145,"type":"hyperlink","data":{"link_type":"Web","url":"https://docs.digitalocean.com/products/databases/mongodb/"}}]},{"type":"paragraph","text":"If you’d like to have a conversation about using DigitalOcean and Managed MongoDB in your business, please feel free to contact our sales team.","spans":[{"start":120,"end":142,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/company/contact/sales/"}}]},{"type":"paragraph","text":"Happy coding!","spans":[]},{"type":"paragraph","text":"André Bearfield","spans":[]},{"type":"paragraph","text":"Director of Product Management","spans":[]}],"tags":[{"tag1":{"__typename":"PRISMIC_Tag","tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}}],"author":{"__typename":"PRISMIC_Author","author_name":"André Bearfield","author_image":{"dimensions":{"width":553,"height":547},"alt":"André Bearfield","copyright":null,"url":"https://images.prismic.io/www-static/fdc7c85186f0a850b04083e1d4306bd1c19772e8_andre-bearfield.png?auto=compress,format"},"_meta":{"uid":"andre-bearfield"}},"_meta":{"uid":"introducing-digitalocean-managed-mongodb"}},"featured_blog_2":{"__typename":"PRISMIC_Blog","_linkType":"Link.document","blog_header_image":{"dimensions":{"width":790,"height":400},"alt":"Droplet Console","copyright":null,"url":"https://images.prismic.io/www-static/710499ae-78cc-4179-afc1-15793637b200_DODX3727-790x400-logo-2.jpg?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Securely connect to Droplets with SSH key pairs using a new Droplet Console","spans":[]}],"blog_post_date":"2021-08-10","blog_post_content":[{"type":"paragraph","text":"The famous author Ken Blanchard once said, “Feedback is the breakfast of champions.\" This is something we truly believe at DigitalOcean, and we always strive to enhance our products based on customer feedback.","spans":[]},{"type":"paragraph","text":"With this goal in mind, we are excited to introduce a new Droplet Console that will make it much easier to connect to your Droplets securely. The new Droplet Console provides one-click SSH access to your Droplets through a native-like SSH/Terminal experience. It also eliminates the need for a password or manual configuration of SSH keys. Starting today, we’re pleased to announce that the new Droplet Console is now available to all Droplet users.","spans":[]},{"type":"heading2","text":"Why you should be using Secure Shell (SSH) ","spans":[]},{"type":"paragraph","text":"Password-based security is notoriously insecure due to password fatigue and the overuse of passwords such as ‘123456’. Secure Shell or SSH is a network communication protocol that solves this by using passwordless solutions for encryption, enabling two computers to communicate and securely share data. At a high level, SSH works by creating cryptographic key pairs consisting of a public and private key, which are computer generated and stored separately to ensure their security. ","spans":[{"start":80,"end":117,"type":"hyperlink","data":{"link_type":"Web","url":"https://cybernews.com/best-password-managers/most-common-passwords/"}}]},{"type":"paragraph","text":"SSH has become the default encryption protocol for many industries, but it was difficult to use SSH keys with DigitalOcean’s current Recovery (VNC) console, which is why we developed our new Droplet Console. The new Droplet Console is backed by an agent that security supervises the key pair, while also providing one-click SSH access to our users. You can see the full list of features below.","spans":[]},{"type":"heading2","text":"The new Droplet Console: More time saving, less time wasting ","spans":[]},{"type":"paragraph","text":"The new Droplet Console is for everyone who is looking to build fast, secure apps and avoid hassles with SSH access & usability issues.","spans":[]},{"type":"paragraph","text":"In addition to easier SSH access, the new Droplet Console comes with:","spans":[]},{"type":"list-item","text":"Copy/paste text: Instead of typing lengthy key pairs and text manually, you can use copy/paste to save time. ","spans":[{"start":0,"end":17,"type":"strong"}]},{"type":"list-item","text":"Multi-color support: Multi-color support makes the console more useful and intuitive, and breaks the conventional standard appearance which is black text on a white background. ","spans":[{"start":0,"end":41,"type":"strong"}]},{"type":"list-item","text":"Multi-language support: DigitalOcean’s new Droplet Console supports multiple languages, meaning you can now type and view any content in any language that is supported by UTF-8","spans":[{"start":0,"end":24,"type":"strong"}]},{"type":"list-item","text":"OS/images supported: Linux distributions (Ubuntu(16.04 - 20.04), Fedora (32 & 33), Debian (9), CentOS (7.6 & 8.3), CentOS 8 Stream, Rocky Linux and Marketplace images.","spans":[{"start":0,"end":20,"type":"strong"},{"start":148,"end":159,"type":"hyperlink","data":{"link_type":"Web","url":"https://marketplace.digitalocean.com/"}}]},{"type":"paragraph","text":"The new Droplet Console is available by default on any new Droplets you spin up. You can also enable it manually on older Droplets. Click here to learn more!","spans":[{"start":132,"end":157,"type":"hyperlink","data":{"link_type":"Web","url":"https://docs.digitalocean.com/products/droplets/how-to/connect-with-console/"}}]},{"type":"paragraph","text":"Check out this short walkthrough video that shows the new Droplet Console in action: ","spans":[]},{"type":"embed","oembed":{"type":"video","embed_url":"https://www.youtube.com/watch?v=Qt7QihVuxiE","title":"Access Your Droplet Terminal Through the Web Console","provider_name":"YouTube","thumbnail_url":"https://i.ytimg.com/vi/Qt7QihVuxiE/hqdefault.jpg","provider_url":"https://www.youtube.com/","author_name":"DigitalOcean","author_url":"https://www.youtube.com/c/Digitalocean","height":113,"width":200,"version":"1.0","thumbnail_height":360,"thumbnail_width":480,"html":"<iframe width=\"200\" height=\"113\" src=\"https://www.youtube.com/embed/Qt7QihVuxiE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>"}},{"type":"paragraph","text":"We hope you’re excited about the new Droplet Console. You’re welcome to spin some Droplets up right now, and try out the new Droplet Console – why wait?","spans":[{"start":72,"end":103,"type":"hyperlink","data":{"link_type":"Web","url":"https://cloud.digitalocean.com/droplets/new"}}]},{"type":"paragraph","text":"Happy coding!","spans":[]},{"type":"paragraph","text":"Harsh Banwait, Senior Product Manager","spans":[]}],"tags":[{"tag1":{"__typename":"PRISMIC_Tag","tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}}],"author":{"__typename":"PRISMIC_Author","author_name":"Harsh Banwait","author_image":{"dimensions":{"width":600,"height":399},"alt":null,"copyright":null,"url":"https://images.prismic.io/www-static/e83ff690-b20c-4d88-a2b6-57e562558cd6_download.png?auto=compress,format"},"_meta":{"uid":"harsh-banwait"}},"_meta":{"uid":"new-droplet-console-ssh-support"}},"featured_blog_3":{"__typename":"PRISMIC_Blog","_linkType":"Link.document","blog_header_image":{"dimensions":{"width":790,"height":400},"alt":null,"copyright":null,"url":"https://images.prismic.io/www-static/588e28d3-d41e-480b-937b-8c3b19201f6e_DODX3568-790x400-Blog.jpg?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"How to scale your SaaS product without breaking the bank","spans":[]}],"blog_post_date":"2021-06-22","blog_post_content":[{"type":"paragraph","text":"These days, if you are in the business of software, chances are you are delivering or plan to deliver your services using a Software-as-a-Service (SaaS) model. A combination of internet-based delivery, subscription-based pricing, and low-friction product experiences have made SaaS solutions valuable tools for their users, and an excellent vehicle for software builders looking to distribute their products.","spans":[]},{"type":"paragraph","text":"These factors have made SaaS solutions ubiquitous; SaaS is the largest segment in the public cloud market, and is used to provide functionality ranging from personal finance apps for consumers, to productivity software for businesses, and even tools and services for software developers themselves to compose their applications and simplify their workflows. It is also not uncommon to find micro-SaaS applications being built for specific industries such as retail, job functions such as accounting or marketing, or tasks such as event management. ","spans":[]},{"type":"paragraph","text":"The best thing about this SaaS wave has been that it has allowed a new generation of software builders to build and monetize applications and participate in the digital economy. Previously, you had to be a big company with lots of resources, name recognition and distribution networks to successfully sell software products. Now, irrespective of whether you are a single person working on a passion project, a small team of developers in a startup, or a small and medium-sized business (SMB), the SaaS model enables you to express your ideas in the form of software and deliver them to customers anywhere in the world.","spans":[]},{"type":"heading2","text":"The unique challenges of building SaaS solutions","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Despite the opportunities that come with the widespread adoption of SaaS products, software builders still have to answer key questions in their journey to building successful SaaS products. Understanding what customers to target, features to prioritize, how to price your product, and how to acquire customers are all critical questions to figure out while you are also doing the important job of actually building and operating the product. ","spans":[]},{"type":"paragraph","text":"Writing the code, testing, deployment, monitoring the usage in production, and ensuring that your apps are able to handle the additional demand when customer base and usage grows are all essential and time-consuming tasks.","spans":[]},{"type":"paragraph","text":"Additionally, being able to test multiple ideas, pivot, and double down on the ideas that actually work is critical in early stages of SaaS development. Once growth comes, it is equally important to scale up without compromising on performance or reliability. Needless to say, all of this needs to be economically viable as well, since not everyone has the resources of large SaaS providers like Salesforce or Adobe.","spans":[]},{"type":"heading2","text":"Cloud Computing enables builders but also poses challenges","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Fortunately, for the act of building and operating your apps, cloud computing can help take some load off your shoulders. Unless you have the scale and resources of Facebook, chances are you are not going to set up your own data centers to host the computing infrastructure that powers your SaaS company. Public cloud infrastructure providers can bring great value to SaaS builders by providing on-demand computing services with usage-based pricing. However, just like how the legacy software companies weren't built for the SaaS model, the early (and big) cloud computing services were not optimized for the unique needs of small SaaS building teams. ","spans":[]},{"type":"paragraph","text":"Smaller SaaS teams face challenges with large cloud computing providers, including:","spans":[]},{"type":"heading4","text":"Too many technology options","spans":[]},{"type":"paragraph","text":"There are just too many options for tech stacks on which to build your SaaS - programming languages, application development frameworks, libraries, runtime environments, architectural patterns, and deployment models - and the list is growing by the day.","spans":[]},{"type":"heading4","text":"Complexity of cloud computing services","spans":[]},{"type":"paragraph","text":"Even when you have decided on a technology stack, there is a lot of cloud vendor-specific terminology you need to learn and heavy lifting you need to do to build on the cloud, not all of which contributes to making your SaaS applications successful.","spans":[]},{"type":"heading4","text":"Unpredictable costs","spans":[]},{"type":"paragraph","text":"The experimentation necessary in early stages of SaaS development, as well as the scaling of applications required during the growth phase, call for affordable and predictable pricing from your cloud provider. The last thing SaaS teams want is surprising and indecipherable bills from your cloud provider. Unfortunately, smaller businesses often experience unpredictable costs with cloud providers who are busy serving only the large enterprises.","spans":[]},{"type":"heading2","text":"DigitalOcean provides a simple, cost effective solution for SaaS builders","spans":[]},{"type":"paragraph","text":"Fortunately, at DigitalOcean we have a laser focus on small software development teams, who are trying to build the next generation of applications. Today, DigitalOcean customers are already building SaaS applications which serve all kinds of customers.","spans":[{"start":191,"end":217,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/solutions/saas/"}}]},{"type":"paragraph","text":"We believe SaaS builders should focus on building apps that power their business, and not spend their valuable time on managing infrastructure. That is exactly what we have been able to enable through our intuitive products that are built for scale and reliability.","spans":[{"start":205,"end":223,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/"}}]},{"type":"list-item","text":"Vidazoo is an advertising technology company specializing in video streaming and serving. It serves video ads to thousands of websites and handles close to 10 billion requests per day. \n\n“We are as much a data company as an adtech company. Our business relies on speedy and accurate data processing at massive scale. DigitalOcean provides us the perfect set of tools to operate our SaaS business profitably, while not making us feel the need to become full time system administrators. We plan to move a lot of our apps to DigitalOcean App Platform and other fully managed products.” - Roman Svichar, CTO of Vidazoo","spans":[{"start":0,"end":7,"type":"hyperlink","data":{"link_type":"Web","url":"https://vidazoo.com/"}},{"start":187,"end":583,"type":"em"}]},{"type":"paragraph","text":"We believe in meeting customers where they are. If they already have an understanding of cloud infrastructure technologies, they should be able to leverage that knowledge and get started with our products without any further ramp up.","spans":[]},{"type":"list-item","text":"Whatfix is an enterprise SaaS provider that offers a digital adoption platform to businesses. The company helps enterprises gain the full value of their investments in enterprise applications by providing real-time, interactive, and contextual guidance to users of those applications. \n\n“What we really love about the DigitalOcean platform is the ease of use. We feel like we know infrastructure and can handle most of the configuration and management. What we needed from a cloud was not bells and whistles but efficiency and reliability. DigitalOcean provides us a platform to build our apps and then gets out of the way. Just how we like it.” - Achyuth Krishna, Director of Engineering of Whatfix","spans":[{"start":0,"end":7,"type":"hyperlink","data":{"link_type":"Web","url":"https://whatfix.com/blog/driving-the-future-now-were-excited-to-announce-our-90-million-series-d-funding/"}},{"start":287,"end":648,"type":"em"}]},{"type":"paragraph","text":"We understand that scaling while maintaining reliability of applications and profitability of business is important, so we provide robust solutions which minimize downtime.","spans":[]},{"type":"list-item","text":"Centra is a SaaS-based e-commerce platform for global direct-to-consumer and wholesale e-commerce brands. Centra provides a powerful e-commerce backend that lets brands build pixel-perfect, custom designed, online flagship stores. \n\n“How do we enable our customers to create differentiated online experiences? How do we ensure their e-commerce apps stay up and running at all times? How do we scale on-demand when traffic grows or new customers come in? These are the questions that we ask ourselves every day. Thankfully, we have a partner in DigitalOcean that provides just the platform to answer those questions enabling us to guarantee 99.9% uptime for our clients.” - Martin Jensen, CEO of Centra","spans":[{"start":0,"end":6,"type":"hyperlink","data":{"link_type":"Web","url":"https://centra.com/"}},{"start":233,"end":673,"type":"em"}]},{"type":"paragraph","text":"These are just a few examples of SaaS businesses finding success on DigitalOcean. We are constantly amazed by the creativity and innovation that software builders are utilizing our platform for. If you are interested in learning more about product updates, technical deep-dives and best practices for building SaaS products and businesses, please contact us to learn how we can help you get started. ","spans":[{"start":340,"end":357,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/migrate/?utmmedium=blog","target":"_blank"}}]},{"type":"paragraph","text":"Come build with DigitalOcean!","spans":[]},{"type":"paragraph","text":"Looking to migrate your SaaS to DigitalOcean? Leverage free infrastructure credits, robust training, and technical support to ensure a worry-free migration.","spans":[{"start":0,"end":156,"type":"strong"},{"start":0,"end":156,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/migrate/?utmmedium=blog","target":"_blank"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Raman Sharma","spans":[]},{"type":"paragraph","text":"Vice President, Product & Programs Marketing","spans":[]}],"tags":[{"tag1":{"__typename":"PRISMIC_Tag","tag":"Developer Relations","_linkType":"Link.document","_meta":{"uid":"developer-relations"}}}],"author":{"__typename":"PRISMIC_Author","author_name":"Raman Sharma","author_image":{"dimensions":{"width":512,"height":512},"alt":null,"copyright":null,"url":"https://images.prismic.io/www-static/497b4b14-d192-493a-8b66-7ae176ba99f3_raman.png?auto=compress,format"},"_meta":{"uid":"raman-sharma"}},"_meta":{"uid":"how-to-scale-your-saas-product-without-breaking-the-bank"}}}}]}}},"pageContext":{"limit":12,"skip":288,"numPages":33,"currentPage":25,"data":[{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":400},"alt":"GitHub's Student Developer Program","copyright":null,"url":"https://images.prismic.io/www-static/a58e2d41-276b-4c02-b11f-be21f10075d9_Github-Student-Pack-Blog.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"We're Participating In GitHub's Student Developer Program","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"We are happy to announce our participation in GitHub's Student Developer Program. This will give students free access to top-notch development tools from the biggest names in our industry.","spans":[{"start":46,"end":80,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/blog/1900-the-best-developer-tools-now-free-for-students"}}]},{"type":"paragraph","text":"The beauty of the program is that it gives students a centralized place where they can access all of these great services, free of charge, so they get a hands-on, professional experience that allows them to learn by doing. For every student that signs up for the program, DigitalOcean will provide $100 in hosting credit. The pack itself also includes special student accounts for GitHub, Atom, NameCheap, Sendgrid, and other awesome companies looking to give back in some way.","spans":[{"start":223,"end":321,"type":"strong"}]},{"type":"paragraph","text":"Here at DigitalOcean, our mission is to make developers' lives better and we believe strongly in creating a sense of community. As developers often get their start while in school, where cost can be a limitation, it's a privilege to have the opportunity to provide support for their education.","spans":[]},{"type":"paragraph","text":"Every DO user can enter one GitHub Promo code, as long as you are 13+ and enrolled in a degree or diploma granting course of study. For more information about the pack, and how to apply, check the GitHub website: https://education.github.com/pack.","spans":[{"start":213,"end":246,"type":"hyperlink","data":{"link_type":"Web","url":"https://education.github.com/pack"}}]},{"type":"paragraph","text":"Love,","spans":[]},{"type":"paragraph","text":"The DO Team","spans":[]},{"type":"paragraph","text":"Update: Unfortunately, the GitHub promo is available to new users only.","spans":[{"start":0,"end":7,"type":"strong"}]},{"type":"paragraph","text":"Update 2: The promo credit amount was changed to $50 in September 2015.","spans":[{"start":0,"end":9,"type":"strong"}]}],"blog_post_date":"2014-10-01","tags":[{"tag1":{"tag":"Community","_linkType":"Link.document","_meta":{"uid":"community"}}}],"_meta":{"uid":"were-participating-in-githubs-student-developer-program"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":784,"height":392},"alt":"hacktoberfest","copyright":null,"url":"https://images.prismic.io/www-static/55f78a6a-1fae-449f-80a8-41f75c622c07_hacktoberfest.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Join Us For Our Hacktoberfest Giveaway","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"Fall is the time for pumpkin flavored everything, Octoberfest, and, if you're anywhere but a perpetually hot place, watching the leaves turn. And this year we are announcing a Hacktoberfest giveaway.","spans":[]},{"type":"paragraph","text":"If you make 50 or more commits on any public GitHub repo in October, we'll send you a free limited edition DO Hacktoberfest T-shirt.","spans":[{"start":86,"end":131,"type":"strong"}]},{"type":"paragraph","text":"How do you claim your shirt? Keep hacking: commit to your current repo or start something new, and at the end of the month, if you've made over 50 commits,  we'll have a form for you to confirm your stats. As there are tons of cool things that you can do with your commit history, we're depending on you to use the honor system.","spans":[{"start":265,"end":271,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/gelstudios/gitfiti"}}]},{"type":"paragraph","text":"Also, if you attend a hackathon this month and take a picture of any DigitalOcean swag (shirt on anyone, sticker on anyone's laptop), and tweet the pic at us with the hashtag #hacktoberfest, we'll make sure you get a shirt as well.","spans":[{"start":155,"end":157,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/digitalocean"}}]},{"type":"paragraph","text":"To keep you going, we're going to be posting about hackathons all around the world on our Twitter, so if you have any you'd like us to highlight, leave them in the comments.","spans":[]},{"type":"paragraph","text":"Happy Hacking!","spans":[]},{"type":"paragraph","text":"Update: The official Hacktoberfest site is now live. Sign up now for an email reminder or check back on Nov 1st.","spans":[{"start":0,"end":7,"type":"strong"},{"start":12,"end":39,"type":"hyperlink","data":{"link_type":"Web","url":"http://hacktoberfest.digitalocean.com/"}}]}],"blog_post_date":"2014-09-30","tags":[{"tag1":{"tag":"Community","_linkType":"Link.document","_meta":{"uid":"community"}}}],"_meta":{"uid":"hacktoberfest"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":375},"alt":"AMS","copyright":null,"url":"https://images.prismic.io/www-static/73d62209-2d5b-47b9-881f-2811891abeff_ams3.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"We're Bringing New Features To Europe: IPv6, Private Networking, CoreOS","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"AMS3 is here! This is our first region in Amsterdam running v1.5 of our backend codebase, and we're actively seeking new regions to service developers throughout Europe. Users spinning up Droplets in the region can now enable IPv6, as well as take advantage of additional benefits, e.g. enabling networking services without the need to power off.","spans":[{"start":0,"end":4,"type":"strong"}]},{"type":"paragraph","text":"Below are DO articles that will help you get started with IPv6 on your Droplets:","spans":[]},{"type":"list-item","text":"How To Enable IPv6 For DigitalOcean Droplets","spans":[{"start":0,"end":44,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-enable-ipv6-for-digitalocean-droplets"}}]},{"type":"list-item","text":"How To Configure Tools To Use IPv6 on a Linux VPS","spans":[{"start":0,"end":49,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-configure-tools-to-use-ipv6-on-a-linux-vps"}}]},{"type":"list-item","text":"How To Add Additional IPv6 Addresses to your Droplet","spans":[{"start":0,"end":52,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-add-additional-ipv6-addresses-to-your-droplet"}}]},{"type":"list-item","text":"How To Configure Your Droplet to Only Use IPv6 Networking","spans":[{"start":0,"end":57,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-configure-your-droplet-to-only-use-ipv6-networking"}}]},{"type":"paragraph","text":"You can also navigate the IPv6 tag for more IPv6 articles and questions in our community","spans":[{"start":79,"end":88,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/"}}]},{"type":"image","url":"https://images.prismic.io/www-static/83c882f5bc6963505a7737ad002655d1c6fba1a2_control_panel.png?auto=compress,format","alt":"DigitalOcean control panel","copyright":null,"dimensions":{"width":715,"height":307}},{"type":"paragraph","text":"There's also been a lot of excitement throughout our community around our recent CoreOS announcement. Now all developers that wish to spin up Droplets in AMS3 can select CoreOS as their operating system, allowing for the easiest way to get started using containers and distributed systems.","spans":[{"start":81,"end":101,"type":"hyperlink","data":{"link_type":"Web","url":"https://assets.digitalocean.com/blog/static/coreos-now-available-on-digitalocean/"}}]},{"type":"paragraph","text":"You can click here to launch a CoreOS image, or here to check out our tutorial series on getting started with CoreOS.","spans":[{"start":14,"end":18,"type":"hyperlink","data":{"link_type":"Web","url":"https://cloud.digitalocean.com/droplets/new?image=coreos-alpha"}},{"start":48,"end":52,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorial_series/getting-started-with-coreos-2"}}]}],"blog_post_date":"2014-09-10","tags":[{"tag1":{"tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}},{"tag1":{"tag":"News","_linkType":"Link.document","_meta":{"uid":"news"}}}],"_meta":{"uid":"were-bringing-new-features-to-europe-ipv6-coreos-more"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":400},"alt":"new community features","copyright":null,"url":"https://images.prismic.io/www-static/5ea3789d-9f8c-4503-9d33-1965e0bf80b6_new-community-header.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Our New Community: User Profiles, Upvoting, Notifications and More!","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"You may have noticed changes in the DigitalOcean community. Following the launch of our new website back in March, we have further upgraded the community to now offer a redesigned interface, user profiles, manual subscriptions, upvoting, and an overall more community-driven platform.","spans":[{"start":36,"end":58,"type":"hyperlink","data":{"link_type":"Web","url":"https://digitalocean.com/community/"}},{"start":88,"end":99,"type":"hyperlink","data":{"link_type":"Web","url":"https://digitalocean.com/"}}]},{"type":"paragraph","text":"When our community site first launched in the spring of 2012, it featured ten Linux tutorials written by an in-house writer and received roughly 1,500 visitors its first week. We're so grateful that as we've grown, the community has come together to sustain the site. Currently, over 50% of DigitalOcean's near 800 tutorials come from outside submissions, and our questions and projects sections are also built up by community contributions.","spans":[{"start":311,"end":324,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials"}},{"start":364,"end":373,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/questions"}},{"start":378,"end":386,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/projects"}}]},{"type":"heading3","text":"Now the community site receives over 1.5 million visitors each month.","spans":[]},{"type":"paragraph","text":"We've put a lot of time and effort into creating a space where we can give back, and that developers of all types can call home. Today, are excited to announce some of the biggest new features of the growing DO community.","spans":[]},{"type":"heading2","text":"New Features","spans":[]},{"type":"paragraph","text":"We have introduced quite a few new features to the community, and will continue improving these features and adding more based on user feedback. Some of our newest features are:","spans":[]},{"type":"heading3","text":"\nUser Profiles","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/7089e1be6a4c1007d0c96ad6de931c43bc42f72d_feature-profile.jpg?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":262,"height":183}},{"type":"paragraph","text":"Keep track of your contributions, showcase your information, connect with other users, and modify your preferences in our newly introduced community profile.","spans":[]},{"type":"heading3","text":"\nSubscriptions","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/e883e56103a6fd25a10ac4b55af80b0ce91b8a0d_feature-subscriptions.jpg?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":262,"height":182}},{"type":"paragraph","text":"Users are automatically subscribed to content they create, and can manually subscribe to any question or tutorial within the community.","spans":[]},{"type":"heading3","text":"\nNotifications","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/a76523c9937594ab0be8414e1865934860b8bf23_feature-notifications.jpg?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":262,"height":182}},{"type":"paragraph","text":"Stay in the know by receiving both in-app and email notifications whenever another user takes action on your post.","spans":[]},{"type":"heading3","text":"\nLove your Content!","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/b251def79b84d89a24f0f91532eede013a8597ff_feature-love.jpg?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":262,"height":182}},{"type":"paragraph","text":"Did you find a fellow community member's post helpful? Give it some love! This will count as a point toward that user, as well as upvote the post in the thread.","spans":[]},{"type":"heading3","text":"\nThreaded Discussions","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/8a81b2aab9d7232b85a159203a912690f0727529_feature-discussions.jpg?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":262,"height":182}},{"type":"paragraph","text":"We can't help but be excited about our new commenting system. You can also format your answers in markdown syntax, or use our visual editor to do that for you.","spans":[]},{"type":"paragraph","text":"A special thank you to Tanooki. Under the guidance of our  Creative Director, they were able to bring you these features as quickly as possible. Now create a user profile and explore your new community. More features and refined interfaces coming soon :)","spans":[{"start":23,"end":30,"type":"hyperlink","data":{"link_type":"Web","url":"http://tanookilabs.com/"}},{"start":59,"end":76,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/ChasingUX"}}]}],"blog_post_date":"2014-09-07","tags":[{"tag1":{"tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}},{"tag1":{"tag":"News","_linkType":"Link.document","_meta":{"uid":"news"}}},{"tag1":{"tag":"Community","_linkType":"Link.document","_meta":{"uid":"community"}}}],"_meta":{"uid":"our-new-community-user-profiles-upvoting-notifications-and-more"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":400},"alt":"Core OS","copyright":null,"url":"https://images.prismic.io/www-static/0fcf4a01-7224-4a98-9ffe-210625d1eec0_DocoreOS.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"CoreOS Now Available On DigitalOcean!","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"It's finally here – we're very pleased to announce that developers can begin using CoreOS on DigitalOcean.","spans":[]},{"type":"paragraph","text":"There's been a lot of community excitement for CoreOS. This integration with the alpha channel version on DO provides an easy and quick way for web and mobile developers interested in working with Docker to deploy applications and experiment with containers. On CoreOS, Docker containers can boot in milliseconds, providing unprecedented flexibility in managing load across a cluster of Droplets. Some additional features include automatic updates, automatic network configuration, and integration with etcd technology.","spans":[{"start":47,"end":53,"type":"hyperlink","data":{"link_type":"Web","url":"https://coreos.com/"}}]},{"type":"paragraph","text":"Through CoreOS's etcd technology, users can deploy a cluster of servers configured to work with one another, ensuring the resiliency of their architecture. This feature greatly reduces the impact of a possible server failure, supporting high-traffic applications. And for those looking for commercial support, CoreOS Managed Linux is delivered as an OS as a Service. We hope developers using our infrastructure are as excited as we are about the possibilities now available through CoreOS on our platform.","spans":[{"start":310,"end":330,"type":"hyperlink","data":{"link_type":"Web","url":"https://coreos.com/products/managed-linux/"}}]},{"type":"image","url":"https://images.prismic.io/www-static/55f1d4044caef07d457575b55b58a58c4b51d631_coreosdistribution.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":750,"height":179}},{"type":"paragraph","text":"Google, Facebook, and Twitter utilize similar strategies to allow for growth and resilient systems. \"The easiest way to get started using containers, distributed systems and the next generation of infrastructure is now available to millions of developers on DigitalOcean,\" said Alex Polvi, CEO of CoreOS. \"Let the developer community go wild.\"","spans":[]},{"type":"paragraph","text":"Click here to launch a CoreOS image. Click here for our series on getting started with CoreOS.","spans":[{"start":6,"end":10,"type":"hyperlink","data":{"link_type":"Web","url":"https://cloud.digitalocean.com/droplets/new?image=coreos-alpha"}},{"start":43,"end":47,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorial_series/getting-started-with-coreos-2"}}]}],"blog_post_date":"2014-09-03","tags":[{"tag1":{"tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}},{"tag1":{"tag":"News","_linkType":"Link.document","_meta":{"uid":"news"}}}],"_meta":{"uid":"coreos-now-available-on-digitalocean"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":400},"alt":"referral program","copyright":null,"url":"https://images.prismic.io/www-static/9c0ec920-c437-40a7-820c-af9a2195e062_New-Referral-Program-Blog.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Give Your Friends $10 To Host Their Projects (And Get $25 Yourself)","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"We've revamped our referral program as a way of giving back. Our community has grown rapidly thanks to you spreading the word and showing love for DO – so we've decided to hook your friends up with some credit for taking a dive into DigitalOcean.","spans":[]},{"type":"paragraph","text":"Here's how it works: anyone you refer to DigitalOcean that signs up using your unique referral link will receive $10 in hosting credit immediately after unlocking their account by entering a valid payment method. What this essentially means is you have an unlimited amount of promo codes that you can shell out to your friends. Hopefully, they'll return the favor by taking you out for a drink, which, here in New York, means they've already spent their credit…","spans":[{"start":79,"end":99,"type":"hyperlink","data":{"link_type":"Web","url":"https://cloud.digitalocean.com/settings/referrals"}}]},{"type":"paragraph","text":"In return for helping us spread the word, we'll give you $25 for each friend that signs up, once they are billed $25 as a DO customer. There is NO LIMIT to how many friends you can refer. You can potentially fund your entire account on DigitalOcean by simply getting your friends to sign up – we hope this shows how much we appreciate your support.","spans":[{"start":259,"end":290,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/referral-program/"}}]},{"type":"paragraph","text":"Within your Settings page in the control panel, you'll be able to track your referral stats, e.g. how many friends you've referred, how much money you are owed, and how much you've earned so far. Email it, Tweet it, and share it. Thanks for spreading the DigitalOcean love!","spans":[{"start":12,"end":25,"type":"hyperlink","data":{"link_type":"Web","url":"https://cloud.digitalocean.com/settings/referrals"}}]},{"type":"paragraph","text":"– The DO Team","spans":[]}],"blog_post_date":"2014-08-24","tags":[{"tag1":{"tag":"Community","_linkType":"Link.document","_meta":{"uid":"community"}}}],"_meta":{"uid":"give-your-friends-10-to-host-their-projects-and-get-25-yourself"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":400},"alt":"NYC expanding capacity","copyright":null,"url":"https://images.prismic.io/www-static/93cc0565-4c88-41b3-b2e3-5675db1ea1b4_nyc3capacity.jpg?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Announcing NYC3 With IPv6 Support","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"NYC3 is live! To keep up with the high demand for capacity on the East Coast, we've opened a new datacenter location in New York: NYC3. This will be the first US location with IPv6 support, which can be enabled during Droplet creation or added to existing Droplets. Private networking is also available in NYC3.","spans":[{"start":130,"end":134,"type":"strong"},{"start":176,"end":188,"type":"strong"}]},{"type":"paragraph","text":"Ever since the launch of our new API, power users have been spinning up a rainstorm of Droplets. Like a NY apartment, space was getting tight on our servers, so we've expanded our East Coast presence to ensure server capacity for all users in the region.","spans":[{"start":29,"end":36,"type":"hyperlink","data":{"link_type":"Web","url":"https://assets.digitalocean.com/blog/static/api-v2-enters-public-beta/"}}]},{"type":"paragraph","text":"Below are DO articles that will help you get started with IPv6 on your Droplets:","spans":[]},{"type":"list-item","text":"How To Enable IPv6 For DigitalOcean Droplets","spans":[{"start":0,"end":44,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-enable-ipv6-for-digitalocean-droplets"}}]},{"type":"list-item","text":"How To Configure Tools To Use IPv6 on a Linux VPS","spans":[{"start":0,"end":49,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-configure-tools-to-use-ipv6-on-a-linux-vps"}}]},{"type":"list-item","text":"How To Add Additional IPv6 Addresses to your Droplet","spans":[{"start":0,"end":52,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-add-additional-ipv6-addresses-to-your-droplet"}}]},{"type":"list-item","text":"How To Configure Your Droplet to Only Use IPv6 Networking","spans":[{"start":0,"end":57,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-configure-your-droplet-to-only-use-ipv6-networking"}}]},{"type":"paragraph","text":"You can also navigate the IPv6 tag for more IPv6 articles and questions in our community","spans":[{"start":79,"end":88,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/"}}]}],"blog_post_date":"2014-08-18","tags":[{"tag1":{"tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}},{"tag1":{"tag":"News","_linkType":"Link.document","_meta":{"uid":"news"}}}],"_meta":{"uid":"announcing-nyc3-with-ipv6-support"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"Ben Uretsky","author_image":{"dimensions":{"width":197,"height":197},"alt":"Ben Uretsky","copyright":null,"url":"https://images.prismic.io/www-static/9c33dc1465bf14e543a18d402452f77970d3b4c1_aaeaaqaaaaaaaa3gaaaajdbmyjgxnzvjlti2zwutnddlzi04mgyxltlhyjfhotnlytgzna.jpg?auto=compress,format"},"_meta":{"uid":"ben_uretsky"}},"blog_header_image":null,"blog_headline":[{"type":"heading1","text":"Network Instability in NYC2 on July 29, 2014","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"Last Tuesday we suffered the second network incident in our New York 2 (NY2) region in the span of a week. This is not acceptable to us, and I want to personally apologize to everyone who was affected.","spans":[]},{"type":"paragraph","text":"At DigitalOcean, one of our core beliefs is that our customers deserve as much transparency as possible. This applies just as much when we have problems as it does when things are going well. With that in mind we'd like to share some details on the incident and our response.","spans":[]},{"type":"paragraph","text":"Our network is designed with a pair of core switches that each of the server racks are connected to. These core switches are also connected to one another and coordinate between themselves to allow a single bonded logical connection to each server rack through both cores. We always have sufficient capacity available on each core switch to handle all of our traffic so that we can continue operating normally if either core switch fails.","spans":[]},{"type":"paragraph","text":"In addition to having fully redundant core switches, we also have redundant routing engines in each core switch. The routing engine is essentially the brain of the switch – it handles management functions and some higher level network protocols. This redundancy is intended to allow us to continue operating with core switch redundancy, even if we have a failure of a single routing engine in either core switch.","spans":[]},{"type":"paragraph","text":"On Tuesday July 29 at 13:09 EST, the solid state disk in the active routing engine failed on one of our core switches. This triggered a failover to the backup routing engine, however the failover was not completely successful. As a result, the coordination that is necessary between the two core switches to present a single bonded link to the server racks was left in an inconsistent state. This, in turn, caused a portion of our network to be unreachable. We discovered the failed routing engine immediately, but it took us nearly an hour to fully understand that the failover was not completed successfully. Once we discovered this, we made the decision to completely isolate the broken core switch from the network moving all traffic over to the remaining core switch.","spans":[]},{"type":"paragraph","text":"The recovery efforts were hampered by a recently discovered problem with the software on our core switches, which we believed may cause problems on the remaining switch if we moved all of our traffic to it. Since we had just finished qualifying a new version of the software in a pre-production environment, we made the decision to apply the update to the unaffected core switch before isolating the failed one. This added approximately 15 minutes to the recovery time, but ultimately put us in a stable position from which to continue operating until we could perform the necessary repairs on the affected switch.","spans":[]},{"type":"paragraph","text":"We have been working around the clock since Tuesday to better understand the failures that happened, return the network to a fully redundant state, and make changes to our configuration and to our standard operating procedures to improve our ability to respond to similar failures in the future.","spans":[]},{"type":"paragraph","text":"First, we repaired the broken core switch and successfully returned it to production restoring core switch redundancy. This was successfully completed on Wednesday evening. We also made the decision to isolate a single core switch from the network a standard troubleshooting procedure when we see similar unexplained traffic loss for part of our network in the future. This should allow us to respond quickly to this type of problem going forward.","spans":[]},{"type":"paragraph","text":"As of Wednesday evening the network has been returned to its original configuration, all devices are fully redundant and functioning normally. We do not expect any further issues to recur at this time. We are confident that our NYC2 region has been stabilized.","spans":[]},{"type":"paragraph","text":"We are working very closely with our networking partner to understand the nature of the failure, assess the chances of a repeat event, and to begin planning architectural changes for the future.","spans":[]},{"type":"paragraph","text":"Our initial focus was on verifying the configuration so we initiated a line-by-line configuration review by engineers at our network partner in order to confirm that we have the most optimal settings for our architecture. Beyond validating the settings, we also asked them to test this configuration in their lab to ensure that it performs as expected on the hardware configuration and software versions that we are currently operating.","spans":[]},{"type":"paragraph","text":"In parallel, we returned the broken routing engine for complete failure analysis and we hope to get more definitive answers about both the cause of the failure and why the backup routing engine was unable to successfully take over. We expect some preliminary findings on this over the next few days.","spans":[]},{"type":"paragraph","text":"Finally, we've scheduled a full network review with the chief architect at our network partner to identify short term tactical changes that can make our network even more stable, as well as longer term architectural changes to support us going forward. We will be reviewing these suggestions early next week and making decisions about how to proceed.","spans":[]},{"type":"paragraph","text":"We know that you rely on us to be online all the time. We appreciate your patience and continued support. We'll do whatever it takes to ensure that your trust is well placed.","spans":[]},{"type":"paragraph","text":"Thank you,","spans":[]},{"type":"paragraph","text":"Ben Uretsky","spans":[]},{"type":"paragraph","text":"CEO, DigitalOcean","spans":[]}],"blog_post_date":"2014-08-01","tags":[{"tag1":{"tag":"News","_linkType":"Link.document","_meta":{"uid":"news"}}}],"_meta":{"uid":"network-instability-in-nyc2-on-july-29-2014"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":400},"alt":"oauth","copyright":null,"url":"https://images.prismic.io/www-static/ea4c857d-93d3-4a3d-b5f3-89b7d4d2e280_oauth_sammy.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Integrate Your Apps With Our API Using OAuth","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"OAuth 2 is now available for applications harnessing the DigitalOcean API, giving developers an easy way to integrate their applications with user accounts. Users can quickly authorize third-party applications with read or read & write access to their DigitalOcean account without exposing personal credentials.","spans":[{"start":57,"end":73,"type":"hyperlink","data":{"link_type":"Web","url":"https://developers.digitalocean.com/v2/"}}]},{"type":"paragraph","text":"Prior to OAuth support, applications that used the API required users to supply their personal access token, a manual and inconvenient process. The new OAuth flow, available in APIv2, is much better suited for web applications, as users can safely and easily provide access to their accounts through a DigitalOcean authorization request page.","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/c29e9aa5778d5f8316a68dec1533a0217339ac6c_authorize_application.png?auto=compress,format","alt":"Authorize Application page","copyright":null,"dimensions":{"width":750,"height":336}},{"type":"paragraph","text":"Additionally, users can view and revoke account access to authorized applications within the DigitalOcean control panel.","spans":[{"start":93,"end":119,"type":"hyperlink","data":{"link_type":"Web","url":"https://cloud.digitalocean.com/settings/applications"}}]},{"type":"heading2","text":"Getting Started","spans":[]},{"type":"paragraph","text":"Since we use Ruby internally, we are providing our open source OAuth strategy for the community to use. The omniauth-digitalocean gem is on Github and published to RubyGems. Based on OmniAuth, the widely used Rack-based library for multi-provider authentication, the gem is an easy way to integrate \"sign in with DigitalOcean\" into Rails and Rack frameworks. We are excited to join the growing list of providers with OmniAuth strategies.","spans":[{"start":108,"end":133,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitaloceancloud/omniauth-digitalocean"}},{"start":183,"end":191,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/intridea/omniauth"}},{"start":386,"end":398,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/intridea/omniauth/wiki/List-of-Strategies"}}]},{"type":"paragraph","text":"We've also developed some community resources to help you get started with OAuth, including a general intro to OAuth 2 and a tutorial on how to use OAuth with DigitalOcean both as a user and as a developer.","spans":[{"start":94,"end":118,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2"}},{"start":137,"end":171,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-use-oauth-authentication-with-digitalocean-as-a-user-or-developer"}}]},{"type":"paragraph","text":"As we continue to refine our new API, we always appreciate any feedback on our API v2 Github page. And if you want to let people know about what you've built, submit your applications to the DigitalOcean projects page. We're excited to highlight the great work of the DO community.","spans":[{"start":79,"end":97,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitaloceancloud/api-v2"}},{"start":191,"end":217,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/projects"}}]}],"blog_post_date":"2014-07-23","tags":[{"tag1":{"tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}},{"tag1":{"tag":"Engineering","_linkType":"Link.document","_meta":{"uid":"engineering"}}}],"_meta":{"uid":"integrate-your-apps-with-our-api-using-oauth"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":750,"height":392},"alt":"london calling","copyright":null,"url":"https://images.prismic.io/www-static/0ed37996-425c-4057-9a7e-8b9fe43ab9b7_london-calling.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Introducing Our London Region (LON1)","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"Today we are thrilled to announce that developers can now launch Droplets in our newest region, London, United Kingdom.","spans":[]},{"type":"paragraph","text":"Our community has been requesting a UK region for a while now, and we're excited to announce that it is now available. It is through our users' support that we have now been able to expand to five regions globally.","spans":[{"start":23,"end":33,"type":"hyperlink","data":{"link_type":"Web","url":"https://digitalocean.uservoice.com/forums/136585-digitalocean/suggestions/3069422-add-uk-data-center"}}]},{"type":"paragraph","text":"London is experiencing a boom in tech and entrepreneurship that looks very similar to NYC's own tech expansion a few years ago, and we want to provide innovative companies in the United Kingdom with the infrastructure they need to grow and succeed. Additionally, we want to ensure that UK developers can comply with data privacy regulations by having a native facility.","spans":[]},{"type":"paragraph","text":"IPv6 and private networking are available for Droplets deployed in the new London region. We are excited to see what is developed in the London datacenter and look forward to offering more DigitalOcean regions around the world as we continue to grow.","spans":[]},{"type":"paragraph","text":"No more waiting. Spin up a Droplet in LON1!","spans":[{"start":17,"end":43,"type":"hyperlink","data":{"link_type":"Web","url":"http://bit.ly/_createdroplet"}}]}],"blog_post_date":"2014-07-14","tags":[{"tag1":{"tag":"News","_linkType":"Link.document","_meta":{"uid":"news"}}}],"_meta":{"uid":"introducing-our-london-region"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"DigitalOcean","author_image":{"dimensions":{"width":600,"height":600},"alt":"Sammy avatar","copyright":null,"url":"https://images.prismic.io/www-static/a10e3c2eb15b74ee43f872be3044313423b1c9a9_sammy_avatar.png?auto=compress,format"},"_meta":{"uid":"digitalocean"}},"blog_header_image":{"dimensions":{"width":784,"height":392},"alt":"new sammy","copyright":null,"url":"https://images.prismic.io/www-static/2fa291f5-16cb-4f48-94ff-2b7b37f2f358_new-sammy-reveal-blog-banner.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Sammy The Shark Gets A Birthday Makeover From Simon Oxley","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"Today we're celebrating our 3rd year since becoming officially incorporated as a company in 2011. So much has happened since then. We went from a small 5 person team to a not-so-small 90 person company. Well actually, we went from a small 5 person team with a shark, to a not-so-small 90 person company… with a shark.","spans":[]},{"type":"paragraph","text":"If you haven't yet met Sammy, he's a big help when talking with our community. He's there when we announce a new datacenter location, when we give thanks for all the love and support, and even when we're partying down at SXSW.","spans":[{"start":98,"end":132,"type":"hyperlink","data":{"link_type":"Web","url":"https://assets.digitalocean.com/blog/static/we-re-excited-to-announce-our-singapore-datacenter-sgp1/"}},{"start":142,"end":182,"type":"hyperlink","data":{"link_type":"Web","url":"https://assets.digitalocean.com/blog/static/happy-thanksgiving-from-sammy-the-turkey/"}},{"start":204,"end":225,"type":"hyperlink","data":{"link_type":"Web","url":"http://vimeo.com/88664728"}}]},{"type":"paragraph","text":"Now, after 3 years, 2 round raises, 2 million Droplets launched, and over 150,000 developers using our platform, Sammy feels a little more grown up.","spans":[]},{"type":"paragraph","text":"So we asked for help from Simon Oxley – designer of graphics and muppet mascots, creator of the original Twitter bird and Github's Octocat – to give Sammy some special treatment. Now Sammy looks amazing and feels better than ever.","spans":[{"start":26,"end":37,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/simonoxleee"}},{"start":122,"end":138,"type":"hyperlink","data":{"link_type":"Web","url":"https://octodex.github.com/"}}]},{"type":"paragraph","text":"Without further ado, here's the new and improved Sammy The Shark:","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/MjFhNjg0NjEtZjc3YS00YWI5LTg3MmQtMDA2NDU0MGVjOTAx_sammytheshark.gif?auto=compress,format","alt":"Sammy Mural","copyright":null,"dimensions":{"width":750,"height":422}},{"type":"paragraph","text":"Here is a closer look at the new Sammy:","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/10508e5ef3ac8b50a3c70252b39abcfdcaf8772f_sammy-normal.png?auto=compress,format","alt":"Sammy","copyright":null,"dimensions":{"width":750,"height":483}},{"type":"paragraph","text":"Just because Sammy lives in the ocean doesn't mean he can't fly :)","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/359d620b30eff181fc504940c280dc81ec2f3b50_sammy-jetpack.png?auto=compress,format","alt":"Sammy Jetpack","copyright":null,"dimensions":{"width":750,"height":483}},{"type":"paragraph","text":"Or float....","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/909f4151ab742bd58f441f397cbbc2d60065ee34_sammy-balloon.png?auto=compress,format","alt":"Sammy Balloon","copyright":null,"dimensions":{"width":750,"height":483}},{"type":"paragraph","text":"What would Sammy look like if he was swimming towards you? #notallthatscary","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/eceebf5d559465963a9c32c4451e15d2a87d0ff0_sammy-front.png?auto=compress,format","alt":"Sammy Front","copyright":null,"dimensions":{"width":750,"height":483}},{"type":"paragraph","text":"Now that's a good lookin' shark.","spans":[]}],"blog_post_date":"2014-07-10","tags":[{"tag1":{"tag":"Community","_linkType":"Link.document","_meta":{"uid":"community"}}}],"_meta":{"uid":"sammy-the-shark-gets-a-birthday-makeover-from-simon-oxley"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"Bryan Liles","author_image":null,"_meta":{"uid":"bryan_liles"}},"blog_header_image":{"dimensions":{"width":750,"height":400},"alt":"gophers digging through the ground illustration with words 'Getting started with Go'","copyright":null,"url":"https://images.prismic.io/www-static/83c59839-f74f-4beb-bc84-0a64c4d1bdf0_Go_Blog.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Get Your Development Team Started With Go","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"Here at DigitalOcean, Go is quickly becoming one of our favorite programming languages. After a few internal debates,  I've distilled a few thoughts that I'd like to share with teams new to Go (or thinking of taking it on in the future).","spans":[{"start":119,"end":123,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/bryanl"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"heading2","text":"Using External Code","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"The Go package landscape is growing every day. People are sharing high quality code that prevents you from having to reinvent the wheel. There are packages that help you with tasks that range from implementing complex algorithms and building networking services to interfacing with other low level systems through the Go C bindings.","spans":[]},{"type":"paragraph","text":"Given what's available, it's still a challenge to locate high quality packages to help you build your projects. Through word of mouth and on social channels (e.g. Twitter), I've found special gems like go-tigertonic and testify. Yes, we could have gotten by without them – but they provide benefits we don't feel the need to replicate in-house.","spans":[{"start":202,"end":215,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/rcrowley/go-tigertonic"}},{"start":220,"end":227,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/stretchr/testify"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"There are also a few package repositories that exist; however, none of them can be considered a standard. There are announcement services like OSS Go, but they aren't helpful if you are looking for something specific.","spans":[{"start":143,"end":149,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/oss_go"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"While this remains an unsolved issue, Go has a secret weapon:","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"The standard library included with Go is incredibly robust, and unless you are looking for something industry specific or niche, there's a high probability the standard library has a complete solution – or the stepping stone to help you build a solution.","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"heading2","text":" Integrating With External Code","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"As you start integrating packages written externally, you should take care to *use* the external packages and not *become* the external package. External API interfaces can change, or your team may decide that it needs to replace backend systems with something more robust. Use Go's interfaces to insulate your application from your imported package's types; in doing this, the focus will shift to fulfilling your project's needs rather than building around a core you don't own or have control over.","spans":[{"start":79,"end":82,"type":"em"},{"start":115,"end":121,"type":"em"}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"As an example, if you're using an external Redis client package, it exports the following:","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"    ```[redis]{`","spans":[]},{"type":"paragraph","text":"     package redis","spans":[]},{"type":"paragraph","text":"    type Redis struct {}","spans":[]},{"type":"paragraph","text":"    func (r *Redis) Get(k string) (*RedisKVPair, error) { // omited}`}```    ","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"You could use this code in your application, but you'll run into two problems: The first problem is that you'll need a Redis server if you ever want to test code that uses this package. The second is that you won't be able to easily upgrade or swap the Redis client out if you require additional functionality.","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Using Go's powerful interfaces, you start specifying the behavior you desire:","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"```[go]{`","spans":[]},{"type":"paragraph","text":"     package myapp","spans":[]},{"type":"paragraph","text":"    type KeyPair struct {","spans":[]},{"type":"paragraph","text":"      Key string","spans":[]},{"type":"paragraph","text":"      Value []byte","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"paragraph","text":"    type KeyStore interface {","spans":[]},{"type":"paragraph","text":"      Get(k string) (*KeyPair, error)","spans":[]},{"type":"paragraph","text":"    }`}```","spans":[]},{"type":"paragraph","text":"Next, you can create your own type that wraps the external dependency:","spans":[]},{"type":"paragraph","text":"    ```[go]{`","spans":[]},{"type":"paragraph","text":"package myapp","spans":[]},{"type":"paragraph","text":"       func NewRedisKeyStore() {","spans":[]},{"type":"paragraph","text":"      return &RedisKeyStore{","spans":[]},{"type":"paragraph","text":"        r: redis.Redis{},","spans":[]},{"type":"paragraph","text":"      }","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"paragraph","text":"    func (rks *RedisKeyStore) Get(k string) (*KeyPair, error) {","spans":[]},{"type":"paragraph","text":"      rkvp, err := rks.r.Get(k)","spans":[]},{"type":"paragraph","text":"      if err != nil {","spans":[]},{"type":"paragraph","text":"        return nil, err","spans":[]},{"type":"paragraph","text":"      }","spans":[]},{"type":"paragraph","text":"      return &KeyPair{","spans":[]},{"type":"paragraph","text":"        Key: rkvp.Key,","spans":[]},{"type":"paragraph","text":"        Value: rkvp.Value,","spans":[]},{"type":"paragraph","text":"      }, nil","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"paragraph","text":"`}```    ","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Finally, instead of using the external Redis client explicitly, you can use your wrapper or swap it out in tests:","spans":[]},{"type":"paragraph","text":"```[go]{`","spans":[]},{"type":"paragraph","text":"    type MockKeyStore struct {","spans":[]},{"type":"paragraph","text":"      Dict map[string][]byte","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"paragraph","text":"    ","spans":[]},{"type":"paragraph","text":"    func NewMockKeyStore() {","spans":[]},{"type":"paragraph","text":"      return &MockKeyStore{","spans":[]},{"type":"paragraph","text":"        Dict: map[string][]byte{},","spans":[]},{"type":"paragraph","text":"      }","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"paragraph","text":"    ","spans":[]},{"type":"paragraph","text":"    func (mks *MockKeyStore) Get(k string) (*KeyPair, error) {","spans":[]},{"type":"paragraph","text":"      return &KeyPair{Key: k, Value: mks.Dict[k]}, nil","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"paragraph","text":"    `}```","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"heading2","text":"Managing Dependencies","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"After a bit of time, packages you rely on will be updated to fix bugs and add new features. You will quickly learn that `go get` is not a robust solution for maintaining and organizing dependencies. There are two solutions here that you can try: vendoring your dependencies or using an external tool such as [godep](https://github.com/tools/godep).","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"The team evaluated vendoring packages but found out quickly that it can be overwhelming. Hence, we are currently leaning towards using godep to manage our dependencies. It provides a method for ensuring that an explicit package is used. Keep in mind it doesn't do so in a declarative manner, so you have to make sure you have the proper version installed prior to saving with godep.","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"While our engineering team has a strong grasp on managing our dependencies, this too remains an unsolved problem. There still isn't a simple, Go community accepted, declarative solution that allows us to specify external dependencies and the exact versions we want to use.  The community is working on it, however, and a few solutions exist for your team to evaluate at the [Go Wiki Tools Page](https://code.google.com/p/go-wiki/wiki/PackageManagementTools).","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"heading2","text":"Writing Go","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"One thing your team may appreciate about Go is that it doesn't require a resource heavy IDE to be productive. You can use your already-familiar text editor and start writing code. If you do this without any research though, you will be missing out on extensions that can help your productivity. I use Sublime Text for writing Go, and the popular GoSublime plugin provides features like code completion and formatting. Other team members use [Vim Go](https://github.com/fatih/vim-go) with large amounts of success.","spans":[{"start":346,"end":355,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/DisposaBoy/GoSublime"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Another tool to keep an eye on is Oracle – it provides source analysis that will aid you in navigating your projects. From evaluating expressions to understanding types and callees, Oracle integration in editors will be a huge productivity boost to developers. You can try it out today if you use Emacs or the Atom package.","spans":[{"start":34,"end":40,"type":"hyperlink","data":{"link_type":"Web","url":"https://godoc.org/code.google.com/p/go.tools/oracle"}},{"start":310,"end":322,"type":"hyperlink","data":{"link_type":"Web","url":"https://atom.io/packages/go-oracle"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Our team has settled on a single workspace with multiple repositories. As mentioned above, it's still the early days of dependency management, but since we ensure that the team works on all projects in a similar manner, multiple people are able to work with multiple projects simultaneously without any major problems.","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"heading2","text":"Deploying Go","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"After writing your software, you'll want to run it in production. Use a tool like fpm to build debs and RPMs and deploy those to your production. You'll get the value of being able to deploy from an internal repository with an explicit version. Since Go compiles down to a single binary, there will be no dependencies to manage.","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"As an example, you can create a Makefile to build a deb:","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"```[go]{` VERSION=0.5.0","spans":[]},{"type":"paragraph","text":"    BUILD=$(shell git rev-list --count HEAD)","spans":[]},{"type":"paragraph","text":"    ","spans":[]},{"type":"paragraph","text":"    widget-dpkg:","spans":[]},{"type":"paragraph","text":"      mkdir -p deb/widget/usr/local/bin","spans":[]},{"type":"paragraph","text":"      cp $(GOPATH)/bin/widget  deb/widget/usr/local/bin","spans":[]},{"type":"paragraph","text":"      fpm -s dir -t deb -n widget -v $(VERSION)-$(BUILD) -C deb/widget .","spans":[]},{"type":"paragraph","text":"`}```    ","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Before thinking of creating packages by hand, consider using your continuous integration system as the builder. This way you'll be guaranteed an up-to-date package after every successful build. We are currently using Drone.IO for continuous integration. We're also moving to Makefiles for automating tasks, which are well known and a great way to ensure that everyone who touches the code can test and build it.","spans":[{"start":217,"end":225,"type":"hyperlink","data":{"link_type":"Web","url":"https://drone.io/"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"heading2","text":"Taking Advantage Of Go's Ecosystem","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"Go provides tools to make it easier to work within its ecosystem. The DO team uses `golint` which finds simple mistakes and ensures that everything has at least a minimal set of documentation. With `godoc` we have an easy to use interface for viewing the documentation for all the code that our projects contain. The Golang Nuts mailing list is an invaluable resource.","spans":[{"start":317,"end":328,"type":"hyperlink","data":{"link_type":"Web","url":"https://groups.google.com/forum/#!forum/golang-nuts"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"So far, our short foray into Go has been a great success. Developers not familiar with the language have ramped up and become productive quickly. The language's speed of development, coupled with its easy-to-grasp concurrency, has allowed to us to write better software in a faster manner. We experimented with Go while rewriting our Droplet Console, and that experience has given us the confidence to move forward on multiple new projects.","spans":[{"start":334,"end":349,"type":"hyperlink","data":{"link_type":"Web","url":"https://assets.digitalocean.com/blog/static/new-super-fast-droplet-console-thanks-golang/"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"If your team hasn't tried Go, it should be on your short list.","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"heading2","text":"Write Go For DO","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"As we continue to write new services, as well as rewrite old ones, we grow a deeper appreciation for the language's strength in building distributed systems. If you're a software engineer that's interested in writing Go – we are hiring.","spans":[{"start":222,"end":235,"type":"hyperlink","data":{"link_type":"Web","url":"https://careers.digitalocean.com/careers/software-engineer/"}}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"*Oh, and if you have experience writing Go, feel free to comment below and share your thoughts.*","spans":[{"start":1,"end":95,"type":"em"}]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"by Bryan Liles","spans":[{"start":3,"end":14,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/bryanl"}}]}],"blog_post_date":"2014-06-30","tags":[{"tag1":{"tag":"Engineering","_linkType":"Link.document","_meta":{"uid":"engineering"}}}],"_meta":{"uid":"get-your-development-team-started-with-go"}}}]}}}