Skip to content

Commit bb91278

Browse files
feature: lock down code-server (extensions, settings, no AI)
* Pre-install a configurable list of extensions via init container into a per-pod emptyDir; main container reads from the same dir via --extensions-dir, so the extensions present are exactly what the chart ships. * Render values.codeServer.settings into a settings.json ConfigMap and mount it as the user's settings file. Defaults set dark theme, turn off telemetry, hide AI/chat surfaces, and silence extension auto-update and recommendation prompts. * Set EXTENSIONS_GALLERY={} so the marketplace returns nothing in the UI, effectively hiding install buttons while leaving the Extensions sidebar visible for the pre-installed ones. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent c848d88 commit bb91278

4 files changed

Lines changed: 65 additions & 1 deletion

File tree

Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type: application
1515
# This is the chart version. This version number should be incremented each time you make changes
1616
# to the chart and its templates, including the app version.
1717
# Versions are expected to follow Semantic Versioning (https://semver.org/)
18-
version: 0.1.4
18+
version: 0.2.0
1919

2020
# This is the version number of the application being deployed. This version number should be
2121
# incremented each time you make changes to the application. Versions are not expected to

templates/code-server-deployment.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,37 @@ spec:
1717
labels:
1818
{{- include "static-webhost.componentSelectorLabels" (dict "Context" . "Component" "code-server") | nindent 8 }}
1919
spec:
20+
securityContext:
21+
fsGroup: 1000
22+
{{- with .Values.codeServer.extensions }}
23+
initContainers:
24+
- name: install-extensions
25+
image: "{{ $.Values.codeServer.image.repository }}:{{ $.Values.codeServer.image.tag }}"
26+
imagePullPolicy: {{ $.Values.codeServer.image.pullPolicy }}
27+
command:
28+
- sh
29+
- -c
30+
- |
31+
set -e
32+
{{- range . }}
33+
code-server --extensions-dir /extensions --install-extension {{ . | quote }}
34+
{{- end }}
35+
volumeMounts:
36+
- name: extensions
37+
mountPath: /extensions
38+
{{- end }}
2039
containers:
2140
- name: code-server
2241
image: "{{ .Values.codeServer.image.repository }}:{{ .Values.codeServer.image.tag }}"
2342
imagePullPolicy: {{ .Values.codeServer.image.pullPolicy }}
2443
args:
2544
- --bind-addr=0.0.0.0:8080
2645
- --auth=none
46+
- --extensions-dir=/extensions
2747
- /srv
48+
env:
49+
- name: EXTENSIONS_GALLERY
50+
value: "{}"
2851
ports:
2952
- name: http
3053
containerPort: 8080
@@ -33,6 +56,11 @@ spec:
3356
- name: data
3457
mountPath: /srv
3558
subPath: site
59+
- name: extensions
60+
mountPath: /extensions
61+
- name: settings
62+
mountPath: /home/coder/.local/share/code-server/User/settings.json
63+
subPath: settings.json
3664
{{- with .Values.codeServer.resources }}
3765
resources:
3866
{{- toYaml . | nindent 12 }}
@@ -41,3 +69,8 @@ spec:
4169
- name: data
4270
persistentVolumeClaim:
4371
claimName: {{ include "static-webhost.fullname" . }}-data
72+
- name: extensions
73+
emptyDir: {}
74+
- name: settings
75+
configMap:
76+
name: {{ include "static-webhost.fullname" . }}-code-server-settings
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: {{ include "static-webhost.fullname" . }}-code-server-settings
5+
labels:
6+
{{- include "static-webhost.labels" . | nindent 4 }}
7+
app.kubernetes.io/component: code-server
8+
data:
9+
settings.json: |
10+
{{- .Values.codeServer.settings | toPrettyJson | nindent 4 }}

values.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,27 @@ codeServer:
4747
tag: latest
4848
pullPolicy: IfNotPresent
4949
resources: {}
50+
# Extensions pre-installed by an init container into a per-pod emptyDir.
51+
# The marketplace UI is disabled at runtime (EXTENSIONS_GALLERY={}), so the
52+
# user can only run what we ship here.
53+
extensions:
54+
- bmewburn.vscode-intelephense-client
55+
- dbaeumer.vscode-eslint
56+
- esbenp.prettier-vscode
57+
# VS Code user settings rendered into settings.json. Defaults enforce dark
58+
# theme, no AI/telemetry, and silence extension recommendations/auto-update.
59+
# Override or add keys here.
60+
settings:
61+
workbench.colorTheme: Default Dark Modern
62+
telemetry.telemetryLevel: "off"
63+
chat.commandCenter.enabled: false
64+
chat.agent.enabled: false
65+
chat.editing.enabled: false
66+
inlineChat.enabled: false
67+
workbench.welcomePage.walkthroughs.openOnInstall: false
68+
extensions.autoUpdate: false
69+
extensions.autoCheckUpdates: false
70+
extensions.ignoreRecommendations: true
5071

5172
# Caddy — serves the shared volume as static files.
5273
caddy:

0 commit comments

Comments
 (0)