1- import { resolveComposeNetworkName , type TemplateConfig } from "../domain.js"
1+ import { dockerGitSharedCodexVolumeName , resolveComposeNetworkName , type TemplateConfig } from "../domain.js"
22
33type ComposeFragments = {
44 readonly networkMode : TemplateConfig [ "dockerNetworkMode" ]
@@ -11,14 +11,12 @@ type ComposeFragments = {
1111 readonly maybeDependsOn : string
1212 readonly maybePlaywrightEnv : string
1313 readonly maybeBrowserService : string
14- readonly maybeBrowserVolume : string
1514 readonly forkRepoUrl : string
1615}
1716
18- type PlaywrightFragments = Pick <
19- ComposeFragments ,
20- "maybeDependsOn" | "maybePlaywrightEnv" | "maybeBrowserService" | "maybeBrowserVolume"
21- >
17+ type PlaywrightFragments = Pick < ComposeFragments , "maybeDependsOn" | "maybePlaywrightEnv" | "maybeBrowserService" >
18+
19+ const sharedCodexVolumeKey = "docker_git_shared_codex"
2220
2321const renderGitTokenLabelEnv = ( gitTokenLabel : string ) : string =>
2422 gitTokenLabel . length > 0
@@ -45,12 +43,6 @@ const renderAgentAutoEnv = (agentAuto: boolean | undefined): string =>
4543 ? ` AGENT_AUTO: "1"\n`
4644 : ""
4745
48- const renderProjectsRootHostMount = ( projectsRoot : string ) : string =>
49- `\${DOCKER_GIT_PROJECTS_ROOT_HOST:-${ projectsRoot } }`
50-
51- const renderSharedCodexHostMount = ( projectsRoot : string ) : string =>
52- `\${DOCKER_GIT_PROJECTS_ROOT_HOST:-${ projectsRoot } }/.orch/auth/codex`
53-
5446const buildPlaywrightFragments = (
5547 config : TemplateConfig ,
5648 networkName : string
@@ -59,8 +51,7 @@ const buildPlaywrightFragments = (
5951 return {
6052 maybeDependsOn : "" ,
6153 maybePlaywrightEnv : "" ,
62- maybeBrowserService : "" ,
63- maybeBrowserVolume : ""
54+ maybeBrowserService : ""
6455 }
6556 }
6657
@@ -75,8 +66,7 @@ const buildPlaywrightFragments = (
7566 maybePlaywrightEnv :
7667 ` MCP_PLAYWRIGHT_ENABLE: "1"\n MCP_PLAYWRIGHT_CDP_ENDPOINT: "${ browserCdpEndpoint } "\n` ,
7768 maybeBrowserService :
78- `\n ${ browserServiceName } :\n build:\n context: .\n dockerfile: ${ browserDockerfile } \n container_name: ${ browserContainerName } \n restart: unless-stopped\n environment:\n VNC_NOPW: "1"\n shm_size: "2gb"\n expose:\n - "9223"\n volumes:\n - ${ browserVolumeName } :/data\n networks:\n - ${ networkName } \n` ,
79- maybeBrowserVolume : ` ${ browserVolumeName } :\n`
69+ `\n ${ browserServiceName } :\n build:\n context: .\n dockerfile: ${ browserDockerfile } \n container_name: ${ browserContainerName } \n restart: unless-stopped\n environment:\n VNC_NOPW: "1"\n shm_size: "2gb"\n expose:\n - "9223"\n volumes:\n - ${ browserVolumeName } :/data\n networks:\n - ${ networkName } \n`
8070 }
8171}
8272
@@ -105,7 +95,6 @@ const buildComposeFragments = (config: TemplateConfig): ComposeFragments => {
10595 maybeDependsOn : playwright . maybeDependsOn ,
10696 maybePlaywrightEnv : playwright . maybePlaywrightEnv ,
10797 maybeBrowserService : playwright . maybeBrowserService ,
108- maybeBrowserVolume : playwright . maybeBrowserVolume ,
10998 forkRepoUrl
11099 }
111100}
@@ -132,10 +121,7 @@ ${fragments.maybePlaywrightEnv}${fragments.maybeDependsOn} env_file:
132121 - "127.0.0.1:${ config . sshPort } :22"
133122 volumes:
134123 - ${ config . volumeName } :/home/${ config . sshUser }
135- - ${ renderProjectsRootHostMount ( config . dockerGitPath ) } :/home/${ config . sshUser } /.docker-git
136- - ${ config . authorizedKeysPath } :/authorized_keys:ro
137- - ${ config . codexAuthPath } :${ config . codexHome }
138- - ${ renderSharedCodexHostMount ( config . dockerGitPath ) } :${ config . codexHome } -shared
124+ - ${ sharedCodexVolumeKey } :${ config . codexHome } -shared
139125 - /var/run/docker.sock:/var/run/docker.sock
140126 networks:
141127 - ${ fragments . networkName }
@@ -153,16 +139,21 @@ const renderComposeNetworks = (
153139 ${ networkName } :
154140 driver: bridge`
155141
156- const renderComposeVolumes = ( config : TemplateConfig , maybeBrowserVolume : string ) : string =>
157- `volumes:
158- ${ config . volumeName } :
159- ${ maybeBrowserVolume } `
142+ const renderComposeVolumes = ( config : TemplateConfig , enableMcpPlaywright : boolean ) : string =>
143+ [
144+ "volumes:" ,
145+ ` ${ config . volumeName } :` ,
146+ ` ${ sharedCodexVolumeKey } :` ,
147+ " external: true" ,
148+ ` name: ${ dockerGitSharedCodexVolumeName } ` ,
149+ ...( enableMcpPlaywright ? [ ` ${ config . volumeName } -browser:` ] : [ ] )
150+ ] . join ( "\n" )
160151
161152export const renderDockerCompose = ( config : TemplateConfig ) : string => {
162153 const fragments = buildComposeFragments ( config )
163154 return [
164155 renderComposeServices ( config , fragments ) ,
165156 renderComposeNetworks ( fragments . networkMode , fragments . networkName ) ,
166- renderComposeVolumes ( config , fragments . maybeBrowserVolume )
157+ renderComposeVolumes ( config , config . enableMcpPlaywright )
167158 ] . join ( "\n\n" )
168159}
0 commit comments