Skip to content

Commit f38f087

Browse files
committed
Merge upstream/main into issue-237-d4e1e2d53afd
2 parents eb5362d + 69f5b64 commit f38f087

73 files changed

Lines changed: 2592 additions & 814 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/check.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,19 @@ jobs:
149149
- name: Pack and run local package via Bun
150150
run: bash scripts/e2e/local-package-cli.sh
151151

152+
e2e-browser-command:
153+
name: E2E (Browser command)
154+
runs-on: ubuntu-latest
155+
timeout-minutes: 40
156+
steps:
157+
- uses: actions/checkout@v6
158+
- name: Install dependencies
159+
uses: ./.github/actions/setup
160+
- name: Docker info
161+
run: docker version && docker compose version
162+
- name: Browser command startup
163+
run: bash scripts/e2e/browser-command.sh
164+
152165
e2e-opencode:
153166
name: E2E (OpenCode)
154167
runs-on: ubuntu-latest

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ docker-git apply-all
5555
docker-git apply-all --active
5656
```
5757

58-
- `apply` применяет конфиг к одному проекту. `--no-up` только обновляет файлы без `docker compose up`. В текущем API-only host mode команда ещё недоступна.
58+
- `apply` применяет конфиг к одному проекту. `--no-up` только обновляет файлы без `docker compose up`.
5959
- `apply-all` применяет конфиг ко всем проектам. `--active` только к запущенным контейнерам.
6060

6161

docker-compose.api.yml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,17 @@ services:
33
build:
44
context: .
55
dockerfile: packages/api/Dockerfile
6+
args:
7+
UBUNTU_APT_MIRROR: ${UBUNTU_APT_MIRROR:-}
68
container_name: ${DOCKER_GIT_API_CONTAINER_NAME:-docker-git-api}
79
environment:
810
DOCKER_GIT_API_PORT: ${DOCKER_GIT_API_PORT:-3334}
11+
DOCKER_GIT_DOCKER_RUNTIME: ${DOCKER_GIT_DOCKER_RUNTIME:-isolated}
12+
DOCKER_HOST: ${DOCKER_GIT_CONTROLLER_DOCKER_HOST:-unix:///var/run/docker.sock}
13+
DOCKER_GIT_DOCKERD_TCP_HOST: ${DOCKER_GIT_DOCKERD_TCP_HOST:-tcp://0.0.0.0:2375}
14+
DOCKER_GIT_DOCKERD_DEFAULT_CGROUPNS_MODE: ${DOCKER_GIT_DOCKERD_DEFAULT_CGROUPNS_MODE:-host}
15+
DOCKER_GIT_PROJECT_DOCKER_HOST: ${DOCKER_GIT_PROJECT_DOCKER_HOST:-tcp://host.docker.internal:2375}
16+
DOCKER_GIT_PROJECT_SSH_BIND_HOST: ${DOCKER_GIT_PROJECT_SSH_BIND_HOST:-0.0.0.0}
917
DOCKER_GIT_PROJECTS_ROOT: ${DOCKER_GIT_PROJECTS_ROOT:-/home/dev/.docker-git}
1018
DOCKER_GIT_PROJECTS_ROOT_VOLUME: ${DOCKER_GIT_PROJECTS_ROOT_VOLUME:-docker-git-projects}
1119
DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN: ${DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN:-}
@@ -23,10 +31,15 @@ services:
2331
- 8.8.4.4
2432
- 1.1.1.1
2533
volumes:
26-
- /var/run/docker.sock:/var/run/docker.sock
2734
- docker_git_projects:${DOCKER_GIT_PROJECTS_ROOT:-/home/dev/.docker-git}
35+
- docker_git_docker_data:/var/lib/docker
36+
privileged: true
37+
cgroup: host
38+
init: true
2839
restart: unless-stopped
2940

3041
volumes:
3142
docker_git_projects:
3243
name: ${DOCKER_GIT_PROJECTS_ROOT_VOLUME:-docker-git-projects}
44+
docker_git_docker_data:
45+
name: ${DOCKER_GIT_DOCKER_DATA_VOLUME:-docker-git-docker-data}

docker-compose.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,17 @@ services:
55
dockerfile: packages/api/Dockerfile
66
args:
77
DOCKER_GIT_CONTROLLER_REV: ${DOCKER_GIT_CONTROLLER_REV:-unknown}
8+
UBUNTU_APT_MIRROR: ${UBUNTU_APT_MIRROR:-}
89
container_name: ${DOCKER_GIT_API_CONTAINER_NAME:-docker-git-api}
910
environment:
1011
DOCKER_GIT_API_PORT: ${DOCKER_GIT_API_PORT:-3334}
1112
DOCKER_GIT_CONTROLLER_REV: ${DOCKER_GIT_CONTROLLER_REV:-unknown}
13+
DOCKER_GIT_DOCKER_RUNTIME: ${DOCKER_GIT_DOCKER_RUNTIME:-isolated}
14+
DOCKER_HOST: ${DOCKER_GIT_CONTROLLER_DOCKER_HOST:-unix:///var/run/docker.sock}
15+
DOCKER_GIT_DOCKERD_TCP_HOST: ${DOCKER_GIT_DOCKERD_TCP_HOST:-tcp://0.0.0.0:2375}
16+
DOCKER_GIT_DOCKERD_DEFAULT_CGROUPNS_MODE: ${DOCKER_GIT_DOCKERD_DEFAULT_CGROUPNS_MODE:-host}
17+
DOCKER_GIT_PROJECT_DOCKER_HOST: ${DOCKER_GIT_PROJECT_DOCKER_HOST:-tcp://host.docker.internal:2375}
18+
DOCKER_GIT_PROJECT_SSH_BIND_HOST: ${DOCKER_GIT_PROJECT_SSH_BIND_HOST:-0.0.0.0}
1219
DOCKER_GIT_PROJECTS_ROOT: ${DOCKER_GIT_PROJECTS_ROOT:-/home/dev/.docker-git}
1320
DOCKER_GIT_PROJECTS_ROOT_VOLUME: ${DOCKER_GIT_PROJECTS_ROOT_VOLUME:-docker-git-projects}
1421
DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN: ${DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN:-}
@@ -26,10 +33,15 @@ services:
2633
- 8.8.4.4
2734
- 1.1.1.1
2835
volumes:
29-
- /var/run/docker.sock:/var/run/docker.sock
3036
- docker_git_projects:${DOCKER_GIT_PROJECTS_ROOT:-/home/dev/.docker-git}
37+
- docker_git_docker_data:/var/lib/docker
38+
privileged: true
39+
cgroup: host
40+
init: true
3141
restart: unless-stopped
3242

3343
volumes:
3444
docker_git_projects:
3545
name: ${DOCKER_GIT_PROJECTS_ROOT_VOLUME:-docker-git-projects}
46+
docker_git_docker_data:
47+
name: ${DOCKER_GIT_DOCKER_DATA_VOLUME:-docker-git-docker-data}
35.5 KB
Loading

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"docker-git": "bash -lc 'bun run --cwd packages/app build:docker-git && bun ./packages/app/dist/src/docker-git/main.js \"$@\"' --",
2929
"e2e": "bash scripts/e2e/run-all.sh",
3030
"e2e:clone-cache": "bash scripts/e2e/clone-cache.sh",
31+
"e2e:browser-command": "bash scripts/e2e/browser-command.sh",
3132
"e2e:login-context": "bash scripts/e2e/login-context.sh",
3233
"e2e:runtime-volumes-ssh": "bash scripts/e2e/runtime-volumes-ssh.sh",
3334
"e2e:opencode-autoconnect": "bash scripts/e2e/opencode-autoconnect.sh",

packages/api/Dockerfile

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
FROM ubuntu:24.04
22

33
ARG DOCKER_GIT_CONTROLLER_REV=unknown
4+
ARG UBUNTU_APT_MIRROR=
45
LABEL io.prover-coder-ai.docker-git.controller-rev=$DOCKER_GIT_CONTROLLER_REV
56

67
ENV DEBIAN_FRONTEND=noninteractive
@@ -10,10 +11,12 @@ ENV PATH=/opt/bun/bin:$PATH
1011
WORKDIR /workspace
1112

1213
RUN set -eu; \
13-
sed -i \
14-
-e 's|http://archive.ubuntu.com/ubuntu|http://azure.archive.ubuntu.com/ubuntu|g' \
15-
-e 's|http://security.ubuntu.com/ubuntu|http://azure.archive.ubuntu.com/ubuntu|g' \
16-
/etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null || true; \
14+
if [ -n "${UBUNTU_APT_MIRROR:-}" ]; then \
15+
sed -i \
16+
-e "s|http://archive.ubuntu.com/ubuntu|${UBUNTU_APT_MIRROR}|g" \
17+
-e "s|http://security.ubuntu.com/ubuntu|${UBUNTU_APT_MIRROR}|g" \
18+
/etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null || true; \
19+
fi; \
1720
for attempt in 1 2 3; do \
1821
rm -rf /var/lib/apt/lists/*; \
1922
if apt-get -o Acquire::Retries=3 -o Acquire::By-Hash=force update; then \
@@ -56,6 +59,8 @@ RUN bun run --cwd packages/lib build
5659
RUN bun run --cwd packages/api build
5760

5861
ENV DOCKER_GIT_API_PORT=3334
62+
ENV DOCKER_GIT_DOCKER_RUNTIME=isolated
63+
ENV DOCKER_HOST=unix:///var/run/docker.sock
5964
EXPOSE 3334
6065

61-
CMD ["bun", "packages/api/dist/src/main.js"]
66+
CMD ["bash", "packages/api/scripts/start-controller.sh"]

packages/api/README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ HTTP API for docker-git orchestration (projects, agents, logs/events, federation
55
This is now the intended controller plane:
66
- the API runs inside `docker-git-api`
77
- `.docker-git` state lives in the Docker volume `docker-git-projects`
8-
- the API talks to Docker through `/var/run/docker.sock`
8+
- the API starts an isolated Docker daemon inside the controller by default
99
- child project containers no longer depend on host bind mounts for bootstrap auth/env
10+
- the host `/var/run/docker.sock` is not mounted into the controller or project containers
1011

1112
## UI wrapper
1213

@@ -41,6 +42,12 @@ Optional env:
4142

4243
- `DOCKER_GIT_API_BIND_HOST` (default: `127.0.0.1`)
4344
- `DOCKER_GIT_API_PORT` (default: `3334`)
45+
- `DOCKER_GIT_DOCKER_RUNTIME` (default: `isolated`; starts a managed Docker daemon in `docker-git-api`)
46+
- `DOCKER_GIT_CONTROLLER_DOCKER_HOST` (default: `unix:///var/run/docker.sock`; socket path inside the controller)
47+
- `DOCKER_GIT_DOCKERD_TCP_HOST` (default: `tcp://0.0.0.0:2375`; reachable only inside Docker networks unless explicitly published)
48+
- `DOCKER_GIT_DOCKERD_DEFAULT_CGROUPNS_MODE` (default: `host`; keeps nested project containers compatible with cgroup v2 DinD)
49+
- `DOCKER_GIT_PROJECT_DOCKER_HOST` (default: `tcp://host.docker.internal:2375`; lets project containers use the isolated daemon)
50+
- `DOCKER_GIT_PROJECT_SSH_BIND_HOST` (default: `0.0.0.0` in controller mode; project SSH binds inside the isolated controller runtime)
4451
- `DOCKER_GIT_PROJECTS_ROOT` (container path, default: `/home/dev/.docker-git`)
4552
- `DOCKER_GIT_PROJECTS_ROOT_VOLUME` (Docker volume name for controller state, default: `docker-git-projects`)
4653
- `DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN` (optional public ActivityPub origin)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
runtime="${DOCKER_GIT_DOCKER_RUNTIME:-isolated}"
5+
docker_host="${DOCKER_HOST:-unix:///var/run/docker.sock}"
6+
dockerd_pid=""
7+
8+
cleanup() {
9+
if [[ -n "$dockerd_pid" ]] && kill -0 "$dockerd_pid" >/dev/null 2>&1; then
10+
kill "$dockerd_pid" >/dev/null 2>&1 || true
11+
wait "$dockerd_pid" >/dev/null 2>&1 || true
12+
fi
13+
}
14+
15+
trap cleanup EXIT INT TERM
16+
17+
if [[ "$runtime" == "isolated" ]]; then
18+
if [[ "$docker_host" != unix://* ]]; then
19+
echo "DOCKER_GIT_DOCKER_RUNTIME=isolated requires a unix:// DOCKER_HOST for the managed controller daemon." >&2
20+
exit 1
21+
fi
22+
23+
export DOCKER_HOST="$docker_host"
24+
25+
socket_path="${docker_host#unix://}"
26+
data_root="${DOCKER_GIT_DOCKER_DATA_ROOT:-/var/lib/docker}"
27+
log_path="${DOCKER_GIT_DOCKERD_LOG:-/var/log/docker-git/dockerd.log}"
28+
tcp_host="${DOCKER_GIT_DOCKERD_TCP_HOST:-tcp://0.0.0.0:2375}"
29+
default_cgroupns_mode="${DOCKER_GIT_DOCKERD_DEFAULT_CGROUPNS_MODE:-host}"
30+
31+
mkdir -p "$(dirname "$socket_path")" "$data_root" "$(dirname "$log_path")"
32+
33+
if ! docker info >/dev/null 2>&1; then
34+
# shellcheck disable=SC2086
35+
dockerd \
36+
--host="$docker_host" \
37+
--host="$tcp_host" \
38+
--tls=false \
39+
--data-root="$data_root" \
40+
--exec-opt native.cgroupdriver=cgroupfs \
41+
--default-cgroupns-mode="$default_cgroupns_mode" \
42+
${DOCKER_GIT_DOCKERD_ARGS:-} \
43+
>"$log_path" 2>&1 &
44+
dockerd_pid="$!"
45+
46+
for _ in $(seq 1 90); do
47+
if docker info >/dev/null 2>&1; then
48+
break
49+
fi
50+
if ! kill -0 "$dockerd_pid" >/dev/null 2>&1; then
51+
echo "Managed Docker daemon exited during startup." >&2
52+
tail -n 200 "$log_path" >&2 || true
53+
exit 1
54+
fi
55+
sleep 1
56+
done
57+
58+
if ! docker info >/dev/null 2>&1; then
59+
echo "Managed Docker daemon did not become ready in time." >&2
60+
tail -n 200 "$log_path" >&2 || true
61+
exit 1
62+
fi
63+
fi
64+
fi
65+
66+
bun packages/api/dist/src/main.js &
67+
api_pid="$!"
68+
wait "$api_pid"

packages/api/src/api/contracts.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ export type CreateProjectAccepted = {
4343

4444
export type CreateProjectResult = ProjectDetails | CreateProjectAccepted
4545

46+
export type StartProjectTerminalSessionAccepted = {
47+
readonly accepted: true
48+
readonly projectId: string
49+
readonly cursor: number
50+
readonly requestId: string
51+
}
52+
4653
export type ProjectPortForwardStatus = "running" | "stopped" | "unknown"
4754

4855
export type ProjectPortForward = {

0 commit comments

Comments
 (0)