From 2a1f73345c42f3b6e101c7ed2aacf0bcf93803ea Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sun, 12 Nov 2023 01:02:26 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20Improve=20dockerfile=20and=20sta?= =?UTF-8?q?rt=20script=20and=20fix=20permission=20issue=20by=20adding=20ne?= =?UTF-8?q?w=20user=20with=20permission=20to=20read=20/=20write=20to=20/da?= =?UTF-8?q?ta=20folder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 30 +++++++++++++++++++++++++---- {src => drizzle/migrate}/migrate.ts | 5 ++++- drizzle/migrate/package.json | 13 +++++++++++++ package.json | 4 ++-- scripts/run.sh | 19 +----------------- yarn.lock | 4 ++-- 6 files changed, 48 insertions(+), 27 deletions(-) rename {src => drizzle/migrate}/migrate.ts (79%) create mode 100644 drizzle/migrate/package.json diff --git a/Dockerfile b/Dockerfile index 621472736..e886469c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,11 @@ FROM node:20.5-slim WORKDIR /app +ARG UID=1001 +ARG GID=1001 +RUN groupadd -g $GID homarr-group +RUN useradd -r -u $UID -g $GID homarr + # Define node.js environment variables ARG PORT=7575 @@ -18,17 +23,30 @@ COPY .next/standalone ./ COPY .next/static ./.next/static COPY ./scripts/run.sh ./scripts/run.sh COPY ./drizzle ./drizzle + +COPY ./drizzle/migrate ./migrate +COPY ./tsconfig.json ./migrate/tsconfig.json + RUN mkdir /data -COPY ./src/migrate.ts ./src/migrate.ts +RUN chown -R homarr:homarr-group /data # Install dependencies RUN apt-get update -y && apt-get install -y openssl wget -# Required for migration +# Move node_modules to temp location to avoid overwriting RUN mv node_modules _node_modules RUN rm package.json -RUN yarn add typescript ts-node dotenv drizzle-orm@0.28.6 better-sqlite3@8.6.0 @types/better-sqlite3 -RUN mv node_modules node_modules_migrate + +# Install dependencies for migration +RUN cp ./migrate/package.json ./package.json +RUN yarn + +# Copy better_sqlite3 build for current platform +RUN cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node + +# Copy node_modules for migration to migrate folder for migration script +RUN mv node_modules ./migrate/node_modules +# Copy temp node_modules of app to app folder RUN mv _node_modules node_modules # Expose the default application port @@ -43,4 +61,8 @@ ENV NEXTAUTH_SECRET NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT} || exit 1 +USER homarr + CMD ["sh", "./scripts/run.sh"] + +# TEMPORARY: "db:migrate": "ts-node ./migrate.ts ../drizzle" \ No newline at end of file diff --git a/src/migrate.ts b/drizzle/migrate/migrate.ts similarity index 79% rename from src/migrate.ts rename to drizzle/migrate/migrate.ts index 5c4abeb88..19ef33fac 100644 --- a/src/migrate.ts +++ b/drizzle/migrate/migrate.ts @@ -5,6 +5,9 @@ import dotenv from 'dotenv'; import { drizzle } from 'drizzle-orm/better-sqlite3'; import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; +// TODO: Remove +// const migrationsFolder = process.argv[2] ?? './drizzle'; + dotenv.config({ path: __dirname + '/../.env' }); const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', '')); @@ -12,7 +15,7 @@ const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', '')); const db = drizzle(sqlite); const migrateDatabase = async () => { - await migrate(db, { migrationsFolder: './drizzle' }); + await migrate(db, { migrationsFolder: '../drizzle' }); }; migrateDatabase(); diff --git a/drizzle/migrate/package.json b/drizzle/migrate/package.json new file mode 100644 index 000000000..81e54f623 --- /dev/null +++ b/drizzle/migrate/package.json @@ -0,0 +1,13 @@ +{ + "scripts": { + "db:migrate": "ts-node ./migrate.ts" + }, + "dependencies": { + "@types/better-sqlite3": "^7.6.7", + "better-sqlite3": "8.6.0", + "drizzle-orm": "^0.28.6", + "dotenv": "^16.3.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} \ No newline at end of file diff --git a/package.json b/package.json index 9a480b3da..40e1b635a 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "test:coverage": "SKIP_ENV_VALIDATION=1 vitest run --coverage", "docker:build": "turbo build && docker build . -t homarr:local-dev", "docker:start": "docker run -p 7575:7575 --name homarr-development homarr:local-dev", - "db:migrate": "ts-node src/migrate.ts" + "db:migrate": "ts-node drizzle/migrate/migrate.ts" }, "dependencies": { "@auth/drizzle-adapter": "^0.3.2", @@ -232,4 +232,4 @@ ] } } -} +} \ No newline at end of file diff --git a/scripts/run.sh b/scripts/run.sh index 61deab801..01e80d0e8 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -2,28 +2,11 @@ echo "Exporting hostname..." export NEXTAUTH_URL_INTERNAL="http://$HOSTNAME:7575" -rm -rf _node_modules -mv node_modules _node_modules -rm -rf node_modules -mv node_modules_migrate node_modules echo "Migrating database..." -yarn ts-node src/migrate.ts & PID=$! +cd ./migrate; yarn db:migrate & PID=$! # Wait for migration to finish wait $PID -echo "Reverting to production node_modules..." -# Copy specific sqlite3 binary to node_modules -cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node - -# Remove node_modules and copy cached node_modules -rm -rf node_modules_migrate -mv node_modules node_modules_migrate -rm -rf node_modules -mv _node_modules node_modules - -cp ./temp_package.json package.json -cp ./temp_yarn.lock yarn.lock - echo "Starting production server..." node /app/server.js \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0979a03e7..610855e04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7152,7 +7152,7 @@ __metadata: rss-parser: ^3.12.0 sabnzbd-api: ^1.5.0 sass: ^1.56.1 - ts-node: latest + ts-node: ^10.9.1 turbo: ^1.10.12 typescript: 5.1.6 uuid: ^9.0.0 @@ -11590,7 +11590,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:latest": +"ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: