Heat olive oil in a large Dutch oven or soup pot over medium-high heat. Add the carrots, onions, and celery. Cook, stirring, until the vegetables start to soften, about 5-7 minutes. Add the garlic and cook until fragrant, about 30 seconds.
Add the ham bone, bay leaf, thyme, chicken broth, and tomatoes. Add black pepper, to taste. Wait to salt the pot until later, since the ham bone can be salty and you might not need too much extra salt by the end.
Bring to a boil; reduce the heat to low, cover, and simmer for 20 minutes. Add the potatoes and cabbage; simmer (covered) for about 30 more minutes, or until the potatoes are fork-tender.
Stir in the beans and the diced ham. Simmer for about 10-15 more minutes, just until the beans and ham are heated through. Discard the ham bone and bay leaf. Taste and season with salt and cayenne pepper or hot sauce, if desired.
Ladle into bowls, garnish with optional toppings, and serve!