services/diagram.py

119 lines
3.8 KiB
Python
Raw Normal View History

2022-08-01 21:34:12 +00:00
""" Diagram to visualize serguzim.net """
2022-08-02 12:07:34 +00:00
# pragma pylint: disable=pointless-statement
import glob
import mimetypes
import os
from urllib.request import urlretrieve
2022-08-01 21:34:12 +00:00
from diagrams import Cluster, Diagram
2022-08-02 12:07:34 +00:00
from diagrams.custom import Custom
2022-08-01 21:34:12 +00:00
from diagrams.oci.storage import ObjectStorage
from diagrams.onprem.database import Influxdb, Postgresql
2022-08-02 12:07:34 +00:00
from diagrams.onprem.inmemory import Redis
2022-08-01 21:34:12 +00:00
from diagrams.onprem.monitoring import Grafana, Prometheus
from diagrams.onprem.network import Caddy
from diagrams.onprem.vcs import Gitea
2022-08-02 12:07:34 +00:00
import requests
ASSETS_DIR = "./diagram_assets/"
os.makedirs(ASSETS_DIR, exist_ok=True)
2022-08-01 21:34:12 +00:00
def add_to_groups(service, *groups):
""" Add a service to groups like 'db_users' """
for group in groups:
group.append(service)
2022-08-02 12:07:34 +00:00
def get_custom_icon(name, url):
""" Download icon for service to location. Reuses existing icons. """
icon_no_extension = os.path.join(ASSETS_DIR, name)
exisiting_icons = glob.glob(icon_no_extension + ".*")
if exisiting_icons:
return exisiting_icons[0]
response = requests.head(url, allow_redirects=True)
extension = mimetypes.guess_extension(response.headers['Content-Type'])
icon = icon_no_extension + extension
urlretrieve(url, icon)
return icon
2022-08-01 21:34:12 +00:00
with Diagram("serguzim.net", show=False):
2022-11-10 18:00:32 +00:00
node001 = Cluster("node001.serguzim.net")
2022-08-01 21:34:12 +00:00
node002 = Cluster("node002.serguzim.net")
exoscale_objectstore = ObjectStorage("Exoscale Object Storage")
with node002:
services = []
db_users = []
objectstore_users = []
proxy = Caddy()
2022-08-02 12:07:34 +00:00
ICON_URL = "https://avatars.githubusercontent.com/u/105618662"
analytics = Custom("analytics.serguzim.me", get_custom_icon("umami", ICON_URL))
add_to_groups(analytics, services, db_users)
ICON_URL = "https://avatars.githubusercontent.com/u/84780935"
ci = Custom("ci.serguzim.me", get_custom_icon("woodpecker-ci", ICON_URL))
2022-08-01 21:34:12 +00:00
add_to_groups(ci, services, db_users)
db_time = Influxdb("tick.serguzim.me")
add_to_groups(db_time, services, db_users)
db = Postgresql("db.serguzim.me")
graph = Grafana("graph.serguzim.me")
add_to_groups(graph, services, db_users)
2022-11-10 18:00:32 +00:00
ICON_URL = "https://avatars.githubusercontent.com/u/40275816"
harbor = Custom("registry.serguzim.me", get_custom_icon("harbor", ICON_URL))
add_to_groups(harbor, services, db_users, objectstore_users)
2022-08-02 12:07:34 +00:00
ICON_URL = "https://avatars.githubusercontent.com/u/23747925"
mail = Custom("mail.serguzim.me", get_custom_icon("mailcow", ICON_URL))
2022-08-01 21:34:12 +00:00
add_to_groups(mail, services)
2022-11-10 18:00:32 +00:00
ICON_URL = "https://avatars.githubusercontent.com/u/8418310"
2022-08-02 12:07:34 +00:00
matrix = Custom("matrix.serguzim.me", get_custom_icon("matrix", ICON_URL))
2022-08-01 21:34:12 +00:00
add_to_groups(matrix, services, db_users, objectstore_users)
prometheus = Prometheus("prometheus.serguzim.me")
add_to_groups(prometheus, services)
2022-08-02 12:07:34 +00:00
ICON_URL = "https://github.com/TandoorRecipes/recipes/raw/develop/cookbook/static/assets/logo_color512.png"
recipies = Custom("recipies.serguzim.me", get_custom_icon("tandoor", ICON_URL))
add_to_groups(recipies, services, db_users)
vcs = Gitea("git.serguzim.me\nregistry.serguzim.me")
add_to_groups(vcs, services, db_users, objectstore_users)
2022-08-01 21:34:12 +00:00
2022-08-02 12:07:34 +00:00
webdis = Redis("webdis.huck.serguzim.me")
add_to_groups(webdis, services)
2022-08-01 21:34:12 +00:00
db_users >> db
proxy >> services
objectstore_users >> exoscale_objectstore
2022-11-10 18:00:32 +00:00
with node001:
2022-08-01 21:34:12 +00:00
services = []
proxy = Caddy()
2022-08-02 12:07:34 +00:00
2022-11-10 18:00:32 +00:00
ICON_URL = "https://icon-icons.com/downloadimage.php?id=168974&root=2699/PNG/256/&file=minecraft_logo_icon_168974.png"
2022-08-02 12:07:34 +00:00
minecraft = Custom("minecraft.serguzim.me", get_custom_icon("minecraft", ICON_URL))
2022-08-01 21:34:12 +00:00
add_to_groups(minecraft, services)
proxy >> services