feat: implement automation feature
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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 pnpm@10.19.0 --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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 \
|
||||
.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user