coder-templates/nix-docker/main.jsonnet
2024-04-24 16:45:10 +02:00

111 lines
4.1 KiB
Jsonnet

local inka = import 'inka/main.libsonnet';
local docker = import 'docker/main.libsonnet';
local coder = import 'coder/main.libsonnet';
{
requirements: {
docker: docker.provider.require(),
coder: coder.provider.require(),
},
providers: {
docker: docker.provider.new(),
coder: coder.provider.new(),
},
parameters: {
cpu: coder.data.parameter.new(
'cpu', name='CPU [cores]', default=2048, mutable=true, icon='/icon/memory.svg',
option=[
coder.data.parameter.option.new('1 Core', value=1024),
coder.data.parameter.option.new('2 Cores', value=2048),
coder.data.parameter.option.new('4 Cores', value=4096),
],
),
memory: coder.data.parameter.new(
'memory', name='Memory [GB]', default=1024, mutable=true, icon='/icon/memory.svg',
option=[
coder.data.parameter.option.new('1GB', value=1024),
coder.data.parameter.option.new('2GB', value=2048),
coder.data.parameter.option.new('4GB', value=4096),
],
),
git_repo: coder.data.parameter.new(
'git_repo', name='Git Repository', default='', type='string', mutable=true,
),
#home_disk_size: coder.data.parameter.new(
# 'home_disk_size', name='Home disk size [GB]', default=10, type='number',
# mutable=false, icon='/emojis/1f4be.png',
# validation=[
# coder.data.parameter.validation.new(min=1, max=100),
# ],
#),
},
coder: {
auth: coder.data.git_auth.new('git_auth', { id: 'primary-gitlab', }),
provisioner: coder.data.provisioner.new('me'),
workspace: coder.data.workspace.new('me'),
agent: coder.agent.new(
'main', arch=self.provisioner.arch, os='linux', login_before_ready=false,
startup_script_timeout=180,
startup_script=|||
# install direnv & code-server
nix-env -iA nixpkgs.direnv nixpkgs.code-server
code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 &
|||,
),
code_server: coder.app.new(
'code-server', agent_id=self.agent.id, slug='code-server',
display_name='Code Server', icon='/icon/code.svg', share='owner',
url='http://localhost:13337/?folder=/home/%s' % self.workspace.owner,
subdomain=false, healthcheck=[
coder.app.healthcheck.new(url='http://localhost:13337/healthz', interval=5, threshold=6),
],
),
},
docker: {
volume: docker.volume.new(
'home', name='coder-%s-home' % $.coder.workspace.id,
# not always supported
#driver_opts={ size: '%sG' % $.parameters.home_disk_size.value },
labels=[
docker.volume.labels.new('coder.owner', $.coder.workspace.owner),
docker.volume.labels.new('coder.owner_id', $.coder.workspace.owner_id),
docker.volume.labels.new('coder.workspace_id', $.coder.workspace.id),
docker.volume.labels.new('coder.workspace_name_at_creation', $.coder.workspace.name),
],
_extra={
lifecycle: [{ ignore_changes: 'all' }],
}
),
container: docker.container.new(
'workspace', name='coder-%s-workspace' % $.coder.workspace.id, cpu_shares=$.parameters.cpu.value,
memory=$.parameters.memory.value, image='nixos/nix:latest', hostname=$.coder.workspace.name,
entrypoint=[
'sh',
'-c',
inka.functions.replace(
$.coder.agent.init_script,
'"/localhost|127.0.0.1/"',
'"host.docker.internal"',
),
],
#runtime='sysbox-runc', storage_opts={ size: '10G' },
env=[
'CODER_AGENT_TOKEN=%s' % $.coder.agent.token,
],
host=[
docker.container.host.new('host.docker.internal', 'host-gateway')
],
volumes=[
docker.container.volumes.new(
container_path='/home/%s' % $.coder.workspace.owner, volume_name=self.volume.name, read_only=false,
),
],
labels=[
docker.container.labels.new('coder.owner', $.coder.workspace.owner),
docker.container.labels.new('coder.owner_id', $.coder.workspace.owner_id),
docker.container.labels.new('coder.workspace_id', $.coder.workspace.id),
docker.container.labels.new('coder.workspace_name_at_creation', $.coder.workspace.name),
],
),
},
}