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), ], ), }, }