From a8236ff3b4a5ac251978e8433ed3252453ccc441 Mon Sep 17 00:00:00 2001 From: Hare Date: Wed, 22 Jul 2026 18:03:03 +0900 Subject: [PATCH] feat: add docker image targets --- .dockerignore | 12 +++++++ Dockerfile | 88 +++++++++++++++++++++++++++++++++++++++++++++++ docker/nginx.conf | 41 ++++++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker/nginx.conf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..ed011188 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +target/ +.git/ +.yoi/ +.direnv/ +result +result-* +.env +.env.* +**/node_modules/ +web/workspace/build/ +web/workspace/.svelte-kit/ +web/workspace/.vite/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..0a2b4a0c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,88 @@ +# syntax=docker/dockerfile:1.7 + +ARG RUST_VERSION=1.95.0 +ARG DEBIAN_VERSION=bookworm +ARG DENO_VERSION=2.7.14 +ARG NGINX_VERSION=1.27-alpine + +FROM rust:${RUST_VERSION}-${DEBIAN_VERSION} AS rust-source +WORKDIR /src + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + git \ + libssl-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +COPY Cargo.toml Cargo.lock ./ +COPY crates ./crates +COPY resources ./resources +COPY tests ./tests + +FROM rust-source AS runtime-builder +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/src/target \ + cargo build --release -p worker-runtime --bin worker-runtime-rest-server --features ws-server,fs-store \ + && mkdir -p /out \ + && cp /src/target/release/worker-runtime-rest-server /out/worker-runtime-rest-server + +FROM rust-source AS server-builder +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/src/target \ + cargo build --release -p yoi-workspace-server --bin yoi-workspace-server \ + && mkdir -p /out \ + && cp /src/target/release/yoi-workspace-server /out/yoi-workspace-server + +FROM denoland/deno:${DENO_VERSION} AS web-builder +WORKDIR /src/web/workspace +COPY web/workspace ./ +RUN deno task build + +FROM debian:${DEBIAN_VERSION}-slim AS runtime +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bash \ + ca-certificates \ + git \ + libssl3 \ + openssh-client \ + && rm -rf /var/lib/apt/lists/* \ + && useradd --system --uid 10001 --gid root --home-dir /runtime-data --shell /usr/sbin/nologin yoi \ + && mkdir -p /runtime-data /workdirs \ + && chown -R yoi:root /runtime-data /workdirs + +COPY --from=runtime-builder /out/worker-runtime-rest-server /usr/local/bin/worker-runtime-rest-server + +USER yoi +EXPOSE 38800 +VOLUME ["/runtime-data", "/workdirs"] +ENTRYPOINT ["worker-runtime-rest-server"] +CMD ["--bind", "0.0.0.0:38800", "--display-name", "Docker Runtime", "--fs-root", "/runtime-data", "--workdir-target", "/workdirs"] + +FROM debian:${DEBIAN_VERSION}-slim AS server +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + git \ + libssl3 \ + && rm -rf /var/lib/apt/lists/* \ + && useradd --system --uid 10002 --gid root --home-dir /server-data --shell /usr/sbin/nologin yoi \ + && mkdir -p /server-data /workspace \ + && chown -R yoi:root /server-data /workspace + +COPY --from=server-builder /out/yoi-workspace-server /usr/local/bin/yoi-workspace-server + +USER yoi +EXPOSE 8787 +VOLUME ["/server-data", "/workspace"] +ENTRYPOINT ["yoi-workspace-server"] +CMD ["serve", "--workspace", "/workspace", "--db", "/server-data/workspace.db", "--listen", "0.0.0.0:8787"] + +FROM nginx:${NGINX_VERSION} AS webui +COPY docker/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=web-builder /src/web/workspace/build /usr/share/nginx/html +EXPOSE 80 diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 00000000..88db38ef --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,41 @@ +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + resolver 127.0.0.11 valid=30s ipv6=off; + set $yoi_backend server:8787; + + location = /api { + proxy_pass http://$yoi_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + } + + location /api/ { + proxy_pass http://$yoi_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + } + + location / { + try_files $uri $uri/ /index.html; + } +}