docker-webtop/create-devcontainer-config.sh

384 lines
11 KiB
Bash
Executable File

#!/bin/bash
# Create VS Code .devcontainer configuration
# This script creates a devcontainer.json that works with the webtop KDE desktop container
set -e
echo "========================================"
echo "VS Code Dev Container Configuration"
echo "========================================"
echo "This script will create a .devcontainer configuration"
echo "for using this container with VS Code."
echo ""
# Check if .devcontainer already exists
if [ -d ".devcontainer" ]; then
echo "⚠️ .devcontainer directory already exists."
read -p "Overwrite existing configuration? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Cancelled."
exit 0
fi
rm -rf .devcontainer
fi
# Default values
GPU_VENDOR="none"
GPU_ALL="false"
GPU_NUMS=""
UBUNTU_VERSION="24.04"
RESOLUTION="1920x1080"
DPI="96"
SSL_DIR=""
# Interactive configuration
echo "========================================"
echo "Configuration Questions"
echo "========================================"
echo ""
# GPU configuration
echo "1. GPU Configuration"
echo "-------------------"
echo "Select GPU type:"
echo " 1) No GPU (software rendering)"
echo " 2) NVIDIA GPU"
echo " 3) NVIDIA WSL2"
echo " 4) Intel GPU"
echo " 5) AMD GPU"
read -p "Select [1-5] (default: 1): " gpu_choice
case "${gpu_choice}" in
2)
GPU_VENDOR="nvidia"
echo ""
echo "NVIDIA GPU selected."
read -p "Use all NVIDIA GPUs? (Y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Nn]$ ]]; then
read -p "Enter GPU device numbers (comma-separated, e.g., 0,1): " GPU_NUMS
GPU_ALL="false"
else
GPU_ALL="true"
GPU_NUMS=""
fi
;;
3)
GPU_VENDOR="nvidia-wsl"
GPU_ALL="true"
echo "NVIDIA WSL2 selected."
;;
4)
GPU_VENDOR="intel"
echo "Intel GPU selected."
;;
5)
GPU_VENDOR="amd"
echo "AMD GPU selected."
;;
*)
GPU_VENDOR="none"
echo "No GPU selected (software rendering)."
;;
esac
echo ""
# Ubuntu version
echo "2. Ubuntu Version"
echo "----------------"
read -p "Ubuntu version (22.04 or 24.04, default: 24.04): " UBUNTU_VERSION
UBUNTU_VERSION="${UBUNTU_VERSION:-24.04}"
echo ""
# Display settings
echo "3. Display Settings"
echo "-------------------"
read -p "Display resolution (default: 1920x1080): " RESOLUTION
RESOLUTION="${RESOLUTION:-1920x1080}"
read -p "DPI (default: 96): " DPI
DPI="${DPI:-96}"
echo ""
# SSL directory (optional)
echo "4. SSL Configuration (Optional)"
echo "-------------------------------"
read -p "SSL directory path (leave empty to skip): " SSL_DIR
echo ""
# Default SSL dir fallback (same as start-container.sh)
if [ -z "${SSL_DIR}" ]; then
DEFAULT_SSL_DIR="$(pwd)/ssl"
if [ -d "${DEFAULT_SSL_DIR}" ]; then
SSL_DIR="${DEFAULT_SSL_DIR}"
echo "Using SSL dir: ${SSL_DIR}"
fi
fi
CURRENT_USER=$(whoami)
COMPOSE_ENV_SCRIPT="./compose-env.sh"
if [ ! -x "${COMPOSE_ENV_SCRIPT}" ]; then
echo "Error: ${COMPOSE_ENV_SCRIPT} not found. Run this script from the repository root." >&2
exit 1
fi
# Create .devcontainer directory
mkdir -p .devcontainer
# Build compose-env arguments
COMPOSE_ARGS=(--gpu "${GPU_VENDOR}" --ubuntu "${UBUNTU_VERSION}" --resolution "${RESOLUTION}" --dpi "${DPI}")
if [ "${GPU_VENDOR}" = "nvidia" ]; then
if [ "${GPU_ALL}" = "true" ]; then
COMPOSE_ARGS+=(--all)
else
COMPOSE_ARGS+=(--num "${GPU_NUMS}")
fi
fi
if [ -n "${SSL_DIR}" ]; then
COMPOSE_ARGS+=(--ssl "${SSL_DIR}")
fi
# Generate environment variables
ENV_FILE=".devcontainer/.env"
"${COMPOSE_ENV_SCRIPT}" "${COMPOSE_ARGS[@]}" --env-file "${ENV_FILE}"
# Load generated environment values
set -a
# shellcheck disable=SC1090
source "${ENV_FILE}"
set +a
DEVCONTAINER_CONTAINER_NAME="${CONTAINER_NAME}"
{
echo ""
echo "# Dev Container specific"
echo "DEVCONTAINER_CONTAINER_NAME=${DEVCONTAINER_CONTAINER_NAME}"
} >> "${ENV_FILE}"
export DEVCONTAINER_CONTAINER_NAME
WORKSPACE_FOLDER="/home/${CURRENT_USER}/host_home"
GPU_DEVICES=""
case "${GPU_VENDOR}" in
intel)
if [ -d "/dev/dri" ]; then
GPU_DEVICES="/dev/dri:/dev/dri:rwm"
fi
;;
amd)
if [ -d "/dev/dri" ]; then
GPU_DEVICES="/dev/dri:/dev/dri:rwm"
fi
if [ -e "/dev/kfd" ]; then
GPU_DEVICES="${GPU_DEVICES:+${GPU_DEVICES},}/dev/kfd:/dev/kfd:rwm"
fi
;;
nvidia)
if [ -d "/dev/dri" ]; then
GPU_DEVICES="/dev/dri:/dev/dri:rwm"
fi
;;
nvidia-wsl)
if [ -e "/dev/dxg" ]; then
GPU_DEVICES="/dev/dxg:/dev/dxg:rwm"
fi
;;
esac
# devcontainer.json
cat > .devcontainer/devcontainer.json << EOF
{
"name": "KDE Desktop (${GPU_VENDOR})",
"dockerComposeFile": [
"../docker-compose.user.yml",
"docker-compose.override.yml"
],
"service": "webtop",
"workspaceFolder": "${WORKSPACE_FOLDER}",
"runServices": ["webtop"],
"overrideCommand": false,
"shutdownAction": "stopCompose",
"remoteUser": "${CURRENT_USER}",
"containerUser": "root",
"updateRemoteUserUID": false
}
EOF
# docker-compose override for devcontainer
cat > .devcontainer/docker-compose.override.yml << EOF
services:
webtop:
user: "root"
privileged: true
container_name: \${DEVCONTAINER_CONTAINER_NAME:-${DEVCONTAINER_CONTAINER_NAME}}
EOF
VOLUME_ENTRIES=()
ENV_OVERRIDE_ENTRIES=()
# Add host group mappings (match start-container.sh)
GROUPS_TO_ADD=()
VIDEO_GID=$(getent group video 2>/dev/null | cut -d: -f3 || true)
RENDER_GID=$(getent group render 2>/dev/null | cut -d: -f3 || true)
if [ -n "${VIDEO_GID}" ]; then
GROUPS_TO_ADD+=("${VIDEO_GID}")
fi
if [ -n "${RENDER_GID}" ]; then
GROUPS_TO_ADD+=("${RENDER_GID}")
fi
if [ "${#GROUPS_TO_ADD[@]}" -gt 0 ]; then
{
echo " group_add:"
for GID in "${GROUPS_TO_ADD[@]}"; do
echo " - \"${GID}\""
done
} >> .devcontainer/docker-compose.override.yml
fi
# Add GPU configuration based on vendor
if [ "${GPU_VENDOR}" = "nvidia" ] || [ "${GPU_VENDOR}" = "nvidia-wsl" ]; then
cat >> .devcontainer/docker-compose.override.yml << EOF
device_requests:
- driver: nvidia
capabilities: ["gpu"]
EOF
if [ "${GPU_VENDOR}" = "nvidia-wsl" ] || [ "${GPU_ALL}" = "true" ]; then
echo " count: all" >> .devcontainer/docker-compose.override.yml
elif [ -n "${GPU_NUMS}" ]; then
{
echo " device_ids:"
IFS=',' read -r -a GPU_ID_LIST <<< "${GPU_NUMS}"
for GPU_ID in "${GPU_ID_LIST[@]}"; do
echo " - \"${GPU_ID}\""
done
} >> .devcontainer/docker-compose.override.yml
fi
ENV_OVERRIDE_ENTRIES+=("DISABLE_ZINK=true")
if [ "${GPU_VENDOR}" = "nvidia-wsl" ]; then
ENV_OVERRIDE_ENTRIES+=("WSL_ENVIRONMENT=true")
fi
fi
# Collect WSL2 specific mounts (match start-container.sh)
if [ "${GPU_VENDOR}" = "nvidia-wsl" ]; then
if [ -d "/usr/lib/wsl/lib" ]; then
VOLUME_ENTRIES+=("/usr/lib/wsl/lib:/usr/lib/wsl/lib:ro")
fi
if [ -d "/mnt/wslg" ]; then
VOLUME_ENTRIES+=("/mnt/wslg:/mnt/wslg:ro")
fi
fi
# Add GPU device mappings when available
if [ -n "${GPU_DEVICES}" ]; then
{
echo " devices:"
IFS=',' read -r -a GPU_DEVICE_LIST <<< "${GPU_DEVICES}"
for DEVICE in "${GPU_DEVICE_LIST[@]}"; do
echo " - ${DEVICE}"
done
} >> .devcontainer/docker-compose.override.yml
fi
# Add SSL mount when available (match start-container.sh)
if [ -n "${SSL_DIR}" ] && [ -f "${SSL_DIR}/cert.pem" ] && [ -f "${SSL_DIR}/cert.key" ]; then
VOLUME_ENTRIES+=("\${SSL_DIR}:/config/ssl:ro")
fi
# Add volumes when available
if [ "${#VOLUME_ENTRIES[@]}" -gt 0 ]; then
{
echo " volumes:"
for VOLUME in "${VOLUME_ENTRIES[@]}"; do
echo " - ${VOLUME}"
done
} >> .devcontainer/docker-compose.override.yml
fi
# Add environment overrides when available
if [ "${#ENV_OVERRIDE_ENTRIES[@]}" -gt 0 ]; then
{
echo " environment:"
for ENV_ENTRY in "${ENV_OVERRIDE_ENTRIES[@]}"; do
echo " - ${ENV_ENTRY}"
done
} >> .devcontainer/docker-compose.override.yml
fi
# Copy .env to workspace root for docker-compose
cp "${ENV_FILE}" .env
# README
cat > .devcontainer/README.md << EOF
# VS Code Dev Container Configuration
このディレクトリのファイルは \`./create-devcontainer-config.sh\` によって生成され、\`start-container.sh\` と同じ環境変数を \`.devcontainer/.env\` とリポジトリ直下の \`.env\` に書き出します。
## 生成された設定
- GPU: ${GPU_VENDOR}
EOF
if [ "${GPU_VENDOR}" = "nvidia" ]; then
if [ "${GPU_ALL}" = "true" ]; then
cat >> .devcontainer/README.md << 'EOF'
- NVIDIA GPUs: all
EOF
else
cat >> .devcontainer/README.md << EOF
- NVIDIA GPUs: ${GPU_NUMS}
EOF
fi
fi
cat >> .devcontainer/README.md << EOF
- Ubuntu Version: ${UBUNTU_VERSION}
- Resolution: ${RESOLUTION}
- DPI: ${DPI}
- HTTPS Port: https://localhost:${HOST_PORT_SSL}
- HTTP Port: http://localhost:${HOST_PORT_HTTP}
- TURN Port: ${HOST_PORT_TURN}
## VS Code での利用手順
1. Dev Containers 拡張機能をインストールする
2. ワークスペースを開き、\`F1\` → \`Dev Containers: Reopen in Container\` を実行
3. VS Code が \`.env\` を読み込んで \`docker compose\` を起動
## 再設定
設定を変更したい場合はリポジトリルートで \`./create-devcontainer-config.sh\` を再実行し、案内に従ってください。スクリプト完了後に VS Code 側で「Rebuild Container」を選択すると新しい設定が反映されます。
EOF
# Copy .env to workspace root for docker-compose
cp "${ENV_FILE}" .env
echo ""
echo "========================================"
echo "Configuration Complete!"
echo "========================================"
echo ""
echo "Created files:"
echo " - .devcontainer/devcontainer.json"
echo " - .devcontainer/docker-compose.override.yml"
echo " - .devcontainer/.env"
echo " - .devcontainer/README.md"
echo " - .env (for docker-compose)"
echo ""
echo "Configuration summary:"
echo " - GPU: ${GPU_VENDOR}"
if [ "${GPU_VENDOR}" = "nvidia" ]; then
if [ "${GPU_ALL}" = "true" ]; then
echo " NVIDIA GPUs: all"
else
echo " NVIDIA GPUs: ${GPU_NUMS}"
fi
fi
echo " - Ubuntu: ${UBUNTU_VERSION}"
echo " - Resolution: ${RESOLUTION}"
echo " - DPI: ${DPI}"
echo " - HTTPS Port: ${HOST_PORT_SSL}"
echo " - HTTP Port: ${HOST_PORT_HTTP}"
echo " - TURN Port: ${HOST_PORT_TURN}"
echo ""
echo "Access the desktop at: https://localhost:${HOST_PORT_SSL}"
echo "========================================"