forked from github/plane
chore: AIO docker images for preview deployments (#4605)
* fix: adding single docker base file * action added * fix action * dockerfile.base modified * action fix * dockerfile * fix: base aio dockerfile * fix: dockerfile.base * fix: dockerfile base * fix: modified folder structure * fix: action * fix: dockerfile * fix: dockerfile.base * fix: supervisor file name changed * fix: base dockerfile updated * fix dockerfile base * fix: base dockerfile * fix: docker files * fix: base dockerfile * update base image * modified docker aio base * aio base modified to debian-12-slim * fixes * finalize the dockerfiles with volume exposure * modified the aio build and dockerfile * fix: codacy suggestions implemented * fix: codacy fix * update aio build action --------- Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
This commit is contained in:
parent
5efa8264d8
commit
a8c03281c6
91
.github/workflows/build-aio-base.yml
vendored
Normal file
91
.github/workflows/build-aio-base.yml
vendored
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
name: Build AIO Base Image
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
TARGET_BRANCH: ${{ github.ref_name }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
base_build_setup:
|
||||||
|
name: Build Preparation
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }}
|
||||||
|
gh_buildx_driver: ${{ steps.set_env_variables.outputs.BUILDX_DRIVER }}
|
||||||
|
gh_buildx_version: ${{ steps.set_env_variables.outputs.BUILDX_VERSION }}
|
||||||
|
gh_buildx_platforms: ${{ steps.set_env_variables.outputs.BUILDX_PLATFORMS }}
|
||||||
|
gh_buildx_endpoint: ${{ steps.set_env_variables.outputs.BUILDX_ENDPOINT }}
|
||||||
|
build_base: ${{ steps.changed_files.outputs.base_any_changed }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- id: set_env_variables
|
||||||
|
name: Set Environment Variables
|
||||||
|
run: |
|
||||||
|
echo "BUILDX_DRIVER=cloud" >> $GITHUB_OUTPUT
|
||||||
|
echo "BUILDX_VERSION=lab:latest" >> $GITHUB_OUTPUT
|
||||||
|
echo "BUILDX_PLATFORMS=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT
|
||||||
|
echo "BUILDX_ENDPOINT=makeplane/plane-dev" >> $GITHUB_OUTPUT
|
||||||
|
echo "TARGET_BRANCH=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- id: checkout_files
|
||||||
|
name: Checkout Files
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed_files
|
||||||
|
uses: tj-actions/changed-files@v42
|
||||||
|
with:
|
||||||
|
files_yaml: |
|
||||||
|
base:
|
||||||
|
- aio/Dockerfile.base
|
||||||
|
|
||||||
|
base_build_push:
|
||||||
|
if: ${{ needs.base_build_setup.outputs.build_base == 'true' || github.event_name == 'workflow_dispatch' || needs.base_build_setup.outputs.gh_branch_name == 'master' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [base_build_setup]
|
||||||
|
env:
|
||||||
|
BASE_IMG_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-aio-base:${{ needs.base_build_setup.outputs.gh_branch_name }}
|
||||||
|
TARGET_BRANCH: ${{ needs.base_build_setup.outputs.gh_branch_name }}
|
||||||
|
BUILDX_DRIVER: ${{ needs.base_build_setup.outputs.gh_buildx_driver }}
|
||||||
|
BUILDX_VERSION: ${{ needs.base_build_setup.outputs.gh_buildx_version }}
|
||||||
|
BUILDX_PLATFORMS: ${{ needs.base_build_setup.outputs.gh_buildx_platforms }}
|
||||||
|
BUILDX_ENDPOINT: ${{ needs.base_build_setup.outputs.gh_buildx_endpoint }}
|
||||||
|
steps:
|
||||||
|
- name: Check out the repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set Docker Tag
|
||||||
|
run: |
|
||||||
|
if [ "${{ env.TARGET_BRANCH }}" == "master" ]; then
|
||||||
|
TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-aio-base:latest
|
||||||
|
else
|
||||||
|
TAG=${{ env.BASE_IMG_TAG }}
|
||||||
|
fi
|
||||||
|
echo "BASE_IMG_TAG=${TAG}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
with:
|
||||||
|
driver: ${{ env.BUILDX_DRIVER }}
|
||||||
|
version: ${{ env.BUILDX_VERSION }}
|
||||||
|
endpoint: ${{ env.BUILDX_ENDPOINT }}
|
||||||
|
|
||||||
|
- name: Build and Push to Docker Hub
|
||||||
|
uses: docker/build-push-action@v5.1.0
|
||||||
|
with:
|
||||||
|
context: ./aio
|
||||||
|
file: ./aio/Dockerfile.base
|
||||||
|
platforms: ${{ env.BUILDX_PLATFORMS }}
|
||||||
|
tags: ${{ env.BASE_IMG_TAG }}
|
||||||
|
push: true
|
||||||
|
env:
|
||||||
|
DOCKER_BUILDKIT: 1
|
||||||
|
DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }}
|
124
Dockerfile
124
Dockerfile
@ -1,124 +0,0 @@
|
|||||||
FROM node:18-alpine AS builder
|
|
||||||
RUN apk add --no-cache libc6-compat
|
|
||||||
# Set working directory
|
|
||||||
WORKDIR /app
|
|
||||||
ENV NEXT_PUBLIC_API_BASE_URL=http://NEXT_PUBLIC_API_BASE_URL_PLACEHOLDER
|
|
||||||
|
|
||||||
RUN yarn global add turbo
|
|
||||||
RUN apk add tree
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
RUN turbo prune --scope=app --scope=plane-deploy --docker
|
|
||||||
CMD tree -I node_modules/
|
|
||||||
|
|
||||||
# Add lockfile and package.json's of isolated subworkspace
|
|
||||||
FROM node:18-alpine AS installer
|
|
||||||
|
|
||||||
RUN apk add --no-cache libc6-compat
|
|
||||||
WORKDIR /app
|
|
||||||
ARG NEXT_PUBLIC_API_BASE_URL=http://localhost:8000
|
|
||||||
# First install the dependencies (as they change less often)
|
|
||||||
COPY .gitignore .gitignore
|
|
||||||
COPY --from=builder /app/out/json/ .
|
|
||||||
COPY --from=builder /app/out/yarn.lock ./yarn.lock
|
|
||||||
RUN yarn install
|
|
||||||
|
|
||||||
# # Build the project
|
|
||||||
COPY --from=builder /app/out/full/ .
|
|
||||||
COPY turbo.json turbo.json
|
|
||||||
COPY replace-env-vars.sh /usr/local/bin/
|
|
||||||
|
|
||||||
RUN chmod +x /usr/local/bin/replace-env-vars.sh
|
|
||||||
|
|
||||||
RUN yarn turbo run build
|
|
||||||
|
|
||||||
ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \
|
|
||||||
BUILT_NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL
|
|
||||||
|
|
||||||
RUN /usr/local/bin/replace-env-vars.sh http://NEXT_PUBLIC_WEBAPP_URL_PLACEHOLDER ${NEXT_PUBLIC_API_BASE_URL}
|
|
||||||
|
|
||||||
FROM python:3.11.1-alpine3.17 AS backend
|
|
||||||
|
|
||||||
# set environment variables
|
|
||||||
ENV PYTHONDONTWRITEBYTECODE 1
|
|
||||||
ENV PYTHONUNBUFFERED 1
|
|
||||||
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
|
|
||||||
|
|
||||||
WORKDIR /code
|
|
||||||
|
|
||||||
RUN apk --no-cache add \
|
|
||||||
"libpq~=15" \
|
|
||||||
"libxslt~=1.1" \
|
|
||||||
"nodejs-current~=19" \
|
|
||||||
"xmlsec~=1.2" \
|
|
||||||
"nginx" \
|
|
||||||
"nodejs" \
|
|
||||||
"npm" \
|
|
||||||
"supervisor"
|
|
||||||
|
|
||||||
COPY apiserver/requirements.txt ./
|
|
||||||
COPY apiserver/requirements ./requirements
|
|
||||||
RUN apk add --no-cache libffi-dev
|
|
||||||
RUN apk add --no-cache --virtual .build-deps \
|
|
||||||
"bash~=5.2" \
|
|
||||||
"g++~=12.2" \
|
|
||||||
"gcc~=12.2" \
|
|
||||||
"cargo~=1.64" \
|
|
||||||
"git~=2" \
|
|
||||||
"make~=4.3" \
|
|
||||||
"postgresql13-dev~=13" \
|
|
||||||
"libc-dev" \
|
|
||||||
"linux-headers" \
|
|
||||||
&& \
|
|
||||||
pip install -r requirements.txt --compile --no-cache-dir \
|
|
||||||
&& \
|
|
||||||
apk del .build-deps
|
|
||||||
|
|
||||||
# Add in Django deps and generate Django's static files
|
|
||||||
COPY apiserver/manage.py manage.py
|
|
||||||
COPY apiserver/plane plane/
|
|
||||||
COPY apiserver/templates templates/
|
|
||||||
|
|
||||||
RUN apk --no-cache add "bash~=5.2"
|
|
||||||
COPY apiserver/bin ./bin/
|
|
||||||
|
|
||||||
RUN chmod +x ./bin/*
|
|
||||||
RUN chmod -R 777 /code
|
|
||||||
|
|
||||||
# Expose container port and run entry point script
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY --from=installer /app/apps/app/next.config.js .
|
|
||||||
COPY --from=installer /app/apps/app/package.json .
|
|
||||||
COPY --from=installer /app/apps/space/next.config.js .
|
|
||||||
COPY --from=installer /app/apps/space/package.json .
|
|
||||||
|
|
||||||
COPY --from=installer /app/apps/app/.next/standalone ./
|
|
||||||
|
|
||||||
COPY --from=installer /app/apps/app/.next/static ./apps/app/.next/static
|
|
||||||
|
|
||||||
COPY --from=installer /app/apps/space/.next/standalone ./
|
|
||||||
COPY --from=installer /app/apps/space/.next ./apps/space/.next
|
|
||||||
|
|
||||||
ENV NEXT_TELEMETRY_DISABLED 1
|
|
||||||
|
|
||||||
# RUN rm /etc/nginx/conf.d/default.conf
|
|
||||||
#######################################################################
|
|
||||||
COPY nginx/nginx-single-docker-image.conf /etc/nginx/http.d/default.conf
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
COPY nginx/supervisor.conf /code/supervisor.conf
|
|
||||||
|
|
||||||
ARG NEXT_PUBLIC_API_BASE_URL=http://localhost:8000
|
|
||||||
ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \
|
|
||||||
BUILT_NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL
|
|
||||||
|
|
||||||
COPY replace-env-vars.sh /usr/local/bin/
|
|
||||||
COPY start.sh /usr/local/bin/
|
|
||||||
RUN chmod +x /usr/local/bin/replace-env-vars.sh
|
|
||||||
RUN chmod +x /usr/local/bin/start.sh
|
|
||||||
|
|
||||||
EXPOSE 80
|
|
||||||
|
|
||||||
CMD ["supervisord","-c","/code/supervisor.conf"]
|
|
149
aio/Dockerfile
Normal file
149
aio/Dockerfile
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
# *****************************************************************************
|
||||||
|
# STAGE 1: Build the project
|
||||||
|
# *****************************************************************************
|
||||||
|
FROM node:18-alpine AS builder
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
ENV NEXT_PUBLIC_API_BASE_URL=http://NEXT_PUBLIC_API_BASE_URL_PLACEHOLDER
|
||||||
|
|
||||||
|
RUN yarn global add turbo
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN turbo prune --scope=web --scope=space --scope=admin --docker
|
||||||
|
|
||||||
|
# *****************************************************************************
|
||||||
|
# STAGE 2: Install dependencies & build the project
|
||||||
|
# *****************************************************************************
|
||||||
|
# Add lockfile and package.json's of isolated subworkspace
|
||||||
|
FROM node:18-alpine AS installer
|
||||||
|
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# First install the dependencies (as they change less often)
|
||||||
|
COPY .gitignore .gitignore
|
||||||
|
COPY --from=builder /app/out/json/ .
|
||||||
|
COPY --from=builder /app/out/yarn.lock ./yarn.lock
|
||||||
|
RUN yarn install
|
||||||
|
|
||||||
|
# # Build the project
|
||||||
|
COPY --from=builder /app/out/full/ .
|
||||||
|
COPY turbo.json turbo.json
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_API_BASE_URL=""
|
||||||
|
ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_ADMIN_BASE_URL=""
|
||||||
|
ENV NEXT_PUBLIC_ADMIN_BASE_URL=$NEXT_PUBLIC_ADMIN_BASE_URL
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_ADMIN_BASE_PATH="/god-mode"
|
||||||
|
ENV NEXT_PUBLIC_ADMIN_BASE_PATH=$NEXT_PUBLIC_ADMIN_BASE_PATH
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_SPACE_BASE_URL=""
|
||||||
|
ENV NEXT_PUBLIC_SPACE_BASE_URL=$NEXT_PUBLIC_SPACE_BASE_URL
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_SPACE_BASE_PATH="/spaces"
|
||||||
|
ENV NEXT_PUBLIC_SPACE_BASE_PATH=$NEXT_PUBLIC_SPACE_BASE_PATH
|
||||||
|
|
||||||
|
ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
ENV TURBO_TELEMETRY_DISABLED 1
|
||||||
|
|
||||||
|
RUN yarn turbo run build
|
||||||
|
|
||||||
|
# *****************************************************************************
|
||||||
|
# STAGE 3: Copy the project and start it
|
||||||
|
# *****************************************************************************
|
||||||
|
# FROM makeplane/plane-aio-base AS runner
|
||||||
|
FROM makeplane/plane-aio-base:develop AS runner
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
SHELL [ "/bin/bash", "-c" ]
|
||||||
|
|
||||||
|
# PYTHON APPLICATION SETUP
|
||||||
|
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE 1
|
||||||
|
ENV PYTHONUNBUFFERED 1
|
||||||
|
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
|
||||||
|
|
||||||
|
COPY apiserver/requirements.txt ./api/
|
||||||
|
COPY apiserver/requirements ./api/requirements
|
||||||
|
|
||||||
|
RUN python3.12 -m venv /app/venv && \
|
||||||
|
source /app/venv/bin/activate && \
|
||||||
|
/app/venv/bin/pip install --upgrade pip && \
|
||||||
|
/app/venv/bin/pip install -r ./api/requirements.txt --compile --no-cache-dir
|
||||||
|
|
||||||
|
# Add in Django deps and generate Django's static files
|
||||||
|
COPY apiserver/manage.py ./api/manage.py
|
||||||
|
COPY apiserver/plane ./api/plane/
|
||||||
|
COPY apiserver/templates ./api/templates/
|
||||||
|
COPY package.json ./api/package.json
|
||||||
|
|
||||||
|
COPY apiserver/bin ./api/bin/
|
||||||
|
|
||||||
|
RUN chmod +x ./api/bin/*
|
||||||
|
RUN chmod -R 777 ./api/
|
||||||
|
|
||||||
|
# NEXTJS BUILDS
|
||||||
|
|
||||||
|
COPY --from=installer /app/web/next.config.js ./web/
|
||||||
|
COPY --from=installer /app/web/package.json ./web/
|
||||||
|
COPY --from=installer /app/web/.next/standalone ./web
|
||||||
|
COPY --from=installer /app/web/.next/static ./web/web/.next/static
|
||||||
|
COPY --from=installer /app/web/public ./web/web/public
|
||||||
|
|
||||||
|
COPY --from=installer /app/space/next.config.js ./space/
|
||||||
|
COPY --from=installer /app/space/package.json ./space/
|
||||||
|
COPY --from=installer /app/space/.next/standalone ./space
|
||||||
|
COPY --from=installer /app/space/.next/static ./space/space/.next/static
|
||||||
|
COPY --from=installer /app/space/public ./space/space/public
|
||||||
|
|
||||||
|
COPY --from=installer /app/admin/next.config.js ./admin/
|
||||||
|
COPY --from=installer /app/admin/package.json ./admin/
|
||||||
|
COPY --from=installer /app/admin/.next/standalone ./admin
|
||||||
|
COPY --from=installer /app/admin/.next/static ./admin/admin/.next/static
|
||||||
|
COPY --from=installer /app/admin/public ./admin/admin/public
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_API_BASE_URL=""
|
||||||
|
ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_ADMIN_BASE_URL=""
|
||||||
|
ENV NEXT_PUBLIC_ADMIN_BASE_URL=$NEXT_PUBLIC_ADMIN_BASE_URL
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_ADMIN_BASE_PATH="/god-mode"
|
||||||
|
ENV NEXT_PUBLIC_ADMIN_BASE_PATH=$NEXT_PUBLIC_ADMIN_BASE_PATH
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_SPACE_BASE_URL=""
|
||||||
|
ENV NEXT_PUBLIC_SPACE_BASE_URL=$NEXT_PUBLIC_SPACE_BASE_URL
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_SPACE_BASE_PATH="/spaces"
|
||||||
|
ENV NEXT_PUBLIC_SPACE_BASE_PATH=$NEXT_PUBLIC_SPACE_BASE_PATH
|
||||||
|
|
||||||
|
ARG NEXT_PUBLIC_WEB_BASE_URL=""
|
||||||
|
ENV NEXT_PUBLIC_WEB_BASE_URL=$NEXT_PUBLIC_WEB_BASE_URL
|
||||||
|
|
||||||
|
ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
ENV TURBO_TELEMETRY_DISABLED 1
|
||||||
|
|
||||||
|
COPY aio/supervisord.conf /app/supervisord.conf
|
||||||
|
|
||||||
|
COPY aio/aio.sh /app/aio.sh
|
||||||
|
RUN chmod +x /app/aio.sh
|
||||||
|
|
||||||
|
COPY aio/pg-setup.sh /app/pg-setup.sh
|
||||||
|
RUN chmod +x /app/pg-setup.sh
|
||||||
|
|
||||||
|
COPY deploy/selfhost/variables.env /app/plane.env
|
||||||
|
|
||||||
|
# NGINX Conf Copy
|
||||||
|
COPY ./aio/nginx.conf.aio /etc/nginx/nginx.conf.template
|
||||||
|
COPY ./nginx/env.sh /app/nginx-start.sh
|
||||||
|
RUN chmod +x /app/nginx-start.sh
|
||||||
|
|
||||||
|
RUN ./pg-setup.sh
|
||||||
|
|
||||||
|
VOLUME [ "/app/data/minio/uploads", "/var/lib/postgresql/data" ]
|
||||||
|
|
||||||
|
CMD ["/usr/bin/supervisord", "-c", "/app/supervisord.conf"]
|
92
aio/Dockerfile.base
Normal file
92
aio/Dockerfile.base
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
FROM --platform=$BUILDPLATFORM tonistiigi/binfmt as binfmt
|
||||||
|
|
||||||
|
FROM debian:12-slim
|
||||||
|
|
||||||
|
# Set environment variables to non-interactive for apt
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
SHELL [ "/bin/bash", "-c" ]
|
||||||
|
|
||||||
|
# Update the package list and install prerequisites
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y \
|
||||||
|
gnupg2 curl ca-certificates lsb-release software-properties-common \
|
||||||
|
build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
|
||||||
|
libsqlite3-dev wget llvm libncurses5-dev libncursesw5-dev xz-utils \
|
||||||
|
tk-dev libffi-dev liblzma-dev supervisor nginx nano vim ncdu
|
||||||
|
|
||||||
|
# Install Redis 7.2
|
||||||
|
RUN echo "deb http://deb.debian.org/debian $(lsb_release -cs)-backports main" > /etc/apt/sources.list.d/backports.list && \
|
||||||
|
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg && \
|
||||||
|
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" > /etc/apt/sources.list.d/redis.list && \
|
||||||
|
apt-get update && \
|
||||||
|
apt-get install -y redis-server
|
||||||
|
|
||||||
|
# Install PostgreSQL 15
|
||||||
|
ENV POSTGRES_VERSION 15
|
||||||
|
RUN curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/pgdg-archive-keyring.gpg && \
|
||||||
|
echo "deb [signed-by=/usr/share/keyrings/pgdg-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \
|
||||||
|
apt-get update && \
|
||||||
|
apt-get install -y postgresql-$POSTGRES_VERSION postgresql-client-$POSTGRES_VERSION && \
|
||||||
|
mkdir -p /var/lib/postgresql/data && \
|
||||||
|
chown -R postgres:postgres /var/lib/postgresql
|
||||||
|
|
||||||
|
# Install MinIO
|
||||||
|
ARG TARGETARCH
|
||||||
|
RUN if [ "$TARGETARCH" = "amd64" ]; then \
|
||||||
|
curl -fSl https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio; \
|
||||||
|
elif [ "$TARGETARCH" = "arm64" ]; then \
|
||||||
|
curl -fSl https://dl.min.io/server/minio/release/linux-arm64/minio -o /usr/local/bin/minio; \
|
||||||
|
else \
|
||||||
|
echo "Unsupported architecture: $TARGETARCH"; exit 1; \
|
||||||
|
fi && \
|
||||||
|
chmod +x /usr/local/bin/minio
|
||||||
|
|
||||||
|
|
||||||
|
# Install Node.js 18
|
||||||
|
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
|
||||||
|
apt-get install -y nodejs
|
||||||
|
|
||||||
|
# Install Python 3.12 from source
|
||||||
|
RUN cd /usr/src && \
|
||||||
|
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz && \
|
||||||
|
tar xzf Python-3.12.0.tgz && \
|
||||||
|
cd Python-3.12.0 && \
|
||||||
|
./configure --enable-optimizations && \
|
||||||
|
make altinstall && \
|
||||||
|
rm -f /usr/src/Python-3.12.0.tgz
|
||||||
|
|
||||||
|
RUN python3.12 -m pip install --upgrade pip
|
||||||
|
|
||||||
|
RUN echo "alias python=/usr/local/bin/python3.12" >> ~/.bashrc && \
|
||||||
|
echo "alias pip=/usr/local/bin/pip3.12" >> ~/.bashrc
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
RUN apt-get clean && \
|
||||||
|
rm -rf /var/lib/apt/lists/* /usr/src/Python-3.12.0
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN mkdir -p /app/{data,logs} && \
|
||||||
|
mkdir -p /app/data/{redis,pg,minio,nginx} && \
|
||||||
|
mkdir -p /app/logs/{access,error} && \
|
||||||
|
mkdir -p /etc/supervisor/conf.d
|
||||||
|
|
||||||
|
# Create Supervisor configuration file
|
||||||
|
COPY supervisord.base /app/supervisord.conf
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y sudo lsof net-tools libpq-dev procps gettext && \
|
||||||
|
apt-get clean
|
||||||
|
|
||||||
|
RUN sudo -u postgres /usr/lib/postgresql/$POSTGRES_VERSION/bin/initdb -D /var/lib/postgresql/data
|
||||||
|
COPY postgresql.conf /etc/postgresql/postgresql.conf
|
||||||
|
|
||||||
|
RUN echo "alias python=/usr/local/bin/python3.12" >> ~/.bashrc && \
|
||||||
|
echo "alias pip=/usr/local/bin/pip3.12" >> ~/.bashrc
|
||||||
|
|
||||||
|
# Expose ports for Redis, PostgreSQL, and MinIO
|
||||||
|
EXPOSE 6379 5432 9000 80
|
||||||
|
|
||||||
|
# Start Supervisor
|
||||||
|
CMD ["/usr/bin/supervisord", "-c", "/app/supervisord.conf"]
|
30
aio/aio.sh
Normal file
30
aio/aio.sh
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$1" = 'api' ]; then
|
||||||
|
source /app/venv/bin/activate
|
||||||
|
cd /app/api
|
||||||
|
exec ./bin/docker-entrypoint-api.sh
|
||||||
|
elif [ "$1" = 'worker' ]; then
|
||||||
|
source /app/venv/bin/activate
|
||||||
|
cd /app/api
|
||||||
|
exec ./bin/docker-entrypoint-worker.sh
|
||||||
|
elif [ "$1" = 'beat' ]; then
|
||||||
|
source /app/venv/bin/activate
|
||||||
|
cd /app/api
|
||||||
|
exec ./bin/docker-entrypoint-beat.sh
|
||||||
|
elif [ "$1" = 'migrator' ]; then
|
||||||
|
source /app/venv/bin/activate
|
||||||
|
cd /app/api
|
||||||
|
exec ./bin/docker-entrypoint-migrator.sh
|
||||||
|
elif [ "$1" = 'web' ]; then
|
||||||
|
node /app/web/web/server.js
|
||||||
|
elif [ "$1" = 'space' ]; then
|
||||||
|
node /app/space/space/server.js
|
||||||
|
elif [ "$1" = 'admin' ]; then
|
||||||
|
node /app/admin/admin/server.js
|
||||||
|
else
|
||||||
|
echo "Command not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
73
aio/nginx.conf.aio
Normal file
73
aio/nginx.conf.aio
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
events {
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
sendfile on;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
root /www/data/;
|
||||||
|
access_log /var/log/nginx/access.log;
|
||||||
|
|
||||||
|
client_max_body_size ${FILE_SIZE_LIMIT};
|
||||||
|
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||||
|
add_header Permissions-Policy "interest-cohort=()" always;
|
||||||
|
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||||
|
add_header X-Forwarded-Proto "${dollar}scheme";
|
||||||
|
add_header X-Forwarded-Host "${dollar}host";
|
||||||
|
add_header X-Forwarded-For "${dollar}proxy_add_x_forwarded_for";
|
||||||
|
add_header X-Real-IP "${dollar}remote_addr";
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade ${dollar}http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host ${dollar}http_host;
|
||||||
|
proxy_pass http://localhost:3001/;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /spaces/ {
|
||||||
|
rewrite ^/spaces/?$ /spaces/login break;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade ${dollar}http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host ${dollar}http_host;
|
||||||
|
proxy_pass http://localhost:3002/spaces/;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
location /god-mode/ {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade ${dollar}http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host ${dollar}http_host;
|
||||||
|
proxy_pass http://localhost:3003/god-mode/;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/ {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade ${dollar}http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host ${dollar}http_host;
|
||||||
|
proxy_pass http://localhost:8000/api/;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /auth/ {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade ${dollar}http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host ${dollar}http_host;
|
||||||
|
proxy_pass http://localhost:8000/auth/;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /${BUCKET_NAME}/ {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade ${dollar}http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host ${dollar}http_host;
|
||||||
|
proxy_pass http://localhost:9000/uploads/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
aio/pg-setup.sh
Normal file
14
aio/pg-setup.sh
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
set -o allexport
|
||||||
|
source plane.env set
|
||||||
|
set +o allexport
|
||||||
|
|
||||||
|
export PGHOST=localhost
|
||||||
|
|
||||||
|
sudo -u postgres "/usr/lib/postgresql/${POSTGRES_VERSION}/bin/pg_ctl" -D /var/lib/postgresql/data start
|
||||||
|
sudo -u postgres "/usr/lib/postgresql/${POSTGRES_VERSION}/bin/psql" --command "CREATE USER $POSTGRES_USER WITH SUPERUSER PASSWORD '$POSTGRES_PASSWORD';" && \
|
||||||
|
sudo -u postgres "/usr/lib/postgresql/${POSTGRES_VERSION}/bin/createdb" -O "$POSTGRES_USER" "$POSTGRES_DB" && \
|
||||||
|
sudo -u postgres "/usr/lib/postgresql/${POSTGRES_VERSION}/bin/pg_ctl" -D /var/lib/postgresql/data stop
|
12
aio/postgresql.conf
Normal file
12
aio/postgresql.conf
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# PostgreSQL configuration file
|
||||||
|
|
||||||
|
# Allow connections from any IP address
|
||||||
|
listen_addresses = '*'
|
||||||
|
|
||||||
|
# Set the maximum number of connections
|
||||||
|
max_connections = 100
|
||||||
|
|
||||||
|
# Set the shared buffers size
|
||||||
|
shared_buffers = 128MB
|
||||||
|
|
||||||
|
# Other custom configurations can be added here
|
37
aio/supervisord.base
Normal file
37
aio/supervisord.base
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
[supervisord]
|
||||||
|
user=root
|
||||||
|
nodaemon=true
|
||||||
|
stderr_logfile=/app/logs/error/supervisor.err.log
|
||||||
|
stdout_logfile=/app/logs/access/supervisor.out.log
|
||||||
|
|
||||||
|
[program:redis]
|
||||||
|
directory=/app/data/redis
|
||||||
|
command=redis-server
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stderr_logfile=/app/logs/error/redis.err.log
|
||||||
|
stdout_logfile=/app/logs/access/redis.out.log
|
||||||
|
|
||||||
|
[program:postgresql]
|
||||||
|
user=postgres
|
||||||
|
command=/usr/lib/postgresql/15/bin/postgres --config-file=/etc/postgresql/15/main/postgresql.conf
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stderr_logfile=/app/logs/error/postgresql.err.log
|
||||||
|
stdout_logfile=/app/logs/access/postgresql.out.log
|
||||||
|
|
||||||
|
[program:minio]
|
||||||
|
directory=/app/data/minio
|
||||||
|
command=minio server /app/data/minio
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stderr_logfile=/app/logs/error/minio.err.log
|
||||||
|
stdout_logfile=/app/logs/access/minio.out.log
|
||||||
|
|
||||||
|
[program:nginx]
|
||||||
|
directory=/app/data/nginx
|
||||||
|
command=/usr/sbin/nginx -g 'daemon off;'
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stderr_logfile=/app/logs/error/nginx.err.log
|
||||||
|
stdout_logfile=/app/logs/access/nginx.out.log
|
115
aio/supervisord.conf
Normal file
115
aio/supervisord.conf
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
[supervisord]
|
||||||
|
user=root
|
||||||
|
nodaemon=true
|
||||||
|
priority=1
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
||||||
|
[program:redis]
|
||||||
|
directory=/app/data/redis
|
||||||
|
command=redis-server
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
priority=1
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
||||||
|
[program:postgresql]
|
||||||
|
user=postgres
|
||||||
|
command=/usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/data --config-file=/etc/postgresql/postgresql.conf
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
priority=1
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
||||||
|
[program:minio]
|
||||||
|
directory=/app/data/minio
|
||||||
|
command=minio server /app/data/minio
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
priority=1
|
||||||
|
stdout_logfile=/app/logs/access/minio.log
|
||||||
|
stderr_logfile=/app/logs/error/minio.err.log
|
||||||
|
|
||||||
|
[program:nginx]
|
||||||
|
command=/app/nginx-start.sh
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
priority=1
|
||||||
|
stdout_logfile=/app/logs/access/nginx.log
|
||||||
|
stderr_logfile=/app/logs/error/nginx.err.log
|
||||||
|
|
||||||
|
|
||||||
|
[program:web]
|
||||||
|
command=/app/aio.sh web
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
environment=PORT=3001,HOSTNAME=0.0.0.0
|
||||||
|
|
||||||
|
[program:space]
|
||||||
|
command=/app/aio.sh space
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
environment=PORT=3002,HOSTNAME=0.0.0.0
|
||||||
|
|
||||||
|
[program:admin]
|
||||||
|
command=/app/aio.sh admin
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
environment=PORT=3003,HOSTNAME=0.0.0.0
|
||||||
|
|
||||||
|
[program:migrator]
|
||||||
|
command=/app/aio.sh migrator
|
||||||
|
autostart=true
|
||||||
|
autorestart=false
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
||||||
|
[program:api]
|
||||||
|
command=/app/aio.sh api
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
||||||
|
[program:worker]
|
||||||
|
command=/app/aio.sh worker
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
||||||
|
[program:beat]
|
||||||
|
command=/app/aio.sh beat
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stdout
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
@ -1,32 +0,0 @@
|
|||||||
[supervisord] ## This is the main process for the Supervisor
|
|
||||||
nodaemon=true
|
|
||||||
|
|
||||||
[program:node]
|
|
||||||
command=sh /usr/local/bin/start.sh
|
|
||||||
autostart=true
|
|
||||||
autorestart=true
|
|
||||||
stderr_logfile=/var/log/node.err.log
|
|
||||||
stdout_logfile=/var/log/node.out.log
|
|
||||||
|
|
||||||
[program:python]
|
|
||||||
directory=/code
|
|
||||||
command=sh bin/docker-entrypoint-api.sh
|
|
||||||
autostart=true
|
|
||||||
autorestart=true
|
|
||||||
stderr_logfile=/var/log/python.err.log
|
|
||||||
stdout_logfile=/var/log/python.out.log
|
|
||||||
|
|
||||||
[program:nginx]
|
|
||||||
command=nginx -g "daemon off;"
|
|
||||||
autostart=true
|
|
||||||
autorestart=true
|
|
||||||
stderr_logfile=/var/log/nginx.err.log
|
|
||||||
stdout_logfile=/var/log/nginx.out.log
|
|
||||||
|
|
||||||
[program:worker]
|
|
||||||
directory=/code
|
|
||||||
command=sh bin/worker
|
|
||||||
autostart=true
|
|
||||||
autorestart=true
|
|
||||||
stderr_logfile=/var/log/worker.err.log
|
|
||||||
stdout_logfile=/var/log/worker.out.log
|
|
Loading…
Reference in New Issue
Block a user