diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index 5a6f61db..efd7c777 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -190,6 +190,10 @@ jobs: if [ -f "termix-${VERSION}-armv7l.tar.gz" ]; then mv "termix-${VERSION}-armv7l.tar.gz" "termix_linux_armv7l_portable.tar.gz" fi + # Rename Debian amd64 to x64 for consistency + if [ -f "termix_linux_amd64_deb.deb" ]; then + mv "termix_linux_amd64_deb.deb" "termix_linux_x64_deb.deb" + fi cd .. @@ -213,6 +217,14 @@ jobs: path: release/termix_linux_arm64_appimage.AppImage retention-days: 30 + - name: Upload Linux armv7l AppImage + uses: actions/upload-artifact@v4 + if: hashFiles('release/termix_linux_armv7l_appimage.AppImage') != '' && github.event.inputs.artifact_destination != 'none' + with: + name: termix_linux_armv7l_appimage + path: release/termix_linux_armv7l_appimage.AppImage + retention-days: 30 + - name: Upload Linux x64 DEB uses: actions/upload-artifact@v4 if: hashFiles('release/termix_linux_x64_deb.deb') != '' && github.event.inputs.artifact_destination != 'none' @@ -413,7 +425,7 @@ jobs: if: steps.check_certs.outputs.has_certs == 'true' && hashFiles('release/termix_macos_universal_mas.pkg') != '' && (github.event.inputs.artifact_destination == 'file' || github.event.inputs.artifact_destination == 'release' || github.event.inputs.artifact_destination == 'submit') uses: actions/upload-artifact@v4 with: - name: termix_macos_mas + name: termix_macos_universal_mas path: release/termix_macos_universal_mas.pkg retention-days: 30 if-no-files-found: warn diff --git a/docker/nginx-https.conf b/docker/nginx-https.conf index 984e7973..e27032b0 100644 --- a/docker/nginx-https.conf +++ b/docker/nginx-https.conf @@ -106,6 +106,15 @@ http { proxy_read_timeout 300s; } + location ~ ^/snippets(/.*)?$ { + proxy_pass http://127.0.0.1:30001; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + location ~ ^/database(/.*)?$ { client_max_body_size 5G; client_body_timeout 300s; diff --git a/docker/nginx.conf b/docker/nginx.conf index 384e64d9..cf078022 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -103,6 +103,15 @@ http { proxy_read_timeout 300s; } + location ~ ^/snippets(/.*)?$ { + proxy_pass http://127.0.0.1:30001; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + location ~ ^/database(/.*)?$ { client_max_body_size 5G; client_body_timeout 300s; diff --git a/electron-builder.json b/electron-builder.json index fc7d05dd..de8b41fd 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -53,7 +53,7 @@ "target": [ { "target": "AppImage", - "arch": ["x64", "arm64"] + "arch": ["x64", "arm64", "armv7l"] }, { "target": "deb", diff --git a/src/ui/desktop/apps/dashboard/Dashboard.tsx b/src/ui/desktop/apps/dashboard/Dashboard.tsx index 6d4c9320..39742b77 100644 --- a/src/ui/desktop/apps/dashboard/Dashboard.tsx +++ b/src/ui/desktop/apps/dashboard/Dashboard.tsx @@ -194,7 +194,7 @@ export function Dashboard({ setServerStatsLoading(true); const serversWithStats = await Promise.all( - hosts.slice(0, 5).map(async (host: { id: number; name: string }) => { + hosts.slice(0, 50).map(async (host: { id: number; name: string }) => { try { const metrics = await getServerMetricsById(host.id); return { @@ -213,7 +213,10 @@ export function Dashboard({ } }), ); - setServerStats(serversWithStats); + const validServerStats = serversWithStats.filter( + (server) => server.cpu !== null && server.ram !== null, + ); + setServerStats(validServerStats); setServerStatsLoading(false); } catch (error) { console.error("Failed to fetch dashboard data:", error); diff --git a/src/ui/desktop/authentication/Auth.tsx b/src/ui/desktop/authentication/Auth.tsx index 5ee3da8c..dde027dd 100644 --- a/src/ui/desktop/authentication/Auth.tsx +++ b/src/ui/desktop/authentication/Auth.tsx @@ -651,7 +651,12 @@ export function Auth({ ); } - if (isElectron() && currentServerUrl && authLoading) { + if ( + isElectron() && + currentServerUrl && + authLoading && + !isInElectronWebView() + ) { return (
setIsSidebarOpen(true)} - className="absolute top-0 left-0 w-[10px] h-full bg-dark-bg cursor-pointer z-20 flex items-center justify-center rounded-tr-md rounded-br-md" + className="fixed top-0 left-0 w-[10px] h-full cursor-pointer flex items-center justify-center rounded-tr-md rounded-br-md" + style={{ + zIndex: 9999, + backgroundColor: "#18181b", + border: "2px solid #27272a", + borderLeft: "none", + }} >
diff --git a/src/ui/desktop/navigation/TopNavbar.tsx b/src/ui/desktop/navigation/TopNavbar.tsx index 7f377bd3..7a7bb34d 100644 --- a/src/ui/desktop/navigation/TopNavbar.tsx +++ b/src/ui/desktop/navigation/TopNavbar.tsx @@ -491,7 +491,16 @@ export function TopNavbar({ {!isTopbarOpen && (
setIsTopbarOpen(true)} - className="absolute top-0 left-0 w-full h-[10px] cursor-pointer z-20 flex items-center justify-center rounded-bl-md rounded-br-md bg-dark" + className="fixed top-0 cursor-pointer flex items-center justify-center rounded-bl-md rounded-br-md" + style={{ + left: leftPosition, + right: "17px", + height: "10px", + zIndex: 9999, + backgroundColor: "#18181b", + border: "2px solid #27272a", + borderTop: "none", + }} >
diff --git a/src/ui/main-axios.ts b/src/ui/main-axios.ts index 2fd2b184..357b074b 100644 --- a/src/ui/main-axios.ts +++ b/src/ui/main-axios.ts @@ -345,7 +345,15 @@ function createApiInstance( toast.warning("Session expired. Please log in again."); }); - setTimeout(() => window.location.reload(), 1000); + const currentPath = window.location.pathname; + const isOnAuthPage = + currentPath === "/" || + currentPath === "/login" || + currentPath === "/auth"; + + if (!isOnAuthPage) { + setTimeout(() => window.location.reload(), 1000); + } } }