From d050fcececa58fe880c5472f5297bc8636f81fe8 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Sat, 22 Feb 2025 10:29:55 +1100 Subject: [PATCH] Makefile --- Dockerfile | 20 ++++++---- Makefile | 67 +++++++++++++++++++++----------- docker-compose.yml | 28 +++---------- src/astro-typesafe-api-caller.ts | 50 ++++++++++++------------ 4 files changed, 86 insertions(+), 79 deletions(-) diff --git a/Dockerfile b/Dockerfile index d76f08a7..eefa60ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,16 @@ -FROM oven/bun:1.0.23 +FROM postgres:latest +ENV POSTGRES_USER ${POSTGRES_USER} +ENV POSTGRES_PASSWORD ${POSTGRES_PASSWORD} +ENV POSTGRES_DB ${POSTGRES_DB} -EXPOSE 3000 +COPY ./prisma/migrations/ /docker-entrypoint-initdb.d/ -WORKDIR /online-energieausweis -COPY ./package.json ./ -COPY . . -RUN bun install --prod +EXPOSE 5432 -CMD ["bun", "run", "build:production"] \ No newline at end of file +# Use a loop to copy migration.sql from each folder to the corresponding directory in the build context +RUN for folder in /docker-entrypoint-initdb.d/*; do \ + if [ -d "$folder" ]; then \ + cp "$folder/migration.sql" "$folder.sql"; \ + rm -rf "$folder"; \ + fi \ +done \ No newline at end of file diff --git a/Makefile b/Makefile index 26bfb791..37b790f3 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,59 @@ -.PHONY: dev database online-energieausweis all prod bun-install-database # api bun-install-api +.PHONY: dev online-energieausweis all prod backup run-database build-database install-dependencies wait-for-database prod database + +DB_CONTAINER_NAME := database +DB_NAME := main +DB_USER := main +DB_PASSWORD := hHMP8cd^N3SnzGRR +DB_PORT := 5432 +DB_VOLUME := postgres_data +PERSISTENT_DIR := $(HOME)/persistent/$(APP_NAME) +BACKUP_FILENAME := $(HOME)/backups/$(shell date +"%Y-%m-%d_%H-%M-%S").sql.gz online-energieausweis: bun run dev --host -dev: database online-energieausweis # api +dev: install-dependencies database online-energieausweis database: - $(MAKE) -C ../database dev + docker compose up -bun-install-database: - cd ../database - bun link +backup: + mkdir -p $(PERSISTENT_DIR) + - docker exec -t $(DB_CONTAINER_NAME) pg_dump --data-only -U $(DB_USER) $(DB_NAME) | gzip > $(BACKUP_FILENAME) + +rundatabase: stop_database + docker volume rm -f $(DB_VOLUME) + docker volume create $(DB_VOLUME) + docker build -t $(DB_CONTAINER_NAME) . + docker run -d --name $(DB_CONTAINER_NAME) \ + -e POSTGRES_USER=$(DB_USER) \ + -e POSTGRES_PASSWORD=$(DB_PASSWORD) \ + -p $(DB_PORT):5432 \ + -v $(DB_VOLUME):/var/lib/postgresql/data \ + -v $(PERSISTENT_DIR):/persistent \ + $(DB_CONTAINER_NAME) + +stop-database: + -docker stop $(DB_CONTAINER_NAME) + -docker rm $(DB_CONTAINER_NAME) + +wait-fordatabase: + @while ! docker exec $(DB_CONTAINER_NAME) pg_isready -U $(DB_USER) -h localhost -p $(DB_PORT) > /dev/null 2>&1; do \ + sleep 1; \ + done + +restore-backup: + gunzip -c $(BACKUP_FILENAME) | docker exec -i $(DB_CONTAINER_NAME) psql -U $(DB_USER) -d postgres + +install-dependencies: bun install -# bun-install-api: bun-install-database -# cd ../api -# bun install -# bun link @ibcornelsen/database - -# api: -# $(MAKE) -C ../api dev - all: mkdir -p ~/logs bun run dev 2>&1 | tee ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log -prod: bun-install-database # bun-install-api +prod: install-dependencies run-database + bun run build mkdir -p ~/logs mkdir -p ~/persistent/online-energieausweis @@ -35,13 +63,6 @@ prod: bun-install-database # bun-install-api $(MAKE) prod; \ cd ../online-energieausweis; \ fi - -# Auch die API sollte bereits laufen -# @if [ $$(pm2 pid api) -eq "0" ]; then \ -# cd ../api; \ -# $(MAKE) prod; \ -# cd ../online-energieausweis; \ -# fi - rm -f ~/online-energieausweis/.env; - touch ~/online-energieausweis/.env; @@ -49,4 +70,4 @@ prod: bun-install-database # bun-install-api - echo "CERTIFICATE=$(cat /etc/letsencrypt/live/ibcornelsen.de/fullchain.pem | base64 | tr -d '\n')" >> ~/online-energieausweis/.env; - pm2 delete online-energieausweis - pm2 start --name "online-energieausweis" --log ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log --time bun -- astro dev \ No newline at end of file + pm2 start --name "online-energieausweis" --log ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log --time bun -- run ./server.ts \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index a97dbbbb..a0485abf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,8 @@ version: '3' - services: - ibcornelsen-online-energieausweis: - build: ./ - command: bun run dev --host - environment: - PORT: 3000 - NODE_ENV: "development" - ports: - - "3000:3000" - volumes: - - ./:/online-energieausweis - - ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui - - ./node_modules/@ibcornelsen/database:/online-energieausweis/node_modules/@ibcornelsen/database - # - ./node_modules/@ibcornelsen/api:/online-energieausweis/node_modules/@ibcornelsen/api - - ./node_modules/radix-svelte-icons:/online-energieausweis/node_modules/radix-svelte-icons - - ../api/persistent:/persistent - ibcornelsen-api: - extends: - file: ../api/docker-compose.yml - service: ibcornelsen-api database: - extends: - file: ../database/docker-compose.yml - service: database \ No newline at end of file + build: ./ + env_file: + - .env + ports: + - 5432:5432 \ No newline at end of file diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 7d92f2a2..3b30b98b 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -5,9 +5,33 @@ export const createCaller = createCallerFactory({ "klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"), "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "unterlage": await import("../src/pages/api/unterlage.ts"), + "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), + "ausweise": await import("../src/pages/api/ausweise/index.ts"), + "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), + "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), + "geg-nachweis-wohnen/[uid]": await import("../src/pages/api/geg-nachweis-wohnen/[uid].ts"), + "geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"), + "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), + "geg-nachweis-gewerbe/[uid]": await import("../src/pages/api/geg-nachweis-gewerbe/[uid].ts"), + "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"), + "objekt": await import("../src/pages/api/objekt/index.ts"), + "rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"), + "rechnung": await import("../src/pages/api/rechnung/index.ts"), + "user": await import("../src/pages/api/user/index.ts"), + "user/self": await import("../src/pages/api/user/self.ts"), + "ticket": await import("../src/pages/api/ticket/index.ts"), + "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), + "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), + "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), + "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), + "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), + "aufnahme/[uid]/bilder": await import("../src/pages/api/aufnahme/[uid]/bilder.ts"), + "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid]/index.ts"), + "aufnahme/[uid]/unterlagen": await import("../src/pages/api/aufnahme/[uid]/unterlagen.ts"), + "objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"), "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"), "admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"), "admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"), @@ -15,30 +39,4 @@ export const createCaller = createCallerFactory({ "admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"), "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), - "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), - "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), - "ausweise": await import("../src/pages/api/ausweise/index.ts"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), - "geg-nachweis-gewerbe/[uid]": await import("../src/pages/api/geg-nachweis-gewerbe/[uid].ts"), - "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"), - "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), - "geg-nachweis-gewerbe/[uid]": await import("../src/pages/api/geg-nachweis-gewerbe/[uid].ts"), - "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"), - "geg-nachweis-wohnen/[uid]": await import("../src/pages/api/geg-nachweis-wohnen/[uid].ts"), - "geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"), - "objekt": await import("../src/pages/api/objekt/index.ts"), - "ticket": await import("../src/pages/api/ticket/index.ts"), - "rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"), - "rechnung": await import("../src/pages/api/rechnung/index.ts"), - "user": await import("../src/pages/api/user/index.ts"), - "user/self": await import("../src/pages/api/user/self.ts"), - "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), - "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), - "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), - "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), - "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), - "aufnahme/[uid]/bilder": await import("../src/pages/api/aufnahme/[uid]/bilder.ts"), - "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid]/index.ts"), - "aufnahme/[uid]/unterlagen": await import("../src/pages/api/aufnahme/[uid]/unterlagen.ts"), - "objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"), }) \ No newline at end of file