{"componentChunkName":"component---src-templates-author-jsx","path":"/blog/author/asb/","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":0,"numAuthorPages":1,"currentPage":1,"uid":"asb","data":[{"node":{"author":{"_linkType":"Link.document","author_name":"Andrew Starr-Bochicchio","author_image":null,"_meta":{"uid":"asb"}},"blog_header_image":{"dimensions":{"width":1200,"height":628},"alt":null,"copyright":null,"url":"https://images.prismic.io/www-static/5054199c-0f75-4879-8a8b-d845ff634d96_OpenAPI-v2-01.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Introducing the DigitalOcean OpenAPI Specification","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"When v2 of our API first entered general availability in April of 2015, it consisted mainly of features supporting Droplets and domains. Since then, DigitalOcean’s product portfolio has grown, and the surface area of our API has greatly expanded along with it. Today our API supports App Platform, databases, firewalls, Kubernetes, load balancers, and more. Providing over 200 operations, our API enables you to do just about anything you can do in our control panel programmatically.","spans":[{"start":19,"end":53,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/blog/apiv2-officially-leaves-beta/"}}]},{"type":"paragraph","text":"Keeping up with all these changes can be challenging. That’s why we’re excited to announce the release of a new tool to give you confidence when developing against our API: the DigitalOcean OpenAPI Specification.","spans":[]},{"type":"heading2","text":"What Is OpenAPI?","spans":[]},{"type":"paragraph","text":"OpenAPI is an open standard for describing APIs led by the OpenAPI Initiative. As the specification itself reads:","spans":[{"start":59,"end":77,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.openapis.org/"}},{"start":82,"end":106,"type":"hyperlink","data":{"link_type":"Web","url":"http://spec.openapis.org/oas/v3.0.3#introduction"}}]},{"type":"list-item","text":"The OpenAPI Specification (OAS) defines a standard, language-agnostic interface to RESTful APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. When properly defined, a consumer can understand and interact with the remote service with a minimal amount of implementation logic.","spans":[]},{"type":"list-item","text":"An OpenAPI definition can then be used by documentation generation tools to display the API, code generation tools to generate servers and clients in various programming languages, testing tools, and many other use cases.","spans":[]},{"type":"paragraph","text":"Internally, an OpenAPI specification provides engineering teams at DigitalOcean a common language to define and collaborate on API design. It also defines a formal contract that can be tested and monitored, ensuring that our API remains stable. By publicly releasing the specification, it provides customers with new ways to interact with our API.","spans":[]},{"type":"heading2","text":"Open Source","spans":[]},{"type":"paragraph","text":"The source files for our specification are now available on GitHub. The repository also includes tooling to work with the files. For example, to check out the repository and compile the specification into a single file, run:","spans":[{"start":47,"end":66,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/openapi"}}]},{"type":"preformatted","text":"git clone https://github.com/digitalocean/openapi.git","spans":[]},{"type":"preformatted","text":"cd openapi/","spans":[]},{"type":"preformatted","text":"make bundle","spans":[]},{"type":"paragraph","text":"You can use the specification to generate Postman Collections, mock servers, and API clients in languages we do not yet officially support.","spans":[]},{"type":"heading2","text":"Feedback","spans":[]},{"type":"paragraph","text":"The specification is currently in Early Availability. While the specification is accurate, it is still under active development. The structure of this repository may continue to evolve. If you encounter any inaccuracies or have feedback on how it can better suit your use case, please let us know by opening a GitHub issue.","spans":[{"start":300,"end":322,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/apiv2-openapi/issues/new"}}]},{"type":"paragraph","text":"How do you hope to use the specification? What kind of tools would like to see for working with the DigitalOcean API? Let us know in the comments below!","spans":[]}],"blog_post_date":"2021-03-30","tags":[{"tag1":{"tag":"Engineering","_linkType":"Link.document","_meta":{"uid":"engineering"}}}],"_meta":{"uid":"introducing-the-digitalocean-openapi-specification"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"Andrew Starr-Bochicchio","author_image":null,"_meta":{"uid":"asb"}},"blog_header_image":{"dimensions":{"width":1200,"height":600},"alt":null,"copyright":null,"url":"https://images.prismic.io/www-static/587ccdbe-88e0-4278-a9c0-8c18408e764a_image5.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"How to Deploy to DigitalOcean Kubernetes with GitHub Actions","spans":[]}],"blog_post_content":[{"type":"heading4","text":"Update - September 9, 2019:","spans":[]},{"type":"paragraph","text":"The examples in this blog post use the HCL syntax used in the initial version of GitHub Actions. GitHub Actions v2 now uses a new YAML syntax. You can find an updated workflow using the new syntax in the in this example repository.","spans":[{"start":0,"end":231,"type":"strong"},{"start":97,"end":114,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.blog/2019-08-08-github-actions-now-supports-ci-cd/"}},{"start":207,"end":230,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/andrewsomething/example-doctl-action/blob/master/.github/workflows/workflow.yaml"}}]},{"type":"heading2","text":"Introduction","spans":[]},{"type":"paragraph","text":"GitHub Actions were one of the most exciting things launched by our friends at GitHub last year. Now that they're in public beta, people are using them to build awesome stuff, from running tests and linters to more lighthearted use cases. With the DigitalOcean doctl Action, you can interact with all of your DigitalOcean resources.","spans":[{"start":0,"end":14,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/action-doctl"}},{"start":161,"end":174,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/sdras/awesome-actions"}},{"start":215,"end":237,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/jessfraz/shaking-finger-action"}},{"start":248,"end":273,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/action-doctl"}}]},{"type":"paragraph","text":"One of the most powerful aspects of GitHub Actions is the ability to compose workflows using multiple Actions to accomplish complicated tasks. In this post, we’ll show what that looks like in practice.","spans":[]},{"type":"paragraph","text":"Using multiple Actions, including ones for DigitalOcean and Docker, we’ll build a simple continuous delivery pipeline that deploys an application to a DigitalOcean Kubernetes cluster on push to the master branch of a GitHub repository. Along the way, we’ll dig into some of the details of working with GitHub Actions.","spans":[{"start":151,"end":182,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/products/kubernetes/"}}]},{"type":"heading2","text":"Creating Your Workflow","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/65f9f2b0-2464-4e5d-ac9e-b94693e8f464_image2.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":1849,"height":858}},{"type":"paragraph","text":"The first step in using GitHub Actions is to create a workflow. You can do this from the Actions tab of your GitHub repository. This is where you define what will trigger a run of your workflow. ","spans":[]},{"type":"paragraph","text":"Nearly any GitHub event can be used from a new PR being opened to a new release being tagged. In our example, we’ll be using the “push” event so that our workflow is executed when a new commit is pushed to the master branch.","spans":[{"start":0,"end":23,"type":"hyperlink","data":{"link_type":"Web","url":"https://developer.github.com/actions/managing-workflows/workflow-configuration-options/#events-supported-in-workflow-files"}}]},{"type":"image","url":"https://images.prismic.io/www-static/77c1578a-03c6-4b3e-9fe5-532c99fc0bcf_image1-1.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":289,"height":153}},{"type":"paragraph","text":"This will create a new file in your repository at .github/main.workflow with the following contents:","spans":[]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    workflow \"New workflow\" {  ","spans":[]},{"type":"paragraph","text":"      on = \"push\"","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"This highlights an important aspect of GitHub Actions. While workflows can be created and edited using the GitHub GUI, they are configured in code using HCL – the same format used by tools like [HashiCorp’s Terraform](https://www.terraform.io/). Each change made in the GUI is mirrored in the file and will be committed to the repository. This allows you to edit your workflows offline and collaborate on them via pull requests. For the rest of this post, we’ll mostly be showing the examples as code so that it is easier to see the details of how all the pieces fit together.","spans":[]},{"type":"heading2","text":"Defining Your First Action","spans":[]},{"type":"paragraph","text":"Our repository contains a Dockerfile in its root directory that defines how to build and run our application. In order to keep our example simple and focused on the workflow rather than the details of the application, our “application” is just a static site served by NGINX. The first Action block that we’ll define will build a container image from this Dockerfile:","spans":[{"start":26,"end":36,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/andrewsomething/example-doctl-action/blob/master/Dockerfile"}}]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    action \"Build Docker image\" {  ","spans":[]},{"type":"paragraph","text":"      uses = \"actions/docker/cli@master\"","spans":[]},{"type":"paragraph","text":"      args = [\"build\", \"-t\", \"andrewsomething/static-example:$(echo $GITHUB_SHA | head -c7)\", \".\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"The first line is just a label for the block; the interesting bits are inside. The ```[php]{`uses`}``` line specifies the Action that will be run. The path used to reference the Action matches its location on GitHub. For instance, here we are using the Docker CLI Action which can be found in the cli/ directory of the github.com/actions/docker repository. This Action is a wrapper around the same Docker CLI tool that you would use on the command line locally. ","spans":[{"start":319,"end":355,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/actions/docker/tree/master/cli"}}]},{"type":"paragraph","text":"If you have ever built a Docker image, the next line should look familiar. The ```[php]{`args`}``` line is just what it sounds like. Here we can pass arguments to the Docker command needed to build the image.","spans":[]},{"type":"paragraph","text":"When we build the image, we are tagging it so that we can push it to Docker Hub. If you are following along, make sure to replace \"andrewsomething\" with your own username. You probably noticed that we are using the $GITHUB_SHA environment variable as part of the tag. Its value is the SHA of the commit that triggered the workflow. It is one of a number of variables made available in the Action’s runtime environment. ","spans":[{"start":347,"end":366,"type":"hyperlink","data":{"link_type":"Web","url":"https://developer.github.com/actions/creating-github-actions/accessing-the-runtime-environment/#environment-variables"}}]},{"type":"heading2","text":"Using Secrets","spans":[]},{"type":"paragraph","text":"Often you will need to store secrets that your Action will require in order to run. Our next Action block demonstrates this. To push the image we built to Docker Hub, we will first need to log in. Using the `secrets` line of an Action block, we can securely pass the needed information as environment variables:  ","spans":[]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    action \"Docker Login\" {  ","spans":[]},{"type":"paragraph","text":"      uses = \"actions/docker/login@master\"","spans":[]},{"type":"paragraph","text":"      secrets = [\"DOCKER_USERNAME\", \"DOCKER_PASSWORD\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"The contents of these secrets can be configured in the GitHub GUI:","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/7298f06d-eb92-40f5-b859-0cc15eb6d928_image3.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":340,"height":311}},{"type":"paragraph","text":"While we’re here, we will also specify a ```[php]{`DIGITALOCEAN_ACCESS_TOKEN`}``` secret using a personal access token generated from the API section of the DigitalOcean Control Panel. We’ll be using this in a later step.","spans":[{"start":138,"end":183,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/docs/api/create-personal-access-token/"}}]},{"type":"heading2","text":"Specifying Dependencies","spans":[]},{"type":"paragraph","text":"In the next step of our workflow, we’ll push the Docker image to Docker Hub. This looks similar to the previous Action blocks, but this time we have a new line:","spans":[]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    action \"Push image to Docker Hub\" {  ","spans":[]},{"type":"paragraph","text":"      needs = [\"Docker Login\", \"Build Docker image\"]","spans":[]},{"type":"paragraph","text":"      uses = \"actions/docker/cli@master\"","spans":[]},{"type":"paragraph","text":"      args = [\"push\", \"andrewsomething/static-example\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"Multiple Action blocks may run in parallel. In this case, we need to ensure that the Docker image has been built and that we have logged into Docker Hub before we can push it there. So we’ve specified a `needs` line referencing the labels for those two Action blocks so that they will be executed in the correct order.","spans":[]},{"type":"heading2","text":"Accessing Your Workspace","spans":[]},{"type":"paragraph","text":"The config directory of our repository contains a Kubernetes YAML file specifying our deployment. As committed in git, there is only a placeholder for the Docker image that we want to deploy. It will need to be updated to point to the image we’ve tagged and pushed to Docker Hub. To do this, we’ll use the Shell Action provided by GitHub. Based on Debian, it includes all the standard UNIX tools you’d expect. Here we’re using ```[php]{`sed`}``` to update the contents of our deployment file:","spans":[{"start":61,"end":96,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/andrewsomething/example-doctl-action/blob/master/config/deployment.yml"}},{"start":306,"end":318,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/actions/bin/tree/master/sh"}}]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    action \"Update deployment file\" {  ","spans":[]},{"type":"paragraph","text":"      needs = [\"Push image to Docker Hub\"]","spans":[]},{"type":"paragraph","text":"      uses = \"actions/bin/sh@master\"","spans":[]},{"type":"paragraph","text":"      args = [\"TAG=$(echo $GITHUB_SHA | head -c7) && sed -i 's|<IMAGE>|andrewsomething/static-example:'${TAG}'|' $GITHUB_WORKSPACE/config/deployment.yml\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"This demonstrates another important environment variable available to you, ```[php]{`$GITHUB_WORKSPACE`}```. This directory contains a copy of the repository that triggered the workflow. Changes made here will persist from one step to the next.","spans":[]},{"type":"heading2","text":"Deploying to DigitalOcean Kubernetes","spans":[]},{"type":"paragraph","text":"In our next step, we’ll retrieve the credentials needed to access our Kuberenetes cluster using the DigitalOcean doctl Action. This Action enables you to use any doctl sub-command just like from the command line giving you access to all of your DigitalOcean resources. Using the ```[php]{`DIGITALOCEAN_ACCESS_TOKEN`}``` secret we configured earlier, we will save the kubeconfig file for our cluster:","spans":[{"start":113,"end":125,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/action-doctl"}}]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    action \"Save DigitalOcean kubeconfig\" {  ","spans":[]},{"type":"paragraph","text":"      uses = \"digitalocean/action-doctl@master\"","spans":[]},{"type":"paragraph","text":"      secrets = [\"DIGITALOCEAN_ACCESS_TOKEN\"]","spans":[]},{"type":"paragraph","text":"      args = [\"kubernetes cluster kubeconfig show actions-example > $HOME/.kubeconfig\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"Next, we’ll configure an Action block using ```[php]{`kubectl`}``` to apply the actual deployment:","spans":[]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    action \"Deploy to DigitalOcean Kubernetes\" {  ","spans":[]},{"type":"paragraph","text":"      needs = [\"Save DigitalOcean kubeconfig\", \"Update deployment file\"]","spans":[]},{"type":"paragraph","text":"      uses = \"docker://lachlanevenson/k8s-kubectl\"","spans":[]},{"type":"paragraph","text":"      runs = \"sh -l -c\"","spans":[]},{"type":"paragraph","text":"      args = [\"kubectl --kubeconfig=$HOME/.kubeconfig apply -f $GITHUB_WORKSPACE/config/deployment.yml\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"You’ll notice something new in this block demonstrating just how flexible GitHub Actions can be. In this case, the `uses` line is not specifying an Action on GitHub like our previous steps. Instead, it is referencing a container image hosted on DockerHub. This opens up a whole world of tools not packaged as Actions for use in your workflow.","spans":[{"start":205,"end":234,"type":"hyperlink","data":{"link_type":"Web","url":"https://developer.github.com/actions/managing-workflows/workflow-configuration-options/#using-a-dockerfile-image-in-an-action"}}]},{"type":"heading2","text":"Verifying the Deployment","spans":[]},{"type":"paragraph","text":"In the final step of our workflow, using the same kubectl Docker image, we will check on the status of our deployment. The kubectl rollout status command returns a zero exit code when a deployment was successful:","spans":[{"start":123,"end":153,"type":"hyperlink","data":{"link_type":"Web","url":"https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#complete-deployment"}}]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    action \"Verify deployment\" {  ","spans":[]},{"type":"paragraph","text":"      needs = [\"Deploy to DigitalOcean Kubernetes\"]","spans":[]},{"type":"paragraph","text":"      uses = \"docker://lachlanevenson/k8s-kubectl\"","spans":[]},{"type":"paragraph","text":"      runs = \"sh -l -c\"","spans":[]},{"type":"paragraph","text":"      args = [\"kubectl --kubeconfig=$HOME/.kubeconfig rollout status deployment/static-example\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"If the deployment fails, it returns a non-zero exit code. So that the status of our workflow will correctly reflect whether or not our application was successfully deployed, we will return to our workflow block from the first step and add a new ```[php]{`resolves`}``` line:","spans":[]},{"type":"preformatted","text":"```[php]{`","spans":[]},{"type":"paragraph","text":"    workflow \"New workflow\" {  ","spans":[]},{"type":"paragraph","text":"      on = \"push\"","spans":[]},{"type":"paragraph","text":"      resolves = [\"Verify deployment\"]","spans":[]},{"type":"paragraph","text":"    }","spans":[]},{"type":"preformatted","text":"`}```","spans":[]},{"type":"paragraph","text":"Since our \"Verify deployment\" Action depends on all of our other Actions, we can specify it here alone. If our workflow contained completely independent Actions, we’d want to include each of them here.","spans":[]},{"type":"heading2","text":"Bringing It All Together","spans":[]},{"type":"paragraph","text":"Now that we’ve successfully configured our workflow, each time a commit is pushed to the master branch of our repository it will be triggered. Each step will run in the order that we specified. The GitHub GUI will display the progress:","spans":[]},{"type":"image","url":"https://images.prismic.io/www-static/ca1f3803-92dc-4ba1-9f54-e2d2ce1202d1_image4.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":701,"height":898}},{"type":"paragraph","text":"With everything green, our site is now live: https://doctl-action.do-api.dev/","spans":[{"start":45,"end":77,"type":"hyperlink","data":{"link_type":"Web","url":"https://doctl-action.do-api.dev/"}}]},{"type":"paragraph","text":"You can find the complete workflow file with the full end-to-end example on GitHub.","spans":[{"start":49,"end":72,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/andrewsomething/example-doctl-action/blob/master/.github/main.workflow"}}]},{"type":"heading2","text":"Next Steps","spans":[]},{"type":"paragraph","text":"GitHub Actions allow you to craft powerful workflows integrating multiple Actions to accomplish complicated tasks. In this post, we’ve only scratched the surface of what they can do. With the doctl Action, you can incorporate your DigitalOcean resources into your workflows. Here are a few resources to help you get started building your own:","spans":[]},{"type":"list-item","text":"Check out the source for the DigitalOcean doctl Action on GitHub.","spans":[{"start":29,"end":54,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/action-doctl"}}]},{"type":"list-item","text":"Dig into Actions in more detail with GitHub's Actions Documentation.","spans":[{"start":37,"end":67,"type":"hyperlink","data":{"link_type":"Web","url":"https://developer.github.com/actions/managing-workflows/"}}]},{"type":"list-item","text":"Run your GitHub Actions locally with act. Great for debugging!","spans":[{"start":0,"end":41,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/nektos/act"}}]},{"type":"paragraph","text":"In this post we mostly focused on the GitHub Actions side of the equation. If you’re looking for more info on working with Kubernetes, the DigitalOcean Kubernetes Resource Center is a great place to start.","spans":[{"start":139,"end":178,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/resources/kubernetes/"}}]},{"type":"paragraph","text":"We’d love to know how you are using GitHub Actions. So let us know in the comments below! Are there other Actions for DigitalOcean that you’d like to see? Share your feedback and requests by opening an issue on GitHub.","spans":[{"start":191,"end":217,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/action-doctl/issues"}}]}],"blog_post_date":"2019-04-24","tags":[{"tag1":{"tag":"Engineering","_linkType":"Link.document","_meta":{"uid":"engineering"}}}],"_meta":{"uid":"how-to-deploy-to-digitalocean-kubernetes-with-github-actions"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"Andrew Starr-Bochicchio","author_image":null,"_meta":{"uid":"asb"}},"blog_header_image":{"dimensions":{"width":784,"height":418},"alt":"Squares and droplets illustration","copyright":null,"url":"https://images.prismic.io/www-static/9c52b92f36b36421056d9affc3d1d6f5815ff852_terraform_social_blog.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Introducing the DigitalOcean Terraform Provider","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"Terraform provides you with a safe and predictable way to create, change, and version your infrastructure. It has become an essential part of many DigitalOcean users' workflow, and we want to ensure it receives the support it deserves. That's why we were so excited to release version 1.0.0 of the DigitalOcean Terraform Provider. This release marks a major milestone: the first since DigitalOcean took ownership of the project and a declaration of our commitment to support its continued development.","spans":[{"start":298,"end":329,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.terraform.io/docs/providers/do/index.html"}}]},{"type":"paragraph","text":"The release is full of new features, improvements, and bug fixes. Here are some highlights:","spans":[]},{"type":"list-item","text":"New attachment resources for both volumes and floating IPs allowing you to better handle their life cycles separate from Droplets.","spans":[]},{"type":"list-item","text":"Ten new data sources allowing you to reference existing resources not managed by Terraform.","spans":[]},{"type":"list-item","text":"Support for recent DigitalOcean features like Let’s Encrypt certificates, auto-formatting for volumes, and CAA domain records.","spans":[]},{"type":"list-item","text":"And improvements to existing resources like volumes which now support resizing and creating from snapshots.","spans":[]},{"type":"paragraph","text":"You can find the full changelog here.","spans":[{"start":17,"end":36,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/terraform-providers/terraform-provider-digitalocean/blob/master/CHANGELOG.md#100-september-27-2018"}}]},{"type":"paragraph","text":"Special thanks to all the community contributors that helped make this release possible: Aaron (slapula), Arve Knudsen (aknuds1), Nikolai Zujev (jaymecd), Piotr Grzesik (pgrzesik), Justin (justinbarrick), jonnydford, and Leandro López (inkel).","spans":[{"start":96,"end":103,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/slapula"}},{"start":120,"end":127,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/aknuds1"}},{"start":145,"end":152,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/jaymecd"}},{"start":170,"end":178,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/pgrzesik"}},{"start":189,"end":202,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/justinbarrick"}},{"start":205,"end":215,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/jonnydford"}},{"start":236,"end":241,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/inkel"}}]},{"type":"heading3","text":"HashiConf 2018","spans":[]},{"type":"paragraph","text":"To keep up on all the latest Terraform developments and hear your feedback face-to-face, next week we’ll be attending HashiConf in San Francisco, October 22 to 24. Find me at our booth with the rest of the DigitalOcean crew.","spans":[{"start":118,"end":127,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.hashiconf.com/"}}]},{"type":"paragraph","text":"DigitalOcean’s Eddie Zaneski will be sharing some lessons learned in building a Terraform provider in his talk, “Creating a Terraform Provider for Just About Anything,” at 2:35 PM PST in the Gold Room on Tuesday, October 23.","spans":[{"start":113,"end":166,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.hashiconf.com/speakers#eddie-zaneski"}}]},{"type":"paragraph","text":"Terraform is an amazing tool that lets you define your infrastructure as code. Under the hood it's an incredibly powerful state machine that makes API requests and marshals resources. In this talk we'll dive into the inner workings of Terraform and examine all the elements of a provider — from the documentation to the test suite. You'll walk away with the knowledge of how to contribute to an existing provider or create your own from scratch. We'll also take a look at some of the things we encountered while working on the DigitalOcean provider and the lessons learned from the community.","spans":[{"start":0,"end":592,"type":"em"}]},{"type":"heading3","text":"Get Started with Terraform","spans":[]},{"type":"paragraph","text":"Whether you’re new to Terraform or looking to learn more, here are some recommended resources to dive into:","spans":[]},{"type":"list-item","text":"How To Use Terraform with DigitalOcean:\nLearn the basics of using Terraform in this tutorial on the DigitalOcean community site. It starts from square one and walks you through creating an infrastructure project consisting of two Nginx servers that are load balanced by an HAProxy server.","spans":[{"start":0,"end":38,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean#"}}]},{"type":"paragraph","text":"","spans":[{"start":0,"end":0,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.youtube.com/watch?v=FZjy5ZNIxvI"}}]},{"type":"image","url":"https://images.prismic.io/www-static/b79686e3e9005f6c2937110326efce867ea9b719_youtube.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":1122,"height":558}},{"type":"list-item","text":"Collaborating on Infrastructure:\nEarlier this year, HashiCorp Developer Advocate Nic Jackson joined us for TIDE NYC, a day of tech talks at DigitalOcean HQ. His talk focused on using Terraform for collaborating on infrastructure in a team setting, including bringing the GitFlow approach to your infrastructure and using DigitalOcean Spaces for keeping state.","spans":[{"start":0,"end":31,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.youtube.com/watch?v=FZjy5ZNIxvI"}},{"start":81,"end":92,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/@sheriffjackson"}},{"start":107,"end":155,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.youtube.com/playlist?list=PLseEp7p6EwibAnWVIxSp6NoVu9gFfECwm"}}]},{"type":"paragraph","text":"","spans":[{"start":0,"end":0,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.youtube.com/playlist?list=PLtK75qxsQaMIHQOaDd0Zl_jOuu1m3vcWO"}}]},{"type":"image","url":"https://images.prismic.io/www-static/c8c73d706d0cd634939a050da315369217ee216d_intro_to.png?auto=compress,format","alt":null,"copyright":null,"dimensions":{"width":1280,"height":720}},{"type":"list-item","text":"Terraform Basics: Dave C’s tutoriaLinux YouTube channel is home to some amazing DevOps and programing content including his five-part Terraform Mini-Course. These easy to follow videos are a great introduction to Terraform.","spans":[{"start":0,"end":16,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.youtube.com/playlist?list=PLtK75qxsQaMIHQOaDd0Zl_jOuu1m3vcWO"}},{"start":27,"end":55,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/tutorialinux"}}]},{"type":"list-item","text":"Zero Downtime Updates with HashiCorp Terraform: \nNic Jackson is back; this time with an introduction to managing the lifecycle of your infrastructure resources using the DigitalOcean Terraform provider. He’ll show us how to avoid downtime caused by updates and allow uninterrupted replacement of resources.","spans":[{"start":0,"end":46,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.hashicorp.com/blog/zero-downtime-updates-with-terraform"}}]},{"type":"list-item","text":"DigitalOcean Terraform Provider - Reference Documentation: \nFinally, check out the full reference documentation for all the details.","spans":[{"start":0,"end":57,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.terraform.io/docs/providers/do/index.html"}}]},{"type":"paragraph","text":"Andrew Starr-Bochicchio is an open source enthusiast and was DigitalOcean's first full-time community manager. Now he serves as a Product Manager in our Developer Experience group focused on our API. Follow Andrew on Twitter @astarrb.","spans":[{"start":0,"end":234,"type":"em"},{"start":225,"end":233,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.twitter.com/astarrb"}}]}],"blog_post_date":"2018-10-22","tags":[{"tag1":{"tag":"Product Updates","_linkType":"Link.document","_meta":{"uid":"product-updates"}}}],"_meta":{"uid":"introducing-the-digitalocean-terraform-provider"}}},{"node":{"author":{"_linkType":"Link.document","author_name":"Andrew Starr-Bochicchio","author_image":null,"_meta":{"uid":"asb"}},"blog_header_image":{"dimensions":{"width":784,"height":418},"alt":"Two hands doing a high five illustration","copyright":null,"url":"https://images.prismic.io/www-static/927dd10154d9cbfe5c4578de0d408bb1797bb471_developer_advocates_blog.png?auto=compress,format"},"blog_headline":[{"type":"heading1","text":"Introducing Community Doers: March Edition","spans":[]}],"blog_post_content":[{"type":"paragraph","text":"Here at DigitalOcean one of our core values is \"our community is bigger than just us\". From our support of the broader open source community to making our tutorials as platform agnostic as possible, we believe that contributing knowledge and resources to the community benefits not just ourselves but all members – past, present, and future.","spans":[{"start":155,"end":164,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/tutorials"}}]},{"type":"paragraph","text":"We never could have anticipated the amazing amount of support we've received in return. You’ve built open source tools using our API, hosted Meetups across the globe, shared your DigitalOcean stories, and so much more. We wouldn’t be where we are today without you.","spans":[{"start":101,"end":118,"type":"hyperlink","data":{"link_type":"Web","url":"https://developers.digitalocean.com/libraries/"}},{"start":134,"end":148,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.meetup.com/pro/digitalocean/"}},{"start":167,"end":199,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/customers/"}}]},{"type":"paragraph","text":"We're now six years into this journey and want to start recognizing our members more regularly. So today we are excited to highlight some of our most active Community contributors—our Doers!","spans":[{"start":184,"end":189,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community#do-ers"}}]},{"type":"heading3","text":"Marko Mudrinić (@xmudrii)","spans":[]},{"type":"paragraph","text":"It’s hard to overstate just how lucky we are to have people like Marko in our Community; he’s an all around rockstar whose contributions span from ocean to ocean. Marko is one of the most prolific users on our Community Q&A platform, where he helps users learn about and build on DigitalOcean. He’s written tutorials on topics like Prometheus and Go, but also puts that knowledge into practice. He is the most active contributor to doctl, our open source command line interface, and has worked extensively on DigitalOcean support in Kubicorn to help users get up and running with Kubernetes.","spans":[{"start":65,"end":70,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/users/xmudrii?primary_filter=tutorials"}},{"start":210,"end":232,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/questions"}},{"start":432,"end":437,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/digitalocean/doctl"}},{"start":533,"end":541,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/kris-nova/kubicorn"}}]},{"type":"heading3","text":"Mateusz Papiernik (@maticomp)","spans":[]},{"type":"paragraph","text":"Mateusz's passion for giving back to the Community inspires us. He has been sharing his technical expertise with us for many years, which you can enjoy in the dozens of tutorials he has published on topics from ProxySQL to Nginx optimization. With even more in the works, he has already helped hundreds of thousands of readers. His genuine enthusiasm and drive to aid others shines through in his writing and his collaboration with our editorial team.","spans":[{"start":0,"end":9,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/users/mati"}}]},{"type":"heading3","text":"Peter Hsu (@peterdavehello)","spans":[]},{"type":"paragraph","text":"Peter is an open source enthusiast who is always going above and beyond. He has traveled across Taiwan to share DigitalOcean with his community—from COSCUP in Taipei to MOPCON in Kaohsiung. As the maintainer of the CDNJS (a free, public, and open-source CDN service), he helps to power millions of websites across the globe. Closer to home, he is an organizer of the DigitalOcean Meetup group in Hsinchu, Taiwan, which is quickly approaching 600 members. With nine events in 2017—including the first Hacktoberfest event of the year—it’s one of our most active Meetups!","spans":[{"start":0,"end":5,"type":"hyperlink","data":{"link_type":"Web","url":"https://twitter.com/peterdavehello"}},{"start":367,"end":411,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.meetup.com/DigitalOceanHsinchu/"}}]},{"type":"paragraph","text":"Marko, Mateusz, and Peter exemplify some of the best qualities found in our community. All three share our enthusiasm for open source and passion for knowledge-sharing. But they’re not alone! We look forward to recognizing more of our amazing Community members in the coming months.","spans":[]},{"type":"paragraph","text":"Are you interested in getting more involved in the DigitalOcean Community? Here are a few places to start:","spans":[]},{"type":"list-item","text":"Share a project that you’ve built with our API.","spans":[{"start":0,"end":15,"type":"hyperlink","data":{"link_type":"Web","url":"http://www.digitalocean.com/community/projects"}}]},{"type":"list-item","text":"Share your knowledge in our Community Q&A section.","spans":[{"start":28,"end":49,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/questions"}}]},{"type":"list-item","text":"Join our Write for DigitalOcean program and contribute to our library of tutorials.","spans":[{"start":9,"end":39,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.digitalocean.com/community/write-for-digitalocean"}}]},{"type":"list-item","text":"Get involved in your local DigitalOcean Meetup or start your own.","spans":[{"start":21,"end":46,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.meetup.com/pro/digitalocean/"}},{"start":50,"end":64,"type":"hyperlink","data":{"link_type":"Web","url":"https://do.co/cometomycity"}}]}],"blog_post_date":"2018-03-07","tags":[{"tag1":{"tag":"Community","_linkType":"Link.document","_meta":{"uid":"community"}}}],"_meta":{"uid":"introducing-community-doers-march-edition"}}}]}}}