{ pkgs, lib, ... }: let workadventure-repository = pkgs.fetchgit { url = "https://github.com/thecodingmachine/workadventure.git"; rev = "284846e8a59ec0d921189ac3a46e0eb5d1e14818"; sha256 = "1f1vi226kas7x9y8zw810q5vg1ikn4bb6ha9vnzvqk9y7jlc1n8q"; }; homeFolder = "/srv/workadventure"; debugMode = "true"; jitsiURL = "meet.palovandalo.com"; # If your Jitsi environment has authentication set up, # you MUST set JITSI_PRIVATE_MODE to "true" and # you MUST pass a SECRET_JITSI_KEY to generate the JWT secret #JITSI_PRIVATE_MODE = "false"; jitsiPrivateMode = "false"; #SECRET_JITSI_KEY= secretJitsiKey = ""; #JITSI_ISS= jitsiISS = ""; #ADMIN_API_TOKEN = 123 adminAPIToken = 123; # note: container logs can be viewed by using # journalctrl CONTAINER_NAME=front # journalctrl CONTAINER_NAME=back domain = "workadventure.palovandalo.com"; in { systemd.services.workadventureRepository = { enable = true; wantedBy = [ "multi-user.target" ]; script = '' mkdir -p ${homeFolder} cp -r "${workadventure-repository}"/* "${homeFolder}/" chmod -R 777 "${homeFolder}" ''; before = [ "docker-back.service" "docker-maps.service" "docker-messages.service" "docker-prune.service" "docker-uploader.service" "docker-website.service" ]; }; virtualisation.oci-containers = { backend = "docker"; containers = { front = { image = "thecodingmachine/nodejs:14"; environment = { DEBUG_MODE = debugMode; JITSI_URL = jitsiURL; JITSI_PRIVATE_MODE = jitsiPrivateMode; HOST = "0.0.0.0"; NODE_ENV = "development"; API_URL = "pusher.${domain}"; UPLOADER_URL = "uploader.${domain}"; ADMIN_URL = "admin.${domain}"; STARTUP_COMMAND_1 = "yarn install"; # udp packet foobar TURN_SERVER = "turn:coturn.workadventu.re:443,turns:coturn.workadventu.re:443"; TURN_USER = "workadventure"; TURN_PASSWORD = "WorkAdventure123"; }; cmd = [ "yarn run start" ]; volumes = [ "$homeFolder}/front:/usr/src/app" ]; extraOptions = let labelFile = pkgs.writeText "front-labels" '' traefik.http.routers.front.rule=Host(`play.${domain}`) traefik.http.routers.front.entryPoints=web,traefik traefik.http.services.front.loadbalancer.server.port=8080 traefik.http.routers.front-ssl.rule=Host(`play.${domain}`) traefik.http.routers.front-ssl.entryPoints=websecure traefik.http.routers.front-ssl.tls=true traefik.http.routers.front-ssl.service=front ''; in [ "--label-file" (toString labelFile) ]; }; pusher = { image = "thecodingmachine/nodejs:12"; cmd = [ "yarn dev" ]; environment = { DEBUG = "*"; STARTUP_COMMAND_1 = "yarn install"; SECRET_JITSI_KEY = secretJitsiKey; SECRET_KEY = "yourSecretKey"; ADMIN_API_TOKEN = "$ADMIN_API_TOKEN"; API_URL = "back:50051"; JITSI_URL = jitsiURL; JITSI_ISS = jitsiISS; }; volumes = [ "${homeFolder}/pusher:/usr/src/app" ]; extraOptions = let labelFile = pkgs.writeText "pusher-labels" '' traefik.http.routers.pusher.rule=Host(`pusher.${domain}`) traefik.http.routers.pusher.entryPoints=web traefik.http.services.pusher.loadbalancer.server.port=8080 traefik.http.routers.pusher-ssl.rule=Host(`pusher.${domain}`) traefik.http.routers.pusher-ssl.entryPoints=websecure traefik.http.routers.pusher-ssl.tls=true traefik.http.routers.pusher-ssl.service=pusher ''; in [ "--label-file" (toString labelFile) ]; }; maps = { image = "thecodingmachine/nodejs:12-apache"; environment = { DEBUG_MODE = debugMode; HOST = "0.0.0.0"; NODE_ENV = "development"; STARTUP_COMMAND_0 = "sudo a2enmod headers"; STARTUP_COMMAND_1 = "yarn install"; STARTUP_COMMAND_2 = "yarn run dev &"; }; volumes = [ "${homeFolder}/maps:/var/www/html" ]; extraOptions = let labelFile = pkgs.writeText "maps-labels" '' traefik.http.routers.maps.rule=Host(`maps.${domain}`) traefik.http.routers.maps.entryPoints=web,traefik traefik.http.services.maps.loadbalancer.server.port=80 traefik.http.routers.maps-ssl.rule=Host(`maps.${domain}`) traefik.http.routers.maps-ssl.entryPoints=websecure traefik.http.routers.maps-ssl.tls=true traefik.http.routers.maps-ssl.service=maps ''; in [ "--label-file" (toString labelFile) ]; }; back = { image = "thecodingmachine/nodejs:12"; cmd = [ "yarn dev" ]; environment = { DEBUG = "*"; STARTUP_COMMAND_1 = "yarn install"; SECRET_KEY = "yourSecretKey"; SECRET_JITSI_KEY = secretJitsiKey; ALLOW_ARTILLERY = "true"; ADMIN_API_TOKEN = "$ADMIN_API_TOKEN"; JITSI_URL = jitsiURL; JITSI_ISS = jitsiISS; }; volumes = [ "${homeFolder}/back:/usr/src/app" ]; extraOptions = let labelFile = pkgs.writeText "back-labels" '' traefik.http.routers.back.rule=Host(`api.${domain}`) traefik.http.routers.back.entryPoints=web traefik.http.services.back.loadbalancer.server.port=8080 traefik.http.routers.back-ssl.rule=Host(`api.${domain}`) traefik.http.routers.back-ssl.entryPoints=websecure traefik.http.routers.back-ssl.tls=true traefik.http.routers.back-ssl.service=back ''; in [ "--label-file" (toString labelFile) ]; }; uploader = { image = "thecodingmachine/nodejs:12"; cmd = [ "yarn dev" ]; environment = { DEBUG = "*"; STARTUP_COMMAND_1 = "yarn install"; }; volumes = [ "${homeFolder}/uploader:/usr/src/app" ]; extraOptions = let labelFile = pkgs.writeText "uploader-labels" '' traefik.http.routers.uploader.rule=Host(`uploader.${domain}`) traefik.http.routers.uploader.entryPoints=web traefik.http.services.uploader.loadbalancer.server.port=8080 traefik.http.routers.uploader-ssl.rule=Host(`uploader.${domain}`) traefik.http.routers.uploader-ssl.entryPoints=websecure traefik.http.routers.uploader-ssl.tls=true traefik.http.routers.uploader-ssl.service=uploader ''; in [ "--label-file" (toString labelFile) ]; }; website = { image = "thecodingmachine/nodejs:12-apache"; environment = { STARTUP_COMMAND_1 = "npm install"; STARTUP_COMMAND_2 = "npm run watch &"; APACHE_DOCUMENT_ROOT = "dist/"; }; volumes = [ "${homeFolder}/website:/var/www/html" ]; extraOptions = let labelFile = pkgs.writeText "website-labels" '' traefik.http.routers.website.rule=Host(`${domain}`) traefik.http.routers.website.entryPoints=web traefik.http.services.website.loadbalancer.server.port=8080 traefik.http.routers.website-ssl.rule=Host(`${domain}`) traefik.http.routers.website-ssl.entryPoints=websecure traefik.http.routers.website-ssl.tls=true traefik.http.routers.website-ssl.service=website ''; in [ "--label-file" (toString labelFile) ]; }; messages = { image = "thecodingmachine/workadventure-back-base:latest"; environment = { STARTUP_COMMAND_1 = "yarn install"; STARTUP_COMMAND_2 = "yarn run proto:watch"; }; volumes = [ "${homeFolder}/messages:/usr/src/app" "${homeFolder}/back:/usr/src/back" "${homeFolder}/front:/usr/src/front" "${homeFolder}/pusher:/usr/src/pusher" ]; }; }; }; }