diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 532f09af..9ec64081 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -36,7 +36,7 @@ jobs: strategy: fail-fast: false matrix: - image: [server, web, browser, sparse] + image: [server, web, browser, browser-chromium, browser-firefox, sparse] platform: [linux/amd64, linux/arm64] include: - image: server @@ -45,6 +45,10 @@ jobs: dockerfile: docker/Dockerfile.web - image: browser dockerfile: docker/Dockerfile.browser + - image: browser-chromium + dockerfile: docker/Dockerfile.browser-chromium + - image: browser-firefox + dockerfile: docker/Dockerfile.browser-firefox - image: sparse dockerfile: docker/Dockerfile.sparse - platform: linux/amd64 @@ -130,7 +134,7 @@ jobs: needs: build strategy: matrix: - image: [server, web, browser, sparse] + image: [server, web, browser, browser-chromium, browser-firefox, sparse] steps: - name: Download digests uses: actions/download-artifact@v4 diff --git a/docker-compose.yml b/docker-compose.yml index b512db42..c5994a63 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -104,15 +104,42 @@ services: browser: image: memohai/browser:latest - build: - context: . - dockerfile: docker/Dockerfile.browser - args: - BROWSER_CORES: ${BROWSER_CORES:-chromium,firefox} container_name: memoh-browser profiles: [browser] environment: - - BROWSER_CORES=${BROWSER_CORES:-chromium,firefox} + - BROWSER_CORES=chromium,firefox + volumes: + - ${MEMOH_CONFIG:-./config.toml}:/config.toml:ro + ports: + - "8083:8083" + depends_on: + - server + restart: unless-stopped + networks: + - memoh-network + + browser-chromium: + image: memohai/browser-chromium:latest + container_name: memoh-browser + profiles: [browser-chromium] + environment: + - BROWSER_CORES=chromium + volumes: + - ${MEMOH_CONFIG:-./config.toml}:/config.toml:ro + ports: + - "8083:8083" + depends_on: + - server + restart: unless-stopped + networks: + - memoh-network + + browser-firefox: + image: memohai/browser-firefox:latest + container_name: memoh-browser + profiles: [browser-firefox] + environment: + - BROWSER_CORES=firefox volumes: - ${MEMOH_CONFIG:-./config.toml}:/config.toml:ro ports: diff --git a/docker/Dockerfile.browser b/docker/Dockerfile.browser index 421dceb3..f26bae12 100644 --- a/docker/Dockerfile.browser +++ b/docker/Dockerfile.browser @@ -17,8 +17,7 @@ RUN cd apps/browser && bun run build FROM ubuntu:noble -ARG BROWSER_CORES=chromium,firefox -ENV BROWSER_CORES=$BROWSER_CORES +ENV BROWSER_CORES=chromium,firefox WORKDIR /app diff --git a/docker/Dockerfile.browser-chromium b/docker/Dockerfile.browser-chromium new file mode 100644 index 00000000..817c5b92 --- /dev/null +++ b/docker/Dockerfile.browser-chromium @@ -0,0 +1,41 @@ +# syntax=docker/dockerfile:1 +FROM --platform=$BUILDPLATFORM oven/bun:1 AS builder + +WORKDIR /build + +COPY apps/browser/package.json apps/browser/bun.lock* ./apps/browser/ +COPY packages/config/package.json ./packages/config/package.json + +RUN echo '{"name":"@memohai/monorepo","private":true,"workspaces":["apps/*","packages/*"]}' > package.json + +RUN cd apps/browser && bun install + +COPY packages/config/ ./packages/config/ +COPY apps/browser/ ./apps/browser/ + +RUN cd apps/browser && bun run build + +FROM ubuntu:noble + +ENV BROWSER_CORES=chromium + +WORKDIR /app + +RUN apt-get update && apt-get install -y unzip curl && \ + curl -fsSL https://bun.sh/install | bash && \ + ln -s /root/.bun/bin/bun /usr/local/bin/bun && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /build/apps/browser/dist /app/dist +COPY --from=builder /build/apps/browser/node_modules /app/node_modules +COPY --from=builder /build/apps/browser/package.json /app/package.json +COPY --from=builder /build/node_modules /node_modules + +RUN bun /app/node_modules/.bin/playwright install --with-deps chromium + +EXPOSE 8083 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ + CMD curl -sf http://127.0.0.1:8083/health || exit 1 + +CMD ["bun", "run", "dist/index.js"] diff --git a/docker/Dockerfile.browser-firefox b/docker/Dockerfile.browser-firefox new file mode 100644 index 00000000..c5410989 --- /dev/null +++ b/docker/Dockerfile.browser-firefox @@ -0,0 +1,41 @@ +# syntax=docker/dockerfile:1 +FROM --platform=$BUILDPLATFORM oven/bun:1 AS builder + +WORKDIR /build + +COPY apps/browser/package.json apps/browser/bun.lock* ./apps/browser/ +COPY packages/config/package.json ./packages/config/package.json + +RUN echo '{"name":"@memohai/monorepo","private":true,"workspaces":["apps/*","packages/*"]}' > package.json + +RUN cd apps/browser && bun install + +COPY packages/config/ ./packages/config/ +COPY apps/browser/ ./apps/browser/ + +RUN cd apps/browser && bun run build + +FROM ubuntu:noble + +ENV BROWSER_CORES=firefox + +WORKDIR /app + +RUN apt-get update && apt-get install -y unzip curl && \ + curl -fsSL https://bun.sh/install | bash && \ + ln -s /root/.bun/bin/bun /usr/local/bin/bun && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /build/apps/browser/dist /app/dist +COPY --from=builder /build/apps/browser/node_modules /app/node_modules +COPY --from=builder /build/apps/browser/package.json /app/package.json +COPY --from=builder /build/node_modules /node_modules + +RUN bun /app/node_modules/.bin/playwright install --with-deps firefox + +EXPOSE 8083 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ + CMD curl -sf http://127.0.0.1:8083/health || exit 1 + +CMD ["bun", "run", "dist/index.js"] diff --git a/docker/docker-compose.cn.yml b/docker/docker-compose.cn.yml index 35c45ff2..c9427345 100644 --- a/docker/docker-compose.cn.yml +++ b/docker/docker-compose.cn.yml @@ -10,4 +10,8 @@ services: web: image: memoh.cn/memohai/web:latest browser: - image: memoh.cn/memohai/browser:latest \ No newline at end of file + image: memoh.cn/memohai/browser:latest + browser-chromium: + image: memoh.cn/memohai/browser-chromium:latest + browser-firefox: + image: memoh.cn/memohai/browser-firefox:latest \ No newline at end of file diff --git a/scripts/install.sh b/scripts/install.sh index f8015c21..077d6aaf 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -107,7 +107,7 @@ WORKSPACE="$WORKSPACE_DEFAULT" MEMOH_DATA_DIR="$MEMOH_DATA_DIR_DEFAULT" USE_CN_MIRROR="${USE_CN_MIRROR:-false}" USE_SPARSE="${USE_SPARSE:-false}" -BROWSER_CORES="${BROWSER_CORES:-chromium,firefox}" +BROWSER_PROFILE="${BROWSER_PROFILE:-browser-chromium}" if [ "$SILENT" = false ]; then echo "Configure Memoh (press Enter to use defaults):" > /dev/tty @@ -159,15 +159,15 @@ if [ "$SILENT" = false ]; then echo "" > /dev/tty echo " Browser core selection:" > /dev/tty - echo " 1) Chromium only (smaller image)" > /dev/tty + echo " 1) Chromium only (default, smaller image)" > /dev/tty echo " 2) Firefox only" > /dev/tty - echo " 3) Both Chromium and Firefox (default)" > /dev/tty - printf " Browser core [3]: " > /dev/tty + echo " 3) Both Chromium and Firefox" > /dev/tty + printf " Browser core [1]: " > /dev/tty read -r input < /dev/tty || true case "$input" in - 1) BROWSER_CORES="chromium" ;; - 2) BROWSER_CORES="firefox" ;; - *) BROWSER_CORES="chromium,firefox" ;; + 2) BROWSER_PROFILE="browser-firefox" ;; + 3) BROWSER_PROFILE="browser" ;; + *) BROWSER_PROFILE="browser-chromium" ;; esac echo "" > /dev/tty @@ -206,6 +206,8 @@ if [ "$MEMOH_DOCKER_VERSION" != "latest" ]; then sed -i.bak "s|memohai/server:latest|memohai/server:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml sed -i.bak "s|memohai/agent:latest|memohai/agent:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml sed -i.bak "s|memohai/web:latest|memohai/web:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml + sed -i.bak "s|memohai/browser-chromium:latest|memohai/browser-chromium:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml + sed -i.bak "s|memohai/browser-firefox:latest|memohai/browser-firefox:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml sed -i.bak "s|memohai/browser:latest|memohai/browser:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml sed -i.bak "s|memohai/sparse:latest|memohai/sparse:${MEMOH_DOCKER_VERSION}|g" docker-compose.yml rm -f docker-compose.yml.bak @@ -231,7 +233,7 @@ export MEMOH_DATA_DIR mkdir -p "$MEMOH_DATA_DIR" COMPOSE_FILES="-f docker-compose.yml" -COMPOSE_PROFILES="--profile qdrant --profile browser" +COMPOSE_PROFILES="--profile qdrant --profile $BROWSER_PROFILE" if [ "$USE_SPARSE" = true ]; then COMPOSE_PROFILES="$COMPOSE_PROFILES --profile sparse" echo "${GREEN}✓ Sparse memory service enabled${NC}" @@ -246,17 +248,12 @@ fi echo POSTGRES_PASSWORD="${PG_PASS}" >> .env echo MEMOH_CONFIG=./config.toml >> .env echo MEMOH_DATA_DIR="${MEMOH_DATA_DIR}" >> .env -echo BROWSER_CORES="${BROWSER_CORES}" >> .env echo USE_SPARSE="${USE_SPARSE}" >> .env -echo "${GREEN}✓ Browser cores: ${BROWSER_CORES}${NC}" +echo "${GREEN}✓ Browser profile: ${BROWSER_PROFILE}${NC}" echo "" -echo "${GREEN}Pulling latest Docker images...${NC}" -$DOCKER compose $COMPOSE_FILES $COMPOSE_PROFILES pull --ignore-buildable - -echo "" -echo "${GREEN}Building browser image (cores: ${BROWSER_CORES})...${NC}" -$DOCKER compose $COMPOSE_FILES $COMPOSE_PROFILES build browser +echo "${GREEN}Pulling Docker images...${NC}" +$DOCKER compose $COMPOSE_FILES $COMPOSE_PROFILES pull echo "" echo "${GREEN}Starting services (first startup may take a few minutes)...${NC}"