feat: implement automation feature

This commit is contained in:
Rotimi Best
2026-03-18 23:39:12 +01:00
parent 576d0366de
commit ef4424e267
121 changed files with 4544 additions and 1055 deletions
+4 -1
View File
@@ -13,9 +13,12 @@ RUN pnpm install --frozen-lockfile --ignore-scripts --shamefully-hoist --filter
RUN find . -name 'tsconfig.tsbuildinfo' -delete
RUN pnpm -r --filter @cio/api... build
COPY docker/entrypoint-api.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh
EXPOSE 3081
ENV NODE_ENV=production \
PORT=3081
CMD ["pnpm", "--filter", "@cio/api", "start"]
ENTRYPOINT ["/app/entrypoint.sh"]
+1 -17
View File
@@ -5,13 +5,6 @@ WORKDIR /app
ENV CI=true
ARG PUBLIC_IS_SELFHOSTED=true
ARG PUBLIC_SERVER_URL
ARG ALLOWED_EXTERNAL_DOMAINS
ARG CSP_SCRIPT_SRC_DOMAINS
ARG CSP_STYLE_SRC_DOMAINS
ARG CSP_CONNECT_SRC_DOMAINS
ARG CSP_FRAME_SRC_DOMAINS
ARG CSP_FONT_SRC_DOMAINS
RUN corepack enable && corepack prepare [email protected] --activate
@@ -19,17 +12,8 @@ COPY . .
RUN pnpm install --frozen-lockfile --ignore-scripts --filter @cio/dashboard...
RUN find . -name 'tsconfig.tsbuildinfo' -delete
RUN echo "Dashboard build PUBLIC_IS_SELFHOSTED=${PUBLIC_IS_SELFHOSTED}" && \
echo "Dashboard build PUBLIC_SERVER_URL=${PUBLIC_SERVER_URL}" && \
NODE_OPTIONS="--max-old-space-size=3072" \
RUN NODE_OPTIONS="--max-old-space-size=3072" \
PUBLIC_IS_SELFHOSTED="${PUBLIC_IS_SELFHOSTED}" \
PUBLIC_SERVER_URL="${PUBLIC_SERVER_URL}" \
ALLOWED_EXTERNAL_DOMAINS="${ALLOWED_EXTERNAL_DOMAINS}" \
CSP_SCRIPT_SRC_DOMAINS="${CSP_SCRIPT_SRC_DOMAINS}" \
CSP_STYLE_SRC_DOMAINS="${CSP_STYLE_SRC_DOMAINS}" \
CSP_CONNECT_SRC_DOMAINS="${CSP_CONNECT_SRC_DOMAINS}" \
CSP_FRAME_SRC_DOMAINS="${CSP_FRAME_SRC_DOMAINS}" \
CSP_FONT_SRC_DOMAINS="${CSP_FONT_SRC_DOMAINS}" \
pnpm -r --filter @cio/dashboard... build
RUN test -f apps/dashboard/build/index.js || (echo "ERROR: Dashboard build output not found at apps/dashboard/build/index.js" && exit 1)
+8 -26
View File
@@ -72,23 +72,6 @@ services:
profiles:
- minio
db-init:
build:
context: ..
dockerfile: docker/Dockerfile.api
container_name: cio-db-init
depends_on:
postgres:
condition: service_healthy
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-classroomio}
PRIVATE_DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-classroomio}
command:
- sh
- -c
- pnpm --filter @cio/db db:setup
restart: "no"
api:
build:
context: ..
@@ -101,8 +84,6 @@ services:
condition: service_healthy
redis:
condition: service_healthy
db-init:
condition: service_completed_successfully
environment:
NODE_ENV: production
PORT: 3081
@@ -137,6 +118,7 @@ services:
LICENSE_KEY: ${LICENSE_KEY:-}
UNSPLASH_API_KEY: ${UNSPLASH_API_KEY:-}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:-local-dev-only-secret-change-this}
SKIP_DB_SETUP: ${SKIP_DB_SETUP:-}
restart: unless-stopped
dashboard:
@@ -145,13 +127,6 @@ services:
dockerfile: docker/Dockerfile.dashboard
args:
PUBLIC_IS_SELFHOSTED: ${PUBLIC_IS_SELFHOSTED:-true}
PUBLIC_SERVER_URL: ${PUBLIC_SERVER_URL:-http://localhost:3081}
ALLOWED_EXTERNAL_DOMAINS: ${ALLOWED_EXTERNAL_DOMAINS:-}
CSP_SCRIPT_SRC_DOMAINS: ${CSP_SCRIPT_SRC_DOMAINS:-}
CSP_STYLE_SRC_DOMAINS: ${CSP_STYLE_SRC_DOMAINS:-}
CSP_CONNECT_SRC_DOMAINS: ${CSP_CONNECT_SRC_DOMAINS:-}
CSP_FRAME_SRC_DOMAINS: ${CSP_FRAME_SRC_DOMAINS:-}
CSP_FONT_SRC_DOMAINS: ${CSP_FONT_SRC_DOMAINS:-}
container_name: cio-dashboard
ports:
- "3082:3082"
@@ -169,6 +144,13 @@ services:
PRIVATE_APP_HOST: ${PRIVATE_APP_HOST:-localhost}
PRIVATE_APP_SUBDOMAINS: ${PRIVATE_APP_SUBDOMAINS:-app}
AUTH_BEARER_TOKEN: ${AUTH_BEARER_TOKEN:-}
ALLOWED_EXTERNAL_DOMAINS: ${ALLOWED_EXTERNAL_DOMAINS:-}
CSP_SCRIPT_SRC_DOMAINS: ${CSP_SCRIPT_SRC_DOMAINS:-}
CSP_STYLE_SRC_DOMAINS: ${CSP_STYLE_SRC_DOMAINS:-}
CSP_CONNECT_SRC_DOMAINS: ${CSP_CONNECT_SRC_DOMAINS:-}
CSP_FRAME_SRC_DOMAINS: ${CSP_FRAME_SRC_DOMAINS:-}
CSP_FONT_SRC_DOMAINS: ${CSP_FONT_SRC_DOMAINS:-}
CSP_MEDIA_SRC_DOMAINS: ${CSP_MEDIA_SRC_DOMAINS:-}
restart: unless-stopped
volumes:
-7
View File
@@ -42,13 +42,6 @@ echo "Dashboard build arg PUBLIC_IS_SELFHOSTED=${PUBLIC_IS_SELFHOSTED}"
docker build \
-f docker/Dockerfile.dashboard \
--build-arg PUBLIC_IS_SELFHOSTED=${PUBLIC_IS_SELFHOSTED} \
--build-arg PUBLIC_SERVER_URL=${PUBLIC_SERVER_URL:-} \
--build-arg ALLOWED_EXTERNAL_DOMAINS="${ALLOWED_EXTERNAL_DOMAINS:-}" \
--build-arg CSP_SCRIPT_SRC_DOMAINS="${CSP_SCRIPT_SRC_DOMAINS:-}" \
--build-arg CSP_STYLE_SRC_DOMAINS="${CSP_STYLE_SRC_DOMAINS:-}" \
--build-arg CSP_CONNECT_SRC_DOMAINS="${CSP_CONNECT_SRC_DOMAINS:-}" \
--build-arg CSP_FRAME_SRC_DOMAINS="${CSP_FRAME_SRC_DOMAINS:-}" \
--build-arg CSP_FONT_SRC_DOMAINS="${CSP_FONT_SRC_DOMAINS:-}" \
-t ${DOCKERHUB_USERNAME}/dashboard:${VERSION} \
-t ${DOCKERHUB_USERNAME}/dashboard:latest \
.
+1 -1
View File
@@ -158,7 +158,7 @@ The GitHub Actions workflow builds for both `linux/amd64` and `linux/arm64` plat
### Build failures
- Check Dockerfile syntax
- Ensure all build arguments are provided
- The only required build argument is `PUBLIC_IS_SELFHOSTED` (defaults to `true`)
- Check available disk space: `docker system df`
### Clean up old images
+2 -1
View File
@@ -25,7 +25,8 @@ All Docker services read from a single root `.env` file. See [`.env.example`](..
Key points:
- **Required:** `PUBLIC_SERVER_URL`, `TRUSTED_ORIGINS`, `BETTER_AUTH_SECRET`, `PUBLIC_IS_SELFHOSTED=true`, `ALLOWED_EXTERNAL_DOMAINS`, `DASHBOARD_ORIGIN`.
- **Required:** `PUBLIC_SERVER_URL`, `TRUSTED_ORIGINS`, `BETTER_AUTH_SECRET`, `PUBLIC_IS_SELFHOSTED=true`, `DASHBOARD_ORIGIN`.
- **CSP (runtime):** `ALLOWED_EXTERNAL_DOMAINS` (overrides all) or per-directive: `CSP_SCRIPT_SRC_DOMAINS`, `CSP_STYLE_SRC_DOMAINS`, `CSP_CONNECT_SRC_DOMAINS`, `CSP_FRAME_SRC_DOMAINS`, `CSP_FONT_SRC_DOMAINS`, `CSP_MEDIA_SRC_DOMAINS`. These are read at container startup — no image rebuild needed.
- **Auth cookies:** Set `AUTH_COOKIE_DOMAIN` to your root domain (e.g. `.yourdomain.com`) when API and dashboard use different subdomains. Without it, auth cookies may not be set and login will fail.
- **Auto-generated:** `AUTH_BEARER_TOKEN`, `PRIVATE_SERVER_KEY` (by `./run-docker-full-stack.sh`).
- **Auto-configured:** All `MINIO_*` / `OBJECT_STORAGE_*` vars (by the startup script).
+13
View File
@@ -0,0 +1,13 @@
#!/bin/sh
set -e
if [ "${SKIP_DB_SETUP}" = "true" ]; then
echo "Skipping database setup (SKIP_DB_SETUP=true)."
else
echo "Running database setup..."
pnpm --filter @cio/db db:setup
echo "Database setup complete."
fi
echo "Starting API..."
exec pnpm --filter @cio/api start