diff --git a/docker/Dockerfile.local b/docker/Dockerfile.local new file mode 100644 index 00000000..fbbad52c --- /dev/null +++ b/docker/Dockerfile.local @@ -0,0 +1,56 @@ +# syntax=docker/dockerfile:1 +# Build UI +FROM node:16 as build_ui + +ADD --keep-git-dir=false https://github.com/cairis-platform/cairis-ui.git#master /cairis-ui +RUN cd /cairis-ui && \ + yarn install --ignore-engines && \ + yarn run build + +# Build CAIRIS backend +FROM python:3.12 +LABEL "org.opencontainers.image.authors"="Shamal Faily " +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y \ + apache2 \ + apache2-dev \ + mariadb-client \ + poppler-utils \ + netpbm \ + graphviz + +#Installing Python modules +COPY requirements.txt / +COPY wsgi_requirements.txt / +RUN pip install wheel --break-system-packages && \ + pip install -r requirements.txt -r wsgi_requirements.txt --break-system-packages + +#Environment Variable starts from here +ENV CAIRIS_SRC=/cairis/cairis +ENV CAIRIS_CFG_DIR=/cairis/docker +ENV CAIRIS_CFG=/cairis.cnf +ENV PYTHONPATH=/cairis + +# Copy from local repo +COPY cairis /cairis/cairis + +# Grant permission to executable files +RUN chmod +x /cairis/cairis/bin/*.* && \ + chmod +x /cairis/cairis/config/*.sh + +COPY cairis.cnf / +COPY addAccount.sh / +COPY register_user.html /cairis/cairis/daemon/templates/security + +# Copy UI build +COPY --from=build_ui /cairis-ui/dist /cairis/cairis/dist + +EXPOSE 8000 + +RUN mkdir /tmpDocker && \ + mkdir /images && \ + chown www-data /images && \ + chgrp www-data /images && \ + chmod 1777 /tmpDocker + +CMD ["mod_wsgi-express", "start-server", "/cairis/cairis/bin/cairis.wsgi", "--user", "www-data", "--group", "www-data"] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 00000000..de317809 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,56 @@ +# INSTRUCTION TO BUILD AND BRING UP SETUP WITH DOCKER + +## 1. Build docker image + +By default, the cairis backend source code is fetched from github repo. The below script will help to build docker image locally. +You can specify the image version. By default, it is "latest". + +```sh +./buildLocalImage.sh +``` + +## 2. Server startup and shutdown + +To create and start containers in backgroud mode: + +```sh +docker compose up -d +``` + +To view container logs: + +```sh +docker compose logs -f +``` + +To stop: + +```sh +docker compose stop +``` + +To start: + +```sh +docker compose start +``` + +To stop and remove the containers: + +```sh +docker compose down +``` + +Your data is persistent even you remove the containers. To completely delete all data: + +```sh +$ docker volume rm cairis_cairisDocumentation cairis_cairisImage cairis_cairisMysqlData +``` + +## 3. Create a user + +"cairis-CAIRIS-1" is the name of docker container of the cairis server. + +```sh +docker exec -t cairis-CAIRIS-1 ./addAccount.sh test@test.com test TestUser +``` diff --git a/docker/addAccount.sh b/docker/addAccount.sh index 44aebecf..e8bc0c56 100755 --- a/docker/addAccount.sh +++ b/docker/addAccount.sh @@ -8,4 +8,4 @@ USERNAME=$1 PASSWD=$2 FULLNAME=$3 -$CAIRIS_SRC/bin/add_cairis_user.py $USERNAME $PASSWD $FULLNAME +python3 $CAIRIS_SRC/bin/add_cairis_user.py $USERNAME $PASSWD $FULLNAME diff --git a/docker/buildLocalImage.sh b/docker/buildLocalImage.sh new file mode 100644 index 00000000..94bfa661 --- /dev/null +++ b/docker/buildLocalImage.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +# Get version from parameter +VERSION=$1 + +if [[ "$VERSION" == "" ]]; then + VERSION=latest +fi + +# Copy from local repo +cp -R ../cairis ./ + +# Build +docker build -t shamalfaily/cairis:$VERSION -f Dockerfile.local . + +# Clean up +rm -rf cairis diff --git a/docker/compose.yml b/docker/compose.yml new file mode 100644 index 00000000..98606ff6 --- /dev/null +++ b/docker/compose.yml @@ -0,0 +1,54 @@ +name: cairis +services: + cairis-mysql: + image: mysql:5.7 + environment: + - MYSQL_ROOT_PASSWORD=my-secret-pw + command: --thread_stack=256K --max_sp_recursion_depth=255 --log_bin_trust_function_creators=1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci + volumes: + - cairisMysqlData:/var/lib/mysql + - ./createdb.sql:/docker-entrypoint-initdb.d/00-createdb.sql:ro + - ./init-test-data.sh:/docker-entrypoint-initdb.d/01-init-test-data.sh:ro + - ../cairis/sql/init.sql:/sql/init.sql + - ../cairis/sql/procs.sql:/sql/procs.sql + networks: + - cairisnet + healthcheck: + test: ["CMD-SHELL", "[ -f /var/lib/mysql/db_init_done ] && mysql -h localhost -P 3306 -uroot -pmy-secret-pw -e \"SELECT 1\" && exit 0 || exit 1"] + interval: 1m + timeout: 10s + retries: 3 + start_period: 2m30s + start_interval: 10s + + cairis-docs: + image: shamalfaily/cairis-docs + depends_on: + - cairis-mysql + volumes: + - cairisDocumentation:/tmpDocker + - cairisImage:/images + networks: + - cairisnet + + CAIRIS: + image: shamalfaily/cairis:latest + depends_on: + cairis-mysql: + condition: service_healthy + restart: true + ports: + - 80:8000 + volumes: + - cairisDocumentation:/tmpDocker + - cairisImage:/images + networks: + - cairisnet + +volumes: + cairisMysqlData: + cairisDocumentation: + cairisImage: + +networks: + cairisnet: diff --git a/docker/init-test-data.sh b/docker/init-test-data.sh new file mode 100644 index 00000000..7adabbf2 --- /dev/null +++ b/docker/init-test-data.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -x + +mysql --user=cairis_test --password=cairis_test --database=cairis_test_default < /sql/init.sql +mysql --user=cairis_test --password=cairis_test --database=cairis_test_default < /sql/procs.sql +mysql --user=root --password=my-secret-pw <=1.0.4 lxml>=3.6.4 openpyxl>=2.4.0 SQLAlchemy>=2.0.0 -bcrypt>=3.1.6 +bcrypt==3.1.6 python-magic>=0.4.15 email_validator>=1.0.5 xlsxwriter>=1.2.7