In a large pot or Dutch oven over medium heat, cook the chopped bacon until crisp. Use a slotted spoon to remove the bacon bits and drain on paper towels, leaving the rendered fat in the pot. This bacon fat will add amazing flavor to the soup base.
Add the butter to the bacon fat and melt it. Then stir in the chopped onion and cook until translucent and soft, about 5 minutes. Add the minced garlic and cook for another minute until fragrant, careful not to burn it.
Sprinkle the flour over the onion and garlic mixture, stirring constantly to combine and cook the flour for 1-2 minutes. Gradually whisk in the chicken broth, making sure to dissolve any lumps. Bring the mixture to a simmer.
Add the diced potatoes to the pot. Simmer until the potatoes are very tender, about 20 minutes. You can test by poking a piece with a fork; it should slide off easily.
For a thicker, creamier texture, use a potato masher to mash some of the potatoes in the pot, or carefully pulse a few times with an immersion blender. Leave some chunks for that perfect rustic feel.
Stir in the milk (or cream), shredded cheddar cheese, sour cream, and cooked bacon bits. Heat gently until the cheese melts and the soup is creamy and smooth. Season with salt, pepper, and optional smoked paprika or cayenne to taste. Garnish with sliced green onions and serve hot.