diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..93f995b
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,18 @@
+CERTBOT_EMAIL=${CERTBOT_EMAIL}
+CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
+DOMAIN=${DOMAIN}
+PUBLIC_IP=${PUBLIC_IP}
+ANDROID_SMS_GATEWAY_IP=${ANDROID_SMS_GATEWAY_IP}
+ANDROID_SMS_GATEWAY_URL=${ANDROID_SMS_GATEWAY_URL}
+ANDROID_SMS_GATEWAY_LOGIN=${ANDROID_SMS_GATEWAY_LOGIN}
+ANDROID_SMS_GATEWAY_PASSWORD=${ANDROID_SMS_GATEWAY_PASSWORD}
+ANDROID_SMS_GATEWAY_RECIPIENT_PHONE=${ANDROID_SMS_GATEWAY_RECIPIENT_PHONE}
+ASTRO_DB_REMOTE_URL=${ASTRO_DB_REMOTE_URL}
+OTP_SUPER_SECRET_SALT=${OTP_SUPER_SECRET_SALT}
+IMAGE_FILENAME=${IMAGE_FILENAME}
+IMAGE_NAME=${IMAGE_NAME}
+SSH_USER=${SSH_USER}
+SSH_PORT=${SSH_PORT}
+SSH_HOST=${SSH_HOST}
+SSH_KEY="${SSH_KEY}"
+SSH_KNOWN_HOST="${SSH_KNOWN_HOST}"
diff --git a/.forgejo/workflows/build-and-deploy.yml b/.forgejo/workflows/build-and-deploy.yml
new file mode 100644
index 0000000..7396a1f
--- /dev/null
+++ b/.forgejo/workflows/build-and-deploy.yml
@@ -0,0 +1,59 @@
+name: Build And Deploy
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ build-and-deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Install dependencies
+ run: |
+ apt-get update && apt-get install gettext -y
+ - name: Check out repository
+ uses: actions/checkout@v4
+ # - name: Expose repo secrets and vars as shell variables
+ # env:
+ # SECRETS_CONTEXT: ${{ toJSON(secrets) }}
+ # VARS_CONTEXT: ${{ toJSON(vars) }}
+ # run: |
+ # # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable
+ # # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
+ # # # EOF randomness is to account for empty secrets and vars
+ # EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
+ # to_envs() { jq -r "to_entries[] | \"\(.key)<<$EOF\n\(.value)\n$EOF\n\""; }
+ # echo "$VARS_CONTEXT" | to_envs >> $GITHUB_ENV
+ # echo "$SECRETS_CONTEXT" | to_envs >> $GITHUB_ENV
+ - name: Substitute environment variables in .env.example and write to .env
+ env:
+ CERTBOT_EMAIL: ${{secrets.CERTBOT_EMAIL}}
+ CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}}
+ DOMAIN: ${{secrets.DOMAIN}}
+ PUBLIC_IP: ${{secrets.PUBLIC_IP}}
+ ANDROID_SMS_GATEWAY_IP: ${{secrets.ANDROID_SMS_GATEWAY_IP}}
+ ANDROID_SMS_GATEWAY_URL: ${{secrets.ANDROID_SMS_GATEWAY_URL}}
+ ANDROID_SMS_GATEWAY_LOGIN: ${{secrets.ANDROID_SMS_GATEWAY_LOGIN}}
+ ANDROID_SMS_GATEWAY_PASSWORD: ${{secrets.ANDROID_SMS_GATEWAY_PASSWORD}}
+ ANDROID_SMS_GATEWAY_RECIPIENT_PHONE: ${{secrets.ANDROID_SMS_GATEWAY_RECIPIENT_PHONE}}
+ ASTRO_DB_REMOTE_URL: ${{secrets.ASTRO_DB_REMOTE_URL}}
+ OTP_SUPER_SECRET_SALT: ${{secrets.OTP_SUPER_SECRET_SALT}}
+ IMAGE_FILENAME: ${{secrets.IMAGE_FILENAME}}
+ IMAGE_NAME: ${{secrets.IMAGE_NAME}}
+ SSH_USER: ${{secrets.SSH_USER}}
+ SSH_PORT: ${{secrets.SSH_PORT}}
+ SSH_HOST: ${{secrets.SSH_HOST}}
+ SSH_KEY: ${{secrets.SSH_KEY}}
+ SSH_KNOWN_HOST: ${{secrets.SSH_KNOWN_HOST}}
+ run: |
+ envsubst < .env.example > .env
+ - name: Run build script
+ run: |
+ cd cicd/scripts
+ chmod +x ./build.sh
+ ./build.sh
+ - name: Run deploy script
+ run: |
+ cd cicd/scripts
+ chmod +x ./deploy.sh
+ ./deploy.sh
diff --git a/bun.lockb b/bun.lockb
index 2656e95..0cc7456 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/cicd/scripts/build.sh b/cicd/scripts/build.sh
new file mode 100755
index 0000000..3dedac4
--- /dev/null
+++ b/cicd/scripts/build.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+#######################
+# VARIABLES #
+#######################
+ROOT_DIR=$(dirname $(dirname $(dirname $(realpath $0))))
+GIT_REF=${GIT_REF:-main}
+
+### NO EDITS BELOW THIS LINE ###
+cd ${ROOT_DIR}
+source .env
+git checkout ${GIT_REF}
+GIT_SHA=$(git rev-parse --short HEAD)
+
+if [[ "${GIT_REF}" =~ ^refs/tags/v([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$ ]]; then
+ VERSION="${BASH_REMATCH[1]}"
+ if [[ -n "${BASH_REMATCH[2]}" ]]; then
+ VERSION="${VERSION}${BASH_REMATCH[2]}"
+ fi
+ echo "Using git tag version: ${VERSION}"
+else
+ VERSION=$(node -p "require('./package.json').version || '0.0.0'")
+ GIT_SHA_SHORT="${GIT_SHA:0:7}"
+ VERSION="${VERSION}-${GIT_SHA_SHORT}"
+ echo "Using package.json + SHA version: ${VERSION}"
+fi
+
+docker build -t ${IMAGE_NAME}:latest -t ${IMAGE_NAME}:v${VERSION} --build-arg VERSION=${VERSION} .
+docker save -o ${IMAGE_FILENAME} ${IMAGE_NAME}:latest
diff --git a/cicd/scripts/deploy.sh b/cicd/scripts/deploy.sh
new file mode 100755
index 0000000..350fa0a
--- /dev/null
+++ b/cicd/scripts/deploy.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+#######################
+# VARIABLES #
+#######################
+ROOT_DIR=$(dirname $(dirname $(dirname $(realpath $0))))
+
+### NO EDITS BELOW THIS LINE ###
+cd ${ROOT_DIR}
+source .env
+
+mkdir -p ${HOME}/.ssh
+chmod 700 ${HOME}/.ssh
+echo "${SSH_KEY}" > ${HOME}/.ssh/id_ed25519-${SSH_HOST//./_}
+echo "${SSH_KNOWN_HOST}" > ${HOME}/.ssh/known_hosts-${SSH_HOST//./_}
+chmod -R 600 ${HOME}/.ssh/
+chmod 700 ${HOME}/.ssh
+
+grep -q "Host ${SSH_HOST}" ${HOME}/.ssh/config || cat >> ${HOME}/.ssh/config <
- +
diff --git a/utils/generate-env-example.sh b/utils/generate-env-example.sh new file mode 100755 index 0000000..e1afeec --- /dev/null +++ b/utils/generate-env-example.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +cd $(dirname $(dirname $(realpath $0))) + +# Path to the original .env file +ENV_FILE=".env" +# Path to the new .env.example file +EXAMPLE_FILE=".env.example" + +# Check if the .env file exists +if [ ! -f "$ENV_FILE" ]; then + echo "The file $ENV_FILE does not exist." + exit 1 +fi + +# Create or empty the .env.example file +> "$EXAMPLE_FILE" + +SKIP_NEXT=false + +# Read each line in .env +while IFS= read -r line; do + # Skip the current line if the previous line is part of a multiline/quoted string + if [[ $SKIP_NEXT == true ]]; then + if [[ $line == *'"'* ]]; then + SKIP_NEXT=false + fi + continue + # Copy comments and empty lines verbatim + elif [[ $line == \#* ]] || [[ -z $line ]]; then + echo "$line" >> "$EXAMPLE_FILE" + continue + # Check if the line is a multiline/quoted string + elif [[ $line == *'="'* ]]; then + if [[ $line != *'"' ]]; then + SKIP_NEXT=true + fi + LINE=${line%%=*} + echo "$LINE=\"\${$LINE}\"" >> "$EXAMPLE_FILE" + # For all other lines, copy only the key (everything before the '=') if present + elif [[ $line == *'='* ]]; then + LINE=${line%%=*} + echo "$LINE=\${$LINE}" >> "$EXAMPLE_FILE" + fi +done < "$ENV_FILE" + +echo ".env.example file created successfully."