commit 4255d95c686ab0e098076e43c9c1db2248833aa9 Author: Mike Johnston Date: Sat Feb 28 00:01:41 2026 -0500 first commit diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7556c5a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +data +.git +.gitea +*.md +.env diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..706c246 --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +# Server +PORT=3000 +NODE_ENV=production +BASE_URL=https://loot-hunt.com + +# Session +SESSION_SECRET=change-me-to-a-random-string + +# Database (SQLite file path) +DB_PATH=./data/loot-hunt.db + +# Uploads directory +UPLOADS_DIR=./data/uploads diff --git a/.gitea/workflows/rebuild-prod.yaml b/.gitea/workflows/rebuild-prod.yaml new file mode 100644 index 0000000..4121af7 --- /dev/null +++ b/.gitea/workflows/rebuild-prod.yaml @@ -0,0 +1,89 @@ +# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions +name: Build Images and Deploy +run-name: ${{ gitea.actor }} is building new PROD images and redeploying the existing stack 🚀 +on: + push: + # not working right now https://github.com/actions/runner/issues/2324 + # paths-ignore: + # - **.yml + branches: + - main + +env: + STACK_NAME: loot-hunt + DOT_ENV: ${{ secrets.PROD_ENV }} + PORTAINER_TOKEN: ${{ vars.PORTAINER_TOKEN }} + PORTAINER_API_URL: https://portainer.dev.nervesocket.com/api + ENDPOINT_NAME: "mini" #sometimes "primary" + IMAGE_TAG: "reg.dev.nervesocket.com/loot-hunt:latest" + +jobs: + Update-PROD-Stack: + runs-on: ubuntu-latest + steps: + # if: contains(github.event.pull_request.head.ref, 'init-stack') + - name: Checkout + uses: actions/checkout@v4 + with: + ref: main + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Build and push PROD Docker image + run: | + echo $DOT_ENV | base64 -d > .env + docker buildx build --push -f Dockerfile -t $IMAGE_TAG . + + - name: Get the endpoint ID + # Usually ID is 1, but you can get it from the API. Only skip this if you are VERY sure. + run: | + ENDPOINT_ID=$(curl -s -H "X-API-Key: $PORTAINER_TOKEN" "$PORTAINER_API_URL/endpoints" | jq -r ".[] | select(.Name==\"$ENDPOINT_NAME\") | .Id") + echo "ENDPOINT_ID=$ENDPOINT_ID" >> $GITHUB_ENV + echo "Got stack Endpoint ID: $ENDPOINT_ID" + + - name: Fetch stack ID from Portainer + run: | + STACK_ID=$(curl -s -H "X-API-Key: $PORTAINER_TOKEN" "$PORTAINER_API_URL/stacks" | jq -r ".[] | select(.Name==\"$STACK_NAME\" and .EndpointId==$ENDPOINT_ID) | .Id") + + echo "STACK_ID=$STACK_ID" >> $GITHUB_ENV + echo "Got stack ID: $STACK_ID matched with Endpoint ID: $ENDPOINT_ID" + + - name: Fetch Stack + run: | + # Get the stack details (including env vars) + STACK_DETAILS=$(curl -s -H "X-API-Key: $PORTAINER_TOKEN" "$PORTAINER_API_URL/stacks/$STACK_ID") + + # Extract environment variables from the stack + echo "$STACK_DETAILS" | jq -r '.Env' > stack_env.json + + echo "Existing stack environment variables:" + cat stack_env.json + + - name: Redeploy stack in Portainer + run: | + # Read stack file content + STACK_FILE_CONTENT=$(echo "$(