From 78278b2df17916256116b9b3aeea0f7d754babe1 Mon Sep 17 00:00:00 2001 From: Matt598 <24874369+Matt5981@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:21:08 +1100 Subject: [PATCH 1/4] Initial README.md draft --- README.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7ccb8e0..a67216c 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,83 @@ # PA-Cloud -Terraform that builds the pa-cloud. Currently this consists of propass related infrastructure. +PA-Cloud is a solution for enabling cross-institutional federated analysis of informatics datasets while maintaining compliance with institutional network policies, and leveraging DataSHIELD to prevent direct disclosure of data. -### Getting started +# Architectural Overview -1. Initialise terraform +PA-Cloud consists of a set of AWS resources that allow individual DataSHIELD servers running on University networks to communicate securely. + +This leverages AWS' site-to-site VPN connections, with an internal network in AWS serving as a confluence, from which an instance of Jupyterhub can be used to spawn Jupyter notebook servers, within which analysis can take place. + +Authentication is provided by an instance of Keycloak operating within the AWS internal network. + +# Getting started + +## Prerequisites + +To deploy PA-Cloud from scratch, you will need: + +- An AWS account. +- The AWS CLI installed and logged into the above account (if `aws sts get-caller-identity` succeeds when run, this is met). +- Sufficient permissions to deploy all resources. +- Hashicorp's Terraform installed. +- Access to at least one cohort server, for which: + - A server is required, which has: + - A constant externally facing IP address (this can either be the IP address of the server itself, or the IP address of the NAT gateway which it is behind), + - Docker installed and running. + +> [!NOTE] +> This repository is currently configured as per Pacific Analytics' deployment of PA-Cloud. You will need to adjust various values in Terraform if deploying to a different location. + +> [!NOTE] +> The above is provisional, with exact requirements for a novel environment not fully known. + +## Deployment + +Deployment is handled solely through Terraform. + +1. Generate an SSH key. This is to be used to authenticate to on prem servers, and should be added to `authorized_keys` in all cohort servers. These instructions assume this was generated as `./pacloud.key`. + +2. Add all cohort servers. This can be done in `cohort.tf` by adding further instances of the `cohort` module, ensuring that required additional networking resources are added in `network.tf` as well. + +3. Initialise terraform. ```hcl terraform init ``` -2. Add pacloud ssh key to ssh keyring (can find this in bitwarden) (used to authenticate with on prem cohort servers) +4. Add `pacloud.key` to your SSH keyring: ``` -ssh-add +ssh-add ./pacloud.key ``` -2. Plan terraform +5. Generate a deployment plan with Terraform. ```hcl -terraform plan +terraform plan -out plan.tfplan ``` -3. Apply changes +> [!WARNING] +> Ensure you review the generated plan to ensure all required resources are present and correctly configured. Always review the plan once deployed to ensure Terraform does not mistakenly perform a destructive action. + +6. Apply the previously generated plan. ```hcl -terraform apply +terraform apply plan.tfplan ``` + +## Access + +Once Terraform completes its deployment, you can access the PA-Cloud deployment via the domain set as the public Route53 zone in `domain.tf`. Assuming this domain to be `propass.pacificanalytics.com`, this is: + +- `https://identity.propass.pacificanalytics.com` (Keycloak) +- `https://analytics.propass.pacificanalytics.com` (JupyterHub) + +Users must be added to the created realm in Keycloak (`propass` by default) to access Jupyterhub. Keycloak's default administrator credentials can be retrieved from Terraform's state file, or AWS Secrets Manager. + +## Analysis + +Once a user has been created in the `propass` realm in Keycloak, they can log in to Jupyterhub and begin performing analysis using DataSHIELD. + +When using DataSHIELD, connect using the names specified in the cohort modules, suffixed with `.pacloud.internal`. For example, a cohort called 'example' would set the `name` variable to `example`, then once deployed, connect to it with DataSHIELD via `example.pacloud.internal`. + +# License and Contact +PA-Cloud is available under the Apache license. See [LICENSE](./LICENSE) for more details. + +For any questions relating to the code or usage thereof, raise an issue. For urgent matters or other inquiries, contact [info@pacificanalytics.com](mailto:info@pacificanalytics.com). \ No newline at end of file From 3b4d7de91ebaa6b17310c42c39dee38d952c2aca Mon Sep 17 00:00:00 2001 From: Matt598 <24874369+Matt5981@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:42:50 +1100 Subject: [PATCH 2/4] PDP-36 Add Pacific Analytics logo to README.md --- README.md | 2 ++ docs/images/PA_logo.png | Bin 0 -> 58611 bytes 2 files changed, 2 insertions(+) create mode 100644 docs/images/PA_logo.png diff --git a/README.md b/README.md index a67216c..bfd14c0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # PA-Cloud +![Pacific Analytics Logo](docs/images/PA_logo.png) + PA-Cloud is a solution for enabling cross-institutional federated analysis of informatics datasets while maintaining compliance with institutional network policies, and leveraging DataSHIELD to prevent direct disclosure of data. # Architectural Overview diff --git a/docs/images/PA_logo.png b/docs/images/PA_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a54feceaad2dba4934a2f2ea4fac2dff8e004f9a GIT binary patch literal 58611 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 Date: Thu, 11 Dec 2025 17:49:14 +1100 Subject: [PATCH 3/4] PDP-36 Add Issue and Feature Request Templates Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 2476e264ee78475ffedacbf2b2f5683fcf16cff6 Mon Sep 17 00:00:00 2001 From: Matt598 <24874369+Matt5981@users.noreply.github.com> Date: Fri, 12 Dec 2025 15:54:31 +1100 Subject: [PATCH 4/4] PDP-36 Adjust README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bfd14c0..9f8e728 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ PA-Cloud is a solution for enabling cross-institutional federated analysis of in # Architectural Overview -PA-Cloud consists of a set of AWS resources that allow individual DataSHIELD servers running on University networks to communicate securely. +PA-Cloud consists of a set of AWS resources alongside deployments of DataSHIELD, the latter of which is deployed onto federated networks and uses an AWS site-to-site VPN to communicate securely. -This leverages AWS' site-to-site VPN connections, with an internal network in AWS serving as a confluence, from which an instance of Jupyterhub can be used to spawn Jupyter notebook servers, within which analysis can take place. +The site-to-site VPN tunnels form a confluence in AWS, within which an EC2 resides running JupyterHub. This is then used to spawn Jupyter notebook servers, within which connections to the DataSHIELD servers are established and analysis can take place. This enables cross-institutional analysis while remaining secure and compliant with institutional network policies. Authentication is provided by an instance of Keycloak operating within the AWS internal network. @@ -28,7 +28,7 @@ To deploy PA-Cloud from scratch, you will need: - Docker installed and running. > [!NOTE] -> This repository is currently configured as per Pacific Analytics' deployment of PA-Cloud. You will need to adjust various values in Terraform if deploying to a different location. +> This repository is currently configured as per Pacific Analytics' deployment of PA-Cloud. You will need to adjust various values in Terraform if deploying to a different location, though contributions towards generifying the repository or expanding the range of deployment environments it can run on are welcome. > [!NOTE] > The above is provisional, with exact requirements for a novel environment not fully known. @@ -80,6 +80,6 @@ Once a user has been created in the `propass` realm in Keycloak, they can log in When using DataSHIELD, connect using the names specified in the cohort modules, suffixed with `.pacloud.internal`. For example, a cohort called 'example' would set the `name` variable to `example`, then once deployed, connect to it with DataSHIELD via `example.pacloud.internal`. # License and Contact -PA-Cloud is available under the Apache license. See [LICENSE](./LICENSE) for more details. +PA-Cloud is available under the Apache 2.0 license. See [LICENSE](./LICENSE) for more details. For any questions relating to the code or usage thereof, raise an issue. For urgent matters or other inquiries, contact [info@pacificanalytics.com](mailto:info@pacificanalytics.com). \ No newline at end of file