Skip to content

Commit e39c2d9

Browse files
chore: update workspace templates and images
1 parent bdee476 commit e39c2d9

8 files changed

Lines changed: 569 additions & 391 deletions

File tree

Docker-Images/Designer/Dockerfile

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ RUN dpkg --add-architecture i386 && \
2525
apt-get install -y --no-install-recommends \
2626
build-essential \
2727
pkg-config \
28-
python3 python3-venv python3-pip pipx \
28+
python3 python3-venv python3-pip python3-requests pipx \
2929
zip unzip p7zip-full \
3030
fuse3 \
3131
libfuse2 \
@@ -80,7 +80,7 @@ RUN dpkg --add-architecture i386 && \
8080
alsa-utils \
8181
&& rm -rf /var/lib/apt/lists/*
8282

83-
# OrcaSlicer (AppImage), LaserGRBL (Wine) y VisiCut (.deb)
83+
# OrcaSlicer (AppImage), LaserGRBL (Wine), OpenCode Desktop y VisiCut (.deb)
8484
RUN <<'EOSH'
8585
set -e
8686
ORCA_VERSION="2.3.1"
@@ -118,16 +118,71 @@ rm /tmp/opencode-desktop.deb
118118
rm -rf /var/lib/apt/lists/*
119119
EOSH
120120

121+
# Claude Desktop (.deb repo comunitario) + wrapper no-sandbox para Electron
122+
RUN <<'EOSH'
123+
set -e
124+
curl -fsSL https://aaddrick.github.io/claude-desktop-debian/KEY.gpg | gpg --dearmor -o /usr/share/keyrings/claude-desktop.gpg
125+
echo "deb [signed-by=/usr/share/keyrings/claude-desktop.gpg arch=amd64,arm64] https://aaddrick.github.io/claude-desktop-debian stable main" > /etc/apt/sources.list.d/claude-desktop.list
126+
apt-get update
127+
apt-get install -y --no-install-recommends claude-desktop
128+
rm -rf /var/lib/apt/lists/*
129+
if [ -x /usr/share/claude-desktop/claude-desktop ] && [ -x /usr/bin/claude-desktop ]; then
130+
mv /usr/bin/claude-desktop /usr/bin/claude-desktop.real || true
131+
cat > /usr/bin/claude-desktop <<'EOFWRAP'
132+
#!/bin/sh
133+
exec env ELECTRON_DISABLE_SANDBOX=1 ELECTRON_OZONE_PLATFORM_HINT="${ELECTRON_OZONE_PLATFORM_HINT:-auto}" \
134+
/usr/share/claude-desktop/claude-desktop --no-sandbox --disable-gpu-sandbox --disable-setuid-sandbox --disable-seccomp-filter-sandbox --no-zygote --disable-gpu "$@"
135+
EOFWRAP
136+
chmod +x /usr/bin/claude-desktop
137+
fi
138+
EOSH
139+
140+
# Blender 3.6 LTS (binario oficial)
141+
ARG BLENDER_VERSION=3.6.23
142+
RUN <<'EOSH'
143+
set -e
144+
BLENDER_DIR="/opt/blender"
145+
BLENDER_PKG="blender-${BLENDER_VERSION}-linux-x64"
146+
BLENDER_URL="https://download.blender.org/release/Blender3.6/${BLENDER_PKG}.tar.xz"
147+
mkdir -p /opt
148+
curl -fL "${BLENDER_URL}" -o /tmp/blender.tar.xz
149+
tar -xJf /tmp/blender.tar.xz -C /opt
150+
rm -f /tmp/blender.tar.xz
151+
rm -rf "${BLENDER_DIR}"
152+
mv "/opt/${BLENDER_PKG}" "${BLENDER_DIR}"
153+
ln -sf "${BLENDER_DIR}/blender" /usr/local/bin/blender
154+
ln -sf "${BLENDER_DIR}/blender-thumbnailer" /usr/local/bin/blender-thumbnailer || true
155+
install -D -m 0644 "${BLENDER_DIR}/blender.svg" /usr/share/icons/hicolor/scalable/apps/blender.svg
156+
cat > /usr/share/applications/blender.desktop <<'EOF'
157+
[Desktop Entry]
158+
Type=Application
159+
Name=Blender
160+
Exec=blender
161+
Icon=blender
162+
Categories=Graphics;3DGraphics;
163+
Terminal=false
164+
EOF
165+
EOSH
166+
121167
# Configuración FUSE para permitir AppImages (allow_other)
122168
RUN echo "user_allow_other" > /etc/fuse.conf
123169

124170
# Locales
125171
RUN locale-gen es_ES.UTF-8 en_US.UTF-8 && \
126172
update-locale LANG=es_ES.UTF-8
127173

174+
# KasmVNC usa `startkde`; en Plasma moderno el binario es `startplasma-x11`.
175+
RUN if [ -x /usr/bin/startplasma-x11 ] && [ ! -x /usr/bin/startkde ]; then \
176+
ln -sf /usr/bin/startplasma-x11 /usr/bin/startkde; \
177+
fi && \
178+
update-alternatives --set x-session-manager /usr/bin/startplasma-x11 || true
179+
128180
ENV LANG=es_ES.UTF-8 \
129181
LC_ALL=es_ES.UTF-8
130182

183+
ENV ELECTRON_DISABLE_SANDBOX=1 \
184+
ELECTRON_OZONE_PLATFORM_HINT=auto
185+
131186
# Utilidades NVIDIA para `nvidia-smi` cuando se habilitan GPUs
132187
RUN set -e; \
133188
apt-get update; \
@@ -138,6 +193,31 @@ RUN set -e; \
138193
fi; \
139194
rm -rf /var/lib/apt/lists/*
140195

196+
# Node.js 22 LTS + CLIs de IA para trabajo con código
197+
RUN install -m 0755 -d /etc/apt/keyrings && \
198+
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
199+
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" \
200+
| tee /etc/apt/sources.list.d/nodesource.list > /dev/null && \
201+
apt-get update && \
202+
apt-get install -y --no-install-recommends nodejs && \
203+
npm install -g --omit=dev --no-update-notifier --no-fund \
204+
@openai/codex \
205+
@anthropic-ai/claude-code && \
206+
npm cache clean --force && \
207+
rm -rf /var/lib/apt/lists/*
208+
209+
# uv + OpenCode CLI (binario en /usr/local/bin/opencode)
210+
RUN <<'EOSH'
211+
set -e
212+
# uv (Astral)
213+
curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin UV_NO_MODIFY_PATH=1 sh
214+
# OpenCode CLI using official installer in an unmanaged path
215+
export HOME=/opt/opencode-cli
216+
mkdir -p "$HOME"
217+
curl -fsSL https://opencode.ai/install | bash -s -- --no-modify-path
218+
install -m 0755 /opt/opencode-cli/.opencode/bin/opencode /usr/local/bin/opencode
219+
EOSH
220+
141221
# Desactivar bloqueo/ahorro de pantalla (KDE)
142222
RUN printf '[Daemon]\nTimeout=0\nLockOnResume=false\nLockOnSuspend=false\nAutolock=false\n' > /etc/xdg/kscreenlockerrc
143223

@@ -209,7 +289,7 @@ RUN update-desktop-database /usr/share/applications || true && \
209289

210290
# Crear accesos directos en Desktop para todas las aplicaciones
211291
RUN mkdir -p /etc/skel/Desktop && \
212-
for f in firefox.desktop org.freecadweb.FreeCAD.desktop org.inkscape.Inkscape.desktop gimp.desktop org.kde.krita.desktop org.kicad.kicad.desktop openscad.desktop PrusaSlicer.desktop librecad.desktop meshlab.desktop org.fritzing.Fritzing.desktop net.launchpad.code.simulide.desktop geany.desktop VisiCut.desktop orcaslicer.desktop appimagepool.desktop OpenCode.desktop; do \
292+
for f in firefox.desktop org.freecadweb.FreeCAD.desktop org.inkscape.Inkscape.desktop gimp.desktop org.kde.krita.desktop org.kicad.kicad.desktop openscad.desktop PrusaSlicer.desktop librecad.desktop meshlab.desktop org.fritzing.Fritzing.desktop net.launchpad.code.simulide.desktop geany.desktop VisiCut.desktop orcaslicer.desktop appimagepool.desktop OpenCode.desktop claude-desktop.desktop; do \
213293
src="/usr/share/applications/$f"; \
214294
if [ -f "$src" ]; then ln -sf "$src" "/etc/skel/Desktop/$f"; fi; \
215295
done && \

Docker-Images/Developer/Dockerfile

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,25 +163,23 @@ RUN set -e; \
163163
fi; \
164164
rm -rf /var/lib/apt/lists/*
165165

166-
# GitHub Desktop (shiftkey build), Claude Desktop (unofficial build) y OpenCode Desktop
166+
# GitHub Desktop (shiftkey build), Claude Desktop (repo APT) y OpenCode Desktop
167167
ARG GITHUB_DESKTOP_REPO=shiftkey/desktop
168-
ARG CLAUDE_DESKTOP_REPO=aaddrick/claude-desktop-debian
169168
ARG OPENCODE_DESKTOP_URL=https://opencode.ai/es/download/stable/linux-x64-deb
170169
RUN set -e; \
171170
GH_DESKTOP_URL="$(curl -fsSL "https://api.github.com/repos/${GITHUB_DESKTOP_REPO}/releases/latest" | \
172171
jq -r '.assets[] | select(.name | test("GitHubDesktop-linux-amd64-.*\\.deb$")) | .browser_download_url' | head -n1)"; \
173-
CLAUDE_URL="$(curl -fsSL "https://api.github.com/repos/${CLAUDE_DESKTOP_REPO}/releases/latest" | \
174-
jq -r '.assets[] | select(.name | test("claude-desktop_.*_amd64\\.deb$")) | .browser_download_url' | head -n1)"; \
175-
if [ -z "$GH_DESKTOP_URL" ] || [ -z "$CLAUDE_URL" ] || [ -z "$OPENCODE_DESKTOP_URL" ]; then \
172+
if [ -z "$GH_DESKTOP_URL" ] || [ -z "$OPENCODE_DESKTOP_URL" ]; then \
176173
echo "No se encontraron URLs .deb válidas para las apps desktop" >&2; \
177174
exit 1; \
178175
fi; \
179176
curl -fsSL "$GH_DESKTOP_URL" -o /tmp/github-desktop.deb; \
180-
curl -fsSL "$CLAUDE_URL" -o /tmp/claude-desktop.deb; \
181177
curl -fsSL "$OPENCODE_DESKTOP_URL" -o /tmp/opencode-desktop.deb; \
178+
curl -fsSL https://aaddrick.github.io/claude-desktop-debian/KEY.gpg | gpg --dearmor -o /usr/share/keyrings/claude-desktop.gpg; \
179+
echo "deb [signed-by=/usr/share/keyrings/claude-desktop.gpg arch=amd64,arm64] https://aaddrick.github.io/claude-desktop-debian stable main" > /etc/apt/sources.list.d/claude-desktop.list; \
182180
apt-get update; \
183-
apt-get install -y --no-install-recommends /tmp/github-desktop.deb /tmp/claude-desktop.deb /tmp/opencode-desktop.deb; \
184-
rm -rf /var/lib/apt/lists/* /tmp/github-desktop.deb /tmp/claude-desktop.deb /tmp/opencode-desktop.deb
181+
apt-get install -y --no-install-recommends /tmp/github-desktop.deb /tmp/opencode-desktop.deb claude-desktop; \
182+
rm -rf /var/lib/apt/lists/* /tmp/github-desktop.deb /tmp/opencode-desktop.deb
185183

186184
# Electron apps dentro de contenedores Docker necesitan desactivar el sandbox
187185
# (no hay user namespaces). Los wrappers añaden --no-sandbox y pistas de Ozone.

workspaces/AdvancedHostDANGER/main.tf

Lines changed: 19 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ data "coder_parameter" "enable_dri" {
7777
display_name = "[Compute] DRI (/dev/dri)"
7878
description = "Mapea /dev/dri para aceleracion grafica (Intel/AMD o NVIDIA via EGL/GL)."
7979
type = "bool"
80-
default = false
80+
default = true
8181
mutable = true
8282
}
8383

@@ -90,24 +90,6 @@ data "coder_parameter" "persist_projects_storage" {
9090
mutable = true
9191
}
9292

93-
data "coder_parameter" "host_mount_path" {
94-
name = "02_03_host_mount_path"
95-
display_name = "[Storage] Montar ruta host en ~/host"
96-
description = "Ruta del host que se monta en /home/coder/host dentro del workspace."
97-
type = "string"
98-
default = ""
99-
mutable = true
100-
}
101-
102-
data "coder_parameter" "host_mount_uid" {
103-
name = "02_04_host_mount_uid"
104-
display_name = "[Storage] Especificar UID para montar la ruta host"
105-
description = "UID para ejecutar el contenedor cuando montas ~/host. Por defecto 1000."
106-
type = "string"
107-
default = "1000"
108-
mutable = true
109-
}
110-
11193
data "coder_parameter" "git_repo_url" {
11294
name = "03_git_repo_url"
11395
display_name = "[Code] Repositorio Git (opcional)"
@@ -118,28 +100,10 @@ data "coder_parameter" "git_repo_url" {
118100
}
119101

120102
# Parámetros opcionales para OpenCode
121-
data "coder_parameter" "opencode_provider_url" {
122-
name = "04_opencode_provider_url"
123-
display_name = "[AI/OpenAI] Base URL (opcional)"
124-
description = "Base URL compatible con OpenAI (ej. https://api.tu-proveedor.com/v1)."
125-
type = "string"
126-
default = ""
127-
mutable = true
128-
}
129-
130-
data "coder_parameter" "opencode_api_key" {
131-
name = "04_opencode_api_key"
132-
display_name = "[AI/OpenAI] API key (opcional)"
133-
description = "API key para el proveedor OpenAI compatible. Deja vacío y usa autoprovisión para llave MakeSpace."
134-
type = "string"
135-
default = ""
136-
mutable = true
137-
}
138-
139103
data "coder_parameter" "autoprovision_freeapi_key" {
140104
name = "04_autoprovision_freeapi_key"
141105
display_name = "[AI/FreeAPI] Provisionar API key automáticamente"
142-
description = "Si hay FREEAPI_BASE_URL/FREEAPI_KEY_ENDPOINT, solicita una key y configura FreeAPI en OpenCode."
106+
description = "Generar automaticamente una key con acceso a recursos gratis externos que pueden no ser privados."
143107
type = "bool"
144108
default = true
145109
mutable = true
@@ -154,24 +118,15 @@ data "coder_parameter" "claude_token" {
154118
mutable = true
155119
}
156120

157-
data "coder_parameter" "vscode_extensions" {
158-
name = "06_vscode_extensions"
159-
display_name = "[Code] Extensiones VS Code (preinstalar)"
160-
description = "Lista separada por comas de extensiones a preinstalar en VS Code/code-server."
161-
type = "string"
162-
default = join(", ", local.vscode_extensions_default)
163-
mutable = true
164-
}
165-
166121
locals {
167122
username = data.coder_workspace_owner.me.name
168123
workspace_image = "ghcr.io/makespacemadrid/coder-mks-developer:latest"
169124
persist_home_storage = data.coder_parameter.persist_home_storage.value
170125
persist_projects_storage = data.coder_parameter.persist_projects_storage.value
171126
enable_gpu = data.coder_parameter.enable_gpu.value
172127
enable_dri = data.coder_parameter.enable_dri.value
173-
host_mount_path = trimspace(data.coder_parameter.host_mount_path.value)
174-
host_mount_uid = trimspace(data.coder_parameter.host_mount_uid.value)
128+
host_mount_path = ""
129+
host_mount_uid = "1000"
175130
workspace_storage_root = trimspace(var.users_storage)
176131
workspace_storage_home = local.workspace_storage_root != "" ? "${local.workspace_storage_root}/${local.username}/${lower(data.coder_workspace.me.name)}" : ""
177132
workspace_storage_projects = local.workspace_storage_root != "" ? "${local.workspace_storage_root}/${local.username}/${lower(data.coder_workspace.me.name)}/Projects" : ""
@@ -185,22 +140,11 @@ locals {
185140
repo_url = trimspace(data.coder_parameter.git_repo_url.value)
186141
repo_name = local.repo_url != "" ? trimsuffix(basename(local.repo_url), ".git") : ""
187142
default_repo_path = local.repo_name != "" ? "/home/coder/Projects/${local.repo_name}" : "/home/coder/Projects"
188-
openai_base_url = trimspace(data.coder_parameter.opencode_provider_url.value)
189-
openai_api_key = trimspace(data.coder_parameter.opencode_api_key.value)
143+
openai_base_url = ""
144+
openai_api_key = ""
190145
auto_provision_freeapi_key = data.coder_parameter.autoprovision_freeapi_key.value
191146
claude_token = trimspace(data.coder_parameter.claude_token.value)
192147
install_claude = local.claude_token != ""
193-
vscode_extensions_default = [
194-
"coder.coder-remote",
195-
"openai.chatgpt",
196-
"Anthropic.claude-code",
197-
"Continue.continue"
198-
]
199-
vscode_extensions_input = trimspace(data.coder_parameter.vscode_extensions.value)
200-
vscode_extensions = local.vscode_extensions_input != "" ? [
201-
for ext in split(",", local.vscode_extensions_input) : trimspace(ext)
202-
if trimspace(ext) != ""
203-
] : local.vscode_extensions_default
204148
continue_default_config = file("${path.module}/continue-config.yaml")
205149
}
206150

@@ -334,15 +278,19 @@ for path in paths:
334278
with open(path, "w") as f:
335279
json.dump(data, f, indent=2)
336280
PY
337-
if [ ! -f "$HOME/Projects/.vscode/extensions.json" ]; then
338-
mkdir -p "$HOME/Projects/.vscode"
339-
cat > "$HOME/Projects/.vscode/extensions.json" <<'VSCODEEXT'
340-
{
341-
"recommendations": [
342-
${join(",\n", formatlist(" \"%s\"", local.vscode_extensions))}
343-
]
344-
}
345-
VSCODEEXT
281+
mkdir -p "$HOME/.codex"
282+
touch "$HOME/.codex/config.toml"
283+
if ! grep -q '^\[mcp_servers\.chrome-devtools\]' "$HOME/.codex/config.toml" 2>/dev/null; then
284+
cat >> "$HOME/.codex/config.toml" <<'CODEXCFG'
285+
286+
[mcp_servers.chrome-devtools]
287+
command = "bash"
288+
args = [
289+
"-lc",
290+
"DISPLAY=:1 XAUTHORITY=$HOME/.Xauthority npx -y chrome-devtools-mcp@latest"
291+
]
292+
enabled = true
293+
CODEXCFG
346294
fi
347295
mkdir -p ~/.opencode ~/.config/opencode
348296
if [ ! -f ~/.opencode/opencode.json ]; then
@@ -997,7 +945,6 @@ module "code-server" {
997945
version = "~> 1.1"
998946
agent_id = coder_agent.main.id
999947
folder = "/home/coder/Projects"
1000-
extensions = local.vscode_extensions
1001948
order = 1
1002949
}
1003950

0 commit comments

Comments
 (0)