diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..53b039d --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,46 @@ +name: Build and Deploy + +on: + push: + branches: [master] + +jobs: + build-deploy: + runs-on: ubuntu-latest + container: + image: oven/bun:latest + volumes: + - /opt/todo3:/deploy + steps: + - name: Install Docker CLI + run: apt-get update && apt-get install -y docker.io docker-compose + + - uses: actions/checkout@v4 + + - name: Copy source to deploy directory + run: | + rm -rf /deploy/build + cp -r . /deploy/build + + - name: Create .env file + working-directory: /deploy/build + run: | + cat > .env << 'EOF' + PUBLIC_WS_URL=${{ vars.PUBLIC_WS_URL }} + HOST=${{ vars.HOST }} + FE_PORT=${{ vars.FE_PORT }} + BE_PORT=${{ vars.BE_PORT }} + JWT_SECRET=${{ secrets.JWT_SECRET }} + SIGNUP_SECRET=${{ secrets.SIGNUP_SECRET }} + ADMIN_EMAIL=${{ vars.ADMIN_EMAIL }} + DATA_DIR=/opt/todo3/data + EOF + + - name: Build and deploy + working-directory: /deploy/build + run: | + docker-compose build + docker-compose up -d + + - name: Cleanup + run: rm -rf /deploy/build diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..00c0c7d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +FROM oven/bun:latest AS base +WORKDIR /app + +FROM base AS deps +COPY package.json bun.lockb ./ +COPY packages/fe/package.json packages/fe/ +COPY packages/be/package.json packages/be/ +RUN bun install --frozen-lockfile + +FROM deps AS fe-build +COPY packages/fe packages/fe +COPY packages/be/src/websocket/types.ts packages/be/src/websocket/types.ts +COPY tsconfig.json . +ARG PUBLIC_WS_URL +ENV PUBLIC_WS_URL=$PUBLIC_WS_URL +RUN bun run --filter fe build + +FROM base AS frontend +WORKDIR /app/packages/fe +COPY --from=deps /app/node_modules /app/node_modules +COPY --from=deps /app/packages/fe/node_modules ./node_modules +COPY --from=fe-build /app/packages/fe/dist ./dist +COPY packages/fe/package.json packages/fe/vite.config.ts ./ +CMD ["bun", "run", "start"] + +FROM base AS backend +WORKDIR /app/packages/be +COPY --from=deps /app/node_modules /app/node_modules +COPY --from=deps /app/packages/be/node_modules ./node_modules +COPY packages/be ./ +CMD ["bun", "run", "start"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e280f3a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +services: + fe: + build: + context: . + target: frontend + args: + PUBLIC_WS_URL: ${PUBLIC_WS_URL} + ports: + - "${FE_PORT}:4173" + environment: + HOST: ${HOST} + restart: unless-stopped + + be: + build: + context: . + target: backend + ports: + - "${BE_PORT}:3000" + environment: + JWT_SECRET: ${JWT_SECRET} + SIGNUP_SECRET: ${SIGNUP_SECRET} + ADMIN_EMAIL: ${ADMIN_EMAIL} + DB_PATH: /data/db.sqlite + volumes: + - ${DATA_DIR:-./data}:/data + restart: unless-stopped diff --git a/packages/be/src/db/index.ts b/packages/be/src/db/index.ts index 0845e2b..3e752d8 100644 --- a/packages/be/src/db/index.ts +++ b/packages/be/src/db/index.ts @@ -1,3 +1,3 @@ import { Database } from 'bun:sqlite'; -export const db = new Database('db.sqlite'); +export const db = new Database(process.env.DB_PATH ?? 'db.sqlite');