# Server - Online Demo Server test.fab-access.org

Du bist neu und willst FabAccess vorher antesten? Dann lohnt sich der Aufwand der Installation vermutlich nicht, bevor du einen ersten Eindruck gewonnen hast. Hier findest du Details zu unserem Demo Server. Informationen zum Download des Clients, den du für das Testen in jedem Fall benötigst, findest du [hier](https://docs.fab-access.org/books/fabaccess-installation/page/downloads-demo "24.04.2022 / Roadmap").

## Zwecke eines Demo-Servers

- Client damit verbinden, um diesen auszuprobieren - die getriggerten Aktionen durch den Server können in einem Log angezeigt werden
- dem Demo-Tester Zugriff auf ein Sample-Grafana-Monitoring geben, was an BFFH gekoppelt ist

## Infos zu test.fab-access.org

Der BFFH Server ist erreichbar unter `test.fab-access.org:59661` und diese Dokumentation unter [https://test.fab-access.org](https://test.fab-access.org) bzw. der konfigurierbaren Shortener-URL [https://y.fab-access.org/testserver](https://y.fab-access.org/testserver). Unser FabAccess Client [Borepin](https://docs.fab-access.org/books/fabaccess-konfiguration/page/client-benutzen-und-typische-konfigurationsfehler-bei-server-und-clients "Client benutzen und typische Konfigurationsfehler bei Server und Clients") ist passend auf `test.fab-access.org` vorkonfiguriert.

Die aktuelle Konfiguration basiert auf dem Demo Setup von [tfom2023](https://gitlab.com/fabinfra/fabaccess/demos-environments/tfom23-demo "03.03.2023 // INTERFACER Abschlussveranstaltung zur Konferenz und Expo "the future of making" (tfom) 2023").

Der Server wurde per Paket installiert - zusammen mit der minimalen Abhängigkeit `mosquitto`.

Aktuell am Laufen (Stand 13.03.2025) ist das [Development-Paket 0.4.4](https://downloads.fab-access.org/bffh-packages/development/fabaccess-bffh_0.4.4_amd64.deb).

Weitere Details zum Installieren ersparen wir uns, da wir diese an geeigneten Stellen ausführlich beschreiben:

- [Server - Installation mit Distributionspaketen (\*:deb, \*.rpm)](https://docs.fab-access.org/books/fabaccess-installation/page/server-installation-mit-distributionspaketen-deb-rpm "Server - Installation mit Distributionspaketen (*:deb, *.rpm)")
- [Server - Anleitung zum selber kompilieren](https://docs.fab-access.org/books/fabaccess-installation/page/server-anleitung-zum-selber-kompilieren "Server - Anleitung zum selber kompilieren")

<p class="callout info">Der Testserver wird stündlich auf die Standardeinstellungen zurückgesetzt (z.B. falls Nutzer gelöscht oder Passwörter verändert wurden).</p>

### Benutzer (users.toml)

Folgende Benutzer (mit verschiedenen Rollen) sind für die Demo freigeschalten (das Passwort ist immer gleich und lautet `secret`).

```ini
[Admin]
roles = ["Admin"]
passwd = "secret"

[Manager]
roles = ["Default", "Manage"]
passwd = "secret"

[Maker]
roles = ["Default", "EuroBox", "LBoxx", "Locker", "Prusa"]
passwd = "secret"

[Maker-Lasercutter]
roles = ["Default", "Lasercutter"]
passwd = "secret"

[Maker-CNC]
roles = ["Default", "CNC"]
passwd = "secret"

[Maker-Printer]
roles = ["Default", "Printer"]
passwd = "secret"

[Bot]
roles = ["Default"]
passwd = "secret"
```

### Hauptkonfiguration (bffh.dhall)

Wir verwenden folgende `bffh.dhall` Hauptkonfiguration:

<details id="bkmrk-bffh.dhall-anzeigen-"><summary>bffh.dhall anzeigen</summary>

```ini
{ listens = [ { address = "test.fab-access.org", port = 59661 } ]
, mqtt_url = "mqtt://fabaccess-defaultuser:fabaccess@localhost:1883"
, auditlog_path = "/var/log/bffh/audit.json"
, db_path = "/var/lib/bffh/bffh.db"
, certfile = "/etc/bffh/certs/bffh.crt"
, keyfile = "/etc/bffh/certs/bffh.key"
, verbosity = 3
, spacename = "TFOM23-Demo"
, instanceurl = "tfom23-demo.fab-access.org"
, roles =
  { Default.permissions = [ "tfom23.disclose", "tfom23.read" ]
  , Admin.permissions =
    [ "tfom23.*", "bffh.users.info", "bffh.users.manage", "bffh.users.admin" ]
  , Manage.permissions = [ "tfom23.manage" ]
  , EuroBox.permissions = [ "tfom23.eurobox.write" ]
  , LBoxx.permissions = [ "tfom23.lboxx.write" ]
  , Locker.permissions = [ "tfom23.locker.write" ]
  , Lasercutter.permissions = [ "tfom23.lasercutter.write" ]
  , Printer.permissions = [ "tfom23.printer.write" ]
  , Prusa.permissions = [ "tfom23.prusa.write" ]
  , CNC.permissions = [ "tfom23.cnc.write" ]
  }
, machines =
  { LBoxx_0 =
    { name = "Filament"
    , description = "LBoxx with 1,75mm PLA"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.lboxx.write"
    , manage = "tfom23.manage"
    , category = "LBoxx"
    , prodable = True
    }
  , LBoxx_1 =
    { name = "FabLock Tools"
    , description = "LBoxx with Tools of the FabLock Project"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.lboxx.write"
    , manage = "tfom23.manage"
    , category = "LBoxx"
    , prodable = True
    }
  , LBoxx_2 =
    { name = "FabReader Tools"
    , description = "LBoxx with Tools of the FabReader Project"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.lboxx.write"
    , manage = "tfom23.manage"
    , category = "LBoxx"
    , prodable = True
    }
  , LBoxx_3 =
    { name = "Sticker"
    , description = "LBoxx with FabAccess Sticker and NTAGs"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.lboxx.write"
    , manage = "tfom23.manage"
    , category = "LBoxx"
    , prodable = True
    }
  , LBoxx_4 =
    { name = "Demo Parts"
    , description = "LBoxx with Parts for the TFOM23 Demo"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.lboxx.write"
    , manage = "tfom23.manage"
    , category = "LBoxx"
    , prodable = True
    }
  , EuroBox_0 =
    { name = "Haribo"
    , description = "EuroBox with Haribo"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.eurobox.write"
    , manage = "tfom23.manage"
    , category = "EuroBox"
    , prodable = True
    }
  , EuroBox_1 =
    { name = "Goldschatz"
    , description = "EuroBox with Rittersport Goldschatz"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.eurobox.write"
    , manage = "tfom23.manage"
    , category = "EuroBox"
    , prodable = True
    }
  , Drawer_0 =
    { name = "Drawer 0 ???"
    , description = "Kallax Drawer"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.locker.write"
    , manage = "tfom23.manage"
    , category = "Locker"
    , prodable = True
    }
  , Drawer_1 =
    { name = "Drawer 1 ???"
    , description = "Kallax Drawer"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.locker.write"
    , manage = "tfom23.manage"
    , category = "Locker"
    , prodable = True
    }
  , Drawer_2 =
    { name = "Drawer 2 ???"
    , description = "Kallax Drawer"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.locker.write"
    , manage = "tfom23.manage"
    , category = "Locker"
    , prodable = True
    }
  , Drawer_3 =
    { name = "Drawer 3 ???"
    , description = "Kallax Drawer"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.locker.write"
    , manage = "tfom23.manage"
    , category = "Locker"
    , prodable = True
    }
  , Door_0 =
    { name = "3D-Printer Accesories"
    , description = "Kallax Door"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.locker.write"
    , manage = "tfom23.manage"
    , category = "Locker"
    , prodable = True
    }
  , Printer_0 =
    { name = "Prusa MK3"
    , description = "FabAccess Prusa MK3"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.prusa.write"
    , manage = "tfom23.manage"
    , category = "Printers"
    }
  , Printer_1 =
    { name = "Other Printer ???"
    , description = "TFOM23 Printer"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.printer.write"
    , manage = "tfom23.manage"
    , category = "Printers"
    }
  , Lasercutter_0 =
    { name = "Other Lasercutter ???"
    , description = "TFOM23 Lasercutter"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.lasercutter.write"
    , manage = "tfom23.manage"
    , category = "Lasercutter"
    }
  , CNC_0 =
    { name = "Some Open Hardware CNC Router"
    , description = "TFOM23 CNC"
    , disclose = "tfom23.disclose"
    , read = "tfom23.read"
    , write = "tfom23.cnc.write"
    , manage = "tfom23.manage"
    , category = "CNC"
    }
  }
, actors =
  { shellyplug-s-C8C9A3B942DB = { module = "Shelly", params = {=} }
  , shellyplug-s-C8C9A3B943D7 = { module = "Shelly", params = {=} }
  , shellyplug-s-C8C9A3B8DB67 = { module = "Shelly", params = {=} }
  , shellyplug-s-3CE90ED72CEF = { module = "Shelly", params = {=} }
  , shellyplug-s-3CE90ED72481 = { module = "Shelly", params = {=} }
  , shellyplug-s-C8C9A3B8E88A = { module = "Shelly", params = {=} }
  , shellyplug-2C94AA = { module = "Shelly", params = {=} }
  , shellyplug-C198E8 = { module = "Shelly", params = {=} }
  , fablock_locker_0 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00000 --lock 00000"
      }
    }
  , fablock_locker_1 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00000 --lock 00001"
      }
    }
  , fablock_locker_2 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00000 --lock 00002"
      }
    }
  , fablock_locker_3 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00000 --lock 00003"
      }
    }
  , fablock_locker_4 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00000 --lock 00004"
      }
    }
  , fablock_locker_5 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00000 --lock 00005"
      }
    }
  , fablock_locker_6 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00000 --lock 00006"
      }
    }
  , fablock_lboxx_0 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00001 --lock 00000"
      }
    }
  , fablock_lboxx_1 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00001 --lock 00001"
      }
    }
  , fablock_lboxx_2 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00001 --lock 00002"
      }
    }
  , fablock_lboxx_3 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00001 --lock 00003"
      }
    }
  , fablock_lboxx_4 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fablock/main.py --host localhost --fablock 00001 --lock 00004"
      }
    }
  , fabreader_0 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabreader/main.py --host localhost --fabreader 00000"
      }
    }
  , fabreader_1 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabreader/main.py --host localhost --fabreader 00001"
      }
    }
  , fabreader_2 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabreader/main.py --host localhost --fabreader 00002"
      }
    }
  , fabreader_3 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabreader/main.py --host localhost --fabreader 00003"
      }
    }
  , fabreader_4 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabreader/main.py --host localhost --fabreader 00004"
      }
    }
  , fabpel_0 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabpel/main.py --host localhost --fabpel 00000"
      }
    }
  , fabpel_1 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabpel/main.py --host localhost --fabpel 00001"
      }
    }
  , fabpel_2 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabpel/main.py --host localhost --fabpel 00002"
      }
    }
  , fabpel_3 =
    { module = "Process"
    , params =
      { cmd = "python"
      , args =
          "tfom23-demo/actors/fabpel/main.py --host localhost --fabpel 00003"
      }
    }
  }
, actor_connections =
  [ { machine = "LBoxx_0", actor = "fablock_lboxx_0" }
  , { machine = "LBoxx_1", actor = "fablock_lboxx_1" }
  , { machine = "LBoxx_2", actor = "fablock_lboxx_2" }
  , { machine = "LBoxx_3", actor = "fablock_lboxx_3" }
  , { machine = "LBoxx_4", actor = "fablock_lboxx_4" }
  , { machine = "EuroBox_0", actor = "fablock_locker_0" }
  , { machine = "EuroBox_1", actor = "fablock_locker_1" }
  , { machine = "Drawer_0", actor = "fablock_locker_2" }
  , { machine = "Drawer_1", actor = "fablock_locker_3" }
  , { machine = "Drawer_2", actor = "fablock_locker_4" }
  , { machine = "Drawer_3", actor = "fablock_locker_5" }
  , { machine = "Door_0", actor = "fablock_locker_6" }
  , { machine = "Printer_0", actor = "shellyplug-s-C8C9A3B942DB" }
  , { machine = "Printer_1", actor = "shellyplug-s-3CE90ED72481" }
  , { machine = "Lasercutter_0", actor = "shellyplug-s-C8C9A3B943D7" }
  , { machine = "CNC_0", actor = "shellyplug-s-C8C9A3B8E88A" }
  , { machine = "Printer_0", actor = "fabreader_1" }
  , { machine = "Printer_1", actor = "fabreader_2" }
  , { machine = "Lasercutter_0", actor = "fabreader_3" }
  , { machine = "CNC_0", actor = "fabreader_4" }
  , { machine = "Printer_0", actor = "fabpel_0" }
  , { machine = "Printer_1", actor = "fabpel_1" }
  , { machine = "Lasercutter_0", actor = "fabpel_2" }
  , { machine = "CNC_0", actor = "fabpel_3" }
  ]
, initiators = {=}
, init_connections = [] : List { machine : Text, initiator : Text }
}
```

</details>