mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
refactor: gpu support and docker setup improvements
- Add gpu status refresh with useEffect - Update docker-compose.yml configuration - Modify gpu setup scripts - Improve gpu support checks
This commit is contained in:
@@ -11,7 +11,7 @@ import {
|
|||||||
import { api } from "@/utils/api";
|
import { api } from "@/utils/api";
|
||||||
import { TRPCClientError } from "@trpc/client";
|
import { TRPCClientError } from "@trpc/client";
|
||||||
import { CheckCircle2, Cpu, Loader2, RefreshCw, XCircle } from "lucide-react";
|
import { CheckCircle2, Cpu, Loader2, RefreshCw, XCircle } from "lucide-react";
|
||||||
import { useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
|
|
||||||
interface GPUSupportProps {
|
interface GPUSupportProps {
|
||||||
@@ -54,9 +54,18 @@ export function GPUSupport({ serverId }: GPUSupportProps) {
|
|||||||
|
|
||||||
const handleRefresh = async () => {
|
const handleRefresh = async () => {
|
||||||
setIsRefreshing(true);
|
setIsRefreshing(true);
|
||||||
await refetch();
|
try {
|
||||||
setIsRefreshing(false);
|
await utils.settings.checkGPUStatus.invalidate({ serverId });
|
||||||
|
await refetch();
|
||||||
|
} catch (error) {
|
||||||
|
toast.error("Failed to refresh GPU status");
|
||||||
|
} finally {
|
||||||
|
setIsRefreshing(false);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
useEffect(() => {
|
||||||
|
handleRefresh();
|
||||||
|
}, []);
|
||||||
|
|
||||||
const handleEnableGPU = async () => {
|
const handleEnableGPU = async () => {
|
||||||
if (serverId === undefined) {
|
if (serverId === undefined) {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ version: "3.8"
|
|||||||
services:
|
services:
|
||||||
blender:
|
blender:
|
||||||
image: lscr.io/linuxserver/blender:latest
|
image: lscr.io/linuxserver/blender:latest
|
||||||
container_name: blender
|
|
||||||
runtime: nvidia
|
runtime: nvidia
|
||||||
deploy:
|
deploy:
|
||||||
resources:
|
resources:
|
||||||
|
|||||||
@@ -87,20 +87,38 @@ const checkRuntime = async (serverId?: string) => {
|
|||||||
let runtimeConfigured = false;
|
let runtimeConfigured = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const runtimeCommand = 'docker info --format "{{json .Runtimes}}"';
|
// First check: Is nvidia-container-runtime installed?
|
||||||
const { stdout: runtimeInfo } = serverId
|
const checkBinaryCommand = "command -v nvidia-container-runtime";
|
||||||
? await execAsyncRemote(serverId, runtimeCommand)
|
try {
|
||||||
: await execAsync(runtimeCommand);
|
const { stdout } = serverId
|
||||||
|
? await execAsyncRemote(serverId, checkBinaryCommand)
|
||||||
|
: await execAsync(checkBinaryCommand);
|
||||||
|
runtimeInstalled = !!stdout.trim();
|
||||||
|
} catch (error) {
|
||||||
|
console.debug("Runtime binary check:", error);
|
||||||
|
}
|
||||||
|
|
||||||
const runtimes = JSON.parse(runtimeInfo);
|
// Second check: Is it configured in Docker?
|
||||||
runtimeInstalled = "nvidia" in runtimes;
|
try {
|
||||||
|
const runtimeCommand = 'docker info --format "{{json .Runtimes}}"';
|
||||||
|
const { stdout: runtimeInfo } = serverId
|
||||||
|
? await execAsyncRemote(serverId, runtimeCommand)
|
||||||
|
: await execAsync(runtimeCommand);
|
||||||
|
|
||||||
const defaultCommand = 'docker info --format "{{.DefaultRuntime}}"';
|
const defaultCommand = 'docker info --format "{{.DefaultRuntime}}"';
|
||||||
const { stdout: defaultRuntime } = serverId
|
const { stdout: defaultRuntime } = serverId
|
||||||
? await execAsyncRemote(serverId, defaultCommand)
|
? await execAsyncRemote(serverId, defaultCommand)
|
||||||
: await execAsync(defaultCommand);
|
: await execAsync(defaultCommand);
|
||||||
|
|
||||||
runtimeConfigured = defaultRuntime.trim() === "nvidia";
|
const runtimes = JSON.parse(runtimeInfo);
|
||||||
|
const hasNvidiaRuntime = "nvidia" in runtimes;
|
||||||
|
const isDefaultRuntime = defaultRuntime.trim() === "nvidia";
|
||||||
|
|
||||||
|
// Only set runtimeConfigured if both conditions are met
|
||||||
|
runtimeConfigured = hasNvidiaRuntime && isDefaultRuntime;
|
||||||
|
} catch (error) {
|
||||||
|
console.debug("Runtime configuration check:", error);
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.debug("Runtime check:", error);
|
console.debug("Runtime check:", error);
|
||||||
}
|
}
|
||||||
@@ -279,6 +297,7 @@ const setupRemoteServer = async (serverId: string, daemonConfig: any) => {
|
|||||||
"sudo -n true",
|
"sudo -n true",
|
||||||
`echo '${JSON.stringify(daemonConfig, null, 2)}' | sudo tee /etc/docker/daemon.json`,
|
`echo '${JSON.stringify(daemonConfig, null, 2)}' | sudo tee /etc/docker/daemon.json`,
|
||||||
"sudo mkdir -p /etc/nvidia-container-runtime",
|
"sudo mkdir -p /etc/nvidia-container-runtime",
|
||||||
|
'sudo sed -i "/swarm-resource/d" /etc/nvidia-container-runtime/config.toml',
|
||||||
'echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" | sudo tee -a /etc/nvidia-container-runtime/config.toml',
|
'echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" | sudo tee -a /etc/nvidia-container-runtime/config.toml',
|
||||||
"sudo systemctl daemon-reload",
|
"sudo systemctl daemon-reload",
|
||||||
"sudo systemctl restart docker",
|
"sudo systemctl restart docker",
|
||||||
@@ -295,6 +314,7 @@ const setupLocalServer = async (daemonConfig: any) => {
|
|||||||
`pkexec sh -c '
|
`pkexec sh -c '
|
||||||
cp ${configFile} /etc/docker/daemon.json &&
|
cp ${configFile} /etc/docker/daemon.json &&
|
||||||
mkdir -p /etc/nvidia-container-runtime &&
|
mkdir -p /etc/nvidia-container-runtime &&
|
||||||
|
sed -i "/swarm-resource/d" /etc/nvidia-container-runtime/config.toml &&
|
||||||
echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" >> /etc/nvidia-container-runtime/config.toml &&
|
echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" >> /etc/nvidia-container-runtime/config.toml &&
|
||||||
systemctl daemon-reload &&
|
systemctl daemon-reload &&
|
||||||
systemctl restart docker
|
systemctl restart docker
|
||||||
|
|||||||
Reference in New Issue
Block a user