{"@attributes":{"version":"2.0"},"channel":{"title":"vsupalov.com","link":"https:\/\/vsupalov.com\/","description":"Recent content on vsupalov.com","generator":"Hugo -- gohugo.io","language":"en","lastBuildDate":"Mon, 01 Sep 2025 00:00:00 +0000","item":[{"title":"About","link":"https:\/\/vsupalov.com\/about\/","pubDate":"Sat, 04 Apr 2026 12:00:00 +0200","guid":"https:\/\/vsupalov.com\/about\/","description":"I help bootstrapped founders and solo owners who already have a digital business that works.\nUsually that means a website, SaaS, app or other internet-based asset that is already bringing in revenue, but still relies too much on tribal knowledge, manual operations or hope.\nThat stage is often awkward:\nthe product is good enough to matter the business is real enough to protect but the operational foundation is still improvised That is where I like to work."},{"title":"A List of Terminal-Friendly Tools","link":"https:\/\/vsupalov.com\/cli-tools-2025\/","pubDate":"Mon, 01 Sep 2025 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/cli-tools-2025\/","description":"This post is a note to myself. There are a few CLI\/TUI tools I have grown fond of over the years, but haven&rsquo;t captured anywhere yet. I intend to expand this as the year goes on.\nNix(OS) A great way to capture system-wide configuration and make it reproducible. It&rsquo;s a joy to be able to list all the packages I actually use and be sure only they are installed.\nBonus points on adding tools per-project as needed."},{"title":"Catching Up on 5 Years of Docker Updates","link":"https:\/\/vsupalov.com\/catching-up-on-docker\/","pubDate":"Sun, 06 Aug 2023 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/catching-up-on-docker\/","description":"Okay, how much has Docker has changed since 2018?\nSometimes you are so comfortable with a tool, it fades into the background. You don&rsquo;t even notice that it is moving and changing, while you are happily using it - after all, it&rsquo;s doing everything you want from it, and it does not get in the way.\nThis is pretty much what has happened to me and Docker.\nOccasionally, single topics like nifty features of BuildKit have caught my attention, but I have not taken the time to follow all developments."},{"title":"Tailwind CSS For Non-Designers","link":"https:\/\/vsupalov.com\/tailwindcss-for-non-designers\/","pubDate":"Wed, 19 Jul 2023 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/tailwindcss-for-non-designers\/","description":"It has happened. I have recently gotten what Tailwind CSS is about. Working with it has become a breeze, instead of copying code and hoping for the best.\nDon&rsquo;t get me wrong - I don&rsquo;t have a complete grasp of it, nor did I dive into more advanced topics yet! However, I feel confident to have generated enough understanding to code up almost any project I want with it.\nIf you are a backend developer approaching Tailwind CSS (or a fellow ops-kin curious about giving it a try), you have come to the right place!"},{"title":"Demystifying The Linux Desktop Environment","link":"https:\/\/vsupalov.com\/demystifying-linux-desktop\/","pubDate":"Sat, 18 Mar 2023 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/demystifying-linux-desktop\/","description":"Recently, I wondered how a Linux desktop environment that really fit my needs would look like.\nWell, okay. I was bored and could not do much else being sick, so the only thing left was idle reading and tinkering in between bouts of tiredness.\nI learned a lot! And I think it could be fun to share what I have discovered while playing around.\nInto The Unknown In recent years, I was using Ubuntu for my desktop\/working needs."},{"title":"Demystifying 'The Kernel'","link":"https:\/\/vsupalov.com\/demystifying-kernel\/","pubDate":"Fri, 03 Mar 2023 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/demystifying-kernel\/","description":"&lsquo;The Kernel&rsquo; is a ominous sounding term which sometimes comes up when you talk about containers. To me, it felt a bit hand-wavy at times. Whenever it came up it was as a side-note. With the intention to move towards the actual topic right after. Understanding was assumed. Or at least there was a silent agreement that nobody had the intention to go any closer to the topic.\n&ldquo;Containers share &lsquo;The Kernel&rsquo; of the host you see."},{"title":"ZFS Basics","link":"https:\/\/vsupalov.com\/zfs-basics\/","pubDate":"Thu, 02 Feb 2023 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/zfs-basics\/","description":"ZFS is one of the technologies I have gotten to know a bit better recently (the other one being Nix, but more on that in another article).\nI would like to share what I learned, what got me interested and why I think ZFS is worth learning about.\nWhat is ZFS for? The glorious Arch Wiki has a great description of the benefits and technical parameters of ZFS. Here are a few key quotes: it is &ldquo;an advanced filesystem&rdquo; and &ldquo;described as &lsquo;The last word in filesystems&rsquo;&rdquo;."},{"title":"Generating HN Titles Using Markov Chains In Python","link":"https:\/\/vsupalov.com\/generate-hn-titles-markov-chain\/","pubDate":"Wed, 04 May 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/generate-hn-titles-markov-chain\/","description":"A simple way to create a machine learning model which can generate text are markov chains.\nI had to adjust my workflows at this point, because just loading the whole dataset into memory started causing performance issues&hellip; So filtering submissions while loading them from disk was the way to go.\nHaving all HN submission titles, it was pretty quick to filter out successful submissions (ones which received at least a few comments or upvotes), and provide them to a ready-made markov chain library - markovify."},{"title":"Frequent Suffixes And Prefixes In HN Titles","link":"https:\/\/vsupalov.com\/frequent-hn-title-suffixes-prefixes\/","pubDate":"Thu, 28 Apr 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/frequent-hn-title-suffixes-prefixes\/","description":"I&rsquo;ve recently started to play around with HN data. A first look at the first 10 years was interesting enough. But now that the dataset is almost complete, I wanted to dive a bit deeper.\nWhat are frequent suffixes and prefixes of HN submission titles?\nNote: the analyzed dataset isn&rsquo;t quite complete, but large enough to be representative at this point. We have 3 million submitted posts to work on."},{"title":"The First 10 Years Of HN In Data","link":"https:\/\/vsupalov.com\/first-10-years-hn-data\/","pubDate":"Mon, 25 Apr 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/first-10-years-hn-data\/","description":"I&rsquo;ve recently started to play around with HN data. Here are a few interesting things I found while getting to know the dataset.\nThe Data You can read about the data here.\nAt the time of writing, there are about 31.150.000 entries. Every single comment, story or other type of post have an index, starting with&hellip;\nThe First Entry No need to go to the raw data for this. You can simply open it using https:\/\/news."},{"title":"Notes On Building A 'HN Data Project'","link":"https:\/\/vsupalov.com\/building-hn-data-project\/","pubDate":"Thu, 21 Apr 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/building-hn-data-project\/","description":"I&rsquo;ve had a few sessions of looking around HN data. Gathering recent comments and stories to be processed, building a web app around it.\nIt seems to be a fun data playground \/ learning project, so I&rsquo;d like to take it seriously.\nThe following are my working notes. The current idea is to have a mix of work-log-like entries, and notes around topics, and to refine them over time. Sometimes Sections will be left out as &ldquo;to be filled in&rdquo;, sometimes notes will become articles."},{"title":"A Journey Through Mathematical Subfields","link":"https:\/\/vsupalov.com\/math-subfields\/","pubDate":"Wed, 13 Apr 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/math-subfields\/","description":"When I discovered the spark of &lsquo;getting&rsquo; mathematics for myself, I couldn&rsquo;t get but try and get an overview. Find out what&rsquo;s within mathematics.\nThere are a lot of interesting and fascinating subfields!\nThis is an attempt to share my curiosity and new-found appreciation for the field of mathematics. I hope, that the spark can be shared.\nWarning: the following list is a selective transcription of the articles above. This is the part most likely to be wrong-ish."},{"title":"Understanding How Scientific Papers Are Structured","link":"https:\/\/vsupalov.com\/structure-of-papers\/","pubDate":"Wed, 13 Apr 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/structure-of-papers\/","description":"It took a while for me to get a real understanding of what math is about.\nI also did not understand the reasons behind the structure of scientific papers. When putting in the work for University, I was following the patterns I saw. Applying them mechanically, imitating what I saw.\nI was missing a deeper understanding. I only understood it years later, when reading about a fictional conversation.\nWhat Made If Click The book was Cryptonomicon, by Neal Stephenson."},{"title":"What Is Math About?","link":"https:\/\/vsupalov.com\/what-is-math-about\/","pubDate":"Sat, 09 Apr 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/what-is-math-about\/","description":"I haven&rsquo;t really understood mathematics for a long time. It never occured to me, that there was something to be interested in.\nThere was plenty of exposure to using math. Thanks computer science! But I managed to get by without a deeper understanding of what math is about or an appreciation for it, besides the benefits of practical applications.\nI dealt with applications. Getting very familiar with the leaves of the tree, never caring about why the tree came to be in the first place."},{"title":"Things I Wish I Knew Earlier About Pulumi","link":"https:\/\/vsupalov.com\/pulumi-learnings\/","pubDate":"Fri, 08 Apr 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/pulumi-learnings\/","description":"At the time of writing, Pulumi is still kind of a new kid on the block.\nMost people have used some flavor of infrastructure as code (IaC) tooling. Terraform as the most common cross-cloud solution, or a cloud-focused one like specific tooling around CloudFormation (like troposphere, or CDK).\nPulumi&rsquo;s main selling point vs Terraform is, that you can code it in a language you already know - TypeScript and Python for example, instead of Terraform&rsquo;s HCL."},{"title":"Starting A Vagrant Ops Sandbox","link":"https:\/\/vsupalov.com\/vagrant-quickstart\/","pubDate":"Tue, 22 Feb 2022 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/vagrant-quickstart\/","description":"Here&rsquo;s how you can set up and get going with Vagrant! Using this overview, you will have a usable virtual machine going really fast.\n1. Install Vagrant. To get started, you&rsquo;ll need to install Vagrant on your local development machine. Go to Vagrant&rsquo;s download page and install the most recent version from there.\nNote: if you&rsquo;re on Ubuntu or Debian, you can also follow the steps under Linux -&gt; Ubuntu\/Debian to add the apt repository and stay updated."},{"title":"Resources to Learn Solidity","link":"https:\/\/vsupalov.com\/resources-to-learn-solidity\/","pubDate":"Mon, 29 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/resources-to-learn-solidity\/","description":"Learning Solidity can be fun! Here are a few resources which helped me get started and for comfortable with the language.\nCrypto Zombies Hands-down, one of the best resources to learn about Solidity and smart contracts step-by-step.\nYou learn about basic elements of the language, writing code which adds up to a smart contract with game mechanics. You&rsquo;ll also get to know essentials building blocks of the ecosystem, like OpenZeppelin, and can dive deeper into more advanced topics in later course chapters."},{"title":"Resources to Start a Solidity-Powered Project","link":"https:\/\/vsupalov.com\/resources-to-start-solidity-project\/","pubDate":"Mon, 29 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/resources-to-start-solidity-project\/","description":"You have understood how smart contracts work, how dApps are structured, made your first steps learning Solidity and are ready to start your own first project.\nHere are a few nifty tools &amp; resources, which can help you skip over tedious parts, and focus on learning and creating something that excites you!\nJust A Local Solidity Starting Point Please If you want to start simple, check out this starter kit. It&rsquo;s pretty straightforward, uses hardhat and ethers."},{"title":"Call a Payable Solidity Function Using Ethers","link":"https:\/\/vsupalov.com\/ethers-call-payable-solidity-function\/","pubDate":"Sat, 27 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/ethers-call-payable-solidity-function\/","description":"I found this quite hard to Google, and spent too much time finding it out. Here&rsquo;s a quick writeup for anyone who&rsquo;s just getting started with Solidity and ethers.js.\nA word of caution: I&rsquo;m a beginner as well! Things which worked for me may not work for you. The stuff below may be very flawed for reasons I don&rsquo;t understand. For personal studying purposes only, no guarantees of any kind."},{"title":"My Quickstart Notes For React","link":"https:\/\/vsupalov.com\/react-quickstart\/","pubDate":"Mon, 22 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/react-quickstart\/","description":"After being a casual Vue enthusiast for a while, I tried React and&hellip; Liked it!\nWorking with Next.js was a blast, I got everything done which I wanted to. The resources are great, the tooling just works. Everything is (at least with hooks, and a simple application) pretty convenient and understandable.\nHere are my notes, about things I had to find out by doing them wrong, and Googling around.\nComponents Can Be Functions Just define a function, and make sure it returns one of those jsx thingies."},{"title":"Anatomy of a DApp","link":"https:\/\/vsupalov.com\/anatomy-of-a-dapp\/","pubDate":"Sun, 21 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/anatomy-of-a-dapp\/","description":"This article is my contribution to taking some of the magic and mystery out of Web3 DApps.\nOnce you understand how they work from a high level, the topic becomes a lot more approachable and less scary.\nI hope this will help you wrap your head around Web3 faster.\nNote: the explanations below are very Ethereum-ecosystem-focused. They apply to compatible blockchain environments like Polygon though! Probably others as well, but I haven&rsquo;t got enough experience to generalize with confidence."},{"title":"My Current Understanding of Smart Contracts","link":"https:\/\/vsupalov.com\/what-are-smart-contracts\/","pubDate":"Sat, 20 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/what-are-smart-contracts\/","description":"Before diving in, a quick disclaimer: I have been looking into this topic for a short while. Some of the things written below may be inprecise or false. My focus is on the Ethereum (ETH) ecosystem, things can be different when it comes to other ones. Consider the below to be a work in progress.\nDisclaimer: I&rsquo;m pretty new to this topic, and might be mixing up words and concepts without realizing it!"},{"title":"Beautifulsoup4 Essentials","link":"https:\/\/vsupalov.com\/beautifulsoup4-essentials\/","pubDate":"Fri, 19 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/beautifulsoup4-essentials\/","description":"I love the utility made possible by beautifulsoup4, aka bs4. I also struggle with the docs every single time I pick it up. Somehow, I find it hard to find the parts which I need, and end up searching for them a long. Which is annoying the 5th time around.\nSo here&rsquo;s a quick overview of the most essential snippets. You&rsquo;re welcome future-me.\nInstallation &amp; Docs The package is called beautifulsoup4."},{"title":"My Favourite Way To Start Data Tinkering Projects With Python","link":"https:\/\/vsupalov.com\/start-python-data-project\/","pubDate":"Fri, 19 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/start-python-data-project\/","description":"Every time I want to tinker with data, I have noticed going through the same incantations again and again.\nOf course I don&rsquo;t remember them every single time, and have to look stuff up. This article is where I want to be looking from now on :)\nA Fresh Environment Assuming Python 3.* is installed on the system, pip and pipenv are installed globally, as well as all libraries needed to build Python packages if needed."},{"title":"CLI Snippet: View Path Content as a Tree","link":"https:\/\/vsupalov.com\/cli-snippet-path-tree\/","pubDate":"Sun, 07 Nov 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/cli-snippet-path-tree\/","description":"Sometimes I need one of those fancy directory overview-ish examples for a peace of writing - be it docs or new article.\nHere&rsquo;s a tool which can help with that. Say hi to tree.\nInstallation I&rsquo;m guessing for the non-mac part here:\n# mac: $ brew install tree # ubuntu-ish $ sudo apt-get install tree Usage $ tree PATH_YOU_CARE_ABOUT $ tree . This will spit out a nice shiny overview of the directory in question!"},{"title":"Running Commands On A Remote Machine","link":"https:\/\/vsupalov.com\/running-commands-on-remote-machine\/","pubDate":"Tue, 19 Oct 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/running-commands-on-remote-machine\/","description":"How can I make a script run a command on my remote machine?\nSometimes I&rsquo;m surprised by all the things that I don&rsquo;t know. This was one of them.\nThere are excellent automation tools to make local workflows less tedious, but only one of those would be a good solution for running remote commands.\nAnd using Fabric requires creating a project and a lot of thought. Too much effort for a one-off casual command."},{"title":"Ops Friendly Containers","link":"https:\/\/vsupalov.com\/ops-friendly-containers\/","pubDate":"Thu, 25 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/ops-friendly-containers\/","description":"What does it take to make your containerized application easier to operate in production? What can help to keep them running and make them more reliable?\nHere are a few things to look out for, which will make your container ops job easier, both inside and outside of your running containers.\nOutput Logs To Stdout Most logging solutions for containers are built around the assumption, that log s are written to stdout."},{"title":"Less Is Awesome","link":"https:\/\/vsupalov.com\/less\/","pubDate":"Thu, 18 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/less\/","description":"Gosh, that naming gets confusing really fast! I&rsquo;m talking about the Unix CLI tool less.\nLess is more, but better.\nmore being another CLI tool, which was there before less.\nAs it happens, less is one of those tools I use a lot and couldn&rsquo;t imagine being without. I use it a lot, and it&rsquo;s so present that I sometimes don&rsquo;t really notice just how much I use it for."},{"title":"An Overview of Docker Networking","link":"https:\/\/vsupalov.com\/docker-networking\/","pubDate":"Wed, 17 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-networking\/","description":"Networking is a topic I have been tip-toeing around for a while. It always takes a bit of effort and intentionality to learn about basics, which are not immediately needed for daily work.\nHere&rsquo;s the overview I wish I had about Docker networking for practical purposes, I hope it will help you get an overview of the topic.\nThe Docker docs on networking are cool. However, I felt like I needed to read a lot and look in many different places while researching the topic."},{"title":"How Does the Docker Cache Work?","link":"https:\/\/vsupalov.com\/docker-cache\/","pubDate":"Tue, 16 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-cache\/","description":"The Docker build cache can speed up your image builds and save a lot of bandwidth, or be something that eats away your time for no reason. This article is about how the Docker build cache works, what it is good for and how to make the most out of it.\nIf you are not quite sure about the difference between an image and a container, check out this overview of Docker basics."},{"title":"What Are Docker Image Layers?","link":"https:\/\/vsupalov.com\/docker-image-layers\/","pubDate":"Mon, 15 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-image-layers\/","description":"You often read that Docker images consist of layers. But what are those layers anyway?\nTL;DR Each layer is an image itself, just one without a human-assigned tag. They have auto-generated IDs though. Each layer stores the changes compared to the image it&rsquo;s based on. An image can consist of a single layer (that&rsquo;s often the case when the squash command was used). Each instruction in a Dockerfile results in a layer."},{"title":"Things I Wish I Knew About Git","link":"https:\/\/vsupalov.com\/git-facts\/","pubDate":"Fri, 12 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/git-facts\/","description":"Git is such an essential part of my development workflows, it almost fades into the background of everyday work for me.\nThis is a sure sign, that I should notice and care about it more :) After all, mastery is a process and not a state you arrive at. It&rsquo;s always a good idea to tend to the tools of your craft.\nSo, for the sake of pushing (heh) myself to discover things I don&rsquo;t know yet, I&rsquo;d like to share a collection of facts I wish I had internalized about Git sooner."},{"title":"You Might Want To Know About: Kubernetes Operators","link":"https:\/\/vsupalov.com\/kubernetes-operators\/","pubDate":"Thu, 11 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/kubernetes-operators\/","description":"Okay, check this out: you install a containerized application on your Kubernetes cluster, which manages other applications for you.\nThat&rsquo;s what Kubernetes operators are in a nutshell. But let&rsquo;s start from the beginning.\nReconciliation Kubernetes, like other orchestrators, is stuck in an eternal loop - the control loop. It checks what the world looks like, compares it to its note on how the world is SUPPOSED to look like, and performs operations to make reality resemble the desired state."},{"title":"What Multi-Stage Builds Can Be Good For","link":"https:\/\/vsupalov.com\/docker-multi-stage-advantages\/","pubDate":"Wed, 10 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-multi-stage-advantages\/","description":"Multi-stage builds are simple in principle, but the benefits they bring can be surprising. Let&rsquo;s look at a few useful things you can do with Docker multi-stage builds.\nReduce Redundant Build Effort Are you rebuilding your frontend assets every time a new backend package is installed?\nIn the spirit of Docker layers, multi-stage builds can be a good advanced tool to reduce the amount of duplicate work needed. Especially for production builds, where you just need the final artifacts."},{"title":"Which Problems Can Docker Help Me Solve?","link":"https:\/\/vsupalov.com\/docker-solve-problems\/","pubDate":"Tue, 09 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-solve-problems\/","description":"Docker can be used for deployment, local development and testing. It&rsquo;s also a useful experimenting and tinkering tool. But what practical problems can it help solve?\nHere&rsquo;s a non-exhaustive list of problems which can be made less painful with the help of Docker.\nIf you&rsquo;re looking to understand what jobs Docker has you can read more here. There are three main ones - packaging, distributing and running applications. This is a slightly different, more practical way to approach the same topic."},{"title":"Choosing a Base Image For Your Dockerfile","link":"https:\/\/vsupalov.com\/choose-base-image\/","pubDate":"Mon, 08 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/choose-base-image\/","description":"How to choose a base image for your Dockerfile? I have written about my process of creating a Dockerfile before, and this detail seemed to warrant an own closer look.\nHere&rsquo;s how I would go about the decision in detail.\nWhat&rsquo;s The Usecase? What do I need this image to do for me? Do I need to build a new one?\nIf there&rsquo;s a ready-made official image available, I would opt towards using it instead of rolling my own."},{"title":"My Process for Creating a New Dockerfile","link":"https:\/\/vsupalov.com\/creating-new-dockerfile\/","pubDate":"Fri, 05 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/creating-new-dockerfile\/","description":"Today I wondered - what goes through my head, when I want to create a new Dockerfile? I don&rsquo;t think I have written about this before.\nI think it could be useful to get a glimpse of how I approach creating a new Dockerfile, what the high-level thinking looks like and what decisions I care about.\nLet&rsquo;s start with the most important part: the context around the Dockerfile.\nWhat Is This For?"},{"title":"Your First Docker Compose Stack","link":"https:\/\/vsupalov.com\/first-docker-compose\/","pubDate":"Thu, 04 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/first-docker-compose\/","description":"Your first docker-compose stack does not need to be fancy, perfect or even mostly functional to be useful.\nPersonally, I try to avoid developing inside of containers. Nevertheless, for any project which moves towards being deployed, I create a local docker-compose stack.\nNot for the final production destination, but as a test-bed to figure out the deployment requirements and make sure I have thought about all parts.\nIt Doesn&rsquo;t Need To Be Fancy A simple Dockerfile for the application."},{"title":"What Are Orchestrators, and How Do They Relate to Docker?","link":"https:\/\/vsupalov.com\/what-are-orchestrators\/","pubDate":"Wed, 03 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/what-are-orchestrators\/","description":"When you are deploying containerized applications, it&rsquo;s just a question of time until you ask yourself: &ldquo;should we use an orchestrator?&rdquo;. But what is an orchestrator anyway?\nThe Short Version Container orchestrators are tools that helps you with managing your running containers. They take care of the busywork for you.\nHere&rsquo;s an example: you tell your orchestrator &ldquo;I want 2 containers based on image X running at all times&rdquo;.\nThe orchestrator starts paying attention, and takes action to make your wishes become reality."},{"title":"What's Up With Multi-Stage Builds?","link":"https:\/\/vsupalov.com\/multi-stage-builds\/","pubDate":"Tue, 02 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/multi-stage-builds\/","description":"What are multi-stage Docker builds for? What can you do with them, and why should you care?\nHere&rsquo;s a quick explanation of the benefits, without going into too many details!\nYou Can Copy Between Stages This is the most important part to grasp. What makes multi-stage builds useful, is that you can copy specific folders and files from one named stage to another.\nThis way, you can selectively copy only what you need in your final image from other stages."},{"title":"How To Enable BuildKit?","link":"https:\/\/vsupalov.com\/enable-buildkit\/","pubDate":"Mon, 01 Feb 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/enable-buildkit\/","description":"This can be done by setting an environment variable in your shell:\nexport DOCKER_BUILDKIT=1 This will configure Docker to use BuildKit for build commands.\nIf you want this to use BuildKit every single time from now on, you could set this variable in your .bashrc, or adjust the Docker settings in \/etc\/docker\/daemon.json as described in the docs (or via the &ldquo;preferences\/Docker Engine&rdquo; menu in Docker Desktop), by adding &ldquo;buildkit&rdquo; in the &ldquo;features&rdquo; section:"},{"title":"What's A Docker Image Anyway?","link":"https:\/\/vsupalov.com\/whats-a-docker-image\/","pubDate":"Fri, 29 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/whats-a-docker-image\/","description":"What&rsquo;s a Docker image anyway? Let&rsquo;s create a simple image, export it, and look take a look at what it&rsquo;s made of.\nCreating An Image Let&rsquo;s keep it really simple. I want to investigate the image of the following Dockerfile:\nFROM ubuntu RUN echo hihi RUN touch \/hi RUN rm \/hi CMD [&#34;echo&#34;, &#34;hello&#34;] Completely without any practical purpose! We don&rsquo;t even make the effort to use a properly tagged base image."},{"title":"The Nastiest Git Script I Love To Use","link":"https:\/\/vsupalov.com\/nasty-git-script\/","pubDate":"Thu, 28 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/nasty-git-script\/","description":"It&rsquo;s called changes.\nHere&rsquo;s how I tend to use it:\n# editing a file in a Git project $ git add $FILE_I_CHANGED $ changes It needs to be located in a PATH-included directory, I usually put mine into an own folder called ~\/local\/bin.\nNot For Team Use I wouldn&rsquo;t run it on a non-private non-early-stage project. All it does, is create a new commit with the message &ldquo;changes&rdquo; and push it."},{"title":"Find Out What Files A Command Changes With Docker","link":"https:\/\/vsupalov.com\/docker-changed-files\/","pubDate":"Wed, 27 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-changed-files\/","description":"So, what did this command just do?\nHave you always wondered what files change on disk when you update your OS package information? Would you like to know what files were added after you installed a particular package or ran a script?\nDocker can help you to be nosy about what files changed due to a particular command you ran.\nTwo Approaches You can go about it in two ways."},{"title":"Adding Tailwind CSS to a Static Site","link":"https:\/\/vsupalov.com\/tailwind-with-static-site\/","pubDate":"Tue, 26 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/tailwind-with-static-site\/","description":"How to go about adding Tailwind CSS to a static site?\nThis article will show how to get started easily, how to set up your tooling in a more complex way and what to look out for.\nNote: for a more complete guide on getting started with Tailwind CSS, check out the Tailwind CSS For Non-Designers article.\nStarting Simple This approach works independently from where you want to add Tailwind CSS."},{"title":"The Quickest Way to Improve Your Docker Images","link":"https:\/\/vsupalov.com\/improve-your-docker-images\/","pubDate":"Tue, 26 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/improve-your-docker-images\/","description":"This might be the most frequent advice I give to folks: &ldquo;Have you tried using a Dockerfile linter?&rdquo;\nApart from learning the basics of Docker, this is the most bang-for-the-buck thing your can do to improve your Docker game and save yourself from a few nasty gotchas.\nMaybe &ldquo;linter&rdquo; is a bit too specific, it&rsquo;s really about having an automated way to catch and discover avoidable mistakes.\nCool Tools To Know About Here&rsquo;s a list of tools you can use to get started."},{"title":"A Better Way to Access Private SSH Git Repositories While Building Your Docker Images","link":"https:\/\/vsupalov.com\/better-docker-private-git-ssh\/","pubDate":"Mon, 25 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/better-docker-private-git-ssh\/","description":"I have written about this topic before in the past. If you don&rsquo;t watch out, you can easily leak your SSH credentials into your Docker image, sometimes without even noticing. Handling build-time secrets got easier with BuildKit, and the same goes for SSH secrets.\nHowever, there&rsquo;s a special mechanism to pass SSH credentials into your building Docker image without leaving a trace, with is an even better fit than the new secret mount type."},{"title":"A Better Way to Handle Build-Time Secrets in Docker","link":"https:\/\/vsupalov.com\/better-docker-build-secrets\/","pubDate":"Mon, 25 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/better-docker-build-secrets\/","description":"Passing build-time variables to Docker is a solvable problem. However, if you want that data to leave no traces in the image, it&rsquo;s another story. For example, when you want to access private SSH repositories during a build.\nYou had to watch out not to leak any secrets. Packing lots of commands into a single line, making sure to clean up with squashing (nah), using multi-stage builds to keep secrets in non-public files (okay), or coming up with elaborate schemes to access those secrets securely."},{"title":"5 Tips to Speed up Your Docker Image Build","link":"https:\/\/vsupalov.com\/5-tips-to-speed-up-docker-build\/","pubDate":"Fri, 22 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/5-tips-to-speed-up-docker-build\/","description":"Are your Docker builds taking forever? Docker can be a valuable part of your tool belt, or a constant source of annoyance.\nThis article will walk you through frequent sources of slowness when building Docker images for Python projects, and ways how you can avoid or fix them.\nLet\u2019s speed up an utterly slow Docker build together using the right high-level approach, easy to implement tricks and brand-new Docker features to speed up your build protect your coding flow from annoying delays."},{"title":"Fixing an Empty Git Submodule Folder After a Clone","link":"https:\/\/vsupalov.com\/git-fix-submodule\/","pubDate":"Mon, 04 Jan 2021 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/git-fix-submodule\/","description":"Here&rsquo;s something I stumble over almost every time I clone a git repository with submodules.\nThose darn folders are empty and using the project fails. Here are two ways to fix that:\nClone With The Recursive Flag When issuing your git clone, add a --recursive flag. It will look like this:\n$ git clone git@github.com:user\/project.git --recursive And as easy as that, your submodules are there.\nIf you cloned your repo and don&rsquo;t mind starting over - delete the freshly cloned repository and add that --recursive to the command."},{"title":"What's A Better Docker Tag Than :latest?","link":"https:\/\/vsupalov.com\/docker-better-image-tags\/","pubDate":"Wed, 28 Oct 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-better-image-tags\/","description":"What&rsquo;s a better naming scheme for Docker image tags than the tricky :latest tag? What naming schemes can help you have an easier time handling your Docker images, and make it harder to run into unexpected errors?\nLet&rsquo;s look at a few options!\nThe Thing With &ldquo;Reusing&rdquo; Tags If you use another tag than :latest, you might still run into issues if you end up &ldquo;reusing&rdquo; the same tag for different images."},{"title":"How to Speed Up Your Dockerfile with BuildKit Cache Mounts","link":"https:\/\/vsupalov.com\/buildkit-cache-mount-dockerfile\/","pubDate":"Wed, 23 Sep 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/buildkit-cache-mount-dockerfile\/","description":"If you have a long (and ever-changing) list of apt-get packages in your Dockerfile, this one is for you.\nBuildKit, a new build engine shipped with Docker, introduced a build-time cache mounts feature, which can be used to avoid long download times during image rebuilds.\nBy using cache mounts in your Dockerfile, you can skip re-downloading your complete package list and only fetch what&rsquo;s missing. This can make a huge difference when it comes to the build times of your Docker images."},{"title":"12 Things I Wish I Knew About Docker","link":"https:\/\/vsupalov.com\/12-docker-facts\/","pubDate":"Tue, 18 Aug 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/12-docker-facts\/","description":"When learning Docker, there are a lot of subtle details you can miss. But knowing them can be really helpful. I often had full-fledged &ldquo;aha&rdquo; moments. After stumbling upon a small snippet of information suddenly things started to make much more sense all of a sudden.\nI like to think them as puzzle pieces, which help you figure out what the whole image is supposed to look like and provide you with an overview."},{"title":"Tools to Help Automate Your Workflows","link":"https:\/\/vsupalov.com\/automation-tools\/","pubDate":"Tue, 02 Jun 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/automation-tools\/","description":"Depending on how often you are doing something, even seconds saved each time can add up quickly.\nWhy do the same thing over and over, if you can get some help from a robot-assistant instead? This is an overview of useful tools you might not know yet, which can help you to automate parts of your development workflows.\nI hope this will help you to focus on writing code and getting things done instead of thinking through each step a toil-y shell-incantation."},{"title":"How to Tell That Your Docker Setup Is Broken","link":"https:\/\/vsupalov.com\/docker-setup-broken\/","pubDate":"Tue, 26 May 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-setup-broken\/","description":"Docker always had a very compelling first-usage story. Just install Docker, and you can run your first containerized application right away. Want to create your own image? Just write a Dockerfile with a few lines.\nEasy, convenient and, unfortunately, not that simple.\nGetting started with Docker is easy, but it takes time and experience to avoid even the most common ways to build broken images or run unreliable and insecure containers."},{"title":"Showing the Time Each Layer of Your Docker Image Build Takes","link":"https:\/\/vsupalov.com\/time-docker-build-layer\/","pubDate":"Tue, 19 May 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/time-docker-build-layer\/","description":"How to find out how long your Docker image build takes for each layer?\nMeasuring the total build time is quite straightforward - just add time in front of your docker build command.\nYou also don&rsquo;t have to sit there with a stop-watch to time your layers. Here&rsquo;s a simple way to get the time each layer you build:\nUse the BuildKit buildx Command BuildKit brings along a few useful features you can use out of the box starting with Docker 18."},{"title":"BuildKit Features You Might Want to Know About","link":"https:\/\/vsupalov.com\/docker-buildkit-features\/","pubDate":"Tue, 12 May 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-buildkit-features\/","description":"Accessing private Git repositories during a Docker build, handling secrets and re-downloading lots of dependencies.\nIf you have struggled with these topics, BuildKit could help you solve them in a more elegant fashion.\nI&rsquo;d like to introduce some of those new features to you, and give a quick impression how they can be used to improve your existing workflows. If you want to see all of them in the docs, check out this docs file from BuildKit&rsquo;s GitHub repo."},{"title":"Your Docker Learning Roadmap","link":"https:\/\/vsupalov.com\/docker-learning-roadmap\/","pubDate":"Wed, 22 Apr 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-learning-roadmap\/","description":"It\u2019s easy to get started with Docker, but once you go beyond very basic usage you can start running into issues and questions which are hard to ask or answer.\nIt can feel like banging your head against the wall. Simple things you expected to &ldquo;just work&rdquo; turn out to be really hard or not to make sense.\nLots of struggles are caused by superficial understanding of Docker - the tool, its parts and the concepts behind them."},{"title":"Snippet: The Most Simple URL-Based View in Django","link":"https:\/\/vsupalov.com\/most-simple-url-based-view-in-django\/","pubDate":"Wed, 26 Feb 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/most-simple-url-based-view-in-django\/","description":"When starting a new Django project, I always like to get a first, simple view working.\nIt&rsquo;s kind of a &ldquo;Hello World&rdquo; step I like to take.\nIf you have created and configured a templates folder, and created your first template within it, all that&rsquo;s left to do is to add two lines to the project&rsquo;s urls.py:\nfrom django.contrib import admin from django.urls import path from django.views.generic.base import TemplateView # here urlpatterns = [ path(&#39;admin\/&#39;, admin."},{"title":"The First Step Towards Making Your Django Project More Onboarding-Friendly","link":"https:\/\/vsupalov.com\/first-step-onboarding-friendly-django\/","pubDate":"Fri, 07 Feb 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/first-step-onboarding-friendly-django\/","description":"Does the thought of setting up a new development environment for your Django project seem like a tedious task? How about helping somebody else to start helping with the development? Do you feel like you and your project would be well prepared?\nIf both of these scenarios sound uncomfortable, this article is for you. Read onto learn an easy first step towards making your project more onboarding-friendly.\nWrite a Friendly Note to Future-You It doesn&rsquo;t need to be a huge effort."},{"title":"A Simple Fix If Your Dockerized App Crashes Because The Database Container Isn't Ready Yet","link":"https:\/\/vsupalov.com\/simple-fix-db-not-ready\/","pubDate":"Fri, 31 Jan 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/simple-fix-db-not-ready\/","description":"It&rsquo;s frustrating to work with a fragile docker-compose development setup.\nOne frequent issue, is if the dockerized application crashes because the database isn&rsquo;t ready early enough. All you see is an error message and a terminated container.\nRacing conditions are pretty annoying. They don&rsquo;t always happen, and it&rsquo;s easy to get caught in the trap of &ldquo;retrying until it works again&rdquo; once too often.\nHere&rsquo;s an easy way to work around your failing dependency quickly, and get a fix in place without breaking out of your context, blocking out time to identify the exact issue and fix the root cause."},{"title":"The Reason Why You Need to Wait When Stopping Your Docker Compose Services","link":"https:\/\/vsupalov.com\/docker-compose-stop-slow\/","pubDate":"Fri, 24 Jan 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-compose-stop-slow\/","description":"Working with docker-compose can feel like a chore if it makes you wait again and again. Waiting for containers to stop or when restarting can cost a lot of time if you&rsquo;re using docker-compose for development.\nIf you need to wait for your containers to be &ldquo;stopped gracefully&rdquo;, chances are that docker-compose isn&rsquo;t at fault. Rather, it&rsquo;s because of your dockerized apps don&rsquo;t react to a SIGTERM signal and time out instead."},{"title":"You Don't Need to Rebuild Your Development Docker Image on Every Code Change","link":"https:\/\/vsupalov.com\/rebuilding-docker-image-development\/","pubDate":"Fri, 17 Jan 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/rebuilding-docker-image-development\/","description":"Local development in Docker can feel really slow. All you wanted was to have reproducible environments, but the price to pay are painful waiting times, and way more commands.\nIf you are using docker build frequently and your containers need to be restarted a lot, this post will help you to save some time.\nMount Your Code Directory Into the Container While it makes sense to create a complete Docker image when deploying your code, you don&rsquo;t need to do it when developing."},{"title":"Is Docker-Compose Suited For Production?","link":"https:\/\/vsupalov.com\/docker-compose-production\/","pubDate":"Fri, 10 Jan 2020 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-compose-production\/","description":"Docker-compose is just a tool for handling and configuring Docker containers.\nIf you would be comfortable working with plain Docker commands in your environment, you can use docker-compose as well. The docker-compose docs even have a section about using docker-compose in production.\nBut let&rsquo;s look deeper than this easy answer. Why do some people recommend otherwise? I think it&rsquo;s important to understand why some people mean when they say &ldquo;don&rsquo;t use docker-compose in production&rdquo; and what assumptions are behind this recommendation."},{"title":"The Web App Deployment Wishlist","link":"https:\/\/vsupalov.com\/deployment-wishlist\/","pubDate":"Fri, 13 Dec 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/deployment-wishlist\/","description":"Long waiting times, lots of manual steps, constant worrying that something might break. Deployments come in many forms, and if done wrong they are quite the opposite of enjoyable.\nThe goal of any deployment method, is to get your carefully crafted project online. To share it with the world, and make it possible for people to use it.\nThat&rsquo;s the bare minimum. Have you ever though about what else your production deployment could be doing for you?"},{"title":"AWS Services You Should Know When Deploying Your Django App","link":"https:\/\/vsupalov.com\/django-aws-services\/","pubDate":"Fri, 06 Dec 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-aws-services\/","description":"AWS offers a LOT of services.\nSeeing the list of AWS services in the console can feel completely overwhelming the first few times. Just reading through the names of all services takes minutes. Finding out what every single one does would need a lot more effort.\nAnd why would you? If you are like most people, there&rsquo;s only a small subset of services which you really want to know about. Some of them because they are essential, and some because they come in really handy in specific situations."},{"title":"Running Django and PostgreSQL in a Single Docker Container","link":"https:\/\/vsupalov.com\/same-docker-container-django-postgresql\/","pubDate":"Sat, 23 Nov 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/same-docker-container-django-postgresql\/","description":"When working with VMs, it&rsquo;s not uncommon to put everything onto a single box. When deploying to a server, this is a common pattern as well.\nHowever, when it comes to Docker, you shouldn&rsquo;t cram all of your applications into a single container. Let&rsquo;s try to untangle this issue into small, digestible pieces.\nThe Short Answer Sure, you can put everything into a single container. It can work, but you should reconsider."},{"title":"Overriding One Single Value in Your Docker-Compose .env File","link":"https:\/\/vsupalov.com\/override-docker-compose-dot-env\/","pubDate":"Fri, 15 Nov 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/override-docker-compose-dot-env\/","description":"Using a .env file is one of the many ways fo configure Docker images and containers. If you are using docker-compose, the values from .env are used to replace ${DOLLAR_NOTATION} placeholders in your docker-compose.yml file.\nBut what if you want to change one of the values in the .env file dynamically? You could use something like sed or awk to change the file in-place, but there is a better way."},{"title":"But What is Docker's Actual Job?","link":"https:\/\/vsupalov.com\/docker-actual-job\/","pubDate":"Fri, 08 Nov 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-actual-job\/","description":"Docker can seem pretty overwhelming. It seems to be doing so much - it&rsquo;s hard to say what it&rsquo;s for exactly.\nThat&rsquo;s because Docker is a tool which takes care of multiple jobs. If you look at each of those responsibilities by themselves, it&rsquo;s easier to understand Docker and you&rsquo;ll have an easier time getting your head around Docker.\nThe Three Jobs: Packaging, Distributing and Running It&rsquo;s easy to mistake a task you want to get done with the most popular tool for it."},{"title":"Avoiding Permission Issues With Docker-Created Files","link":"https:\/\/vsupalov.com\/docker-shared-permissions\/","pubDate":"Fri, 01 Nov 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-shared-permissions\/","description":"Permission denied -rw-r--r-- 1 root root ... Is this what you see when accessing files that were created from within your Docker container?\nThe user of the container (root in the worst case) is completely different than the one on the host. The file permissions and ownership are all wrong.\nOne frequent solution, is to &ldquo;chown&rdquo; your shared folder again and again. It&rsquo;s tedious and there is a better way: read on to learn learn how to build, configure and run your Docker containers correctly, so you don&rsquo;t have to fight permission errors and access your files easily."},{"title":"The Hero's Journey to Every Deployment Story","link":"https:\/\/vsupalov.com\/deployment-hero-journey\/","pubDate":"Tue, 08 Oct 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/deployment-hero-journey\/","description":"Do you feel like your knowledge of development ends with a git push to the remote branch?\nYou&rsquo;re very comfortable running code on your local development machine, but deployment seems complicated and unapproachable in comparison. Every single project seems to do it differently - a unique tangled-up ball of arcane rituals, scripts and tools.\nAvoiding deployment topic worked for you so far, but deep down you know that this will come back to bite you someday."},{"title":"Should You Use Virtualenv in Docker?","link":"https:\/\/vsupalov.com\/virtualenv-in-docker\/","pubDate":"Tue, 24 Sep 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/virtualenv-in-docker\/","description":"Why use a virtualenv if your app runs inside of a Docker container already?\nDocker is great at packaging OS-level dependencies together with your application. Virtualenv however, is great at making sure that you have a perfectly controlled environment for your Python application.\nSure, you could simply install your project&rsquo;s dependencies inside of your Docker image without using virtualenv. Using a virtual environment with your dependency tooling of choice like pipenv, poetry or good old pip won&rsquo;t hurt or slow you down."},{"title":"Your Vagrant Deployment Sandbox for Django","link":"https:\/\/vsupalov.com\/django-vagrant-deployment-sandbox\/","pubDate":"Mon, 19 Aug 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-vagrant-deployment-sandbox\/","description":"Deploying your Django project for the first time can seem like a huge task, and a blocking one in addition to that. You can&rsquo;t move forward until the site is in production. The pressure is on.\nHowever, there&rsquo;s one trick to make deployment way less scary, and way less of a big deal.\nJust deploy as early as possible. It doesn&rsquo;t even need to be a publicly accessible location. Just an environment which is distinct from your development environment."},{"title":"The First Step When Dockerizing Your Django App - Use Environment Variables","link":"https:\/\/vsupalov.com\/django-dockerize-first-step\/","pubDate":"Thu, 15 Aug 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-dockerize-first-step\/","description":"Dockerizing your Django application can seem like a daunting task. There is a lot to learn, new exciting mistakes to make and you&rsquo;ll need to get used to new workflows.\nYou&rsquo;ll also need to prepare your project to be Docker-ready. You&rsquo;ll have the best experience if you make your project Docker-ready before you try to cram it into a container. This way you won&rsquo;t have to fight your application&rsquo;s setup at the same time as you figure out Docker."},{"title":"Why Is Fabric 2 so Hard?","link":"https:\/\/vsupalov.com\/fabric-2-example-fabfile\/","pubDate":"Thu, 15 Aug 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/fabric-2-example-fabfile\/","description":"I always loved to use Fabric as a tool to automate my dev workflows and deployments. It was so easy to get started, straightforward and uncomplicated.\nImagine my surprise, when I got literally stuck trying to use Fabric 2. It all looked different. Commands I got used to simply didn&rsquo;t exist anymore, and I could not find a clear minimal example to get me started. Even basic things seemed hard to do, as I was so used to the old ways."},{"title":"Docker EXPOSE Ports","link":"https:\/\/vsupalov.com\/docker-expose-ports\/","pubDate":"Tue, 13 Aug 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-expose-ports\/","description":"What does it mean to EXPOSE a port in your Dockerfile? What is it good for, and why doesn&rsquo;t it make your container available?\nWhat EXPOSE Does Writing EXPOSE in your Dockerfile, is merely a hint that a certain port is useful. Docker won&rsquo;t do anything with that information by itself.\nEXPOSE 8000 Defining a port as &ldquo;exposed&rdquo; doesn&rsquo;t publish the port by itself.\nPublishing Ports Docker doesn&rsquo;t publish exposed ports by itself."},{"title":"Django vs My Favorite Design Principles","link":"https:\/\/vsupalov.com\/django-vs-my-favorite-design-principles\/","pubDate":"Tue, 06 Aug 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-vs-my-favorite-design-principles\/","description":"It&rsquo;s easy to take best practices and good design patterns for granted. If everything just works, you don&rsquo;t even realize that they are there. That is, until you sabotage them without knowing you did.\nIt pays off to know what hidden decisions shape the environment you are working in.\n&ldquo;Of course&rdquo;, you might say - but chances are that you are not aware of many design principles which have shaped your favorite language and web framework."},{"title":"Quick Django Refresher Crash Course","link":"https:\/\/vsupalov.com\/quick-django-refresher-crash-course\/","pubDate":"Tue, 30 Jul 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/quick-django-refresher-crash-course\/","description":"Sometimes, I need a quick reminder of how certain aspects around Django work. My memory is pretty lazy when it comes to details, so after being away from Django for a while I have to revisit the basics every now and then. That&rsquo;s especially the case when starting a new project.\nUsually, this means finding the right parts of the official tutorial and docs. A quick reminder is more than enough, but getting to the right place always means doing the same searches to find the same things."},{"title":"Deploying Early. Earlier Than You Think.","link":"https:\/\/vsupalov.com\/deploy-early\/","pubDate":"Tue, 23 Jul 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/deploy-early\/","description":"You wouldn&rsquo;t expect to write your Django app perfectly on the first try.\nThere are things you only find out once you are trying to implement them Sometimes getting it right, means rethinking the details and trying different approaches until you find a way which works for you.\nGetting deployment right is really similar to the process of developing your app. Deployment shouldn&rsquo;t be an afterthought - in fact you are better off if you start thinking about it early, starting with relaxed constraints and approaching the task iteratively."},{"title":"The Best Way to Deploy Your Django Project","link":"https:\/\/vsupalov.com\/best-way-to-deploy-django\/","pubDate":"Tue, 16 Jul 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/best-way-to-deploy-django\/","description":"Deployment can be approached in many ways - most of them are valid and good. It&rsquo;s not a purely technical problem. Instead, it&rsquo;s highly subjective and depends on your preferences, your team and your project. A solution which is perfect for one person, could be a very bad fit for you, and vice-versa.\nThe biggest confusion, when it comes to choosing a deployment method, is caused by having the wrong focus (too narrow or too technical), and a lack of general knowledge."},{"title":"When It's Okay to Use Runserver in Your Dockerfile","link":"https:\/\/vsupalov.com\/runserver-in-dockerfile\/","pubDate":"Tue, 09 Jul 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/runserver-in-dockerfile\/","description":"python manage.py runserver is not something you want to use in your production setup. After all, runserver is not your production server.\nHowever, it&rsquo;s completely okay to write a Dockerfile, where you use it! You will have a good time running a development server in your Docker container, if you are using them for development instead of deployment.\nLet&rsquo;s look at two cool use cases.\nAn automated example development setup Readmes are great!"},{"title":"Using Docker At Your Own Pace","link":"https:\/\/vsupalov.com\/docker-at-your-own-pace\/","pubDate":"Tue, 02 Jul 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-at-your-own-pace\/","description":"&ldquo;Operating a piece of technology at a professional level turns out to be really hard. It\u2019s easy to get started with a lot of technology, but harder to do a really good job with it.&rdquo;\n&ldquo;If you decide to try out a new piece of technology, you should figure out low-risk ways to get started.&rdquo;\nThese quotes are from boringtechnology.club. I love everything about them.\nDocker is one of those things, which you probably don&rsquo;t want to start using in production right away."},{"title":"Six Big Open-Source Django Codebases to Read and Learn From","link":"https:\/\/vsupalov.com\/six-big-open-source-django-codebases\/","pubDate":"Tue, 25 Jun 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/six-big-open-source-django-codebases\/","description":"You have been reading books and tutorials about Django - but it feels like something&rsquo;s missing. How do these pieces come together in the real world? What&rsquo;s different, and what can you learn from it?\nThere&rsquo;s also a lot you can get out of exploring other people&rsquo;s projects. Tools, (missing) best practices, code structure and a glimpse of real-world issues. Everything is there to be looked at, and to help you level up."},{"title":"How to Find Real-World Django Projects Online as Learning Examples?","link":"https:\/\/vsupalov.com\/django-find-real-world-projects\/","pubDate":"Tue, 18 Jun 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-find-real-world-projects\/","description":"Tutorials are great to get started with Django, but they feel like something&rsquo;s missing from them.\nI&rsquo;m always very curious to see how other people are getting work done, when tackling real-world projects. You can see how other people are structuring their code, growing their codebase and handling the issues they encounter.\nBut how to find real-world Django projects which are online and have open-source code available? Here are a few techniques you can use for finding cool projects online to learn from."},{"title":"Production Doesn't Have to Be a Big Deal","link":"https:\/\/vsupalov.com\/production-no-big-deal\/","pubDate":"Tue, 11 Jun 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/production-no-big-deal\/","description":"Deploying to production for the first time can feel completely overwhelming.\nYou&rsquo;re leaving behind the cozy comfort of your development environment, and are sending your little web app off into the unknown.\nAnd then there&rsquo;s that nagging feeling that you&rsquo;re missing something very important.\nAfter all, production is that special place, where everything needs to be perfect. You have to do everything the right way or else.\n&hellip;\nI don&rsquo;t think that production has to be a big deal."},{"title":"What's up with Django's Custom User Model?","link":"https:\/\/vsupalov.com\/django-custom-user-model\/","pubDate":"Tue, 04 Jun 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-custom-user-model\/","description":"Do you want the users of your app to be able to login via email? Or would you like to add custom fields about your users? You might need a custom user model for that. But does it mean to use a custom user model?\nIn general, Django&rsquo;s user models have to do with authentication and storing data about users. When you start a default Django project, your project is configured to use the default user model."},{"title":"Django Runserver Is Not Your Production Server","link":"https:\/\/vsupalov.com\/django-runserver-in-production\/","pubDate":"Tue, 28 May 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-runserver-in-production\/","description":"You&rsquo;ve built your Django web app and are working on deploying it.\nYou&rsquo;ve been running your app locally with python manage.py runserver. That&rsquo;s a fine command, built for development convenience, but it&rsquo;s not meant to be used as part of a production setup.\nThe docs are very adamant about this:\nDO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests.\nSo the server started with runserver is not guaranteed to be performant (it&rsquo;s very slow), and it hasn&rsquo;t been built with security concerns in mind."},{"title":"Developing With Python 3.8 on Ubuntu 18.04 LTS","link":"https:\/\/vsupalov.com\/developing-with-python3-8-on-ubuntu-18-04\/","pubDate":"Tue, 21 May 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/developing-with-python3-8-on-ubuntu-18-04\/","description":"Every version of Python brings along cool new features and improvements. But really recent versions are not available from default system package sources - you need to do some extra work to get to them.\nHere are complete instructions how to install Python3.8 on Ubuntu 18.04 LTS, and a few more steps to setup an enjoyable Python development environment on a fresh machine.\nMake Python 3.8 Available Right now (18. May 2019), Python 3."},{"title":"11 Django Real-World Challenges Your Tutorial Didn't Mention","link":"https:\/\/vsupalov.com\/11-django-real-world-challenges\/","pubDate":"Tue, 14 May 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/11-django-real-world-challenges\/","description":"After finishing the first version of your Django project, it&rsquo;s just a question of time until you stumble into things you didn&rsquo;t prepare for. Those are real-world challenges which are usually not covered in beginner tutorials. However, all successful Django projects need to deal with these topics sooner or later.\nLet&rsquo;s talk about eleven of these challenges. Knowing about those will not resolve them automatically, but you&rsquo;ll have a bit more time to prepare instead of being disappointed that you didn&rsquo;t know about them at an earlier point in time."},{"title":"Django Systemd Crashcourse","link":"https:\/\/vsupalov.com\/django-systemd-crashcourse\/","pubDate":"Tue, 07 May 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-systemd-crashcourse\/","description":"This article will help you get started with systemd.\nYou know - that tool you didn&rsquo;t really knew you would need when you started to work on your Django project. Sometime before you found out that deploying your app can turn into much more work than expected.\nLet&rsquo;s make sure you have a broad overview, and enough understanding of useful commands to get going. After reading this, you should have just the right amount of information to interact with systemd and continue climbing the steep deployment learning curve."},{"title":"Gunicorn and Nginx in a Nutshell","link":"https:\/\/vsupalov.com\/gunicorn-and-nginx\/","pubDate":"Tue, 30 Apr 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/gunicorn-and-nginx\/","description":"When hosting a Python web app in production you can&rsquo;t get around using a WSGI server and a web server.\nGunicorn and Nginx are solid and popular options - but what are those two apps? Why do people run both, and not just one of them?\nNginx and Gunicorn work together Nginx is where requests from the internet arrive first. It can handle them very quickly, and is usually configured to only let those requests through, which really need to arrive at your web application."},{"title":"What Is Gunicorn, and What Does It Do?","link":"https:\/\/vsupalov.com\/what-is-gunicorn\/","pubDate":"Tue, 23 Apr 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/what-is-gunicorn\/","description":"Many people are using Gunicorn (or uWSGI), but don&rsquo;t really know what they actually do.\nYou take it as a given, and just hope that your web app will work as expected when you deploy it.\nLet&rsquo;s take some time and look at deployment best practices, and the job Gunicorn has.\nA production stack dream team The unix approach is to have small tools which do one thing, and do it well."},{"title":"I Love Go and Django. Here's Why.","link":"https:\/\/vsupalov.com\/go-and-django\/","pubDate":"Tue, 16 Apr 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/go-and-django\/","description":"I like Go and Django. Both are currently very valuable parts of my toolbox when working with web applications.\nYou might wonder why I have bundled up a language and a framework. Why not picking a certain Go framework? Because with Go, there are no must-use third party libraries. You&rsquo;re completely free to choose and match, depending on the type of project.\nGo is a amazing for writing flexible web services."},{"title":"The Quickest Way to Create and Run a New Cookiecutter Django Project","link":"https:\/\/vsupalov.com\/cookiecutter-django-quickstart\/","pubDate":"Tue, 09 Apr 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/cookiecutter-django-quickstart\/","description":"This is not an article about setting up a Cookiecutter Django project the right way. It&rsquo;s about creating a new project and fast forwarding to a state where you can start writing code.\nHere&rsquo;s the minimal and most lazy way to start running a brand-new Cookiecutter Django project, and start coding right away. No need to run Docker, no need to setup external databases. Just start a project and start building."},{"title":"What's the Use of of Django-Webpack-Loader?","link":"https:\/\/vsupalov.com\/why-django-webpack-loader\/","pubDate":"Mon, 01 Apr 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/why-django-webpack-loader\/","description":"Have you stumbled upon some of the following problems with your Django project?\nYou have to hard-reload your site while working on your frontend CSS and JS. Sometimes, you have to tell users to try a hard-reload, because the browser seems to ignore changed CSS. Lots of requests for small CSS and JS files need to be made when loading your site, which makes it slower. You have to work with huge frontend source files which are hard to navigate."},{"title":"Writing Code, Building Comment Scaffolds","link":"https:\/\/vsupalov.com\/building-comment-scaffolds\/","pubDate":"Tue, 26 Mar 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/building-comment-scaffolds\/","description":"When approaching less-obvious coding tasks, I really enjoy building scaffolds around the thing I&rsquo;m working on.\nYou only zoom out occasionally to see if you&rsquo;re still on the right track and what&rsquo;s up next. Then you can tackle the next small, isolated problem at a time.\nLess things to keep in mind! It&rsquo;s so nice when you only have to keep a small part of what you&rsquo;re building in mind at a time!"},{"title":"How Does the Frontend Communicate with the Backend?","link":"https:\/\/vsupalov.com\/how-backend-and-frontend-communicate\/","pubDate":"Tue, 19 Mar 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/how-backend-and-frontend-communicate\/","description":"How to connect the frontend and the backend?\nHow do they communicate?\nThere are many different ways how to structure a web application. The frontend can take different forms, and it can be daunting to understand how to connect the two.\nThis article is an overview of what goes on between the backend and the frontend of a web application - how the two communicate.\nLet&rsquo;s start with fundamentals."},{"title":"Get Docker Right and Get on with Life","link":"https:\/\/vsupalov.com\/get-docker-right-get-on-with-life\/","pubDate":"Tue, 12 Mar 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/get-docker-right-get-on-with-life\/","description":"Building cool apps &raquo; deploying them in a fancy way.\nWhen starting work on a new Django project, I don&rsquo;t use Docker.\nWhy would it be otherwise? Nothing has to be deployed. Reproducibility is not a crucial topic. Everybody is on the same page.\nIt will get fancier in time, but only when there are real issues which require more work.\nMy development environment is as simple as possible when starting out."},{"title":"How to Pass Additional Context into a CBV?","link":"https:\/\/vsupalov.com\/pass-context-to-django-cbv\/","pubDate":"Tue, 05 Mar 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/pass-context-to-django-cbv\/","description":"Passing context into your templates from class-based views is easy once you know what to look out for.\nThere are two ways to do it - one involves get_context_data, the other is a bit less known, but can be pretty useful.\nAre you trying to add keys to your context dict, but they are not working as expected? Here&rsquo;s a quick checklist to see if you&rsquo;re not missing something important:"},{"title":"Is Vue Just Overkill for My Project?","link":"https:\/\/vsupalov.com\/is-vue-just-overkill-for-my-project\/","pubDate":"Mon, 25 Feb 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/is-vue-just-overkill-for-my-project\/","description":"You can use Vue for a very small parts of a single template in your Django app. If there&rsquo;s a place where you want to create an interactive element, you could use Vue instead of jQuery or vanilla JavaScript. That wouldn&rsquo;t be overkill, but a sensible and acceptable way to make use of that frontend framework.\nWith Vue, you don&rsquo;t have to commit to a too-complicated solution. But depending on the way you choose to setup Vue with your app might lead to an &ldquo;overkill solution&rdquo;."},{"title":"My Django App Looks Bad and I Don't Know How to Change It!","link":"https:\/\/vsupalov.com\/django-app-looks-bad\/","pubDate":"Mon, 18 Feb 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-app-looks-bad\/","description":"I&rsquo;m a developer, not a designer.\nDon&rsquo;t worry! You don&rsquo;t have to be a designer to make your Django app nice and usable.\nYou don&rsquo;t need to come up with a design, and you don&rsquo;t need to learn CSS in-depth.\nHere are a few things you can do right now, to fix the visuals of your beloved Django project.\nThe basics you should know Before starting, take a really quick look at what a little CSS can do for a site."},{"title":"My Favorite Django Packages in 2019","link":"https:\/\/vsupalov.com\/favorite-django-packages-2019\/","pubDate":"Mon, 11 Feb 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/favorite-django-packages-2019\/","description":"Have you ever wondered &ldquo;what Django packages am I missing?&rdquo;. &ldquo;Is there something I could use for my projects, but haven&rsquo;t tried yet?&rdquo;.\nI&rsquo;d like to share a list of my favorite Django packages! Each has a quick description and link included, so you can get what they are about &ndash; without having to do lots of research up-front.\nI tried to limit this overview to packages, which will be useful for any project, and you should know about."},{"title":"I'm a Makefile PHONY","link":"https:\/\/vsupalov.com\/makefile-phony\/","pubDate":"Tue, 05 Feb 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/makefile-phony\/","description":"Turns out, I&rsquo;m a Makefile phony.\nIt&rsquo;s a tool I use daily. Have used for years. And never took the time to properly learn.\nThis is the story of how I realized that I&rsquo;m an unskilled make user, and how my Makefiles got a bit less cluttered as a result. Follow along if you like.\nMakefiles and I I use Makefiles everywhere. But not to actually handle build dependencies. Gosh no."},{"title":"How to structure a Go project?","link":"https:\/\/vsupalov.com\/go-folder-structure\/","pubDate":"Tue, 29 Jan 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/go-folder-structure\/","description":"Before getting back into developing professionally in Golang last year, I had so many questions:\nWhat tools are useful? What nuances am I missing? What patterns are popular? How to design testable applications? What libraries are helpful when creating RESTful APIs? How to make friends with interfaces and the Go-way of doing things? Good ol&rsquo; A Tour of Go helped with the first one. The other ones took a bit of searching, watching talks, looking at projects and asking questions."},{"title":"Django CBVs seem overwhelming, because there are so many!","link":"https:\/\/vsupalov.com\/django-cbv-seem-overwhelming\/","pubDate":"Tue, 22 Jan 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-cbv-seem-overwhelming\/","description":"When learning about class-based views in Django, it&rsquo;s easy to get overwhelmed. Dealing with the topic, you&rsquo;re bound to face not just the View class, but all of the generic class-based views out there. This can lead to choice paralysis, and make getting started with CBVs harder than it should be.\nYou don&rsquo;t need to deal with generic class-based views First of all, it&rsquo;s important to distinguish between class-based views (CBVs) and generic class-based views (gCBVs)."},{"title":"How to avoid CSRF errors with axios and Django?","link":"https:\/\/vsupalov.com\/avoid-csrf-errors-axios-django\/","pubDate":"Mon, 14 Jan 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/avoid-csrf-errors-axios-django\/","description":"Why do I get CSRF errors when making AJAX calls with axios?\nMaking CSRF-enabled AJAX requests with Django is a frequent stumbling block. The site gets suspicious and rejects your JS-based requests, as the CSRF token is missing from the request. Everything just to make your Django project more secure, but it can be an annoying gotcha.\nHere&rsquo;s how to avoid CSRF errors when using axios with Django:\nSet axios defaults, to pass along CSRF tokens Before you start using axios to fetch and submit data, you have to configure it to work correctly."},{"title":"When and Why Would I Need a JS Framework for Django?","link":"https:\/\/vsupalov.com\/when-and-why-js-framework-for-django\/","pubDate":"Tue, 08 Jan 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/when-and-why-js-framework-for-django\/","description":"Angular, Vue.js, React - when and why would you need them? When using Django, you already have everything you need to write great web applications. So, what makes people choose to use a JS framework? What&rsquo;s a good time to introduce a frontend framework to your Django project?\nIf you have done some research, visited some of the official frontend sites and still don&rsquo;t quite see\nwhy a JS frontend framework is a good idea how it could help with your Django project this list is for you."},{"title":"Do I NEED to Combine Django with Vue or React?","link":"https:\/\/vsupalov.com\/do-i-need-to-combine-django-with-vue-or-react\/","pubDate":"Tue, 01 Jan 2019 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/do-i-need-to-combine-django-with-vue-or-react\/","description":"It&rsquo;s really easy to get caught up in &ldquo;tech for tech&rsquo;s sake&rdquo;. Using new stuff is not a bad thing. The problem consists of opting for something just because it&rsquo;s new and popular.\nPeople who are relatively new to Django seem to be drawn to frontend frameworks. It&rsquo;s completely understandable - that&rsquo;s what everybody seems to be talking aboutthese days. Articles are telling about ways of building your Vue or React SPA, people on forums are asking about it."},{"title":"Vue.js Delimiters And Django","link":"https:\/\/vsupalov.com\/vue-js-delimiters-django\/","pubDate":"Tue, 18 Dec 2018 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/vue-js-delimiters-django\/","description":"What to do, when your backend templating engine is getting in the way of your frontend framework?\nThat&rsquo;s what happens if you&rsquo;re trying to mix Vue.JS and Django - both are using curly brackets by default, and it&rsquo;s easy to run into issues by accident. It&rsquo;s as simple, as forgetting that the two can clash in the first place.\nThen you&rsquo;re stuck wondering, why the variable seems to be an empty string in Vue, while the Django template went ahead and replaced it before Vue was around."},{"title":"Vue.js In A Django Template","link":"https:\/\/vsupalov.com\/vue-js-in-django-template\/","pubDate":"Sun, 02 Dec 2018 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/vue-js-in-django-template\/","description":"What to do when you&rsquo;re ready to level up the interactivity of your Django app, without having to fiddle around with jQuery? Do you have to build a full-fledged SPA, delete all your Django templates and reimplement everything with Django Rest Framework?\nYou don&rsquo;t have to give up everything you know and love from your Django projects. In fact, you can get the interactivity and convenience of Vue.js, without all the overhead of a SPA setup."},{"title":"Go JSON (Un)Marshalling, Missing Fields and Omitempty","link":"https:\/\/vsupalov.com\/go-json-omitempty\/","pubDate":"Wed, 21 Nov 2018 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/go-json-omitempty\/","description":"When working with JSON in Go recently, I wondered: &ldquo;What the heck does json:omitempty do?&rdquo;. I was looking for ways to handle missing fields while unmarshalling some JSON into a struct, and got confused for a while.\nHere are a few examples, as a reminder how most of it works.\nThose are not fancy edgecases. Those are self-contained, completely functional code snippets which should be easy to follow. You&rsquo;re welcome future-me."},{"title":"Switching to Go Modules - bye GOPATH and Godep","link":"https:\/\/vsupalov.com\/switch-to-go-modules\/","pubDate":"Wed, 14 Nov 2018 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/switch-to-go-modules\/","description":"Go modules! Finally you don&rsquo;t have to place your code into the directory structure imposed by GOPATH! Also, you don&rsquo;t need to set up external tooling, such as Godep, to manage your project&rsquo;s dependencies.\nAll you need is to use Go in the version 1.11+ and you&rsquo;re set.\nWell, not quite.\nBefore you can start enjoying modules, you need to make the switch to them, or init your fresh new project to use them."},{"title":"My views.py File Is Quickly Becoming Large. Should I Refactor It?","link":"https:\/\/vsupalov.com\/large-django-views-file\/","pubDate":"Mon, 08 Oct 2018 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/large-django-views-file\/","description":"Eventually, every Django project reaches a state when you ask yourself: should I refactor this views.py file?\nMaybe you find yourself jumping around randomly in a huge view.py file. Or it&rsquo;s just the line count which seems larger than it should be. Are 500 lines too much? How about 2000?\nHere are a few questions you can ask yourself to see if you should be worried, and a simple method to make large views."},{"title":"When do you use Django CBVs or FBVs?","link":"https:\/\/vsupalov.com\/django-cbv-vs-fbv-beginner\/","pubDate":"Mon, 17 Sep 2018 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/django-cbv-vs-fbv-beginner\/","description":"Do I use function-based views, class-based views or generic CBVs?\nIt&rsquo;s no big deal.\nRight now, there&rsquo;s three major (built-in) ways to write a view in Django. Either you:\nwrite a simple function write a class which inherits from the View class or choose one of the dozen-or-so generic class-based views to extend It can feel like a huge decision &ndash; you don&rsquo;t know if the decision will bite you eventually, or if you&rsquo;re missing out on something really cool."},{"title":"The Right Kubectl Version for Each Kubernetes Cluster","link":"https:\/\/vsupalov.com\/multiple-kubectl-versions\/","pubDate":"Thu, 05 Jul 2018 14:00:00 +0100","guid":"https:\/\/vsupalov.com\/multiple-kubectl-versions\/","description":"There was a pretty strange issue with service annotations (they would be silently dropped by kubectl, from what I can tell), which turned out to be caused by kubectl being updated to 1.9 by brew.\nHow many different Kubernetes clusters and versions do you need to work with? What happens to your scripts and workflows when you switch to a newer version of kubectl?\nDo you upgrade your tools, and rely on backwards compatibility?"},{"title":"Tool Spotlight: Watchtower","link":"https:\/\/vsupalov.com\/tools\/watchtower\/","pubDate":"Thu, 21 Jun 2018 18:00:00 +0100","guid":"https:\/\/vsupalov.com\/tools\/watchtower\/","description":"Watchtower helps you use the most recent Docker images.\nWhat is it for? Basically, an automated way to do very simple continuous deployment.\nWatchtower repeatedly asks the Docker registry whether one more more Docker tags point to a new image. If a newer image exists, Watchtower pulls it and restarts the corresponding containers.\nYou can use it for all containers on a machine, or only for some of them.\nYou might be interested if&hellip; You are running a containerized non-production environment which you want to keep updated."},{"title":"Docker Usage in 'The Flask Mega-Tutorial' by Miguel Grinberg - A Review","link":"https:\/\/vsupalov.com\/flask-megatutorial-review\/","pubDate":"Sun, 17 Jun 2018 08:00:00 +0100","guid":"https:\/\/vsupalov.com\/flask-megatutorial-review\/","description":"Remember when you first learned about virtualenv?\nLet me guess - you read about it, thought something like &ldquo;huh that&rsquo;s neat&rdquo;, and started using it right away, creating a new &rsquo;env&rsquo; directory right next to your code and adding it to .gitignore eventually.\nIn time, you transitioned towards using .venv files, virtualenvwrapper and storing your virtualenvs in a dedicated directory like &lsquo;~\/.envs&rsquo;, far from your codebase.\nYou only started learning about best practices and improving your workflows later on, once you got comfortable and virtualenv became a part of your toolset."},{"title":"Tool Spotlight: Portainer","link":"https:\/\/vsupalov.com\/tools\/portainer\/","pubDate":"Sun, 10 Jun 2018 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/tools\/portainer\/","description":"Portainer is a self-hosted web UI. You can use it to view the state of your containers, and interact with them.\nThe Portainer UI. What is it for? A UI to interact with your Docker host or Swarm cluster. Or just to get an overview.\nSee how many resources your containers are using. Get details about your Docker containers in a good-looking graphical interface. You might be interested if&hellip; You like graphical interfaces, and would like to use the Docker CLI a bit less."},{"title":"Unofficial 'CNCF Certified Kubernetes Administrator' Exam Curriculum 1.9 Self-Assessment","link":"https:\/\/vsupalov.com\/unofficial-kubernetes-self-assessment\/","pubDate":"Wed, 30 May 2018 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/unofficial-kubernetes-self-assessment\/","description":"Kubernetes is huge. Kubernetes is complex.\nKubernetes is also very very popular, remarkably beautiful and a lot of companies are interested in it.\nStarting out can be tough.\nYou have to understand Docker, know a bit about best practices regarding deploying web apps and appreciate the challenges around distributed systems.\nOnce you have a solid understanding of the basics, you can get up to speed and productive surprisingly fast. At least if you&rsquo;re using a well-kept k8s installation and can get assistance every now and then."},{"title":"I'm Choosing A New CI\/CD Tool, What Now?","link":"https:\/\/vsupalov.com\/help-choosing-new-ci-cd-tool\/","pubDate":"Tue, 22 May 2018 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/help-choosing-new-ci-cd-tool\/","description":"Congratulations! You&rsquo;re finally ready to automate a part of your deployment pipeline.\nDid the team size hit that magical 3-dev number? Is the product you&rsquo;re working on ready to become more than a prototype?\nOr do you just really really want to switch away from Jenkins?\nIn any case, you&rsquo;re ready to move on, and there&rsquo;s a lot to gain from doing so. Go you!\nBut where to start? There&rsquo;s more tools out there than you can list, let alone learn about, and doing so is confusing as hell."},{"title":"KubeCon Europe 2018 Takeaways","link":"https:\/\/vsupalov.com\/kubecon-europe-2018-takeaways\/","pubDate":"Sat, 05 May 2018 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/kubecon-europe-2018-takeaways\/","description":"The KubeCon Europe this year (2018) was a massive and exceptionally well organized event. Over four thousand people came to Copenhagen. There were a lot of very good talks and interesting people to meet.\nOf course, I mostly focused on topics which are close to my professional interest: helping small teams to get started with Kubernetes by designing deployment pipelines and building internal clusters.\nThe questions I&rsquo;ve been asking myself were:"},{"title":"Should You Run Your Database in Docker?","link":"https:\/\/vsupalov.com\/database-in-docker\/","pubDate":"Thu, 26 Apr 2018 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/database-in-docker\/","description":"Someone mentioned not running databases in containers, but I don&rsquo;t understand why it would be bad&hellip;\nWhat problems can be caused by running PostgreSQL in a container? Should you be worried even if you don&rsquo;t have a lot of traffic? Is it a general thing, and if so, why are so many apps setting up databases in their docker-compose files?\nLet&rsquo;s dig into this question, see what factors should influence your decision and whether you could do better or should start worrying."},{"title":"Help, Docker Compose Runs Old Containers!","link":"https:\/\/vsupalov.com\/docker-compose-runs-old-containers\/","pubDate":"Tue, 24 Apr 2018 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-compose-runs-old-containers\/","description":"When you build a fresh image and run docker-compose up, the changes should take effect, right?\nIs it docker-compose or is there an issue with my Dockerfile?\nAre You Using :Latest? The first thing to say, is a warning against using the :latest tag in any context except for local development.\nYou can read more here, but basically you&rsquo;re in for a lot of potential gotchas if you try to work with :latest for deployment processes."},{"title":"Find out Why Your Docker Container Keeps Crashing","link":"https:\/\/vsupalov.com\/debug-docker-container\/","pubDate":"Mon, 23 Apr 2018 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/debug-docker-container\/","description":"You have been struggling for ages. Rebuilding without caching, adding lines to your Dockerfile, disabling non-vital parts just to make it work.\nStill, the exit code you keep seeing is 1. And there&rsquo;s no useful output in the terminal.\nHow close are you to stripping the Dockerfile back to Alpine and starting over?\nThe following workflow which will help you figure out why your container won&rsquo;t start. Without starting over, or making big changes."},{"title":"What's Wrong With The Docker :latest Tag?","link":"https:\/\/vsupalov.com\/docker-latest-tag\/","pubDate":"Mon, 26 Mar 2018 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-latest-tag\/","description":"For me, &ldquo;latest&rdquo; is an anti-pattern\nDo not run any container with the latest tag. Been there, done that. Did not end very well.\nLatest is a proliferating ball of confusion that should be avoided like a ravine full of venomous snakes\nDocker images tagged with :latest have caused many people a lot of trouble.\nBut what exactly is wrong with the :latest tag? Should you avoid it completely when working with Docker images?"},{"title":"Use More Kubernetes Labels!","link":"https:\/\/vsupalov.com\/use-more-kubernetes-labels\/","pubDate":"Wed, 21 Mar 2018 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/use-more-kubernetes-labels\/","description":"Labels in Kubernetes are in a weird place. Few people talk about them. Sometimes they might even feel like a minor afterthought.\nWhen starting out, you might not appreciate them enough. Sure, you can&rsquo;t get around labeling your pods a little, otherwise they won&rsquo;t get picked up by services and deployments won&rsquo;t work &ndash; but that&rsquo;s pretty much it.\nIf You\u2019re Not Madly in Love with the Elegance of Labels, You\u2019re Missing Out Labels are EVERYWHERE in Kubernetes."},{"title":"Resources for Getting Started with Kubernetes","link":"https:\/\/vsupalov.com\/getting-started-with-kubernetes\/","pubDate":"Sat, 17 Mar 2018 19:00:00 +0000","guid":"https:\/\/vsupalov.com\/getting-started-with-kubernetes\/","description":"There&rsquo;s lots of resources out there about &ldquo;getting&rdquo; and learning Kubernetes. Unfortunately, not all of them are really concise, to-the-point and worth your time.\nAs with Docker, the Kubernetes field is very popular and moving incredibly fast. There&rsquo;s a lot of noise, outdated material, company bias and poorly informed advice.\nHere&rsquo;s a hand-picked selection of great resources for different aspects of getting started with Kubernetes!\nGetting &ldquo;Why?&rdquo; Knowing what issues Kubernetes was made to solve, and when you should use it is the first step."},{"title":"Get Rid of Namespace Parameters When Working with Kubernetes","link":"https:\/\/vsupalov.com\/get-rid-of-kubernetes-namespace-parameters\/","pubDate":"Thu, 25 Jan 2018 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/get-rid-of-kubernetes-namespace-parameters\/","description":"Have you grown sick and tired of typing kubectl -n someverylongnamespacename all day long?\nThere&rsquo;s a few ways to ditch the namespace flag from every. single. command. you issue. The best choice for you, depends on the number of clusters you work with, their stability and your workflows.\nCreate a Shell Alias If you just want to type less and are working with a single namespace, you could just create an alias in your ."},{"title":"Selected Kubernetes Resources","link":"https:\/\/vsupalov.com\/k8s-resources\/","pubDate":"Fri, 05 Jan 2018 19:20:35 +0100","guid":"https:\/\/vsupalov.com\/k8s-resources\/","description":"Learning Kubernetes Resources for Getting Started with Kubernetes Unofficial &lsquo;CNCF Certified Kubernetes Administrator&rsquo; Exam Curriculum 1.9 Self-Assessment Kubernetes Production Patterns and Anti-Patterns Use More Kubernetes Labels! YAML for Docker Compose and Kubernetes Config Files Finding YAML Examples and Docs For Kubernetes Config Files KubeCon Europe 2018 Takeaways Using Docker 6 Docker Basics You Should Completely Grasp When Getting Started Docker ARG, ENV and .env - a Complete Guide What&rsquo;s Wrong With The Docker :latest Tag?"},{"title":"Pass Environment Variables From the Host Machine to your Docker Container","link":"https:\/\/vsupalov.com\/docker-environment-variables-from-host\/","pubDate":"Sat, 04 Nov 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-environment-variables-from-host\/","description":"Are you tired of typing out the values of -e parameters every single time when you run your containers? Maybe the values are even sensitive, and should not end up in your logs (if you&rsquo;re using a CI tool like Jenkins or GitLab CI) or bash history.\nIf there a way to pass values to environment variables of Docker containers, without typing them out?\nPassing Environment Variable Values You can pass the values of environment variables from the host to your containers without much effort."},{"title":"Pass Docker Environment Variables During The Image Build","link":"https:\/\/vsupalov.com\/docker-build-pass-environment-variables\/","pubDate":"Sat, 04 Nov 2017 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/docker-build-pass-environment-variables\/","description":"Working with ENV instructions and environment variables when building Docker images can be surprisingly challenging.\nThis article is an overview of all the ways you can pass or set variables while building a Docker image, from simple to more complex.\n0 Option 1: Hardcoding Default ENV values Fixed ENV values can be good enough in some cases, and the easiest way to define a variable which is usable during your image build as well as by a future container started from that image."},{"title":"Do I HAVE to ADD my Code Into the Docker Image When Deploying?","link":"https:\/\/vsupalov.com\/docker-mount-or-add-code-for-production-deploy\/","pubDate":"Tue, 03 Oct 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-mount-or-add-code-for-production-deploy\/","description":"If you are asking this question, you probably started out using Docker for your local development environment. If you have done a proper job, it comes up with a single docker-compose up, you can perform maintenance tasks without breaking a leg and see the effect of code changes right away when running a development server. Shiny!\nAn important part of this setup, consists of mounting your project code inside the container from the host."},{"title":"Should Built Docker Images Be Used in a Development Environment? Should Dockerfiles Be Used in a Production Environment?","link":"https:\/\/vsupalov.com\/dockerfile-in-production-docker-image-in-dev\/","pubDate":"Tue, 03 Oct 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/dockerfile-in-production-docker-image-in-dev\/","description":"When getting started with using Docker, you&rsquo;re very likely to run into all kinds of practical issues. It gets even less straightforward to find answers when you get out of the realm of purely technical questions, and into processes and workflows.\nOne of them, is whether you should be using Dockerfiles in your production environments, or make development environments rely on pulling custom images. Let&rsquo;s discuss both issues and clear up the confusion by making sure we got the requirements and context straight."},{"title":"Docker ARG vs ENV","link":"https:\/\/vsupalov.com\/docker-arg-vs-env\/","pubDate":"Thu, 28 Sep 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-arg-vs-env\/","description":"ARG and env can be confusing at first. Both are Dockerfile instructions which help you define variables, and from within the Dockerfile they feel pretty similar.\nLet&rsquo;s make sure that you understand the difference, and can use both of them comfortably to build better Docker images without repeating yourself.\nENV is for future running containers. ARG for building your Docker image. ENV is mainly meant to provide default values for your future environment variables."},{"title":"Setting Default Docker Environment Variables During Image Build","link":"https:\/\/vsupalov.com\/docker-build-time-env-values\/","pubDate":"Thu, 28 Sep 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-build-time-env-values\/","description":"Docker ARG and ENV can be a frustrating topic. You can only set ARG values while building the image, and only ENV values are used to set environment variables in running containers.\nSlow Docker image builds? Here are 5 tips to speed them up!\nWhat if you want to specify default ENV values while building your Docker image? Do you really need to edit your Dockerfile every single time?\nGood news!"},{"title":"Speed Up The Build of Your Python Docker Image","link":"https:\/\/vsupalov.com\/speed-up-python-docker-image-build\/","pubDate":"Thu, 28 Sep 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/speed-up-python-docker-image-build\/","description":"Are you waiting for ages, every time you&rsquo;re changing a tiny detail in your dockerized Python project and need to build an image? Literally any comment change, makes it necessary to install every. single. pip. dependency. Over and over! Aaaargh.\nThat&rsquo;s not an issue if you&rsquo;re working in your dev environment, as you&rsquo;re simply mounting your code and have a volume for your virtualenv directory - but building a new image for testing, staging or production takes a long time."},{"title":"Should You Use The Same Dockerfile For Dev, Staging And Production Builds?","link":"https:\/\/vsupalov.com\/same-dockerfile-dev-staging-production\/","pubDate":"Thu, 21 Sep 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/same-dockerfile-dev-staging-production\/","description":"Docker images can be a great way to create reproducible, automated environments. You&rsquo;ve gotten your app to work locally with Docker - everything is up with a single command and you are ready to start planning. You&rsquo;ll want to use Docker for development and to run your app in testing for now, to learn enough to move to production eventually.\nBut what about the details? Should you try to use one single Dockerfile for all environments of the project or should you have individual ones?"},{"title":"Finding YAML Examples and Docs For Kubernetes Config Files","link":"https:\/\/vsupalov.com\/yaml-kubernetes-examples-docs-spec\/","pubDate":"Fri, 15 Sep 2017 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/yaml-kubernetes-examples-docs-spec\/","description":"When new to Kubernetes, it&rsquo;s sometimes hard to find the information you need to get started. The docs are there, but don&rsquo;t feel focused enough at times.\nWriting resource YAML files can be challenging, if you don&rsquo;t know what fields are available and what they do.\nHere are a few ways to look up info on fields and find examples for files like pods.yaml, rs.yaml, rc.yaml, secret.yaml, svc.yaml, deployment.yml.\nExamples in The Docs The documentation pages have examples of YAML files, which can be a good starting point to see how a simple resource file is supposed to look."},{"title":"Labels and Annotations in Kubernetes","link":"https:\/\/vsupalov.com\/kubernetes-labels-annotations-difference\/","pubDate":"Fri, 15 Sep 2017 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/kubernetes-labels-annotations-difference\/","description":"What&rsquo;s the difference between labels and annotations?\nAt first glance, both seem to be simple key-value pairs, meant to add metadata to a Kubernetes setup. The distinction is easy to explain, but takes a bit of time to understand from the docs.\nLabels Contain identifying information and are a used by selector queries or within selector sections in object definitions. The structure of keys as well as values is constrained. This way, queries can be evaluated quickly, using optimized data structures and algorithms."},{"title":"YAML for Docker Compose and Kubernetes Config Files","link":"https:\/\/vsupalov.com\/yaml-docker-compose-kubernetes\/","pubDate":"Fri, 15 Sep 2017 19:00:00 +0100","guid":"https:\/\/vsupalov.com\/yaml-docker-compose-kubernetes\/","description":"When you&rsquo;re getting into the Docker ecosystem, or are starting to work with Kubernetes, you&rsquo;ll get to look at lots of files in YAML format. The YAML format is meant to be human-readable and convenient to type. And it is. It&rsquo;s the popular kid compared to JSON or XML formats for a reason.\nIt&rsquo;s also pretty versatile, so you can express stuff in many different ways. When you read docs, you&rsquo;ll see people refer to it as YML, files can end in either &ldquo;."},{"title":"Debugging a Broken Docker Compose Service Which Crashes Right Away","link":"https:\/\/vsupalov.com\/debug-docker-compose-service\/","pubDate":"Thu, 31 Aug 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/debug-docker-compose-service\/","description":"If you&rsquo;re working with any more-complex docker-compose file, and are building your own images and specifying your own entrypoint scripts, you know that lots of stuff can go wrong. Here&rsquo;s my favourite: One of your docker-compose services keeps crashing, with an obscure error message which isn&rsquo;t enough to fix the issue. Unfortunately, to fix it you need the other containers in the stack to be up.\nWhen you&rsquo;re working with a single Docker image, you can build it, and run a container from it in interactive mode, specifying an override for the entrypoint and command parameters, and voila - you can tinker around and find the issue in no time."},{"title":"Using Docker For Python Web Development - Why And How","link":"https:\/\/vsupalov.com\/docker-python-development\/","pubDate":"Thu, 31 Aug 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-python-development\/","description":"&ldquo;What&rsquo;s the advantage of using Docker instead of virtualenv?&rdquo; &ldquo;Why run a development server inside a container. It works just fine as it is.&rdquo; &ldquo;This looks like unnecessary complexity. Why would anyone do that?&rdquo; That&rsquo;s what you sometimes hear from smart, busy people who are first introduced to the idea of using containers for local development.\nBefore diving in: If you have worked with Vagrant to setup reproducible, automated development environments, you don&rsquo;t have a lot to gain from switching to Docker locally."},{"title":"Exiting a Docker Container","link":"https:\/\/vsupalov.com\/exit-docker-container\/","pubDate":"Tue, 29 Aug 2017 00:00:00 +0000","guid":"https:\/\/vsupalov.com\/exit-docker-container\/","description":"Want to exit a docker container? You have several options to choose from.\nYou can either &ldquo;detach&rdquo; from the interactive session to leave your conainer running in the background, or you can exit it. Let&rsquo;s look at both.\nPrefer a video explanation? Check it out on YouTube! (screenshot of the video) This is relevant if you have started your container with something like:\ndocker run -it busybox sh And are currently in a shell session inside the container."},{"title":"Should I Upgrade My Docker Compose File Version From 2 to 3?","link":"https:\/\/vsupalov.com\/upgrade-docker-compose-file-version\/","pubDate":"Sat, 26 Aug 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/upgrade-docker-compose-file-version\/","description":"When writing docker-compose files, you&rsquo;ve been starting each by specifying the version. I myself, have been using docker-compose for a while, and the yml format since fig was introduced. Until recently my docker-compose.yml files all started like this:\nversion: &#34;2&#34; A version 3 was introduced, but all my old stuff still worked. So why bother, right? I was hesitant to put in the work, as there were no features that I wanted to use for my projects."},{"title":"The Difference Between Docker Compose And Docker Stack","link":"https:\/\/vsupalov.com\/difference-docker-compose-and-docker-stack\/","pubDate":"Tue, 01 Aug 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/difference-docker-compose-and-docker-stack\/","description":"In recent releases, a few things have happened in the Docker world. Swarm mode got integrated into the Docker Engine in 1.12, and has brought with it several new tools. Among others, it&rsquo;s possible to make use of docker-compose.yml files to bring up stacks of Docker containers, without having to install Docker Compose.\nThe command is called docker stack, and it looks exactly the same to docker-compose. Here&rsquo;s a comparison:"},{"title":"Using SQLAlchemy with Flask to Connect to PostgreSQL","link":"https:\/\/vsupalov.com\/flask-sqlalchemy-postgres\/","pubDate":"Tue, 01 Aug 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/flask-sqlalchemy-postgres\/","description":"Modern webapps are meant to be stateless. They don&rsquo;t have something which needs to be remembered - a state. This is the reason why horizontal scaling, spinning up multiple instances of your app, is possible without breaking everything. The data is saved in another service, which is made to be really good at handling it and making it accessible - a database.\nLet&rsquo;s connect our Flask app from the previous article to the PostgreSQL database which we are able to launch in a Docker container, and start doing useful stuff instead of just emitting &ldquo;Hello World&rdquo;."},{"title":"What Exactly is Docker Swarm?","link":"https:\/\/vsupalov.com\/what-is-docker-swarm\/","pubDate":"Tue, 01 Aug 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/what-is-docker-swarm\/","description":"Docker version 1.12 Swarm mode was integrated with Docker Engine but what is it exactly and how can you use it? Should you care?\nIf You&rsquo;re A Ubuntu Users The most recent version of the Docker Engine, is available as a &ldquo;community edition&rdquo;, older package versions were called docker-engine or just docker.\nIf you&rsquo;re on Ubuntu and have been using the docker-engine package before, you probably want to upgrade\nSwarm Mode A swarm is a cluster of one or more computers running Docker."},{"title":"Running Wordpress In Docker For The First Time","link":"https:\/\/vsupalov.com\/docker-wordpress-start\/","pubDate":"Wed, 26 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-wordpress-start\/","description":"You probably have stumbled over Docker multiple times already. People use it to deploy all kinds of web apps, using it for neat development processes and everybody has been pretty excited about it for quite a while.\nBut what is it? Is it any use when developing WordPress sites, plugins and themes? What&rsquo;s the use?\nIf you&rsquo;re completely new to Docker or would like to learn why it&rsquo;s popular explained without the hype, check out this post to brush up on the basics."},{"title":"6 Docker Basics You Should Completely Grasp When Getting Started","link":"https:\/\/vsupalov.com\/6-docker-basics\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/6-docker-basics\/","description":"You&rsquo;re here because you want to use Docker for a small project. The idea is to test it out and see how it fits into your current tools. After doing a bit of googling to get an overview of the things people do with it, you&rsquo;re probably a bit overwhelmed.\nThere&rsquo;s lots of projects using it and all kinds of people talking about it. But why? What&rsquo;s the advantage of using Docker?"},{"title":"Access Private Repositories from Your Dockerfile Without Leaving Behind Your SSH Keys","link":"https:\/\/vsupalov.com\/build-docker-image-clone-private-repo-ssh-key\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/build-docker-image-clone-private-repo-ssh-key\/","description":"If you&rsquo;re not careful, your secrets will leave traces inside of your Docker image.\nUpdate: there&rsquo;s a new, convenient way to give your building Docker image access to a private Git repository with BuildKit. Check it out!\nIf you copy over your private SSH key into the image during the build to clone a private Git repository, it might stick around. If you add a file during an image build, and then delete it in another one, the file still sticks around in the final image!"},{"title":"Adding A Dockerized Application To Your Deployment Setup","link":"https:\/\/vsupalov.com\/start-with-docker-for-your-deployment\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/start-with-docker-for-your-deployment\/","description":"There are a lot of great services for deploying your application without having to set up servers by hand, or deal with the nitty-gritty of infrastructure. The good ones save time, effort and make it easy to start delivering your product to your users. They are made to solve a particular problem for a particular kind of customer.\nChances are, that when your company, product and team grows, you&rsquo;ll be approaching the boundaries of &ldquo;this is made for me&rdquo; and going beyond them."},{"title":"Can You Mount a Volume While Building Your Docker Image to Cache Dependencies?","link":"https:\/\/vsupalov.com\/cache-docker-build-dependencies-without-volume-mounting\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/cache-docker-build-dependencies-without-volume-mounting\/","description":"Right now, you can&rsquo;t mount volumes while building an image, as you can when working with containers. There is no -v option when issuing a docker build.\nIt would be really handy - if you use a volume, you&rsquo;re not impacting the size of the image, can mount data from outside of the container and reuse previously executed work as a kind-of-starting-point.\nSo, do you have to accept that your image is 1."},{"title":"Deploying Like an Early Stage Startup","link":"https:\/\/vsupalov.com\/deploying-like-a-startup\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/deploying-like-a-startup\/","description":"Co-founding a startup is hard. There&rsquo;s lots of tasks to manage, you&rsquo;re always running low on attention, time and hours in the week. If you&rsquo;re lucky enough to have a team of three by now, with two people who are in charge of tech, it still won&rsquo;t feel like you&rsquo;re making enough progress on the product.\nOf course you can&rsquo;t just focus on building the thing. There&rsquo;s marketing, events which need your attention, you need to make some time to talk to potential users and customers."},{"title":"Deploying Your Web App Using a Deploy Key","link":"https:\/\/vsupalov.com\/deploying-with-deploy-key\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/deploying-with-deploy-key\/","description":"Are you happy with the way your apps are deployed right now? Are you, by any chance, using scp or an ftp client to bring your projects to your server once it&rsquo;s time to update or redeploy your web app? Can your server access all your repositories, with too many permissions? That shouldn&rsquo;t be the case, and it&rsquo;s fixable.\nHere&rsquo;s the most basic workflow to deploy your web app to a server."},{"title":"Deployment Properties You Want And Tasks You Should be Able to Do","link":"https:\/\/vsupalov.com\/deployment-tasks\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/deployment-tasks\/","description":"Your web app is shipped, online and running smoothly. You had some struggle at first, before choosing what platform and tech to go with, and the learning curve was a bit harsh. Now you&rsquo;re still a bit unsure - did you miss something?\nWill the app go ka-boosh in the middle of the night, and you&rsquo;ll be wondering what happened in the morning? What if there&rsquo;re too many users all at once?"},{"title":"Docker ARG, ENV and .env - a Complete Guide","link":"https:\/\/vsupalov.com\/docker-arg-env-variable-guide\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-arg-env-variable-guide\/","description":"Error: Docker image build failed. Building Docker images and configuring your dockerized apps doesn&rsquo;t have to be a try-fail-repeat Google extravaganza. This article will help you work with Docker ARG, ENV, env_file and .env files with confidence.\nThe only prerequisite: make sure that you&rsquo;re comfortable with the basics of Docker.\nRead on and you will understand how to configure your Docker images and dockerized apps with ease - with the power of Docker build-time variables, environment variables and docker-compose templating."},{"title":"Running Headless Chrome with Puppeteer and Docker","link":"https:\/\/vsupalov.com\/headless-chrome-puppeteer-docker\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/headless-chrome-puppeteer-docker\/","description":"Headless Chrome has been published by Google&rsquo;s Chrome team, causing a lot of excitement all across the board and immediately causing major shifts in the tooling landscape, such as a complete stop in the development of PhantomJS.\nPuppeteer is the Node API for Headless Chrome. It can be used to control Headless Chrome over the DevTools protocol.\nMost things that you can do manually in the browser can be done using Puppeteer!"},{"title":"So You Want to Deploy Your Web App - a Goal Oriented Introduction","link":"https:\/\/vsupalov.com\/deployment-intro\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/deployment-intro\/","description":"You can whip up a cool web app on your developer machine, but once it&rsquo;s time to launch it, you feel stuck. There seem to be a lot of different tools out there. You heard that Docker is what people use to deploy stuff - so you started looking into it, but where to start? Does it have to be that friggin&rsquo; hard? Kubernetes seems to be really popular right now, but is it right for you?"},{"title":"Understanding Docker Build Args, Environment Variables and Docker Compose Variables","link":"https:\/\/vsupalov.com\/docker-env-vars\/","pubDate":"Thu, 13 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/docker-env-vars\/","description":"UPDATE: There&rsquo;s a new, improved article on this topic - Docker ARG, ENV and .env, a complete guide. Check it out, or continue with this one if you like :)\nWhen working with Docker, you&rsquo;ll stumble over lots of confusing details. I struggled with understanding how to pass variables to Docker images, and how to configure dockerized applications properly.\nDo these sound familiar?\nHow can you set variables during build time?"},{"title":"Cleaning Up After Docker","link":"https:\/\/vsupalov.com\/cleaning-up-after-docker\/","pubDate":"Mon, 10 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/cleaning-up-after-docker\/","description":"Have you been running and re-running docker-compose lately? If you&rsquo;re using Docker for development purposes, you&rsquo;re running lots of containers, building new images and probably have a chunk of space on your disk which is occupied by stuff you don&rsquo;t need.\nJust chucking along, and not doing anything about it, will soon see your root directory fill up 99% of your available space. Weird things tend to happen when you max out your capacity - here&rsquo;s what you need to do to clean up after Docker."},{"title":"Should You Try to Set Environment Variables Based on a Command Output While Building a Docker Image?","link":"https:\/\/vsupalov.com\/set-dynamic-environment-variable-during-docker-image-build\/","pubDate":"Mon, 10 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/set-dynamic-environment-variable-during-docker-image-build\/","description":"Ever wanted to have dynamically-set environment variables when writing a new Dockerfile for building your image? Not dynamically-set before you start building the image (that&rsquo;s a job for ARG and &ndash;build-arg), but set during the image build process, while the Dockerfile lines are interpreted, not bound to the host machine in any way.\nRe-executing the command in question several times will either be wasteful, or plain wrong. Something like a timestamp:"},{"title":"Using Docker Compose for Development Environment Dependencies","link":"https:\/\/vsupalov.com\/flask-docker-compose-development-dependencies\/","pubDate":"Sat, 08 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/flask-docker-compose-development-dependencies\/","description":"Have you ever configured a local PostgreSQL database for a development project? How about multiple projects at the same time? Having particular versions of databases and other helper services for different projects is a common scenario, and can be solved using Docker containers quite elegantly. Let&rsquo;s look at how to do this for a simple Flask application.\nThis is the third article in a series about building a real-life Flask web application."},{"title":"Analyzing my Spotify Music Library With Jupyter And a Bit of Pandas","link":"https:\/\/vsupalov.com\/analyze-spotify-music-library-with-jupyter-pandas\/","pubDate":"Wed, 05 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/analyze-spotify-music-library-with-jupyter-pandas\/","description":"Are you a Spotify user? By now, that&rsquo;s the way I consume most of my music.\nRecently, I have been developing a web app which uses the Spotify API in part for a series of posts about developing a small real-life application and web development in general. The app is written in Python and Flask for displaying full-sized album art for the songs which are playing on a user&rsquo;s Spotify account."},{"title":"Developing With Python 3.6 on Ubuntu 16.04 LTS - Getting Started and Keeping Control","link":"https:\/\/vsupalov.com\/developing-with-python3-6-on-ubuntu-16-04\/","pubDate":"Wed, 05 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/developing-with-python3-6-on-ubuntu-16-04\/","description":"Recently, I started developing locally on my Ubuntu machine again, without having all of my development environment dockerized.\nHere&rsquo;s the approach I use to work with Python3.6 on Ubuntu 16.04 LTS, and the setup steps which I used to set everything up. As those notes are in-retrospect, it might be the case that I missed a detail or two.\nUsing Ubuntu 18.04 and wanna see an updated, complete example for Python 3."},{"title":"Starting a Simple Flask Application From Scratch","link":"https:\/\/vsupalov.com\/flask-app-starting-project\/","pubDate":"Mon, 03 Jul 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/flask-app-starting-project\/","description":"As introduced in the previous article, we&rsquo;re going to build a web app using Python and Flask. It&rsquo;s going to interact with the Spotify API and show the album image of the currently playing song for a logged-in user. The visuals are meant to be displayed as big as wanted or necessary. Fullscreen if possible. Apart from stating the initial intentions, we have not done any hands-on work. Let&rsquo;s change this!"},{"title":"Creating a Real-Life Flask Application","link":"https:\/\/vsupalov.com\/flask-app-big-album-art\/","pubDate":"Wed, 28 Jun 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/flask-app-big-album-art\/","description":"Getting into Python web development should be fun and practical.\nRight now, there&rsquo;s a few tutorials showcasing simple applications and a few open source projects which people can learn from. The tutorials are covering various aspects and important concepts, but few really overlap with issues concerning long-term maintenance, real-world issues which crop up and important aspects of making a project successful.\nLet&rsquo;s change that! This is the start of a mix: a real-world web development project and tutorial series featuring Flask."},{"title":"The Problem With Your Dockerized Django Development Workflow","link":"https:\/\/vsupalov.com\/problem-django-development-workflow\/","pubDate":"Wed, 28 Jun 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/problem-django-development-workflow\/","description":"Are you using docker-compose to bring up your local Django development environment? Did you experience the following nuisances lately?\nYou had to rebuild a Docker image. You had to wait forever for your Django container to come up. You were waiting while a container was spinning up or down to continue with your work. You had to restart the whole container stack. You ran containerized management commands, which took way longer than they should."},{"title":"Flask Is Not Your Production Server","link":"https:\/\/vsupalov.com\/flask-web-server-in-production\/","pubDate":"Mon, 26 Jun 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/flask-web-server-in-production\/","description":"You&rsquo;ve built your Flask web app and are working on deploying the site - either on Heroku or on your own VPS of choice. It&rsquo;s your first, small app and you kinda expected that setting debug to False on the app.run should be enough. Maybe enable threaded too?\nYou really shouldn&rsquo;t rely on that. The official docs disagree as well.\nWhile lightweight and easy to use, Flask\u2019s built-in server is not suitable for production as it doesn\u2019t scale well and by default serves only one request at a time."},{"title":"Running Frontend and Backend Development Servers Together","link":"https:\/\/vsupalov.com\/combine-frontend-and-backend-development-servers\/","pubDate":"Wed, 21 Jun 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/combine-frontend-and-backend-development-servers\/","description":"You are developing your backend in Django or Flask and are looking to combine it with a cool dynamic frontend - Vue.js, Angular, React or Ember.\nHow to make it possible for the frontend to access the backend server, while both run in development and provide you with useful debug outputs and convenient development functionality? You&rsquo;d want to somehow combine both servers, so they can interact with each other. But each can only run on its own port."},{"title":"When Starting Out Tinkering With Webdev - is Flask or Django better?","link":"https:\/\/vsupalov.com\/starting-out-with-python-webdev-flask-or-django\/","pubDate":"Wed, 21 Jun 2017 20:00:00 +0100","guid":"https:\/\/vsupalov.com\/starting-out-with-python-webdev-flask-or-django\/","description":"If you want to start tinkering with webdev and have decided on using Python as your backend language of choice, you are often stuck with choosing a framework. There is lots of options, and usually confusion ensues. Even worse - you can be struck by analysis paralysis and get discouraged.\nLet&rsquo;s solve that! In Python, there are two great frameworks which you can easily choose from, without having to learn everything about webdev first."},{"title":"Datenschutzerkl\u00e4rung","link":"https:\/\/vsupalov.com\/privacy\/","pubDate":"Wed, 25 Mar 2015 19:20:35 +0100","guid":"https:\/\/vsupalov.com\/privacy\/","description":"1. Datenschutz auf einen Blick Allgemeine Hinweise Die folgenden Hinweise geben einen einfachen &Uuml;berblick dar&uuml;ber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie pers&ouml;nlich identifiziert werden k&ouml;nnen. Ausf&uuml;hrliche Informationen zum Thema Datenschutz entnehmen Sie unserer unter diesem Text aufgef&uuml;hrten Datenschutzerkl&auml;rung.\nDatenerfassung auf dieser Website Wer ist verantwortlich f&uuml;r die Datenerfassung auf dieser Website? Die Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber."},{"title":"Every Article Ever","link":"https:\/\/vsupalov.com\/articles\/","pubDate":"Wed, 25 Mar 2015 19:20:35 +0100","guid":"https:\/\/vsupalov.com\/articles\/","description":{}},{"title":"Impressum","link":"https:\/\/vsupalov.com\/impressum\/","pubDate":"Wed, 25 Mar 2015 19:20:35 +0100","guid":"https:\/\/vsupalov.com\/impressum\/","description":"Angaben gem&auml;&szlig; &sect; 5 TMG Vladislav Supalov\nSupalov Software &amp; Services\nM&uuml;hlenstr. 8a\n14167 Berlin\nKontakt Telefon: +4915788912641\nE-Mail: mail@vsupalov.com\nUmsatzsteuer-ID Umsatzsteuer-Identifikationsnummer gem&auml;&szlig; &sect; 27 a Umsatzsteuergesetz:\nDE315768911\nRedaktionell verantwortlich Vladislav Supalov\nHaselnussweg 20\n59269 Beckum\nEU-Streitschlichtung Die Europ&auml;ische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: https:\/\/ec.europa.eu\/consumers\/odr\/.\nUnsere E-Mail-Adresse finden Sie oben im Impressum.\nVerbraucher&shy;streit&shy;beilegung\/Universal&shy;schlichtungs&shy;stelle Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.\nSite Notice Information pursuant to Sect."},{"title":"Newsletter","link":"https:\/\/vsupalov.com\/newsletter\/","pubDate":"Wed, 25 Mar 2015 19:20:35 +0100","guid":"https:\/\/vsupalov.com\/newsletter\/","description":"If you found value in my writing, the newsletter is the easiest way to stay in the loop.\nI send emails when there is a new article about a tool I enjoy to use, or about making profitable digital businesses less brittle, less founder-dependent and easier to run.\nExpect practical notes around topics like:\nbackups, restore readiness and recovery planning safer deploys, infrastructure cleanup and observability automation that removes recurring founder work documentation and operational clarity for handover, time off or growth nitty-gritty about best-in-class tooling that lives below your product It stays practical and low-volume."}]}}