Skip to content

Create HydroServer Timescale Cloud Database #59

Create HydroServer Timescale Cloud Database

Create HydroServer Timescale Cloud Database #59

name: Create HydroServer Timescale Cloud Database
on:
workflow_dispatch:
inputs:
environment:
description: 'Enter a deployment environment name.'
required: true
superuser-email:
description: 'Enter the email for the Django superuser.'
required: true
superuser-password:
description: 'Enter the password for the Django superuser.'
required: true
partition-interval:
description: 'Enter a partition interval in days.'
default: '365'
required: true
hydroserver-version:
description: 'Enter a version of HydroServer to use. Leave blank to use the latest version.'
required: false
permissions:
id-token: write
contents: read
jobs:
setup-deployment:
runs-on: ubuntu-20.04
environment: ${{ github.event.inputs.environment }}
steps:
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: configureawscredentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ vars.AWS_ACCOUNT_ID }}:role/${{ vars.AWS_IAM_ROLE }}
role-session-name: create-hydroserver-resources
aws-region: ${{ vars.AWS_REGION }}
- name: Checkout Repo
uses: actions/checkout@v3
with:
ref: main
path: ops
- name: Get Latest HydroServer Version
id: get_latest_tag
run: echo "tag=$(curl -sL https://api.github.com/repos/hydroserver2/hydroserver-api-services/releases/latest | jq -r '.tag_name')" >> $GITHUB_OUTPUT
- name: Checkout Backend Repo
uses: actions/checkout@v4
with:
repository: hydroserver2/hydroserver-api-services
ref: refs/tags/${{ github.event.inputs.hydroserver-version || steps.get_latest_tag.outputs.tag }}
path: backend
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
- name: Terraform Init
working-directory: ./ops/terraform/timescale
run: terraform init -backend-config="bucket=${{ vars.TERRAFORM_BUCKET }}" -backend-config="region=${{ vars.AWS_REGION }}" -backend-config="key=state/timescale_database_${{ github.event.inputs.environment }}"
- name: Terraform Plan
id: plan
working-directory: ./ops/terraform/timescale
run: terraform plan -no-color -var instance="${{ github.event.inputs.environment }}" -var region="${{ vars.AWS_REGION }}" -var project_id="${{ vars.TIMESCALE_PROJECT_ID }}" -var access_key="${{ secrets.TIMESCALE_ACCESS_KEY }}" -var secret_key="${{ secrets.TIMESCALE_SECRET_KEY }}"
continue-on-error: true
- name: Terraform Plan Status
if: steps.plan.outcome == 'failure'
run: exit 1
- name: Terraform Apply
working-directory: ./ops/terraform/timescale
run: |
terraform apply -auto-approve -var instance="${{ github.event.inputs.environment }}" -var region="${{ vars.AWS_REGION }}" -var project_id="${{ vars.TIMESCALE_PROJECT_ID }}" -var access_key="${{ secrets.TIMESCALE_ACCESS_KEY }}" -var secret_key="${{ secrets.TIMESCALE_SECRET_KEY }}"
echo "HOSTNAME=$(terraform output -json | jq -r '.hostname.value')" > timescale_${{ github.event.inputs.environment }}_connection.txt
echo "PORT=$(terraform output -json | jq -r '.port.value')" >> timescale_${{ github.event.inputs.environment }}_connection.txt
echo "PASSWORD=$(terraform output -json | jq -r '.password.value')" >> timescale_${{ github.event.inputs.environment }}_connection.txt
echo "CONNECTION_STRING=postgresql://tsdbadmin:$(terraform output -json | jq -r '.password.value')@$(terraform output -json | jq -r '.hostname.value'):$(terraform output -json | jq -r '.port.value')/tsdb" >> timescale_${{ github.event.inputs.environment }}_connection.txt
cat << EOF > ../../../backend/.env
PROXY_BASE_URL=http://127.0.0.1:8000
DATABASE_URL=postgresql://tsdbadmin:$(terraform output -json | jq -r ".password.value")@$(terraform output -json | jq -r ".hostname.value"):$(terraform output -json | jq -r ".port.value")/tsdb
DEPLOYED=True
EOF
- name: Upload Connection Details to S3
working-directory: ./ops/terraform/timescale
run: |
aws s3 cp timescale_${{ github.event.inputs.environment }}_connection.txt s3://${{ vars.TERRAFORM_BUCKET }}/output/timescale_${{ github.event.inputs.environment }}_connection.txt
- name: Install Django Dependencies
working-directory: ./backend
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pyopenssl --upgrade
- name: Run Database Setup Commands
working-directory: ./backend
env:
DJANGO_SETTINGS_MODULE: hydroserver.settings
DJANGO_SUPERUSER_EMAIL: ${{ github.event.inputs.superuser-email }}
DJANGO_SUPERUSER_PASSWORD: ${{ github.event.inputs.superuser-password }}
DJANGO_SUPERUSER_FIRST_NAME: ADMIN
DJANGO_SUPERUSER_LAST_NAME: ADMIN
run: |
python manage.py migrate
python manage.py configure_timescaledb --partition-interval-days ${{ github.event.inputs.partition-interval }}
python manage.py createsuperuser --noinput