From c3facfddd1d5cbeac9527a75cadad61d0b10aa0a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 12 Jun 2025 22:05:39 +0000 Subject: [PATCH 1/4] Update dependency koa-compress to v5.1.1 --- yarn.lock | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index eb2f01c..d13c92b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1659,11 +1659,16 @@ busboy@^0.3.0: dependencies: dicer "0.3.0" -bytes@3.1.0, bytes@^3.0.0, bytes@^3.1.0: +bytes@3.1.0, bytes@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + cacache@^12.0.2: version "12.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" @@ -2097,7 +2102,7 @@ component-emitter@^1.2.0, component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compressible@^2.0.0: +compressible@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -2546,7 +2551,7 @@ depd@2.0.0, depd@^2.0.0, depd@~2.0.0: depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== des.js@^1.0.0: version "1.0.1" @@ -3987,7 +3992,7 @@ http-errors@1.7.3, http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@^1.8.0: +http-errors@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== @@ -4753,15 +4758,14 @@ koa-compose@^4.1.0: integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== koa-compress@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-5.1.0.tgz#7b9fe24f4c1b28d9cae90864597da472c2fcf701" - integrity sha512-G3Ppo9jrUwlchp6qdoRgQNMiGZtM0TAHkxRZQ7EoVvIG8E47J4nAsMJxXHAUQ+0oc7t0MDxSdONWTFcbzX7/Bg== + version "5.1.1" + resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-5.1.1.tgz#4f1599cfcaab23de1cd97d0a0ff9b5d05b0ffa52" + integrity sha512-UgMIN7ZoEP2DuoSQmD6CYvFSLt0NReGlc2qSY4bO4Oq0L56OiD9pDG41Kj/zFmVY/A3Wvmn4BqKcfq5H30LGIg== dependencies: - bytes "^3.0.0" - compressible "^2.0.0" - http-errors "^1.8.0" + bytes "^3.1.2" + compressible "^2.0.18" + http-errors "^1.8.1" koa-is-json "^1.0.0" - statuses "^2.0.1" koa-convert@^2.0.0: version "2.0.0" @@ -4814,7 +4818,7 @@ koa-helmet@^5.2.0: koa-is-json@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" - integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= + integrity sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw== koa-logger@~3.2.1: version "3.2.1" @@ -5287,11 +5291,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +"mime-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.26, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" @@ -7466,12 +7475,7 @@ statsy@~0.2.0: "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0, statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -statuses@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== stream-browserify@^2.0.1: version "2.0.2" From 677dfe25afe72c295962b9623710d24c7bc75ae1 Mon Sep 17 00:00:00 2001 From: Jonathan Cremin Date: Fri, 13 Jun 2025 09:32:37 +0100 Subject: [PATCH 2/4] Fix tests, run against ci --- .envrc.example | 25 +++++++ .forgejo/workflows/build-image.yml | 40 ---------- .forgejo/workflows/ci.yml | 85 ++++++++++++++++++++++ .gitignore | 3 +- Makefile | 22 +++--- web/lib/auth.js | 113 +++++++++++++---------------- 6 files changed, 175 insertions(+), 113 deletions(-) create mode 100644 .envrc.example delete mode 100644 .forgejo/workflows/build-image.yml create mode 100644 .forgejo/workflows/ci.yml diff --git a/.envrc.example b/.envrc.example new file mode 100644 index 0000000..ce12b2f --- /dev/null +++ b/.envrc.example @@ -0,0 +1,25 @@ +export DEBUG="hostr*" + +export NODE_ENV=development +export PORT=4040 +export WEB_BASE_URL=http://localhost:$PORT +export API_BASE_URL=$WEB_BASE_URL/api +export UPLOAD_STORAGE_PATH=$HOME/.hostr/uploads +export COOKIE_KEY=INSECURE +export EMAIL_FROM= +export EMAIL_NAME= + +export STATSD_HOST=localhost +export DATABASE_URL=postgresql://hostr:hostr@database:5432/hostr +export REDIS_URL=redis://localhost:6379 +export SENDGRID_KEY= +export STRIPE_SECRET_KEY= +export STRIPE_PUBLIC_KEY= + +# optional, some functionality will be disabled +export AWS_ENDPOINT= # only for AWS-like providers, not AWS +export AWS_ACCESS_KEY_ID= +export AWS_SECRET_ACCESS_KEY= +export AWS_BUCKET= +export VIRUSTOTAL_KEY= +export SENTRY_DSN= diff --git a/.forgejo/workflows/build-image.yml b/.forgejo/workflows/build-image.yml deleted file mode 100644 index 82fa8f7..0000000 --- a/.forgejo/workflows/build-image.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: ci - -on: - push: - branches: main - pull_request: - types: [opened, synchronize, reopened] -jobs: - build-image: - runs-on: self-hosted - steps: - - name: Set current date as env variable - run: echo "NOW=$(date +'%Y%m%d-%H%M%S')" >> $GITHUB_ENV - - name: Fix for bad os check - run: echo "RUNNER_OS=Linux" >> $GITHUB_ENV - - name: Login to Forgejo Registry - uses: https://cremin.dev/actions/podman-login@v1 - with: - registry: cremin.dev - username: ${{ github.actor }} - password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} - - name: Check out repository - uses: https://cremin.dev/actions/checkout@v4 - - name: Build image - uses: https://cremin.dev/actions/buildah-build@v2 - with: - containerfiles: ./Containerfile - context: ./ - oci: true - layers: true - image: hostr - tags: latest ${{ github.sha }} - - name: Push image - uses: https://cremin.dev/actions/push-to-registry@v2 - with: - registry: cremin.dev/jonathan - username: ${{ github.actor }} - password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} - image: hostr - tags: latest ${{ github.sha }} diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml new file mode 100644 index 0000000..61d221e --- /dev/null +++ b/.forgejo/workflows/ci.yml @@ -0,0 +1,85 @@ +name: ci + +on: + push: + branches: [main] + pull_request: + types: [opened, synchronize, reopened] + +services: + database: + image: postgres:10-alpine + env: + POSTGRES_PASSWORD: hostr + POSTGRES_USER: hostr + POSTGRES_DB: hostr + ports: + - 5432:5432 + redis: + image: redis:4.0.2-alpine + ports: + - 6379:6379 + minio: + image: minio/minio + env: + MINIO_ACCESS_KEY: 7HYV3KPRGQ8Z5YCDNWC6 + MINIO_SECRET_KEY: 0kWP/ZkgIwQzgL9t4SGv9Uc93rO//OdyqMH329b/ + ports: + - 9000:9000 + cmd: server /export + +jobs: + build-image: + runs-on: self-hosted + steps: + - name: Set current date as env variable + run: echo "NOW=$(date +'%Y%m%d-%H%M%S')" >> $GITHUB_ENV + - name: Fix for bad os check + run: echo "RUNNER_OS=Linux" >> $GITHUB_ENV + - name: Login to Forgejo Registry + uses: https://cremin.dev/actions/podman-login@v1 + with: + registry: cremin.dev + username: ${{ github.actor }} + password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} + - name: Check out repository + uses: https://cremin.dev/actions/checkout@v4 + - name: Build image + uses: https://cremin.dev/actions/buildah-build@v2 + with: + containerfiles: ./Containerfile + context: ./ + oci: true + layers: true + image: hostr + tags: latest ${{ github.sha }} + - name: Push image + uses: https://cremin.dev/actions/push-to-registry@v2 + with: + registry: cremin.dev/jonathan + username: ${{ github.actor }} + password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} + image: hostr + tags: latest ${{ github.sha }} + test-image: + runs-on: self-hosted + needs: build-image + steps: + - name: Check out repository + uses: https://cremin.dev/actions/checkout@v4 + - name: Test image + env: + WEB_BASE_URL: http://localhost:3000 + API_BASE_URL: http://localhost:3000/api + UPLOAD_STORAGE_PATH: /hostr/uploads + COOKIE_KEY: TESTING + EMAIL_FROM: jonathan@hostr.co + EMAIL_NAME: "Jonathan from Hostr" + DATABASE_URL: postgresql://hostr:hostr@database:5432/hostr + REDIS_URL: redis://redis:6379 + AWS_ENDPOINT: http://minio:9000 + AWS_ACCESS_KEY_ID: 7HYV3KPRGQ8Z5YCDNWC6 + AWS_SECRET_ACCESS_KEY: 0kWP/ZkgIwQzgL9t4SGv9Uc93rO//OdyqMH329b/ + AWS_BUCKET: hostr + run: | + podman run --rm --env-host -it cremin.dev/jonathan/hostr:${{ github.sha }} yarn test diff --git a/.gitignore b/.gitignore index 064a275..9bebce6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -.env* +.envrc .DS_Store .sass-cache/ node_modules @@ -7,6 +7,7 @@ jspm_packages npm-debug.log web/public/build web/public/styles/*.css +web/public/styles/*.css.map *.gz minigun*.json test*.json diff --git a/Makefile b/Makefile index 65974ab..67a7951 100644 --- a/Makefile +++ b/Makefile @@ -10,36 +10,36 @@ help: .PHONY: build build: ## Run `yarn run build` - docker-compose run --rm app yarn run build + podman compose run --rm app yarn run build .PHONY: test test: ## Run tests - docker-compose run --rm app yarn test + podman compose run --rm app yarn test .PHONY: logs logs: ## Tail the app and worker logs - docker-compose logs -f app worker + podman compose logs -f app worker .PHONY: migrate migrate: ## Migrate database schema - docker-compose run --rm app yarn run initdb + podman compose run --rm app yarn run initdb .PHONY: init init: ## Migrate database schema - docker-compose run --rm app yarn run init + podman compose run --rm app yarn run init .PHONY: watch-frontend watch-frontend: ## Build and watch for changes - docker-compose run --rm app yarn run watch + podman compose run --rm app yarn run watch -.PHONY: docker-compose-up -docker-compose-up: ## Start (and create) docker containers - docker-compose up -d +.PHONY: podman compose-up +podman compose-up: ## Start (and create) docker containers + podman compose up -d .PHONY: yarn yarn: ## Update yarn dependencies - docker-compose run --rm app yarn + podman compose run --rm app yarn .PHONY: shell shell: ## Run shell - docker-compose run --rm app sh + podman compose run --rm app sh diff --git a/web/lib/auth.js b/web/lib/auth.js index 45165b9..bbba83c 100644 --- a/web/lib/auth.js +++ b/web/lib/auth.js @@ -1,29 +1,29 @@ -import crypto from 'crypto'; -import { join } from 'path'; -import passwords from 'passwords'; -import uuid from 'node-uuid'; -import views from 'co-views'; -import debugname from 'debug'; -import sendgrid from '@sendgrid/mail'; -import models from '../../models'; +import crypto from "crypto"; +import { join } from "path"; +import passwords from "passwords"; +import uuid from "node-uuid"; +import views from "co-views"; +import debugname from "debug"; +import sendgrid from "@sendgrid/mail"; +import models from "../../models"; -const render = views(join(__dirname, '..', 'views'), { default: 'ejs' }); -const debug = debugname('hostr-web:auth'); +const render = views(join(__dirname, "..", "views"), { default: "ejs" }); +const debug = debugname("hostr-web:auth"); sendgrid.setApiKey(process.env.SENDGRID_KEY); const from = process.env.EMAIL_FROM; const fromname = process.env.EMAIL_NAME; export async function authenticate(email, password) { - const remoteIp = this.headers['x-forwarded-for'] || this.ip; + const remoteIp = this.headers["x-forwarded-for"] || this.ip; if (!password || password.length < 6) { - debug('No password, or password too short'); - return new Error('Invalid login details'); + debug("No password, or password too short"); + return new Error("Invalid login details"); } const count = await models.login.count({ where: { - ip: remoteIp.split(',')[0], + ip: remoteIp.split(",")[0], successful: false, createdAt: { $gt: Math.ceil(Date.now()) - 600000, @@ -32,8 +32,8 @@ export async function authenticate(email, password) { }); if (count > 25) { - debug('Throttling brute force'); - return new Error('Invalid login details'); + debug("Throttling brute force"); + return new Error("Invalid login details"); } const user = await models.user.findOne({ where: { @@ -43,30 +43,29 @@ export async function authenticate(email, password) { }); const login = await models.login.create({ - ip: remoteIp.split(',')[0], + ip: remoteIp.split(",")[0], successful: false, }); if (user && user.password) { login.userId = user.id; if (await passwords.verify(password, user.password)) { - debug('Password verified'); + debug("Password verified"); login.successful = true; await login.save(); return user; } - debug('Password invalid'); + debug("Password invalid"); } await login.save(); return false; } - export async function setupSession(user) { - debug('Setting up session'); + debug("Setting up session"); const token = uuid.v4(); - debug(user) - await this.redis.set(token, user.id, 'EX', 604800); + + await this.redis.set(token, user.id, "EX", 604800); const sessionUser = { id: user.id, @@ -76,27 +75,26 @@ export async function setupSession(user) { joined: user.createdAt, plan: user.plan, uploadsToday: await models.file.count({ userId: user.id }), - md5: crypto.createHash('md5').update(user.email).digest('hex'), + md5: crypto.createHash("md5").update(user.email).digest("hex"), token, }; - if (sessionUser.plan === 'Pro') { + if (sessionUser.plan === "Pro") { sessionUser.maxFileSize = 524288000; - sessionUser.dailyUploadAllowance = 'unlimited'; + sessionUser.dailyUploadAllowance = "unlimited"; } this.session.user = sessionUser; - if (this.request.body.remember && this.request.body.remember === 'on') { + if (this.request.body.remember && this.request.body.remember === "on") { const remember = await models.remember.create({ id: uuid(), userId: user.id, }); - this.cookies.set('r', remember.id, { maxAge: 1209600000, httpOnly: true }); + this.cookies.set("r", remember.id, { maxAge: 1209600000, httpOnly: true }); } - debug('Session set up'); + debug("Session set up"); } - export async function signup(email, password, ip) { const existingUser = await models.user.findOne({ where: { @@ -105,26 +103,29 @@ export async function signup(email, password, ip) { }, }); if (existingUser) { - debug('Email already in use.'); - throw new Error('Email already in use.'); + debug("Email already in use."); + throw new Error("Email already in use."); } const cryptedPassword = await passwords.crypt(password); - const user = await models.user.create({ - email, - password: cryptedPassword, - ip, - plan: 'Free', - activation: { - id: uuid(), + const user = await models.user.create( + { email, + password: cryptedPassword, + ip, + plan: "Free", + activation: { + id: uuid(), + email, + }, }, - }, { - include: [models.activation], - }); + { + include: [models.activation], + }, + ); await user.save(); - const html = await render('email/inlined/activate', { + const html = await render("email/inlined/activate", { activationUrl: `${process.env.WEB_BASE_URL}/activate/${user.activation.id}`, }); const text = `Thanks for signing up to Hostr! @@ -136,18 +137,15 @@ ${process.env.WEB_BASE_URL}/activate/${user.activation.id} `; sendgrid.send({ to: user.email, - subject: 'Welcome to Hostr', + subject: "Welcome to Hostr", from, fromname, html, text, - categories: [ - 'activate', - ], + categories: ["activate"], }); } - export async function sendResetToken(email) { const user = await models.user.findOne({ where: { @@ -159,7 +157,7 @@ export async function sendResetToken(email) { id: uuid.v4(), userId: user.id, }); - const html = await render('email/inlined/forgot', { + const html = await render("email/inlined/forgot", { forgotUrl: `${process.env.WEB_BASE_URL}/forgot/${reset.id}`, }); const text = `It seems you've forgotten your password :( @@ -167,38 +165,32 @@ Visit ${process.env.WEB_BASE_URL}/forgot/${reset.id} to set a new one. `; sendgrid.send({ to: user.email, - from: 'jonathan@hostr.co', - fromname: 'Jonathan from Hostr', - subject: 'Hostr Password Reset', + from: "jonathan@hostr.co", + fromname: "Jonathan from Hostr", + subject: "Hostr Password Reset", html, text, - categories: [ - 'password-reset', - ], + categories: ["password-reset"], }); } else { - throw new Error('There was an error looking up your email address.'); + throw new Error("There was an error looking up your email address."); } } - export async function fromToken(token) { const userId = await this.redis.get(token); return models.user.findByPk(userId); } - export async function fromCookie(rememberId) { const userId = await models.remember.findByPk(rememberId); return models.user.findByPk(userId); } - export async function validateResetToken(resetId) { return models.reset.findByPk(resetId); } - export async function updatePassword(userId, password) { const cryptedPassword = await passwords.crypt(password); const user = await models.user.findByPk(userId); @@ -206,7 +198,6 @@ export async function updatePassword(userId, password) { await user.save(); } - export async function activateUser(code) { const activation = await models.activation.findOne({ where: { From 36e91ff03eb696bca09f70e8f342af6aa7f92517 Mon Sep 17 00:00:00 2001 From: Jonathan Cremin Date: Fri, 13 Jun 2025 09:41:37 +0100 Subject: [PATCH 3/4] Update services hosts --- .forgejo/workflows/ci.yml | 44 +++++++++++++++++---------------------- docker-compose.yml | 4 ++-- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 61d221e..a76d0c2 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -6,28 +6,6 @@ on: pull_request: types: [opened, synchronize, reopened] -services: - database: - image: postgres:10-alpine - env: - POSTGRES_PASSWORD: hostr - POSTGRES_USER: hostr - POSTGRES_DB: hostr - ports: - - 5432:5432 - redis: - image: redis:4.0.2-alpine - ports: - - 6379:6379 - minio: - image: minio/minio - env: - MINIO_ACCESS_KEY: 7HYV3KPRGQ8Z5YCDNWC6 - MINIO_SECRET_KEY: 0kWP/ZkgIwQzgL9t4SGv9Uc93rO//OdyqMH329b/ - ports: - - 9000:9000 - cmd: server /export - jobs: build-image: runs-on: self-hosted @@ -42,6 +20,7 @@ jobs: registry: cremin.dev username: ${{ github.actor }} password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} + logout: false - name: Check out repository uses: https://cremin.dev/actions/checkout@v4 - name: Build image @@ -51,19 +30,34 @@ jobs: context: ./ oci: true layers: true - image: hostr + image: cremin.dev/jonathan/hostr tags: latest ${{ github.sha }} - name: Push image uses: https://cremin.dev/actions/push-to-registry@v2 with: - registry: cremin.dev/jonathan + registry: cremin.dev username: ${{ github.actor }} password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} - image: hostr + image: jonathan/hostr tags: latest ${{ github.sha }} test-image: runs-on: self-hosted needs: build-image + services: + database: + image: postgres:14-alpine + env: + POSTGRES_PASSWORD: hostr + POSTGRES_USER: hostr + POSTGRES_DB: hostr + redis: + image: redis:4.0.2-alpine + minio: + image: minio/minio + env: + MINIO_ACCESS_KEY: 7HYV3KPRGQ8Z5YCDNWC6 + MINIO_SECRET_KEY: 0kWP/ZkgIwQzgL9t4SGv9Uc93rO//OdyqMH329b/ + cmd: ["server", "/export"] steps: - name: Check out repository uses: https://cremin.dev/actions/checkout@v4 diff --git a/docker-compose.yml b/docker-compose.yml index fe33cd8..d36dff3 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,7 +61,7 @@ services: - "3001:3000" command: yarn run worker database: - image: "postgres:10-alpine" + image: "postgres:14-alpine" ports: - "5432:5432" environment: @@ -69,7 +69,7 @@ services: POSTGRES_USER: "hostr" POSTGRES_DB: "hostr" redis: - image: "redis:4.0.2-alpine" + image: "redis:8-alpine" ports: - "6379:6379" minio: From ab01290b72fc0036d076573ce6222560ebfda40b Mon Sep 17 00:00:00 2001 From: Jonathan Cremin Date: Sun, 15 Jun 2025 19:03:03 +0100 Subject: [PATCH 4/4] Use Docker instead of Podman for now --- .forgejo/workflows/.env | 12 +++++++++++ .forgejo/workflows/ci.yml | 44 ++++++++++----------------------------- 2 files changed, 23 insertions(+), 33 deletions(-) create mode 100644 .forgejo/workflows/.env diff --git a/.forgejo/workflows/.env b/.forgejo/workflows/.env new file mode 100644 index 0000000..0c2f98d --- /dev/null +++ b/.forgejo/workflows/.env @@ -0,0 +1,12 @@ +WEB_BASE_URL=http://localhost:3000 +API_BASE_URL=http://localhost:3000/api +UPLOAD_STORAGE_PATH=/hostr/uploads +COOKIE_KEY=TESTING +EMAIL_FROM=jonathan@hostr.co +EMAIL_NAME="Jonathan from Hostr" +DATABASE_URL=postgresql://hostr:hostr@database:5432/hostr +REDIS_URL=redis://redis:6379 +AWS_ENDPOINT=http://minio:9000 +AWS_ACCESS_KEY_ID=7HYV3KPRGQ8Z5YCDNWC6 +AWS_SECRET_ACCESS_KEY=0kWP/ZkgIwQzgL9t4SGv9Uc93rO//OdyqMH329b/ +AWS_BUCKET=hostr diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index a76d0c2..b1c0994 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -14,34 +14,25 @@ jobs: run: echo "NOW=$(date +'%Y%m%d-%H%M%S')" >> $GITHUB_ENV - name: Fix for bad os check run: echo "RUNNER_OS=Linux" >> $GITHUB_ENV - - name: Login to Forgejo Registry - uses: https://cremin.dev/actions/podman-login@v1 + - name: Login to Docker Hub + uses: https://cremin.dev/actions/docker-login@v3 with: registry: cremin.dev username: ${{ github.actor }} password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} - logout: false - name: Check out repository uses: https://cremin.dev/actions/checkout@v4 - - name: Build image - uses: https://cremin.dev/actions/buildah-build@v2 + - name: Set up Docker Buildx + uses: https://cremin.dev/actions/docker-setup-buildx@v3 + - name: Build and push + uses: https://cremin.dev/actions/docker-build-push@v6 with: - containerfiles: ./Containerfile + file: ./Containerfile context: ./ - oci: true - layers: true - image: cremin.dev/jonathan/hostr - tags: latest ${{ github.sha }} - - name: Push image - uses: https://cremin.dev/actions/push-to-registry@v2 - with: - registry: cremin.dev - username: ${{ github.actor }} - password: ${{ secrets.FORGEJO_REGISTRY_TOKEN }} - image: jonathan/hostr - tags: latest ${{ github.sha }} + tags: cremin.dev/jonathan/hostr:latest,cremin.dev/jonathan/hostr:${{ github.sha }} + push: true test-image: - runs-on: self-hosted + runs-on: node22 needs: build-image services: database: @@ -62,18 +53,5 @@ jobs: - name: Check out repository uses: https://cremin.dev/actions/checkout@v4 - name: Test image - env: - WEB_BASE_URL: http://localhost:3000 - API_BASE_URL: http://localhost:3000/api - UPLOAD_STORAGE_PATH: /hostr/uploads - COOKIE_KEY: TESTING - EMAIL_FROM: jonathan@hostr.co - EMAIL_NAME: "Jonathan from Hostr" - DATABASE_URL: postgresql://hostr:hostr@database:5432/hostr - REDIS_URL: redis://redis:6379 - AWS_ENDPOINT: http://minio:9000 - AWS_ACCESS_KEY_ID: 7HYV3KPRGQ8Z5YCDNWC6 - AWS_SECRET_ACCESS_KEY: 0kWP/ZkgIwQzgL9t4SGv9Uc93rO//OdyqMH329b/ - AWS_BUCKET: hostr run: | - podman run --rm --env-host -it cremin.dev/jonathan/hostr:${{ github.sha }} yarn test + docker run --env-file ./.forgejo/workflows/.env --rm -it cremin.dev/jonathan/hostr:${{ github.sha }} yarn test