# Dockerize nodejs application Deploying a **Node.js project using Docker from GitHub with a deploy key** involves a few main steps: --- ### Overview 1. **Generate and configure a deploy key** on GitHub. 2. **Write a Dockerfile** for your Node.js project. 3. **Create a Docker container or server environment** (e.g., a VPS or cloud instance). 4. **Configure SSH to use the deploy key to clone the private repository** 5. **Run Docker build and start the app.** --- ## 1. Create a Deploy Key on GitHub Deploy keys are SSH keys associated with a **single repository**. This means they can only be used for cloning one repository. ### 1.1 Generate SSH Key (no passphrase) ```bash ssh-keygen -t ED25519 -C "<yourcomment>" -f ./deploy_key_name ``` - You’ll get: - `deploy_key_name` (private) - `deploy_key_name.pub` (public) ### 1.2. Add Public Key to GitHub Repo 1. Go to **<GitHub repo> → Settings → Deploy keys**. 2. Click **"Add deploy key"**: - Title: anything (e.g., `Docker Deploy`) - Paste the **contents of `deploy_key.pub`**. this file can be opend using an text editor - ✅ Check **"Allow write access"** if your deployment needs the ability to push. Otherwise, leave it unchecked (Besic need for this totorial). - Save. --- ## 2. Create a Dockerfile In your Node.js project (in GitHub), make sure you have a `Dockerfile` like this (basic configuration): ```Dockerfile # Use Node base image FROM node:lts-alpine # Create app directory WORKDIR /app # Install dependencies COPY backend/package*.json ./ RUN npm install # Bundle app source COPY backend/ . # Expose port and start app #EXPOSE 3000 #not needed if ports get exposed in the docker compose. CMD [ "npm", "start" ] ``` --- ## 3. Set up the Deployment Server On your server (e.g., Ubuntu VPS): ### 3.1 Install Docker (if not installed): ```bash curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh ``` ### 3.2 Copy the Private Deploy Key to the Server ```bash scp deploy_key user@yourserver:/home/user/.ssh/deploy_key ``` Then, SSH into the server and set correct permissions: ```bash chmod 600 ~/.ssh/deploy_key ``` --- ## 4. Clone the GitHub Repo Using the Deploy Key Since Git uses SSH, we need to **override the SSH config** so Git knows to use this key. Create or modify `~/.ssh/config` on the server: ```bash Host github_<projectname> HostName github.com User git IdentityFile ~/.ssh/deploy_key IdentitiesOnly yes ``` Then test: ```bash ssh github_<projectname> ``` You should see something like: ``` Hi username/repo! You've successfully authenticated... ``` Now clone your private repo: ```bash git clone github_projectname:yourusername/your-node-project.git cd your-node-project ``` --- ## 5. Build and Run Docker ### 5.1 Build the Docker Image ```bash docker build -t my-node-app . ``` ### 5.2 Run the Container ```bash docker run -d -p 3000:3000 --name my-node-app-container my-node-app ``` Your app should now be running at `http://<your-server-ip>:3000`. --- ## Optional: Automate with a Shell Script You could make a `deploy.sh`: ```bash #!/bin/bash # Ensure SSH agent is running and key is added eval "$(ssh-agent -s)" ssh-add ~/.ssh/deploy_key # Clone/update the repo if [ ! -d "your-node-project" ]; then git clone git@github.com:yourusername/your-node-project.git else cd your-node-project git pull origin main cd .. fi # Build and run cd your-node-project docker build -t my-node-app . docker stop my-node-app-container && docker rm my-node-app-container docker run -d -p 3000:3000 --name my-node-app-container my-node-app ``` --- ## Tips - Never commit deploy keys to your repo. --- Would you like me to generate an example repo structure, `Dockerfile`, and script for you?