deps_meilisearch.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from typing import TYPE_CHECKING, TypedDict, NotRequired
  2. if TYPE_CHECKING:
  3. from render import Render
  4. from storage import IxStorage
  5. try:
  6. from .error import RenderError
  7. from .deps_perms import PermsContainer
  8. except ImportError:
  9. from error import RenderError
  10. from deps_perms import PermsContainer
  11. class MeiliConfig(TypedDict):
  12. master_key: str
  13. port: NotRequired[int]
  14. volume: "IxStorage"
  15. class MeilisearchContainer:
  16. def __init__(
  17. self, render_instance: "Render", name: str, image: str, config: MeiliConfig, perms_instance: PermsContainer
  18. ):
  19. self._render_instance = render_instance
  20. self._name = name
  21. self._config = config
  22. self._data_dir = "/meili_data"
  23. for key in ("master_key", "volume"):
  24. if key not in config:
  25. raise RenderError(f"Expected [{key}] to be set for meilisearch")
  26. c = self._render_instance.add_container(name, image)
  27. user, group = 568, 568
  28. run_as = self._render_instance.values.get("run_as")
  29. if run_as:
  30. user = run_as["user"] or user # Avoids running as root
  31. group = run_as["group"] or group # Avoids running as root
  32. c.set_user(user, group)
  33. c.healthcheck.set_test("curl", {"port": self.get_port(), "path": "/health"})
  34. c.remove_devices()
  35. c.add_storage(self._data_dir, config["volume"])
  36. c.environment.add_env("MEILI_HTTP_ADDR", f"0.0.0.0:{self.get_port()}")
  37. c.environment.add_env("MEILI_NO_ANALYTICS", True)
  38. c.environment.add_env("MEILI_EXPERIMENTAL_DUMPLESS_UPGRADE", True)
  39. c.environment.add_env("MEILI_MASTER_KEY", config["master_key"])
  40. perms_instance.add_or_skip_action(
  41. f"{self._name}_meili_data", config["volume"], {"uid": user, "gid": group, "mode": "check"}
  42. )
  43. self._get_repo(image, ("getmeili/meilisearch",))
  44. # Store container for further configuration
  45. # For example: c.depends.add_dependency("other_container", "service_started")
  46. self._container = c
  47. @property
  48. def container(self):
  49. return self._container
  50. def _get_repo(self, image, supported_repos):
  51. images = self._render_instance.values["images"]
  52. if image not in images:
  53. raise RenderError(f"Image [{image}] not found in values. Available images: [{', '.join(images.keys())}]")
  54. repo = images[image].get("repository")
  55. if not repo:
  56. raise RenderError("Could not determine repo")
  57. if repo not in supported_repos:
  58. raise RenderError(
  59. f"Unsupported repo [{repo}] for meilisearch. Supported repos: {', '.join(supported_repos)}"
  60. )
  61. return repo
  62. def get_port(self):
  63. return self._config.get("port") or 7700
  64. def get_url(self):
  65. return f"http://{self._name}:{self.get_port()}"