diff --git a/.github/workflows/containers-publish.yml b/.github/workflows/containers-publish.yml index 9cd5fcce..b64fbfd4 100644 --- a/.github/workflows/containers-publish.yml +++ b/.github/workflows/containers-publish.yml @@ -1,8 +1,16 @@ +<<<<<<< HEAD +name: 'Containers: Publish' + +on: + push: + tags: [ 'v*' ] +======= name: "Containers: Publish" on: push: tags: ["v*"] +>>>>>>> afb000d3a3ee90a677a2580d82fe3a432d1c1933 permissions: packages: write @@ -12,6 +20,48 @@ jobs: name: Build and Push runs-on: ubuntu-latest steps: +<<<<<<< HEAD + + - uses: actions/checkout@v3 + + - name: Login to ghcr.io Docker registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Compute Docker container image addresses + run: | + DOCKER_REPOSITORY="ghcr.io/${GITHUB_REPOSITORY,,}" + DOCKER_TAG="${GITHUB_REF:11}" + + echo "DOCKER_REPOSITORY=${DOCKER_REPOSITORY}" >> $GITHUB_ENV + echo "DOCKER_TAG=${DOCKER_TAG}" >> $GITHUB_ENV + + echo "Using: ${DOCKER_REPOSITORY}/*:${DOCKER_TAG}" + + # - name: 'Pull previous Docker container image: :latest' + # run: docker pull "${DOCKER_REPOSITORY}:latest" || true + + - name: 'Pull previous Docker container image: frontend-static:latest' + run: docker pull "${DOCKER_REPOSITORY}/frontend-static:latest" || true + + - name: 'Build Docker container image: frontend-static:latest' + run: | + docker build \ + --cache-from "${DOCKER_REPOSITORY}/frontend-static:latest" \ + --file frontend/Dockerfile.demo \ + --build-arg SERVER_NAME=localhost \ + --tag "${DOCKER_REPOSITORY}/frontend-static:latest" \ + --tag "${DOCKER_REPOSITORY}/frontend-static:${DOCKER_TAG}" \ + frontend + - name: 'Push Docker container image frontend-static:latest' + run: docker push "${DOCKER_REPOSITORY}/frontend-static:latest" + + - name: 'Push Docker container image frontend-static:v*' + run: docker push "${DOCKER_REPOSITORY}/frontend-static:${DOCKER_TAG}" +======= - uses: actions/checkout@v3 - name: Login to ghcr.io Docker registry @@ -51,6 +101,7 @@ jobs: - name: "Push Docker container image frontend-static:v*" run: docker push "${DOCKER_REPOSITORY}/frontend-static:${DOCKER_TAG}" +>>>>>>> afb000d3a3ee90a677a2580d82fe3a432d1c1933 # # # - name: 'Build Docker container image: backend:latest' @@ -65,5 +116,10 @@ jobs: # - name: Push Docker container image backend:v* # run: docker push "${DOCKER_REPOSITORY}/backend:${DOCKER_TAG}" +<<<<<<< HEAD + # - name: Push Docker container image :v*" + # run: docker push "${DOCKER_REPOSITORY}:${DOCKER_TAG}" +======= # - name: Push Docker container image :v*" # run: docker push "${DOCKER_REPOSITORY}:${DOCKER_TAG}" +>>>>>>> afb000d3a3ee90a677a2580d82fe3a432d1c1933 diff --git a/.github/workflows/release-prepare.yml b/.github/workflows/release-prepare.yml index 715e50a6..dd3d3b24 100644 --- a/.github/workflows/release-prepare.yml +++ b/.github/workflows/release-prepare.yml @@ -1,8 +1,16 @@ +<<<<<<< HEAD +name: 'Release: Prepare PR' + +on: + push: + branches: [ develop ] +======= name: "Release: Prepare PR" on: push: branches: [develop] +>>>>>>> afb000d3a3ee90a677a2580d82fe3a432d1c1933 permissions: contents: read @@ -10,9 +18,20 @@ permissions: jobs: release-prepare: +<<<<<<< HEAD + + runs-on: ubuntu-latest + steps: + + - uses: JarvusInnovations/infra-components@channels/github-actions/release-prepare/latest + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + release-branch: main +======= runs-on: ubuntu-latest steps: - uses: JarvusInnovations/infra-components@channels/github-actions/release-prepare/latest with: github-token: ${{ secrets.GITHUB_TOKEN }} release-branch: main +>>>>>>> afb000d3a3ee90a677a2580d82fe3a432d1c1933 diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml index 127aa129..ee3ba2c1 100644 --- a/.github/workflows/release-publish.yml +++ b/.github/workflows/release-publish.yml @@ -1,3 +1,21 @@ +<<<<<<< HEAD +name: 'Release: Publish PR' + +on: + pull_request: + branches: [ main ] + types: [ closed ] + +jobs: + release-publish: + + runs-on: ubuntu-latest + steps: + + - uses: JarvusInnovations/infra-components@channels/github-actions/release-publish/latest + with: + github-token: ${{ secrets.BOT_GITHUB_TOKEN }} +======= name: "Release: Publish PR" on: @@ -12,3 +30,4 @@ jobs: - uses: JarvusInnovations/infra-components@channels/github-actions/release-publish/latest with: github-token: ${{ secrets.BOT_GITHUB_TOKEN }} +>>>>>>> afb000d3a3ee90a677a2580d82fe3a432d1c1933 diff --git a/.github/workflows/release-validate.yml b/.github/workflows/release-validate.yml index 60a2ce03..44d965c3 100644 --- a/.github/workflows/release-validate.yml +++ b/.github/workflows/release-validate.yml @@ -1,3 +1,21 @@ +<<<<<<< HEAD +name: 'Release: Validate PR' + +on: + pull_request: + branches: [ main ] + types: [ opened, edited, reopened, synchronize ] + +jobs: + release-validate: + + runs-on: ubuntu-latest + steps: + + - uses: JarvusInnovations/infra-components@channels/github-actions/release-validate/latest + with: + github-token: ${{ secrets.GITHUB_TOKEN }} +======= name: "Release: Validate PR" on: @@ -12,3 +30,4 @@ jobs: - uses: JarvusInnovations/infra-components@channels/github-actions/release-validate/latest with: github-token: ${{ secrets.GITHUB_TOKEN }} +>>>>>>> afb000d3a3ee90a677a2580d82fe3a432d1c1933 diff --git a/Dockerfile.prod b/Dockerfile.prod new file mode 100644 index 00000000..9c5244c6 --- /dev/null +++ b/Dockerfile.prod @@ -0,0 +1,71 @@ +########### +# BUILDER # +########### + +# pull official base image +FROM python:3.11.4-slim-buster as builder + +# set work directory +WORKDIR /usr/src/app + +# set environment variables +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + +# install system dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends gcc + +# lint +# RUN pip install --upgrade pip +# RUN pip install flake8==6.0.0 +# COPY . /usr/src/app/ +# RUN flake8 --ignore=E501,F401 . + +# install python dependencies +COPY ./requirements.txt . +RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt + + +######### +# FINAL # +######### + +# pull official base image +FROM python:3.11.4-slim-buster + +# create directory for the app user +RUN mkdir -p /home/app + +# create the app user +RUN addgroup --system app && adduser --system --group app + +# create the appropriate directories +ENV HOME=/home/app +ENV APP_HOME=/home/app/web +RUN mkdir $APP_HOME +WORKDIR $APP_HOME + +# install dependencies +RUN apt-get update && apt-get install -y --no-install-recommends netcat +COPY --from=builder /usr/src/app/wheels /wheels +COPY --from=builder /usr/src/app/requirements.txt . +RUN pip install --upgrade pip +RUN pip install --no-cache /wheels/* + +# copy entrypoint.prod.sh +COPY ./entrypoint.prod.sh . +RUN sed -i 's/\r$//g' $APP_HOME/entrypoint.prod.sh +RUN chmod +x $APP_HOME/entrypoint.prod.sh + +# copy project +COPY . $APP_HOME + +# chown all the files to the app user +RUN chown -R app:app $APP_HOME + +# change to the app user +USER app + +# run entrypoint.prod.sh +ENTRYPOINT ["/home/app/web/entrypoint.prod.sh"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.dev.yml similarity index 52% rename from docker-compose.yml rename to docker-compose.dev.yml index 548bff5b..1f9b3608 100644 --- a/docker-compose.yml +++ b/docker-compose.dev.yml @@ -10,46 +10,29 @@ services: - POSTGRES_DB=balancer_dev ports: - "5432:5432" - networks: - app_net: - ipv4_address: 192.168.0.2 - pgadmin: - container_name: pgadmin4 - image: dpage/pgadmin4 - environment: - PGADMIN_DEFAULT_EMAIL: balancer-noreply@codeforphilly.org - PGADMIN_DEFAULT_PASSWORD: balancer - # PGADMIN_LISTEN_PORT = 80 - # volumes: - # - ./pgadmin-data:/var/lib/pgadmin - # # PGADMIN_LISTEN_PORT = 80 - ports: - - "5050:80" - networks: - app_net: - ipv4_address: 192.168.0.3 backend: image: balancer-backend build: ./server +<<<<<<< HEAD:docker-compose.dev.yml command: python manage.py runserver 0.0.0.0:8000 + volumes: + - ./server:/usr/src/app +======= +>>>>>>> ed1b2e3bc80a77cb1283844d0c153fa1f79d9d76:docker-compose.yml ports: - "8000:8000" env_file: - ./config/env/env.dev depends_on: - db - volumes: - - ./server:/usr/src/server - networks: - app_net: - ipv4_address: 192.168.0.4 frontend: image: balancer-frontend build: context: frontend - dockerfile: Dockerfile + dockerfile: Dockerfile.dev args: - IMAGE_NAME=balancer-frontend + - FRONTEND_VERSION=0.0.1 ports: - "3000:3000" environment: @@ -60,16 +43,6 @@ services: - "/usr/src/app/node_modules/" depends_on: - backend - networks: - app_net: - ipv4_address: 192.168.0.5 volumes: - postgres_data: -networks: - app_net: - ipam: - driver: default - config: - - subnet: "192.168.0.0/24" - gateway: 192.168.0.1 \ No newline at end of file + postgres_data: \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 2113abeb..2eb6e187 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -21,6 +21,8 @@ services: - ./config/env/env.dev depends_on: - db +<<<<<<< HEAD +======= frontend: image: balancer-frontend build: @@ -38,6 +40,7 @@ services: - "/usr/src/app/node_modules/" depends_on: - backend +>>>>>>> ac68347c12ced724206112843623ee8c515bd3ad volumes: postgres_data: \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore index 6e10711f..31aed3fe 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -24,5 +24,3 @@ config/env/env.dev *.njsproj *.sln *.sw? - -.DS_Store diff --git a/frontend/Dockerfile.demo b/frontend/Dockerfile.demo new file mode 100644 index 00000000..ecf94591 --- /dev/null +++ b/frontend/Dockerfile.demo @@ -0,0 +1,38 @@ +# This dockerfile builds an image for a static frontend only server suitable for online hosting. +# Use the official Node.js image as the base image +FROM node:18 as builder + +# Set the working directory inside the container +WORKDIR /usr/src/app + +# Copy package.json and package-lock.json +COPY package*.json ./ + +# Set version number +ARG FRONTEND_VERSION +RUN npm version $FRONTEND_VERSION + +# Install dependencies +RUN npm ci --legacy-peer-deps + +# Copy project files +COPY . . + +RUN npm run build + +FROM alpine:latest as nginx-config +RUN apk --no-cache add gettext +WORKDIR /app +COPY nginx.conf.demo ./nginx.conf.demo +# This will get overwritten by helm chart + +ARG SERVER_NAME +ENV SERVER_NAME $SERVER_NAME +RUN cat nginx.conf.demo | envsubst > nginx.conf + +FROM nginx:alpine + +COPY --from=nginx-config /app/nginx.conf /etc/nginx/nginx.conf +COPY --from=Builder /usr/src/app/dist /usr/share/nginx/html + +# The default entrypoint works for us. \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile.dev similarity index 67% rename from frontend/Dockerfile rename to frontend/Dockerfile.dev index f5db71c0..c1a4e1a3 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile.dev @@ -1,4 +1,5 @@ -# Use the official Node.js 14 image as the base image +# This dockerfile builds an image for a Vite development server +# Use the official Node.js image as the base image FROM node:18 # Set the working directory inside the container @@ -14,12 +15,12 @@ RUN npm install COPY . . # Build the project -RUN npm run build +# RUN npm run build # Expose a port if required -EXPOSE 3000 +# EXPOSE 3000 -# Start the application +# Start the dev server CMD [ "npm", "run", "dev" ] # Set the image name diff --git a/frontend/docker-compose.demo.yaml b/frontend/docker-compose.demo.yaml new file mode 100644 index 00000000..652b992f --- /dev/null +++ b/frontend/docker-compose.demo.yaml @@ -0,0 +1,16 @@ +version: "3.8" +services: + frontend-static: + build: + context: . + dockerfile: Dockerfile.demo + args: + - IMAGE_NAME=frontend-static + - FRONTEND_VERSION=0.0.2 + - SERVER_NAME=localhost + image: ghcr.io/codeforphilly/balancer-main/frontend-static:0.0.2 + ports: + - "80:80" + environment: + - CHOKIDAR_USEPOLLING=true + - VITE_API_BASE_URL=https://devnull-as-a-service.com/dev/null diff --git a/frontend/docker-compose.dev.yaml b/frontend/docker-compose.dev.yaml new file mode 100644 index 00000000..3c9916f9 --- /dev/null +++ b/frontend/docker-compose.dev.yaml @@ -0,0 +1,16 @@ +version: "3.8" +services: + react-app: + build: + context: . + dockerfile: Dockerfile.dev + args: + - IMAGE_NAME=balancer-frontend-dev + ports: + - "3000:3000" + # The port number is hard-coded, located in ./vite.config.ts + environment: + - CHOKIDAR_USEPOLLING=true + volumes: + - "./:/usr/src/app:delegated" + - "./node_modules:/usr/src/app/node_modules/" diff --git a/frontend/nginx.conf.demo b/frontend/nginx.conf.demo new file mode 100644 index 00000000..c093b5e4 --- /dev/null +++ b/frontend/nginx.conf.demo @@ -0,0 +1,29 @@ +# nginx config file for static frontend demo site. +# This will be the nginx.conf in the docker image before it gets overwritten by kubernetes helm chart. +user nginx; + worker_processes 1; + events { + worker_connections 1024; + } + http { + include /etc/nginx/mime.types; + server { + listen 80; + listen [::]:80; + server_name $SERVER_NAME; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } + } \ No newline at end of file diff --git a/frontend/src/pages/About/About.tsx b/frontend/src/pages/About/About.tsx index 7f2f5782..4a264afb 100644 --- a/frontend/src/pages/About/About.tsx +++ b/frontend/src/pages/About/About.tsx @@ -80,16 +80,6 @@ function About() { - {/*