Files
foundry-manager-api/src/container_managment.py
2026-04-18 21:41:08 -07:00

98 lines
3.0 KiB
Python

import docker
from game_tables import GameTable
from key_tables import KeyTable
import os
import socket
import inspect
from flask import current_app
def build_container_routing_labels(prefix: str, strip_prefix=True):
router_key = "traefik.http.routers.{prefix}.rule".format(prefix=prefix)
middleware_key = (
"traefik.http.middlewares.{prefix}-stripprefix.stripprefix.prefixes".format(
prefix=prefix
)
)
middleware_router_key = "traefik.http.routers.{prefix}.middlewares".format(
prefix=prefix
)
labels = {}
labels[router_key] = "Host(`localhost`) && PathPrefix(`/{prefix}`)".format(
prefix=prefix
)
if strip_prefix:
labels[middleware_key] = "/{prefix}".format(prefix=prefix)
labels[middleware_router_key] = "{prefix}-stripprefix".format(prefix=prefix)
return labels
def delete_container(docker_id) -> bool:
if not docker_id:
return False
try:
client = docker.from_env()
container = client.containers.get(docker_id)
container.remove()
return True
except docker.errors.NotFound, docker.errors.APIError:
return False
def stop_container(docker_id) -> bool:
try:
client = docker.from_env()
container = client.containers.get(docker_id)
container.kill()
return True
except docker.errors.NotFound, docker.errors.APIError:
return False
def start_foundry_container(table: GameTable, key: KeyTable):
client = docker.from_env()
container = None
networkName = client.containers.get(socket.gethostname()).attrs["HostConfig"]["NetworkMode"]
if table.docker_id != None and table.docker_id != 0:
try:
container = client.containers.get(table.docker_id)
except docker.errors.NotFound, docker.errors.NullResource:
container = None
if container:
container.start()
else:
image = "felddy/foundryvtt:{version}".format(version=table.version)
labels = build_container_routing_labels(table.game_table_link, False)
volumes = {
"{data_bind}/{prefix}".format(
data_bind=os.environ.get("FOUNDRY_DATA_BIND"),
prefix=table.game_table_link,
): {"bind": "/data", "mode": "rw"},
"{data_bind}/container_cache".format(
data_bind=os.environ.get("FOUNDRY_DATA_BIND")
): {"bind": "/data/container_cache", "mode": "rw"},
}
environment = [
"FOUNDRY_ROUTE_PREFIX={prefix}".format(prefix=table.game_table_link),
"FOUNDRY_TELEMETRY=FALSE",
"FOUNDRY_LICENSE_KEY={key_value}".format(key_value=key.key),
]
ports = {"30000": str(30000 + table.game_table_id)}
container = client.containers.run(
image=image,
labels=labels,
volumes=volumes,
environment=environment,
ports=ports,
detach=True,
network=networkName
)
return container.id