From aaa85e99cbb86debf4b663ad917a45863057ad6d Mon Sep 17 00:00:00 2001 From: Martin Berg Alstad Date: Sun, 26 Jan 2025 17:41:44 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=8B=20Docker=20and=20Gitea=20Workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Moved tsx to dependencies as node TS support is 💩 - Renamed start-once to run-once - TODOs --- .dockerignore | 10 ++++++++++ .gitea/workflows/deploy.yml | 34 ++++++++++++++++++++++++++++++++++ Dockerfile | 11 +++++++++++ README.md | 2 +- docker-compose.yml | 22 ++++++++++++++++++++++ package.json | 7 ++++--- pnpm-lock.yaml | 6 +++--- src/main.ts | 4 ++++ 8 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitea/workflows/deploy.yml create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..89fbfbb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.cache +.idea +httpRequests +.env.* +*.sqlite +jest.config.ts +node_modules +.git +.gitignore +*.md \ No newline at end of file diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..83b1a9b --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,34 @@ +name: Deploy application + +on: + push: + branches: [ main ] + +jobs: + deploy: + runs-on: host + + env: + # Actual budget + ACTUAL_BUDGET_ID: ${{ secrets.ACTUAL_BUDGET_ID }} + ACTUAL_SYNC_ID: ${{ secrets.ACTUAL_SYNC_ID }} + ACTUAL_SERVER_URL: ${{ secrets.ACTUAL_SERVER_URL }} + ACTUAL_PASSWORD: ${{ secrets.ACTUAL_PASSWORD }} + ACTUAL_ACCOUNT_IDS: ${{ secrets.ACTUAL_ACCOUNT_IDS }} + ACTUAL_DATA_DIR: ${{ var.ACTUAL_DATA_DIR }} + # Bank + BANK_INITIAL_REFRESH_TOKEN: ${{ secrets.BANK_INITIAL_REFRESH_TOKEN }} + BANK_OAUTH_CLIENT_ID: ${{ secrets.BANK_OAUTH_CLIENT_ID }} + BANK_OAUTH_CLIENT_SECRET: ${{ secrets.BANK_OAUTH_CLIENT_SECRET }} + BANK_OAUTH_STATE: ${{ secrets.BANK_OAUTH_STATE }} + BANK_OAUTH_REDIRECT_URI: ${{ secrets.BANK_OAUTH_REDIRECT_URI }} + BANK_ACCOUNT_IDS: ${{ secrets.BANK_ACCOUNT_IDS }} + # Configuration + LOG_LEVEL: ${{ var.LOG_LEVEL }} + DB_FILENAME: ${{ var.DB_FILENAME }} + + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Run docker-compose + run: docker compose up -d --build diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d3f61f1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM node:22-slim +LABEL authors="Martin Berg Alstad" + +COPY . . + +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile + +CMD ["pnpm", "start-prod"] \ No newline at end of file diff --git a/README.md b/README.md index 9c5161d..1876f5d 100644 --- a/README.md +++ b/README.md @@ -24,5 +24,5 @@ pnpm start Start the application without a CronJob, it will run once, then shutdown. ```shell -pnpm start-once +pnpm run-once ``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5dc7cd2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +services: + # TODO Database in storage + server: + container_name: actual_budget_sparebank1 + restart: no # TODO unless-stopped + build: + context: . + environment: + - ACTUAL_BUDGET_ID + - ACTUAL_SYNC_ID + - ACTUAL_SERVER_URL + - ACTUAL_PASSWORD + - ACTUAL_ACCOUNT_IDS + - ACTUAL_DATA_DIR + - BANK_INITIAL_REFRESH_TOKEN + - BANK_OAUTH_CLIENT_ID + - BANK_OAUTH_CLIENT_SECRET + - BANK_OAUTH_STATE + - BANK_OAUTH_REDIRECT_URI + - BANK_ACCOUNT_IDS + - LOG_LEVEL + - DB_FILENAME diff --git a/package.json b/package.json index 48a5ed9..83558ba 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "preinstall": "npx only-allow pnpm", "start": "dotenvx run --env-file=.env.local -- node --import=tsx ./src/main.ts | pino-pretty", - "start-once": "ONCE=true dotenvx run --env-file=.env.local -- node --import=tsx ./src/main.ts | pino-pretty", + "start-prod": "node --import=tsx ./src/main.ts", + "run-once": "ONCE=true dotenvx run --env-file=.env.local -- node --import=tsx ./src/main.ts | pino-pretty", "test": "dotenvx run --env-file=.env.test.local -- node --experimental-vm-modules node_modules/jest/bin/jest.js | pino-pretty", "format": "prettier --write \"./**/*.{js,mjs,ts,md,json}\"" }, @@ -21,7 +22,8 @@ "dayjs": "^1.11.13", "dotenv": "^16.4.7", "pino": "^9.6.0", - "prettier": "^3.4.2" + "prettier": "^3.4.2", + "tsx": "^4.19.2" }, "devDependencies": { "@jest/globals": "^29.7.0", @@ -32,7 +34,6 @@ "pino-pretty": "^13.0.0", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", - "tsx": "^4.19.2", "typescript": "^5.7.3" }, "prettier": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7459aec..8afb873 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: prettier: specifier: ^3.4.2 version: 3.4.2 + tsx: + specifier: ^4.19.2 + version: 4.19.2 devDependencies: '@jest/globals': specifier: ^29.7.0 @@ -57,9 +60,6 @@ importers: ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.10.7)(typescript@5.7.3) - tsx: - specifier: ^4.19.2 - version: 4.19.2 typescript: specifier: ^5.7.3 version: 5.7.3 diff --git a/src/main.ts b/src/main.ts index 75fd32b..2f1eaef 100644 --- a/src/main.ts +++ b/src/main.ts @@ -19,6 +19,10 @@ import * as fs from "node:fs" import { CronJob } from "cron" // TODO Transports api for pino https://github.com/pinojs/pino/blob/HEAD/docs/transports.md +// TODO create Dockerfile and docker-compose.yml +// TODO Gitea workflow +// TODO move tsx to devDependency. Requires ts support for Node with support for @ alias +// TODO global exception handler, log and graceful shutdown export async function daily(actual: Actual, bank: Bank): Promise { // Fetch transactions from the bank