Loading .dockerignore +22 −10 Original line number Diff line number Diff line **/node_modules build data **/dist packages/build .git .gitignore node_modules backend/node_modules frontend/node_modules backend/dist frontend/dist .env .env.* !.env.example Dockerfile secrets docker-compose*.yml coverage .cache .tmp .DS_Store npm-debug.log* yarn-error.log* # dotfiles .git* .vscode **/.env* No newline at end of file scripts No newline at end of file Dockerfile +52 −43 Original line number Diff line number Diff line # syntax=docker/dockerfile:1.7 FROM node:24-alpine AS base RUN apk add --no-cache openssl RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # --- dependencies --- RUN mkdir -p /home/node/app \ && chown -R node:node /home/node/app COPY --chown=node:node .yarn ./.yarn COPY --chown=node:node package.json yarn.lock .yarnrc.yml ./ COPY --chown=node:node backend/package.json ./backend/ COPY --chown=node:node frontend/package.json ./frontend/ RUN corepack enable && corepack prepare COPY --chown=node:node backend/package.json ./backend/package.json COPY --chown=node:node frontend/package.json ./frontend/package.json RUN corepack enable USER node FROM base AS dev_dep RUN yarn workspaces focus --all ENV YARN_CACHE_FOLDER=/home/node/.yarn-cache FROM base AS dep RUN yarn workspaces focus --production --all FROM base AS dev-deps # # === BUILDER === # RUN --mount=type=cache,target=/home/node/.yarn-cache,uid=1000,gid=1000 \ yarn workspaces focus --all FROM dev_dep AS build COPY --from=dev_dep /home/node/app/ ./ FROM base AS prod-deps COPY --chown=node:node . . RUN --mount=type=cache,target=/home/node/.yarn-cache,uid=1000,gid=1000 \ yarn workspaces focus --all --production # --- build frontend --- RUN yarn workspace @fediverse-auth/frontend run build FROM dev-deps AS build # --- build backend --- COPY --chown=node:node . . RUN yarn workspace @fediverse-auth/frontend run build \ && yarn workspace @fediverse-auth/backend prisma generate \ && yarn workspace @fediverse-auth/backend run build RUN yarn workspace @fediverse-auth/backend prisma generate RUN yarn workspace @fediverse-auth/backend run build # # === RUNNER === # FROM node:24-alpine AS run RUN apk add --no-cache openssl FROM base AS run COPY --from=dep /home/node/app/ ./ COPY docker-start.sh ./ WORKDIR /home/node/app # --- prepare frontend --- ENV PORT=3000 ENV NODE_ENV=production ENV SERVE_FRONTEND=/home/node/app/frontend RUN mkdir -p frontend COPY --from=build /home/node/app/frontend/dist ./frontend/ RUN mkdir -p /home/node/app \ && chown -R node:node /home/node/app # --- prepare server --- USER node RUN mkdir -p backend COPY --from=build /home/node/app/backend/package.json ./backend/ COPY --from=build /home/node/app/backend/prisma ./backend/prisma COPY --from=build /home/node/app/backend/dist ./backend/dist # Production dependencies only. COPY --chown=node:node --from=prod-deps /home/node/app/package.json ./package.json COPY --chown=node:node --from=prod-deps /home/node/app/yarn.lock ./yarn.lock COPY --chown=node:node --from=prod-deps /home/node/app/.yarnrc.yml ./.yarnrc.yml COPY --chown=node:node --from=prod-deps /home/node/app/.yarn ./.yarn COPY --chown=node:node --from=prod-deps /home/node/app/node_modules ./node_modules COPY --chown=node:node --from=prod-deps /home/node/app/backend/package.json ./backend/package.json COPY --chown=node:node --from=prod-deps /home/node/app/frontend/package.json ./frontend/package.json # --- finalize --- # Built frontend. COPY --chown=node:node --from=build /home/node/app/frontend/dist ./frontend COPY --from=build /home/node/app/node_modules/.prisma ./node_modules/.prisma COPY --from=build /home/node/app/node_modules/@prisma ./node_modules/@prisma # Built backend. COPY --chown=node:node --from=build /home/node/app/backend/dist ./backend/dist COPY --chown=node:node --from=build /home/node/app/backend/prisma ./backend/prisma # set runtime env variables # Prisma generated client from the build stage. COPY --chown=node:node --from=build /home/node/app/node_modules/.prisma ./node_modules/.prisma COPY --chown=node:node --from=build /home/node/app/node_modules/@prisma ./node_modules/@prisma ENV PORT=3000 ENV NODE_ENV=production ENV SERVE_FRONTEND=/home/node/app/frontend COPY --chown=node:node docker-start.sh ./docker-start.sh EXPOSE 3000 ENTRYPOINT [ "/bin/sh" ] CMD [ "./docker-start.sh" ] No newline at end of file ENTRYPOINT ["/bin/sh", "./docker-start.sh"] No newline at end of file README.md +15 −0 Original line number Diff line number Diff line Loading @@ -3,3 +3,18 @@ Providing a central OpenID Connect service for Fediverse identification Leverages OpenID Connect Auto Discovery & Dynamic Client Registration ## Development Environment - frontend: copy `frontend/example.env` to `frontend/.env` - backend: copy `backend/example.env` to `backend/.env` - backend: run `yarn workspace @fediverse-auth/backend prisma migrate dev` - `yarn start frontend:dev` - `yarn start backend:dev` ## Deployment - copy `example.env.local` to `.env.local` (and configure) - create `secrets/cookies.json` and put a random string in an array (eg `["super secret string do not share me or use this"]`) - `yarn script:setup-jwks` - `docker compose up -d --build` backend/package.json +24 −24 Original line number Diff line number Diff line Loading @@ -6,38 +6,38 @@ "private": true, "type": "module", "dependencies": { "@fedify/express": "^0.2.0", "@fedify/express": "^0.2.1", "@fedify/fedify": "patch:@fedify/fedify@npm%3A1.10.0#~/.yarn/patches/@fedify-fedify-npm-1.10.0-eb96e7364a.patch", "@fedify/redis": "^1.9.1", "@fedify/redis": "^1.10.10", "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^0.9.1", "@prisma/client": "^5.13.0", "@sc07/fedi-testkit": "^1.0.3", "@tsconfig/recommended": "^1.0.6", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "cron": "^4.3.0", "express": "^4.22.1", "express-session": "^1.18.0", "ioredis": "^5.6.1", "@logtape/logtape": "^0.9.2", "@prisma/client": "^5.22.0", "@sc07/fedi-testkit": "^1.0.4", "@tsconfig/recommended": "^1.0.13", "body-parser": "^1.20.5", "cookie-parser": "^1.4.7", "cors": "^2.8.6", "cron": "^4.4.0", "express": "^4.22.2", "express-session": "^1.19.0", "ioredis": "^5.11.0", "oidc-provider": "^8.8.1", "openid-client": "^5.6.5", "string-strip-html": "^13.4.12" "openid-client": "^5.7.1", "string-strip-html": "^13.5.3" }, "devDependencies": { "@hongminhee/localtunnel": "^0.3.0", "@types/cookie-parser": "^1.4.7", "@types/cors": "^2.8.17", "@types/cookie-parser": "^1.4.10", "@types/cors": "^2.8.19", "@types/express": "^4.17.25", "@types/express-session": "^1.18.2", "@types/node": "^20.12.10", "@types/oidc-provider": "^8.4.4", "dotenv": "^16.4.5", "prisma": "^5.13.0", "tsx": "^4.9.3", "@types/express-session": "^1.19.0", "@types/node": "^20.19.41", "@types/oidc-provider": "^8.8.1", "dotenv": "^16.6.1", "prisma": "^5.22.0", "tsx": "^4.22.4", "typescript": "^5.9.3", "vitest": "^4.0.15" "vitest": "^4.1.8" }, "scripts": { "dev": "tsx watch -r dotenv/config src/index.ts", Loading docker-compose.yml +1 −1 Original line number Diff line number Diff line services: fedi-auth: app: image: sc07/fediverse-auth build: . ports: Loading Loading
.dockerignore +22 −10 Original line number Diff line number Diff line **/node_modules build data **/dist packages/build .git .gitignore node_modules backend/node_modules frontend/node_modules backend/dist frontend/dist .env .env.* !.env.example Dockerfile secrets docker-compose*.yml coverage .cache .tmp .DS_Store npm-debug.log* yarn-error.log* # dotfiles .git* .vscode **/.env* No newline at end of file scripts No newline at end of file
Dockerfile +52 −43 Original line number Diff line number Diff line # syntax=docker/dockerfile:1.7 FROM node:24-alpine AS base RUN apk add --no-cache openssl RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # --- dependencies --- RUN mkdir -p /home/node/app \ && chown -R node:node /home/node/app COPY --chown=node:node .yarn ./.yarn COPY --chown=node:node package.json yarn.lock .yarnrc.yml ./ COPY --chown=node:node backend/package.json ./backend/ COPY --chown=node:node frontend/package.json ./frontend/ RUN corepack enable && corepack prepare COPY --chown=node:node backend/package.json ./backend/package.json COPY --chown=node:node frontend/package.json ./frontend/package.json RUN corepack enable USER node FROM base AS dev_dep RUN yarn workspaces focus --all ENV YARN_CACHE_FOLDER=/home/node/.yarn-cache FROM base AS dep RUN yarn workspaces focus --production --all FROM base AS dev-deps # # === BUILDER === # RUN --mount=type=cache,target=/home/node/.yarn-cache,uid=1000,gid=1000 \ yarn workspaces focus --all FROM dev_dep AS build COPY --from=dev_dep /home/node/app/ ./ FROM base AS prod-deps COPY --chown=node:node . . RUN --mount=type=cache,target=/home/node/.yarn-cache,uid=1000,gid=1000 \ yarn workspaces focus --all --production # --- build frontend --- RUN yarn workspace @fediverse-auth/frontend run build FROM dev-deps AS build # --- build backend --- COPY --chown=node:node . . RUN yarn workspace @fediverse-auth/frontend run build \ && yarn workspace @fediverse-auth/backend prisma generate \ && yarn workspace @fediverse-auth/backend run build RUN yarn workspace @fediverse-auth/backend prisma generate RUN yarn workspace @fediverse-auth/backend run build # # === RUNNER === # FROM node:24-alpine AS run RUN apk add --no-cache openssl FROM base AS run COPY --from=dep /home/node/app/ ./ COPY docker-start.sh ./ WORKDIR /home/node/app # --- prepare frontend --- ENV PORT=3000 ENV NODE_ENV=production ENV SERVE_FRONTEND=/home/node/app/frontend RUN mkdir -p frontend COPY --from=build /home/node/app/frontend/dist ./frontend/ RUN mkdir -p /home/node/app \ && chown -R node:node /home/node/app # --- prepare server --- USER node RUN mkdir -p backend COPY --from=build /home/node/app/backend/package.json ./backend/ COPY --from=build /home/node/app/backend/prisma ./backend/prisma COPY --from=build /home/node/app/backend/dist ./backend/dist # Production dependencies only. COPY --chown=node:node --from=prod-deps /home/node/app/package.json ./package.json COPY --chown=node:node --from=prod-deps /home/node/app/yarn.lock ./yarn.lock COPY --chown=node:node --from=prod-deps /home/node/app/.yarnrc.yml ./.yarnrc.yml COPY --chown=node:node --from=prod-deps /home/node/app/.yarn ./.yarn COPY --chown=node:node --from=prod-deps /home/node/app/node_modules ./node_modules COPY --chown=node:node --from=prod-deps /home/node/app/backend/package.json ./backend/package.json COPY --chown=node:node --from=prod-deps /home/node/app/frontend/package.json ./frontend/package.json # --- finalize --- # Built frontend. COPY --chown=node:node --from=build /home/node/app/frontend/dist ./frontend COPY --from=build /home/node/app/node_modules/.prisma ./node_modules/.prisma COPY --from=build /home/node/app/node_modules/@prisma ./node_modules/@prisma # Built backend. COPY --chown=node:node --from=build /home/node/app/backend/dist ./backend/dist COPY --chown=node:node --from=build /home/node/app/backend/prisma ./backend/prisma # set runtime env variables # Prisma generated client from the build stage. COPY --chown=node:node --from=build /home/node/app/node_modules/.prisma ./node_modules/.prisma COPY --chown=node:node --from=build /home/node/app/node_modules/@prisma ./node_modules/@prisma ENV PORT=3000 ENV NODE_ENV=production ENV SERVE_FRONTEND=/home/node/app/frontend COPY --chown=node:node docker-start.sh ./docker-start.sh EXPOSE 3000 ENTRYPOINT [ "/bin/sh" ] CMD [ "./docker-start.sh" ] No newline at end of file ENTRYPOINT ["/bin/sh", "./docker-start.sh"] No newline at end of file
README.md +15 −0 Original line number Diff line number Diff line Loading @@ -3,3 +3,18 @@ Providing a central OpenID Connect service for Fediverse identification Leverages OpenID Connect Auto Discovery & Dynamic Client Registration ## Development Environment - frontend: copy `frontend/example.env` to `frontend/.env` - backend: copy `backend/example.env` to `backend/.env` - backend: run `yarn workspace @fediverse-auth/backend prisma migrate dev` - `yarn start frontend:dev` - `yarn start backend:dev` ## Deployment - copy `example.env.local` to `.env.local` (and configure) - create `secrets/cookies.json` and put a random string in an array (eg `["super secret string do not share me or use this"]`) - `yarn script:setup-jwks` - `docker compose up -d --build`
backend/package.json +24 −24 Original line number Diff line number Diff line Loading @@ -6,38 +6,38 @@ "private": true, "type": "module", "dependencies": { "@fedify/express": "^0.2.0", "@fedify/express": "^0.2.1", "@fedify/fedify": "patch:@fedify/fedify@npm%3A1.10.0#~/.yarn/patches/@fedify-fedify-npm-1.10.0-eb96e7364a.patch", "@fedify/redis": "^1.9.1", "@fedify/redis": "^1.10.10", "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^0.9.1", "@prisma/client": "^5.13.0", "@sc07/fedi-testkit": "^1.0.3", "@tsconfig/recommended": "^1.0.6", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "cron": "^4.3.0", "express": "^4.22.1", "express-session": "^1.18.0", "ioredis": "^5.6.1", "@logtape/logtape": "^0.9.2", "@prisma/client": "^5.22.0", "@sc07/fedi-testkit": "^1.0.4", "@tsconfig/recommended": "^1.0.13", "body-parser": "^1.20.5", "cookie-parser": "^1.4.7", "cors": "^2.8.6", "cron": "^4.4.0", "express": "^4.22.2", "express-session": "^1.19.0", "ioredis": "^5.11.0", "oidc-provider": "^8.8.1", "openid-client": "^5.6.5", "string-strip-html": "^13.4.12" "openid-client": "^5.7.1", "string-strip-html": "^13.5.3" }, "devDependencies": { "@hongminhee/localtunnel": "^0.3.0", "@types/cookie-parser": "^1.4.7", "@types/cors": "^2.8.17", "@types/cookie-parser": "^1.4.10", "@types/cors": "^2.8.19", "@types/express": "^4.17.25", "@types/express-session": "^1.18.2", "@types/node": "^20.12.10", "@types/oidc-provider": "^8.4.4", "dotenv": "^16.4.5", "prisma": "^5.13.0", "tsx": "^4.9.3", "@types/express-session": "^1.19.0", "@types/node": "^20.19.41", "@types/oidc-provider": "^8.8.1", "dotenv": "^16.6.1", "prisma": "^5.22.0", "tsx": "^4.22.4", "typescript": "^5.9.3", "vitest": "^4.0.15" "vitest": "^4.1.8" }, "scripts": { "dev": "tsx watch -r dotenv/config src/index.ts", Loading
docker-compose.yml +1 −1 Original line number Diff line number Diff line services: fedi-auth: app: image: sc07/fediverse-auth build: . ports: Loading