From c6487778198424a41d98cf986e4d752b7f6292dd Mon Sep 17 00:00:00 2001 From: Karmaa Date: Sun, 16 Mar 2025 21:53:23 -0500 Subject: [PATCH] Optimize github build workflow --- .github/workflows/docker-image.yml | 3 +- docker/Dockerfile | 47 +++++++--------------------- docker/entrypoint.sh | 49 ++++++++++++++++++++++-------- 3 files changed, 48 insertions(+), 51 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 3e946d6e..ae179e57 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -13,7 +13,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: laptop1 steps: - name: Checkout repository uses: actions/checkout@v3 @@ -81,7 +81,6 @@ jobs: BUILDKIT_INLINE_CACHE=1 outputs: type=registry,compression=zstd,compression-level=19 - # Temp fix for https://github.com/docker/build-push-action/issues/252 - name: Move cache run: | rm -rf /tmp/.buildx-cache diff --git a/docker/Dockerfile b/docker/Dockerfile index b9d3b074..180ba179 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,7 +2,6 @@ FROM node:18-alpine AS frontend-builder WORKDIR /app COPY package*.json ./ -# Install all dependencies including dev dependencies needed for build RUN npm ci COPY . . RUN npm run build @@ -22,12 +21,7 @@ WORKDIR /app COPY package*.json ./ RUN apt-get update && \ apt-get install -y --no-install-recommends \ - python3 \ - make \ - g++ \ - wget \ - ca-certificates \ - gnupg && \ + python3 make g++ wget ca-certificates gnupg && \ wget -qO- https://deb.nodesource.com/setup_${NODE_VERSION} | bash - && \ apt-get update && \ apt-get install -y nodejs && \ @@ -35,33 +29,22 @@ RUN apt-get update && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* /root/.npm /tmp/* -# Stage 4: Final production image -FROM ubuntu:focal AS base - -# Prevent interactive prompts during package installation +# Final stage +FROM ubuntu:focal ENV DEBIAN_FRONTEND=noninteractive \ NODE_VERSION=18.x \ MONGO_VERSION=4.4.24 \ - MONGO_URL=mongodb://localhost:27017/termix \ - MONGODB_DATA_DIR=/data/db \ - MONGODB_LOG_DIR=/var/log/mongodb \ - NODE_ENV=production \ PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" -# Create users first +# Create users RUN groupadd -r mongodb && useradd -r -g mongodb mongodb \ && groupadd -r node && useradd -r -g node -m node -# Install all dependencies in one layer and clean up in the same layer to keep the image small +# Install dependencies RUN set -ex \ && apt-get update \ && apt-get install -y --no-install-recommends \ - ca-certificates \ - gnupg \ - gosu \ - nginx-light \ - supervisor \ - wget \ + ca-certificates gnupg wget nginx-light \ && wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add - \ && echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \ && wget -qO- https://deb.nodesource.com/setup_${NODE_VERSION} | bash - \ @@ -72,16 +55,15 @@ RUN set -ex \ mongodb-org-shell=${MONGO_VERSION} \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /var/cache/apt/* /root/.npm /tmp/* \ - && mkdir -p /data/db /var/log/{nginx,mongodb} /var/lib/nginx /var/run/mongodb \ - && chown -R mongodb:mongodb /data/db /var/log/mongodb /var/run/mongodb \ - && chown -R www-data:www-data /var/log/nginx /var/lib/nginx + && mkdir -p /data/db /var/log/mongodb /var/run/mongodb \ + && chown -R mongodb:mongodb /data/db /var/log/mongodb /var/run/mongodb -# Configure nginx and copy frontend +# Setup nginx and frontend COPY docker/nginx.conf /etc/nginx/nginx.conf COPY --from=frontend-builder /app/dist /usr/share/nginx/html RUN chown -R www-data:www-data /usr/share/nginx/html -# Setup backend with pre-built bcrypt +# Setup backend WORKDIR /app COPY package*.json ./ RUN npm ci --only=production --ignore-scripts \ @@ -90,16 +72,9 @@ COPY --from=bcrypt-builder /app/node_modules/bcrypt /app/node_modules/bcrypt COPY --from=backend-builder /app/src/backend ./src/backend RUN chown -R node:node /app -# Create volume for MongoDB data VOLUME ["/data/db"] - -# Expose ports EXPOSE 8080 8081 8082 27017 -# Copy and set entrypoint COPY docker/entrypoint.sh /entrypoint.sh -COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf -RUN chmod +x /entrypoint.sh && \ - mkdir -p /var/log/supervisor && \ - chown -R root:root /var/log/supervisor +RUN chmod +x /entrypoint.sh CMD ["/entrypoint.sh"] \ No newline at end of file diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 5785479f..221b2d33 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,22 +1,45 @@ #!/bin/bash -set -ex +set -e -# Create required directories -mkdir -p /var/run/{mongodb,supervisor} /data/db /var/log/{mongodb,supervisor,nginx} /var/lib/nginx -chown -R mongodb:mongodb /var/run/mongodb /data/db /var/log/mongodb -chown -R www-data:www-data /var/log/nginx /var/lib/nginx /usr/share/nginx/html +# Create required directories and set permissions +mkdir -p /data/db /var/log/mongodb /var/run/mongodb +chown -R mongodb:mongodb /data/db /var/log/mongodb /var/run/mongodb chown -R node:node /app -# Ensure MongoDB data directory has correct permissions -chmod 755 /data/db +# Start MongoDB +echo "Starting MongoDB..." +mongod --dbpath /data/db --logpath /var/log/mongodb/mongodb.log --bind_ip 0.0.0.0 & +MONGO_PID=$! -# Check if mongod is available -which mongod || echo "mongod not found in PATH: $PATH" +# Wait for MongoDB to be ready +echo "Waiting for MongoDB to start..." +until mongo --eval "print(\"waited for connection\")" > /dev/null 2>&1; do + sleep 0.5 + if ! kill -0 $MONGO_PID 2>/dev/null; then + echo "MongoDB failed to start. Checking logs:" + cat /var/log/mongodb/mongodb.log + exit 1 + fi +done +echo "MongoDB started successfully" -# Start supervisor with proper environment +# Start nginx +echo "Starting nginx..." +nginx + +# Start backend services +echo "Starting backend services..." +cd /app export NODE_ENV=production export MONGO_URL=mongodb://localhost:27017/termix -export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" -# Start all services using supervisor -exec /usr/bin/supervisord -n -c /etc/supervisor/conf.d/supervisord.conf \ No newline at end of file +# Start SSH service +su -s /bin/bash node -c "node src/backend/ssh.cjs" & + +# Start database service +su -s /bin/bash node -c "node src/backend/database.cjs" & + +echo "All services started" + +# Keep container running and show logs +tail -f /var/log/mongodb/mongodb.log \ No newline at end of file