Модули #42

Closed
opened 2026-06-20 01:15:30 +02:00 by yorunikakeru · 0 comments
Owner

Модули платформы

FrogOS разделяет два уровня описания системы:

  1. Generic service control — управление уже существующим системным сервисом
    по имени: включить, выключить, перезапустить, проверить состояние.
  2. Typed platform modules — доменные модули FrogOS с собственной схемой
    опций: docker, postgresql, nginx, forgejo и другие.

service "docker" не является аналогом services.docker.* из NixOS. Это
универсальная ссылка на системный сервис с именем docker.

Для настройки конкретных технологий используются отдельные типизированные
модули:

docker $ do
  enable
  rootless True
  storageDriver Overlay2

postgresql "main" $ do
  enable
  port 5432
  dataDir "/var/lib/postgresql"

Доменные опции не смешиваются между модулями. Например, rootless является опцией Docker-модуля и не может быть использован внутри postgresql.

При этом все platform modules имеют общий lifecycle-интерфейс. Это позволяет управлять ими из профилей, условий и политик единообразно:

profile "gaming" $
  when (processRunning "steam") $ do
    disableModule docker
    setPowerProfile Performance

profile "dev" $
  when (processRunning "code") $ do
    enableModule (postgresql "main")

Общий интерфейс модуля описывает только lifecycle-действия:

class FrogModule m where
  moduleRef     :: m -> ModuleRef
  enableModule  :: m -> Action
  disableModule :: m -> Action
  restartModule :: m -> Action

Настройки каждого модуля остаются типизированными в собственном DSL:

docker       :: DockerBuilder a -> ConfigurationBuilder ()
postgresql  :: ModuleName -> PostgreSQLBuilder a -> ConfigurationBuilder ()
nginx        :: ModuleName -> NginxBuilder a -> ConfigurationBuilder ()
forgejo      :: ModuleName -> ForgejoBuilder a -> ConfigurationBuilder ()

В IR конфигурация модуля и lifecycle-действия представлены отдельно.

Пример конфигурации модуля:

{
  "modules": {
    "docker": [
      {
        "name": "default",
        "enable": true,
        "rootless": true,
        "storage_driver": "overlay2"
      }
    ],
    "postgresql": [
      {
        "name": "main",
        "enable": true,
        "port": 5432,
        "data_dir": "/var/lib/postgresql"
      }
    ]
  }
}

Пример lifecycle-действия:

{
  "type": "module_disable",
  "module": {
    "domain": "docker",
    "name": "default"
  }
}

Такой подход сохраняет типобезопасность доменных настроек, но даёт общий способ управлять модулями извне. FrogOS не превращает все модули в один нетипизированный словарь опций, а разделяет:

универсальное управление жизненным циклом;

типизированную настройку конкретного домена;

декларативный IR, понятный движку.


Суть: **общий тип  для enable/disable/restart, отдельный DSL  для опций**. Это прям то самое место, где проект перестаёт быть «дорогим YAML на Haskell».
## Модули платформы FrogOS разделяет два уровня описания системы: 1. **Generic service control** — управление уже существующим системным сервисом по имени: включить, выключить, перезапустить, проверить состояние. 2. **Typed platform modules** — доменные модули FrogOS с собственной схемой опций: `docker`, `postgresql`, `nginx`, `forgejo` и другие. `service "docker"` не является аналогом `services.docker.*` из NixOS. Это универсальная ссылка на системный сервис с именем `docker`. Для настройки конкретных технологий используются отдельные типизированные модули: ```haskell docker $ do enable rootless True storageDriver Overlay2 postgresql "main" $ do enable port 5432 dataDir "/var/lib/postgresql" Доменные опции не смешиваются между модулями. Например, rootless является опцией Docker-модуля и не может быть использован внутри postgresql. При этом все platform modules имеют общий lifecycle-интерфейс. Это позволяет управлять ими из профилей, условий и политик единообразно: profile "gaming" $ when (processRunning "steam") $ do disableModule docker setPowerProfile Performance profile "dev" $ when (processRunning "code") $ do enableModule (postgresql "main") Общий интерфейс модуля описывает только lifecycle-действия: class FrogModule m where moduleRef :: m -> ModuleRef enableModule :: m -> Action disableModule :: m -> Action restartModule :: m -> Action Настройки каждого модуля остаются типизированными в собственном DSL: docker :: DockerBuilder a -> ConfigurationBuilder () postgresql :: ModuleName -> PostgreSQLBuilder a -> ConfigurationBuilder () nginx :: ModuleName -> NginxBuilder a -> ConfigurationBuilder () forgejo :: ModuleName -> ForgejoBuilder a -> ConfigurationBuilder () В IR конфигурация модуля и lifecycle-действия представлены отдельно. Пример конфигурации модуля: { "modules": { "docker": [ { "name": "default", "enable": true, "rootless": true, "storage_driver": "overlay2" } ], "postgresql": [ { "name": "main", "enable": true, "port": 5432, "data_dir": "/var/lib/postgresql" } ] } } Пример lifecycle-действия: { "type": "module_disable", "module": { "domain": "docker", "name": "default" } } Такой подход сохраняет типобезопасность доменных настроек, но даёт общий способ управлять модулями извне. FrogOS не превращает все модули в один нетипизированный словарь опций, а разделяет: универсальное управление жизненным циклом; типизированную настройку конкретного домена; декларативный IR, понятный движку. Суть: **общий тип — для enable/disable/restart, отдельный DSL — для опций**. Это прям то самое место, где проект перестаёт быть «дорогим YAML на Haskell».
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
FrogOS/DSL#42
No description provided.