diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8fce603 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +data/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b9eb682 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,61 @@ +FROM debian:trixie + +# Install dependencies +RUN apt-get update && apt-get install -y \ + gnupg \ + curl \ + git \ + ca-certificates \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install Node.js 18 from NodeSource +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ + apt-get install -y nodejs && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Install MongoDB from official repository +RUN curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \ + gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor && \ + echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | \ + tee /etc/apt/sources.list.d/mongodb-org-8.0.list && \ + apt-get update && \ + apt-get install -y mongodb-org && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Copy all files +COPY . . + +# Install dependencies in correct order +WORKDIR /app/common +RUN npm install + +WORKDIR /app/backend +RUN npm install + +WORKDIR /app/frontend +RUN npm install && npm run build + +# Create startup script +RUN echo '#!/bin/bash' > /start.sh && \ + echo 'mkdir -p /data/db' >> /start.sh && \ + echo 'mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db' >> /start.sh && \ + echo 'sleep 5' >> /start.sh && \ + echo 'cd /app/backend' >> /start.sh && \ + echo 'if [ ! -f /data/db/.db_initialized ]; then' >> /start.sh && \ + echo ' echo "Initializing database..."' >> /start.sh && \ + echo ' npm run db-build && touch /data/db/.db_initialized' >> /start.sh && \ + echo ' echo "Database initialization complete"' >> /start.sh && \ + echo 'else' >> /start.sh && \ + echo ' echo "Database already initialized, skipping..."' >> /start.sh && \ + echo 'fi' >> /start.sh && \ + echo 'npm run dev' >> /start.sh && \ + chmod +x /start.sh + +EXPOSE 80 + +CMD ["/start.sh"] diff --git a/README.md b/README.md index 86acbf6..e6171ec 100644 --- a/README.md +++ b/README.md @@ -33,4 +33,12 @@ To work on the codebase, execute in parallel: * In `frontend/`, execute `npm run dev` to build and pack the frontend JavaScript files in watch mode. -* Finally, you can access the page through `http://127.0.0.1`. \ No newline at end of file +* Finally, you can access the page through `http://127.0.0.1`. + +## Docker Deployment + +You can run the app using Docker with: + +``` +docker compose up --build +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e676390 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.8' + +services: + app: + build: + context: . + dockerfile: Dockerfile + container_name: jisho-app + restart: unless-stopped + environment: + - PORT=80 + - MONGODB_URL=mongodb://localhost:27017/jisho + ports: + - "80:80" + volumes: + - ./data/db:/data/db