Skip to content

Commit 145fb1e

Browse files
Modernize workspace images and pin Terraform providers
1 parent 7cd4fe2 commit 145fb1e

22 files changed

Lines changed: 929 additions & 359 deletions

File tree

‎.gitignore‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Terraform state/lock files for templates
1+
# Terraform state and local caches. Los lockfiles de cada plantilla sí se
2+
# versionan para que Coder use exactamente los proveedores validados.
23
.terraform/
3-
.terraform.lock.hcl
44
terraform.tfstate
55
terraform.tfstate.backup
66
*.tfstate

‎Docker-Images/Designer/Dockerfile‎

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ RUN apt-get update && \
9797
# KiCad autorouter: Freerouting requiere Java 21 (el sistema trae 11). El jar se
9898
# hornea en /opt; el template de Maker lo enlaza a ~/.kicad-mcp/freerouting.jar,
9999
# que es donde lo busca el MCP (check_freerouting/autoroute).
100-
ARG FREEROUTING_VERSION=2.1.0
100+
ARG FREEROUTING_VERSION=2.4.1
101101
RUN apt-get update && \
102102
apt-get install -y --no-install-recommends openjdk-21-jre-headless && \
103103
update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java && \
@@ -173,8 +173,8 @@ fi
173173
rm -rf /var/lib/apt/lists/*
174174
EOSH
175175

176-
# Blender 4.5 LTS (binario oficial)
177-
ARG BLENDER_VERSION=4.5.12
176+
# Blender 5.2 LTS (binario oficial; requerido por el MCP oficial de Blender Lab)
177+
ARG BLENDER_VERSION=5.2.2
178178
RUN <<'EOSH'
179179
set -e
180180
BLENDER_DIR="/opt/blender"
@@ -202,6 +202,59 @@ Terminal=false
202202
EOF
203203
EOSH
204204

205+
# Versiones oficiales modernas para aplicaciones que Ubuntu Noble mantiene muy atrasadas.
206+
# Se conservan los paquetes APT como dependencias/fallback y se priorizan estos AppImages.
207+
ARG FREECAD_VERSION=1.1.3
208+
ARG GIMP_VERSION=3.2.6
209+
ARG KRITA_VERSION=5.3.4
210+
RUN <<'EOSH'
211+
set -e
212+
install_appimage() {
213+
name="$1"
214+
url="$2"
215+
destination="/opt/appimages/${name}.AppImage"
216+
mkdir -p /opt/appimages
217+
curl -fL "$url" -o "$destination"
218+
chmod +x "$destination"
219+
ln -sfn "$destination" "/usr/local/bin/$name"
220+
}
221+
install_appimage freecad "https://github.com/FreeCAD/FreeCAD/releases/download/${FREECAD_VERSION}/FreeCAD_${FREECAD_VERSION}-Linux-x86_64-py311.AppImage"
222+
install_appimage gimp "https://download.gimp.org/gimp/v3.2/linux/GIMP-${GIMP_VERSION}-x86_64.AppImage"
223+
install_appimage krita "https://download.kde.org/stable/krita/${KRITA_VERSION}/krita-${KRITA_VERSION}-x86_64.AppImage"
224+
225+
cat > /usr/share/applications/org.gimp.GIMP.desktop <<'EOF'
226+
[Desktop Entry]
227+
Type=Application
228+
Name=GIMP
229+
Exec=gimp %U
230+
Icon=gimp
231+
Categories=Graphics;2DGraphics;
232+
Terminal=false
233+
EOF
234+
EOSH
235+
236+
# MCP oficial mantenido por Blender Lab, fijado a una revisión reproducible.
237+
# Se hornean tanto el servidor Python como el paquete del add-on para no depender
238+
# de Git/PyPI durante el arranque de cada workspace.
239+
ARG BLENDER_MCP_REVISION=ff54e4d8f6b09502f2f466189cca0e52b4a91643
240+
RUN <<'EOSH'
241+
set -e
242+
source_dir=/opt/blender-mcp-source
243+
git init "$source_dir"
244+
git -C "$source_dir" remote add origin https://projects.blender.org/lab/blender_mcp.git
245+
git -C "$source_dir" fetch --depth 1 origin "$BLENDER_MCP_REVISION"
246+
git -C "$source_dir" checkout --detach FETCH_HEAD
247+
test "$(git -C "$source_dir" rev-parse HEAD)" = "$BLENDER_MCP_REVISION"
248+
python3 -m venv /opt/blender-mcp-venv
249+
/opt/blender-mcp-venv/bin/pip install --no-cache-dir "$source_dir/mcp"
250+
ln -sfn /opt/blender-mcp-venv/bin/blender-mcp /usr/local/bin/blender-mcp
251+
blender --command extension build \
252+
--source-dir "$source_dir/addon/blender_mcp_addon" \
253+
--output-filepath /opt/blender-mcp-addon.zip
254+
rm -rf "$source_dir/.git"
255+
printf '%s\n' "$BLENDER_MCP_REVISION" > /opt/blender-mcp-revision
256+
EOSH
257+
205258
# Configuración FUSE para permitir AppImages (allow_other)
206259
RUN echo "user_allow_other" > /etc/fuse.conf
207260

‎Docker-Images/Desktop-KDE/Dockerfile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Base desktop image with KDE Plasma for Coder workspaces
2-
FROM codercom/enterprise-base:ubuntu
2+
FROM codercom/example-base:ubuntu-noble
33

44
LABEL org.opencontainers.image.title="coder-mks-desktop-kde" \
55
org.opencontainers.image.description="Base desktop image (KDE Plasma) for Coder workspaces" \

‎Docker-Images/Desktop/Dockerfile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Base desktop image with MATE for Coder workspaces
2-
FROM codercom/enterprise-base:ubuntu
2+
FROM codercom/example-base:ubuntu-noble
33

44
LABEL org.opencontainers.image.title="coder-mks-desktop" \
55
org.opencontainers.image.description="Base desktop image (MATE) for Coder workspaces" \

‎Docker-Images/DeveloperAndroid/Dockerfile‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ ENV ANDROID_HOME=/home/coder/Android/Sdk \
161161
ANDROID_USER_HOME=/home/coder/.android \
162162
PATH=$PATH:/home/coder/Android/Sdk/platform-tools:/home/coder/Android/Sdk/cmdline-tools/latest/bin:/home/coder/Android/Sdk/emulator:/opt/gradle/latest/bin
163163

164-
ARG ANDROID_SDK_VERSION=15859902
164+
ARG ANDROID_SDK_VERSION=16111833
165165
RUN mkdir -p /home/coder/Android/Sdk/cmdline-tools && \
166166
curl -fsSL "https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_VERSION}_latest.zip" -o /tmp/cmdline-tools.zip && \
167167
unzip -q /tmp/cmdline-tools.zip -d /home/coder/Android/Sdk/cmdline-tools && \
@@ -189,9 +189,9 @@ RUN mkdir -p /home/coder/Android/Sdk/cmdline-tools && \
189189
install -d -o coder -g coder /home/coder/.android
190190

191191
# Android Studio
192-
ARG ANDROID_STUDIO_VERSION=2026.1.3
193-
ARG ANDROID_STUDIO_BUILD=2026.1.3.7
194-
ARG ANDROID_STUDIO_PACKAGE=android-studio-quail3-linux.tar.gz
192+
ARG ANDROID_STUDIO_VERSION=2026.1.4
193+
ARG ANDROID_STUDIO_BUILD=2026.1.4.8
194+
ARG ANDROID_STUDIO_PACKAGE=android-studio-quail4-patch1-linux.tar.gz
195195
RUN curl -fsSL "https://edgedl.me.gvt1.com/android/studio/ide-zips/${ANDROID_STUDIO_BUILD}/${ANDROID_STUDIO_PACKAGE}" -o /tmp/android-studio.tar.gz && \
196196
tar -xzf /tmp/android-studio.tar.gz -C /opt && \
197197
rm /tmp/android-studio.tar.gz && \
@@ -200,7 +200,7 @@ RUN curl -fsSL "https://edgedl.me.gvt1.com/android/studio/ide-zips/${ANDROID_STU
200200
ln -sf /opt/android-studio/bin/studio /usr/local/bin/studio
201201

202202
# JetBrains Toolbox (para JetBrains Gateway/IDE remotos)
203-
ARG JETBRAINS_TOOLBOX_VERSION=3.6.3.86383
203+
ARG JETBRAINS_TOOLBOX_VERSION=3.8.1.88030
204204
RUN curl -fsSL "https://download.jetbrains.com/toolbox/jetbrains-toolbox-${JETBRAINS_TOOLBOX_VERSION}.tar.gz" -o /tmp/jetbrains-toolbox.tar.gz && \
205205
mkdir -p /opt/jetbrains-toolbox && \
206206
tar -xzf /tmp/jetbrains-toolbox.tar.gz -C /opt/jetbrains-toolbox --strip-components=1 && \
@@ -228,7 +228,7 @@ RUN chmod +x /usr/share/applications/android-studio.desktop && \
228228
done
229229

230230
# Gradle
231-
ARG GRADLE_VERSION=9.6.1
231+
ARG GRADLE_VERSION=9.8.0
232232
RUN curl -fsSL "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" -o /tmp/gradle.zip && \
233233
unzip -q /tmp/gradle.zip -d /opt/gradle && \
234234
ln -sfn "/opt/gradle/gradle-${GRADLE_VERSION}" /opt/gradle/latest && \

‎workspaces/AdvancedHostDANGER/.terraform.lock.hcl‎

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎workspaces/AdvancedHostDANGER/main.tf‎

Lines changed: 60 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
terraform {
22
required_providers {
33
coder = {
4-
source = "coder/coder"
4+
source = "coder/coder"
5+
version = "~> 2.18.0"
56
}
67
docker = {
7-
source = "kreuzwerker/docker"
8+
source = "kreuzwerker/docker"
9+
version = "~> 4.6.0"
810
}
911
null = {
10-
source = "hashicorp/null"
12+
source = "hashicorp/null"
13+
version = "~> 3.3.0"
1114
}
1215
}
1316
}
@@ -119,33 +122,33 @@ data "coder_parameter" "claude_token" {
119122
}
120123

121124
locals {
122-
username = data.coder_workspace_owner.me.name
123-
workspace_image = "ghcr.io/makespacemadrid/coder-mks-developer:latest"
124-
persist_home_storage = data.coder_parameter.persist_home_storage.value
125-
persist_projects_storage = data.coder_parameter.persist_projects_storage.value
126-
enable_gpu = data.coder_parameter.enable_gpu.value
127-
enable_dri = data.coder_parameter.enable_dri.value
128-
host_mount_path = ""
129-
host_mount_uid = "1000"
130-
workspace_storage_root = trimspace(var.users_storage)
131-
workspace_storage_home = local.workspace_storage_root != "" ? "${local.workspace_storage_root}/${local.username}/${lower(data.coder_workspace.me.name)}" : ""
132-
workspace_storage_projects = local.workspace_storage_root != "" ? "${local.workspace_storage_root}/${local.username}/${lower(data.coder_workspace.me.name)}/Projects" : ""
133-
home_mount_host_path = local.persist_home_storage && local.workspace_storage_root != "" ? local.workspace_storage_home : ""
134-
projects_mount_host_path = local.persist_projects_storage && local.workspace_storage_root != "" ? local.workspace_storage_projects : ""
135-
ocabra_endpoint_base_url = trimspace(var.ocabra_endpoint_base_url)
136-
ocabra_key = trimspace(var.ocabra_key)
137-
freeapi_base_url = trimspace(var.freeapi_base_url)
138-
freeapi_key_endpoint = trimspace(var.freeapi_key_endpoint)
139-
home_volume_resolved = "coder-${data.coder_workspace.me.id}-home"
140-
repo_url = trimspace(data.coder_parameter.git_repo_url.value)
141-
repo_name = local.repo_url != "" ? trimsuffix(basename(local.repo_url), ".git") : ""
142-
default_repo_path = local.repo_name != "" ? "/home/coder/Projects/${local.repo_name}" : "/home/coder/Projects"
143-
openai_base_url = ""
144-
openai_api_key = ""
125+
username = data.coder_workspace_owner.me.name
126+
workspace_image = "ghcr.io/makespacemadrid/coder-mks-developer:latest"
127+
persist_home_storage = data.coder_parameter.persist_home_storage.value
128+
persist_projects_storage = data.coder_parameter.persist_projects_storage.value
129+
enable_gpu = data.coder_parameter.enable_gpu.value
130+
enable_dri = data.coder_parameter.enable_dri.value
131+
host_mount_path = ""
132+
host_mount_uid = "1000"
133+
workspace_storage_root = trimspace(var.users_storage)
134+
workspace_storage_home = local.workspace_storage_root != "" ? "${local.workspace_storage_root}/${local.username}/${lower(data.coder_workspace.me.name)}" : ""
135+
workspace_storage_projects = local.workspace_storage_root != "" ? "${local.workspace_storage_root}/${local.username}/${lower(data.coder_workspace.me.name)}/Projects" : ""
136+
home_mount_host_path = local.persist_home_storage && local.workspace_storage_root != "" ? local.workspace_storage_home : ""
137+
projects_mount_host_path = local.persist_projects_storage && local.workspace_storage_root != "" ? local.workspace_storage_projects : ""
138+
ocabra_endpoint_base_url = trimspace(var.ocabra_endpoint_base_url)
139+
ocabra_key = trimspace(var.ocabra_key)
140+
freeapi_base_url = trimspace(var.freeapi_base_url)
141+
freeapi_key_endpoint = trimspace(var.freeapi_key_endpoint)
142+
home_volume_resolved = "coder-${data.coder_workspace.me.id}-home"
143+
repo_url = trimspace(data.coder_parameter.git_repo_url.value)
144+
repo_name = local.repo_url != "" ? trimsuffix(basename(local.repo_url), ".git") : ""
145+
default_repo_path = local.repo_name != "" ? "/home/coder/Projects/${local.repo_name}" : "/home/coder/Projects"
146+
openai_base_url = ""
147+
openai_api_key = ""
145148
auto_provision_freeapi_key = data.coder_parameter.autoprovision_freeapi_key.value
146-
claude_token = trimspace(data.coder_parameter.claude_token.value)
147-
install_claude = local.claude_token != ""
148-
continue_default_config = file("${path.module}/continue-config.yaml")
149+
claude_token = trimspace(data.coder_parameter.claude_token.value)
150+
install_claude = local.claude_token != ""
151+
continue_default_config = file("${path.module}/continue-config.yaml")
149152
}
150153

151154
provider "docker" {
@@ -1120,24 +1123,24 @@ CONTINUECFG
11201123
EOT
11211124

11221125
env = {
1123-
GIT_AUTHOR_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
1124-
GIT_AUTHOR_EMAIL = data.coder_workspace_owner.me.email
1125-
GIT_COMMITTER_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
1126-
GIT_COMMITTER_EMAIL = data.coder_workspace_owner.me.email
1127-
HOME = "/home/coder"
1128-
OPENCODE_PROVIDER_URL = local.openai_base_url
1129-
OPENCODE_API_KEY = local.openai_api_key
1130-
OCABRA_ENDPOINT_BASE_URL = local.ocabra_endpoint_base_url
1131-
OCABRA_KEY = local.ocabra_key
1132-
FREEAPI_BASE_URL = local.freeapi_base_url
1133-
FREEAPI_KEY_ENDPOINT = local.freeapi_key_endpoint
1134-
OCABRA_BASE_URL = local.openai_base_url
1135-
OCABRA_API_KEY = local.openai_api_key
1126+
GIT_AUTHOR_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
1127+
GIT_AUTHOR_EMAIL = data.coder_workspace_owner.me.email
1128+
GIT_COMMITTER_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
1129+
GIT_COMMITTER_EMAIL = data.coder_workspace_owner.me.email
1130+
HOME = "/home/coder"
1131+
OPENCODE_PROVIDER_URL = local.openai_base_url
1132+
OPENCODE_API_KEY = local.openai_api_key
1133+
OCABRA_ENDPOINT_BASE_URL = local.ocabra_endpoint_base_url
1134+
OCABRA_KEY = local.ocabra_key
1135+
FREEAPI_BASE_URL = local.freeapi_base_url
1136+
FREEAPI_KEY_ENDPOINT = local.freeapi_key_endpoint
1137+
OCABRA_BASE_URL = local.openai_base_url
1138+
OCABRA_API_KEY = local.openai_api_key
11361139
AUTO_PROVISION_FREEAPI_API_KEY = tostring(local.auto_provision_freeapi_key)
1137-
INSTALL_CLAUDE = tostring(local.install_claude)
1138-
CODER_USER_EMAIL = data.coder_workspace_owner.me.email
1139-
CODER_WORKSPACE_NAME = data.coder_workspace.me.name
1140-
DEFAULT_REPO_PATH = local.default_repo_path
1140+
INSTALL_CLAUDE = tostring(local.install_claude)
1141+
CODER_USER_EMAIL = data.coder_workspace_owner.me.email
1142+
CODER_WORKSPACE_NAME = data.coder_workspace.me.name
1143+
DEFAULT_REPO_PATH = local.default_repo_path
11411144
}
11421145

11431146
metadata {
@@ -1207,12 +1210,12 @@ CONTINUECFG
12071210
# ---------------------------------------------------------------
12081211

12091212
module "code-server" {
1210-
count = data.coder_workspace.me.start_count
1211-
source = "registry.coder.com/coder/code-server/coder"
1212-
version = "~> 1.1"
1213-
agent_id = coder_agent.main.id
1214-
folder = "/home/coder/Projects"
1215-
order = 1
1213+
count = data.coder_workspace.me.start_count
1214+
source = "registry.coder.com/coder/code-server/coder"
1215+
version = "~> 1.1"
1216+
agent_id = coder_agent.main.id
1217+
folder = "/home/coder/Projects"
1218+
order = 1
12161219
}
12171220

12181221
module "git-config" {
@@ -1327,7 +1330,7 @@ resource "coder_script" "opencode_web" {
13271330
echo "OpenCode Web no respondió en $health_url; consulta $log_file" >&2
13281331
exit 1
13291332
EOT
1330-
depends_on = [module.opencode]
1333+
depends_on = [module.opencode]
13311334
}
13321335

13331336
resource "coder_app" "opencode_web" {
@@ -1349,9 +1352,10 @@ resource "coder_app" "opencode_web" {
13491352
}
13501353

13511354
module "claude-code" {
1352-
count = local.install_claude ? 1 : 0
1353-
source = "registry.coder.com/coder/claude-code/coder"
1354-
version = "~> 4.2"
1355+
count = local.install_claude ? 1 : 0
1356+
source = "registry.coder.com/coder/claude-code/coder"
1357+
# v5 elimina report_tasks/task_app_id, que esta plantilla sigue utilizando.
1358+
version = ">= 4.7.5, < 5.0.0"
13551359
agent_id = coder_agent.main.id
13561360
workdir = "/home/coder/Projects"
13571361
claude_code_oauth_token = local.claude_token

0 commit comments

Comments
 (0)