From f117e4cb65220263e6bb8e7728987fddedbbef98 Mon Sep 17 00:00:00 2001 From: qvalentin Date: Fri, 7 Apr 2023 16:19:13 +0200 Subject: [PATCH 1/5] Backend docker deploy --- backend/.gitignore | 1 + backend/converted.nix | 55 +++++++++++++++++++++++++++++++++++++++ backend/default.nix | 34 ++++++++++++++++++++++++ backend/deploy.sh | 5 ++++ backend/jitsi-rooms.cabal | 25 ------------------ 5 files changed, 95 insertions(+), 25 deletions(-) create mode 100644 backend/converted.nix create mode 100644 backend/default.nix create mode 100755 backend/deploy.sh diff --git a/backend/.gitignore b/backend/.gitignore index 11f8a4f..14422bd 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,3 +1,4 @@ .stack-work/ *~ dist-newstyle +result diff --git a/backend/converted.nix b/backend/converted.nix new file mode 100644 index 0000000..584d831 --- /dev/null +++ b/backend/converted.nix @@ -0,0 +1,55 @@ +{ mkDerivation +, aeson +, base +, bytestring +, classy-prelude +, http-types +, lib +, lifted-base +, mtl +, text +, uuid +, wai +, warp +, websockets +}: +mkDerivation { + pname = "jitsi-rooms"; + version = "0.1.0.0"; + src = ./.; + isLibrary = true; + isExecutable = true; + libraryHaskellDepends = [ + aeson + base + bytestring + classy-prelude + http-types + lifted-base + mtl + text + uuid + wai + warp + websockets + ]; + executableHaskellDepends = [ + aeson + base + bytestring + classy-prelude + http-types + lifted-base + mtl + text + uuid + wai + warp + websockets + ]; + homepage = "https://github.com/githubuser/jitsi-rooms#readme"; + license = lib.licenses.bsd3; + mainProgram = "jitsi-rooms-exe"; + enableSharedExecutables = false; + postFixup = "rm -rf $out/lib $out/nix-support $out/share/doc"; +} diff --git a/backend/default.nix b/backend/default.nix new file mode 100644 index 0000000..6492594 --- /dev/null +++ b/backend/default.nix @@ -0,0 +1,34 @@ +let + config = { + packageOverrides = pkgs: rec { + haskellPackages = pkgs.haskellPackages.override { + overrides = haskellPackagesNew: haskellPackagesOld: rec { + jitsi-rooms = + haskellPackagesNew.callPackage ./converted.nix { }; + }; + }; + }; + }; + pkgs = import { inherit config; }; + + +in +pkgs.dockerTools.buildImage { + name = "jitsi-rooms"; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + paths = [ + pkgs.bash + pkgs.coreutils + ]; + pathsToLink = [ "/bin" ]; + }; + config = { + Cmd = [ "${pkgs.haskellPackages.jitsi-rooms}/bin/jitsi-rooms-exe" ]; + ExposedPorts = { + "9160/tcp" = { }; + "8081/tcp" = { }; + }; + }; +} diff --git a/backend/deploy.sh b/backend/deploy.sh new file mode 100755 index 0000000..fc69a4e --- /dev/null +++ b/backend/deploy.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +nix-build + +scp ./result ffs:/home/ffsys/jitsi-rooms-docker-image diff --git a/backend/jitsi-rooms.cabal b/backend/jitsi-rooms.cabal index 8b8d6d1..e789efa 100644 --- a/backend/jitsi-rooms.cabal +++ b/backend/jitsi-rooms.cabal @@ -91,28 +91,3 @@ executable jitsi-rooms-exe , websockets default-language: Haskell2010 -test-suite jitsi-rooms-test - type: exitcode-stdio-1.0 - main-is: Spec.hs - other-modules: - Paths_jitsi_rooms - hs-source-dirs: - test - default-extensions: - NoImplicitPrelude,OverloadedStrings,ImportQualifiedPost - ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N - build-depends: - aeson - , base >=4.7 && <5 - , bytestring - , classy-prelude - , http-types - , jitsi-rooms - , lifted-base - , mtl - , text - , uuid - , wai - , warp - , websockets - default-language: Haskell2010 From f40582cff11db4a60ac1eaf1911a02ff90c3fd84 Mon Sep 17 00:00:00 2001 From: qvalentin Date: Fri, 7 Apr 2023 16:19:34 +0200 Subject: [PATCH 2/5] Frontend deploy --- frontend/deploy.sh | 5 +++++ frontend/dev-with-remote-backend.sh | 4 ++++ 2 files changed, 9 insertions(+) create mode 100755 frontend/deploy.sh create mode 100644 frontend/dev-with-remote-backend.sh diff --git a/frontend/deploy.sh b/frontend/deploy.sh new file mode 100755 index 0000000..45ee4f6 --- /dev/null +++ b/frontend/deploy.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env sh + + +yarn build +scp -r dist/* ffs:/home/ffsys/apps/static/jitsi-rooms diff --git a/frontend/dev-with-remote-backend.sh b/frontend/dev-with-remote-backend.sh new file mode 100644 index 0000000..b5f736e --- /dev/null +++ b/frontend/dev-with-remote-backend.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + + +ssh -L 9160:localhost:9160 ffs From 247b99d571ed1279432f91a4db83215cd8f5908a Mon Sep 17 00:00:00 2001 From: qvalentin Date: Fri, 7 Apr 2023 16:20:48 +0200 Subject: [PATCH 3/5] Add Backend to compose --- prodsody/.env | 2 +- prodsody/docker-compose.yml | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/prodsody/.env b/prodsody/.env index 0154b4c..790549b 100644 --- a/prodsody/.env +++ b/prodsody/.env @@ -211,7 +211,7 @@ JIBRI_XMPP_PASSWORD=662f13288a07ca64afb4b9b97b4feed6 # # Container restart policy -#RESTART_POLICY=unless-stopped +RESTART_POLICY=no # Jitsi image version (useful for local development) #JITSI_IMAGE_VERSION=latest diff --git a/prodsody/docker-compose.yml b/prodsody/docker-compose.yml index e9b2d49..08feefc 100644 --- a/prodsody/docker-compose.yml +++ b/prodsody/docker-compose.yml @@ -346,6 +346,15 @@ services: networks: meet.jitsi: + jitsi-rooms: + image: jitsi-rooms:67y5d9y2zbi7wkqm2jpcjj1k2614qwx2 + restart: ${RESTART_POLICY:-unless-stopped} + ports: + - '9160:9160' + networks: + meet.jitsi: + + # Custom network so all services can communicate using a FQDN networks: meet.jitsi: From 30bfc6e7631afb9d5c251e815446d72f268d894d Mon Sep 17 00:00:00 2001 From: qvalentin Date: Fri, 7 Apr 2023 16:21:15 +0200 Subject: [PATCH 4/5] Join room via sidebar --- frontend/src/App.tsx | 16 +++++++++++++++- frontend/src/background/constants.ts | 4 +--- frontend/src/components/meeting/Meeting.tsx | 7 ++++--- frontend/src/components/sidebar/Sidebar.tsx | 21 ++++++++++++++------- frontend/src/hooks/useRoomName.ts | 12 +++++++++++- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index f21b806..5901c6c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,28 +1,42 @@ +import { useState } from "react"; import "./App.css"; import Meeting from "./components/meeting/Meeting"; import Sidebar from "./components/sidebar/Sidebar"; import useBackendData from "./hooks/useBackendData"; import useConferenceData from "./hooks/useConferenceData"; import useLocalUser from "./hooks/useLocalUser"; +import { useRoomName } from "./hooks/useRoomName"; function App() { const { userInfo, setUserInfo } = useLocalUser(); + const { roomName, updateRoomName, updateAndSubmitRoomName, submitRoomName } = useRoomName(); const { roomData, sendMessage } = useBackendData(userInfo); const { conferenceData, setConferenceData } = useConferenceData( sendMessage, setUserInfo ); + const [meetingStarted, setMeetingStarted] = useState(false); console.log(roomData); if (roomData && userInfo) { return (
- + { + updateAndSubmitRoomName(roomName) + setMeetingStarted(true) + }} + />
); diff --git a/frontend/src/background/constants.ts b/frontend/src/background/constants.ts index 01ea4ca..e0f8da1 100644 --- a/frontend/src/background/constants.ts +++ b/frontend/src/background/constants.ts @@ -1,7 +1,5 @@ const ISPROD = window.location.protocol == "https:"; -const JITSI_DOMAIN = ISPROD - ? "thisisnotajitsi.filefighter.de" - : "localhost:8443"; +const JITSI_DOMAIN = "thisisnotajitsi.filefighter.de"; const WEBSOCKET_URL = "ws" + (ISPROD ? "s" : "") + diff --git a/frontend/src/components/meeting/Meeting.tsx b/frontend/src/components/meeting/Meeting.tsx index e6cb556..f767894 100644 --- a/frontend/src/components/meeting/Meeting.tsx +++ b/frontend/src/components/meeting/Meeting.tsx @@ -9,11 +9,12 @@ interface Props { conferenceData: ConferenceData | undefined; setConferenceData: (newData: ConferenceData) => void; userInfo: UserInfo; + //@ts-ignore + roomName, updateRoomName, submitRoomName + meetingStarted: Boolean, setMeetingStarted: Function } -function Meeting({ conferenceData, setConferenceData, userInfo }: Props) { - const { roomName, updateRoomName, submitRoomName } = useRoomName(); - const [meetingStarted, setMeetingStarted] = useState(false); +function Meeting({ conferenceData, setConferenceData, userInfo, roomName, updateRoomName, submitRoomName, meetingStarted, setMeetingStarted }: Props) { const startMeeting = useCallback(() => { submitRoomName(); diff --git a/frontend/src/components/sidebar/Sidebar.tsx b/frontend/src/components/sidebar/Sidebar.tsx index 7e2479d..17d5414 100644 --- a/frontend/src/components/sidebar/Sidebar.tsx +++ b/frontend/src/components/sidebar/Sidebar.tsx @@ -5,6 +5,7 @@ import { UsersData } from "../../background/types/roomData"; interface Props { usersData: UsersData; + updateAndSubmitRoomName: Function } function Sidebar(props: Props) { @@ -14,17 +15,17 @@ function Sidebar(props: Props) { return (
-
-

No room

- {props.usersData.usersWithOutRoom.map((username) => ( -
{username}
- ))} -
{props.usersData.roomsData.map((roomData) => { return ( <> -

{roomData.roomName}

+

+ { + props.updateAndSubmitRoomName(roomData.roomName) + }}> + {roomData.roomName} + +

{roomData.participants.map((participant) => (
{participant.displayName}
))} @@ -32,6 +33,12 @@ function Sidebar(props: Props) { ); })}
+
+

No room

+ {props.usersData.usersWithOutRoom.map((username) => ( +
{username}
+ ))} +
diff --git a/frontend/src/hooks/useRoomName.ts b/frontend/src/hooks/useRoomName.ts index 2e352d9..1639237 100644 --- a/frontend/src/hooks/useRoomName.ts +++ b/frontend/src/hooks/useRoomName.ts @@ -11,12 +11,22 @@ function useRoomName() { [setRoomName] ); + const updateAndSubmitRoomName = useCallback( + (newName: string) => { + setRoomName(newName); + setRoomNameInUrl(newName); + setRoomNameInTitle(newName); + console.log("[Rooms] update and submit room name", newName); + }, + [setRoomName] + ) + const submitRoomName = useCallback(() => { setRoomNameInUrl(roomName); setRoomNameInTitle(roomName); }, [roomName]); - return { roomName, updateRoomName, submitRoomName }; + return { roomName, updateRoomName, updateAndSubmitRoomName, submitRoomName }; } function getRoomNameFromUrl(): string { From b01b637a2220b8aaef6d658ede34258001f0a7d9 Mon Sep 17 00:00:00 2001 From: qvalentin Date: Fri, 7 Apr 2023 16:22:08 +0200 Subject: [PATCH 5/5] Broadcast on disconnect and websocket server fix for docker --- backend/src/WebSocket/MonadWebSocketSession.hs | 5 +++++ backend/src/WebSocket/Server.hs | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/src/WebSocket/MonadWebSocketSession.hs b/backend/src/WebSocket/MonadWebSocketSession.hs index 68b57f6..7893af5 100644 --- a/backend/src/WebSocket/MonadWebSocketSession.hs +++ b/backend/src/WebSocket/MonadWebSocketSession.hs @@ -6,6 +6,7 @@ module WebSocket.MonadWebSocketSession ) where +import BroadcastUserData (MonadBroadcast, broadcastUserData) import ClassyPrelude import Data.Aeson ( FromJSON, @@ -16,6 +17,7 @@ import State.ConnectedClientsState ( MonadConnectedClientsModify, removeWSClient, ) +import State.RoomDataState (MonadRoomDataStateRead) import Types.ConnectionState (Client (..)) import Types.WebSocketMessages.WebSocketMessages (SetClientInfo (..)) import WebSocket.Messages @@ -56,9 +58,12 @@ newClientGeneric clientInfo = do disconnectWsClient :: ( MonadConnectedClientsModify m, + MonadRoomDataStateRead m, + MonadBroadcast m, MonadWebSocketSession m ) => m () disconnectWsClient = do clientId <- getSesssionId removeWSClient clientId + broadcastUserData diff --git a/backend/src/WebSocket/Server.hs b/backend/src/WebSocket/Server.hs index cafd046..666a8e0 100644 --- a/backend/src/WebSocket/Server.hs +++ b/backend/src/WebSocket/Server.hs @@ -18,9 +18,9 @@ runWebSocketServer :: ) => m () runWebSocketServer = do - putStrLn "Websocket up at 127.0.0.1:9160" + putStrLn "Websocket up at 0.0.0.0:9160" wsApp' <- runWSApp - liftIO $ WS.runServer "127.0.0.1" 9160 wsApp' + liftIO $ WS.runServer "0.0.0.0" 9160 wsApp' runWSApp :: ( MonadIO m,