From 555984406b8d3fc1b50249bb1598af67df0af7ba Mon Sep 17 00:00:00 2001
From: ptownley
Date: Thu, 12 Nov 2026 10:00:44 +0000
Subject: [PATCH 1/6] Populate Readme with info on how to run the orion
bootstrap application
---
README.md | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 123 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 11265ea..43c4364 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,123 @@
-# Orion-Boostrap
\ No newline at end of file
+# Juno Orion Bootstrap wizard
+
+A guided, terminal-based installer for Juno Orion. It walks you through a short series of screens, then either installs a lightweight Kubernetes (k3s) on the local machine and deploys Juno onto it, or deploys Juno onto a Kubernetes cluster you already have.
+
+## Before you start
+
+**Choose your install type**
+
+| Install type | What it does | Requirements |
+|---|---|---|
+| New k3s deployment | Installs k3s on this machine, then deploys Orion | Linux host, must be run as `root` |
+| Existing Cluster | Deploys Orion onto a cluster you already run | `kubeconfig` for the cluster, network access to it |
+
+**For an Existing Cluster**
+
+- Your active kubeconfig context must point at the target cluster (`KUBECONFIG` is respected).
+- At least one node must carry the Juno label:
+
+ ```
+ kubectl label node juno-innovations.com/service=true
+ ```
+
+- For AWS Marketplace deployments, AWS credentials for the target account must be available in your environment (for example via `AWS_PROFILE` or `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY`), and a region must be set (`AWS_REGION`). The credentials need permission to manage IAM roles and policies and to list EKS clusters.
+- Make sure the kube context you have active is the cluster you select in the AWS step. The installer checks this and will stop with a clear message if they differ.
+
+**For an Offline (air-gapped) install**
+
+- Have the Genesis and ingress-nginx chart sources available at locations reachable from this machine (an internal chart repo or git repo).
+- For a k3s install, have internal registry mirrors ready for `docker.io`, `registry.k8s.io`, `nvcr.io`, `quay.io` and `ghcr.io`.
+
+## Running the installer
+
+Copy the binary to the target machine and run it in a terminal:
+
+```
+chmod +x phobos
+./phobos
+```
+
+For a k3s install, run it as root:
+
+```
+sudo ./phobos
+```
+
+## Controls
+
+| Key | Action |
+|---|---|
+| Up / Down | Move between options |
+| Space | Select or toggle the highlighted item |
+| Enter | Confirm and continue |
+| Ctrl+a | Show or hide advanced settings (first screen) |
+| Ctrl+n | Go back to the previous screen |
+| Ctrl+c | Save your progress and quit |
+
+## Walkthrough
+
+### 1. Deployment method
+
+- Pick **New k3s deployment** or **Existing Cluster** and press Space to select it (a tick appears), then press Enter.
+- **Deployment is offline**: tick this for an air-gapped install. An extra screen collects the offline details.
+- **Advanced settings** (Ctrl+A): lets you set a custom **Namespace** for Juno. Leave it empty to use the default (`argocd`). Names must be lowercase letters, numbers or `-`, and cannot be a reserved name (the installer lists them if you pick one).
+- **Previous config found**: if the installer detects settings from an earlier run, an extra tick box appears at the top. Tick it to delete the old settings and start completely fresh. Otherwise your earlier answers are pre-filled.
+
+### 2. Offline installation details (offline installs only)
+
+Fill in each field and press Enter to move on. Example values are shown in grey and disappear when you start typing.
+
+- **Genesis** and **ingress-nginx**: chart URL, whether the source is a git repo (and if so the chart path inside it), and the chart version.
+- **Registry mirrors** (k3s installs): a mirror URL for each of the five registries listed above.
+- **Registry username / password** (k3s installs): only needed if your mirrors require authentication. Leave blank otherwise.
+
+Move to **[ Continue ]** at the bottom, press Enter, review the summary, then press Enter to proceed or `ctrl+n` to go back and edit.
+
+### 3a. New k3s deployment
+
+- Confirm you are happy to proceed by checking the box (space) and pressing Enter.
+- The installer shows live progress while k3s is installed and Orion is deployed. This can take a while, especially while images are loaded.
+- On success the screen shows the address for the Orion Admin setup wizard.
+
+### 3b. Existing Cluster
+
+- **AWS Marketplace**: you are asked whether the deployment is facilitated by AWS Marketplace. Press `Y` or `N`, then Enter.
+ - If yes, pick your EKS cluster (Space to select, Enter to confirm). A checklist then shows each AWS setup step (connectivity, license manager roles, IAM roles and service accounts) as it completes. Press any key when it finishes.
+ - If no, you go straight to the next step.
+- The installer checks your local environment and cluster connectivity, then asks you to confirm.
+- It installs [ArgoCD](https://argo-cd.readthedocs.io/en/stable/), then Orion. Progress is shown with a spinner.
+
+## Finishing up
+
+When the install completes you will see:
+
+```
+https:///orion/setup/
+```
+
+Open that address in a web browser and complete the Orion Admin setup wizard.
+
+## Saved settings
+
+Your answers are saved to:
+
+```
+/tmp/juno_bootstrap_chart_values.yaml
+```
+
+They are saved when you quit with Ctrl+C or when an install step starts, and reloaded the next time you run the installer. If something goes wrong you can fix the problem and run the installer again to carry on where you left off. This file can contain registry credentials, so treat it as sensitive. Because it lives in `/tmp` it may be removed on reboot.
+
+## Troubleshooting
+
+- **"application is not running as root"**: a k3s install needs root. Re-run with `sudo ./phobos`.
+- **"failed to contact kubernetes"**: set `KUBECONFIG` to a valid kubeconfig and check the cluster is reachable.
+- **"failed to locate Juno node label"**: label at least one node as shown in "Before you start".
+- **Active kube context does not match the selected cluster**: switch context, for example `aws eks update-kubeconfig --name `, and run again.
+- **Permission denied writing the settings file**: an old `/tmp/juno_bootstrap_chart_values.yaml` owned by another user is in the way. Remove it or run as the same user.
+- **Install failed**: the error screen shows the reason and, for k3s installs, the location of the install log. Include it when contacting support.
+- **Verbose logging**: run with `DEBUG=yes ./phobos` to write detailed logs to `debug.log` in the current directory.
+
+## Support
+
+- Support: https://www.juno-innovations.com/contact/support
+- Documentation: https://docs.juno-innovations.com/Orion-Documentation/latest/
\ No newline at end of file
From 25276d98523d420d0640e4fc0bc217c66158a86e Mon Sep 17 00:00:00 2001
From: ptownley
Date: Thu, 12 Nov 2026 11:33:00 +0000
Subject: [PATCH 2/6] Populate the logo
Add some github action config
---
.github/delete-merged-branch-config.yml | 3 ++
.github/pull_request_template.md | 12 +++++
.github/release.yml | 27 +++++++++++
.github/workflows/add-to-project.yaml | 25 +++++++++++
.github/workflows/branch-cleanup.yml | 21 +++++++++
.github/workflows/pr-gChat-notification.yaml | 45 +++++++++++++++++++
.github/workflows/pr-on-branch-creation.yml | 34 ++++++++++++++
.github/workflows/run-cleanup.yml | 30 +++++++++++++
README.md | 7 ++-
assets/logo.png | Bin 0 -> 28774 bytes
10 files changed, 202 insertions(+), 2 deletions(-)
create mode 100644 .github/delete-merged-branch-config.yml
create mode 100644 .github/pull_request_template.md
create mode 100644 .github/release.yml
create mode 100644 .github/workflows/add-to-project.yaml
create mode 100644 .github/workflows/branch-cleanup.yml
create mode 100644 .github/workflows/pr-gChat-notification.yaml
create mode 100644 .github/workflows/pr-on-branch-creation.yml
create mode 100644 .github/workflows/run-cleanup.yml
create mode 100644 assets/logo.png
diff --git a/.github/delete-merged-branch-config.yml b/.github/delete-merged-branch-config.yml
new file mode 100644
index 0000000..1e3de62
--- /dev/null
+++ b/.github/delete-merged-branch-config.yml
@@ -0,0 +1,3 @@
+delete_closed_pr: true
+exclude:
+ - testing
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..fe6e1f7
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,12 @@
+## Summary
+
+### Goal:
+What is this branch trying to accomplish?
+
+
+### Changes:
+What did you do?
+
+
+### Notes:
+Anything reviewers should know?
diff --git a/.github/release.yml b/.github/release.yml
new file mode 100644
index 0000000..0df4669
--- /dev/null
+++ b/.github/release.yml
@@ -0,0 +1,27 @@
+runs-on: self-hosted
+
+changelog:
+ exclude:
+ labels:
+ - ignore-for-release
+ authors:
+ - octocat
+ categories:
+ - title: '🚀 Features'
+ labels:
+ - 'feature'
+ - 'feature request'
+ - 'enhancement'
+ - 'add'
+ - title: '🐛 Bug Fixes'
+ labels:
+ - 'fix'
+ - 'bugfix'
+ - 'bug'
+ - 'broke'
+ - title: '🧰 Maintenance'
+ labels:
+ - 'chore'
+ - title: Other Changes
+ labels:
+ - "*"
\ No newline at end of file
diff --git a/.github/workflows/add-to-project.yaml b/.github/workflows/add-to-project.yaml
new file mode 100644
index 0000000..ff50653
--- /dev/null
+++ b/.github/workflows/add-to-project.yaml
@@ -0,0 +1,25 @@
+name: Add Issue to Project
+
+on:
+ issues:
+ types:
+ - opened
+
+
+jobs:
+ add-to-project:
+ name: Add Issue to Project
+ runs-on: self-hosted
+ steps:
+ - name: Generate a token
+ id: generate-token
+ uses: actions/create-github-app-token@v2
+ with:
+ app-id: ${{ secrets.JUNO_CI_APP_ID }}
+ private-key: ${{ secrets.JUNO_CI_APP_PRIVATE_KEY }}
+ owner: ${{ github.repository_owner }}
+ - uses: actions/add-to-project@main
+ with:
+ project-url: https://github.com/orgs/juno-fx/projects/12
+ github-token: ${{ steps.generate-token.outputs.token }}
+
diff --git a/.github/workflows/branch-cleanup.yml b/.github/workflows/branch-cleanup.yml
new file mode 100644
index 0000000..2b471d8
--- /dev/null
+++ b/.github/workflows/branch-cleanup.yml
@@ -0,0 +1,21 @@
+name: Delete Branch on PR Close
+on:
+ pull_request:
+ types: [closed]
+
+jobs:
+ delete-branch:
+ runs-on:
+ - self-hosted
+ steps:
+ - name: Generate a token
+ id: generate-token
+ uses: actions/create-github-app-token@v2
+ with:
+ app-id: ${{ secrets.JUNO_CI_APP_ID }}
+ private-key: ${{ secrets.JUNO_CI_APP_PRIVATE_KEY }}
+ owner: ${{ github.repository_owner }}
+ - name: delete branch
+ uses: SvanBoxel/delete-merged-branch@main
+ env:
+ GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
diff --git a/.github/workflows/pr-gChat-notification.yaml b/.github/workflows/pr-gChat-notification.yaml
new file mode 100644
index 0000000..20f2b08
--- /dev/null
+++ b/.github/workflows/pr-gChat-notification.yaml
@@ -0,0 +1,45 @@
+name: PR Message
+
+on:
+ pull_request:
+ types:
+ - review_requested
+
+jobs:
+ google-chat-action:
+ runs-on: self-hosted
+ steps:
+ - name: Generate a token
+ id: generate-token
+ uses: actions/create-github-app-token@v2
+ with:
+ app-id: ${{ secrets.JUNO_CI_APP_ID }}
+ private-key: ${{ secrets.JUNO_CI_APP_PRIVATE_KEY }}
+ owner: ${{ github.repository_owner }}
+ - name: Checkout CI repository
+ uses: actions/checkout@v4
+ with:
+ repository: juno-fx/ci
+ ref: main
+ path: .juno-ci
+ token: ${{ steps.generate-token.outputs.token }}
+ - name: Run Google Chat notification
+ uses: ./.juno-ci/actions/workflow/pr-gChat-notification
+ with:
+ webhookUrl: ${{ secrets.GCHAT_PR_SPACE }}
+ title: ${{ github.repository }}
+ subtitle: ${{ github.head_ref }}
+ additionalSections: >
+ {
+ "header": "Requested Reviewer",
+ "widgets": [
+ {
+ "decoratedText": {
+ "text": "${{ github.event.requested_reviewer && github.event.requested_reviewer.login || github.event.requested_team && github.event.requested_team.name || 'N/A' }}",
+ "icon": {
+ "knownIcon": "PERSON"
+ }
+ }
+ }
+ ]
+ }
diff --git a/.github/workflows/pr-on-branch-creation.yml b/.github/workflows/pr-on-branch-creation.yml
new file mode 100644
index 0000000..242b48d
--- /dev/null
+++ b/.github/workflows/pr-on-branch-creation.yml
@@ -0,0 +1,34 @@
+on:
+ create:
+
+permissions:
+ contents: write
+ issues: write
+ pull-requests: write
+ repository-projects: read # github's current permission scheme makes this necessary: https://github.com/cli/cli/issues/6274
+
+jobs:
+ PR:
+ runs-on: self-hosted
+ if: github.event.ref_type == 'branch'
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Generate a token
+ id: generate-token
+ uses: actions/create-github-app-token@v2
+ with:
+ app-id: ${{ secrets.JUNO_CI_APP_ID }}
+ private-key: ${{ secrets.JUNO_CI_APP_PRIVATE_KEY }}
+ owner: ${{ github.repository_owner }}
+ - name: Checkout CI repository
+ uses: actions/checkout@v4
+ with:
+ repository: juno-fx/ci
+ ref: main
+ path: .juno-ci
+ token: ${{ steps.generate-token.outputs.token }}
+ - name: Run PR on branch creation
+ uses: ./.juno-ci/actions/workflow/pr-on-branch-creation
+ with:
+ gh_token: ${{ steps.generate-token.outputs.token }}
diff --git a/.github/workflows/run-cleanup.yml b/.github/workflows/run-cleanup.yml
new file mode 100644
index 0000000..889858d
--- /dev/null
+++ b/.github/workflows/run-cleanup.yml
@@ -0,0 +1,30 @@
+name: Delete old workflow runs
+on:
+ push:
+ paths:
+ - '.github/workflows/run-cleanup.yml'
+ workflow_dispatch:
+ schedule:
+ - cron: '0 0 * * 1'
+jobs:
+ del_runs:
+ runs-on:
+ - self-hosted
+ permissions:
+ actions: write
+ contents: read
+ steps:
+ - name: Generate a token
+ id: generate-token
+ uses: actions/create-github-app-token@v2
+ with:
+ app-id: ${{ secrets.JUNO_CI_APP_ID }}
+ private-key: ${{ secrets.JUNO_CI_APP_PRIVATE_KEY }}
+ owner: ${{ github.repository_owner }}
+ - name: Delete workflow runs
+ uses: Mattraks/delete-workflow-runs@v2
+ with:
+ token: ${{ steps.generate-token.outputs.token }}
+ repository: ${{ github.repository }}
+ retain_days: 7
+ keep_minimum_runs: 6
diff --git a/README.md b/README.md
index 43c4364..c9a6b80 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,8 @@
-# Juno Orion Bootstrap wizard
-
+
+
+
+
Orion Bootstrap Wizard
+
A guided, terminal-based installer for Juno Orion. It walks you through a short series of screens, then either installs a lightweight Kubernetes (k3s) on the local machine and deploys Juno onto it, or deploys Juno onto a Kubernetes cluster you already have.
## Before you start
diff --git a/assets/logo.png b/assets/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dbbebfc11ffe073bba14c61a4daffb1b0559f19
GIT binary patch
literal 28774
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
Date: Thu, 12 Nov 2026 11:56:34 +0000
Subject: [PATCH 3/6] add a beta disclaimer
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index c9a6b80..a824a30 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,10 @@
A guided, terminal-based installer for Juno Orion. It walks you through a short series of screens, then either installs a lightweight Kubernetes (k3s) on the local machine and deploys Juno onto it, or deploys Juno onto a Kubernetes cluster you already have.
+
+
+> **Beta:** This installer is currently in beta. You may encounter rough edges, and behaviour may change between releases. Please report any problems to support (see the Support section below).
+
## Before you start
**Choose your install type**
From fd479564ad2e86527cfe43bc4147c3735ef7f651 Mon Sep 17 00:00:00 2001
From: ptownley
Date: Thu, 12 Nov 2026 12:59:13 +0000
Subject: [PATCH 4/6] Update install binary name
---
README.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index a824a30..d55fd65 100644
--- a/README.md
+++ b/README.md
@@ -40,14 +40,14 @@ A guided, terminal-based installer for Juno Orion. It walks you through a short
Copy the binary to the target machine and run it in a terminal:
```
-chmod +x phobos
-./phobos
+chmod +x orion-bootstrap-
+./orion-bootstrap-
```
For a k3s install, run it as root:
```
-sudo ./phobos
+sudo ./orion-bootstrap-
```
## Controls
@@ -116,13 +116,13 @@ They are saved when you quit with Ctrl+C or when an install step starts, and rel
## Troubleshooting
-- **"application is not running as root"**: a k3s install needs root. Re-run with `sudo ./phobos`.
+- **"application is not running as root"**: a k3s install needs root. Re-run with `sudo ./orion-bootstrap-`.
- **"failed to contact kubernetes"**: set `KUBECONFIG` to a valid kubeconfig and check the cluster is reachable.
- **"failed to locate Juno node label"**: label at least one node as shown in "Before you start".
- **Active kube context does not match the selected cluster**: switch context, for example `aws eks update-kubeconfig --name `, and run again.
- **Permission denied writing the settings file**: an old `/tmp/juno_bootstrap_chart_values.yaml` owned by another user is in the way. Remove it or run as the same user.
- **Install failed**: the error screen shows the reason and, for k3s installs, the location of the install log. Include it when contacting support.
-- **Verbose logging**: run with `DEBUG=yes ./phobos` to write detailed logs to `debug.log` in the current directory.
+- **Verbose logging**: run with `DEBUG=yes ./orion-bootstrap-` to write detailed logs to `debug.log` in the current directory.
## Support
From 020475177caf43b438543c006b967c10f07c7990 Mon Sep 17 00:00:00 2001
From: ptownley
Date: Thu, 12 Nov 2026 16:35:09 +0000
Subject: [PATCH 5/6] MR comments
---
README.md | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/README.md b/README.md
index d55fd65..d5164ea 100644
--- a/README.md
+++ b/README.md
@@ -72,6 +72,9 @@ sudo ./orion-bootstrap-
### 2. Offline installation details (offline installs only)
+[!TIP]
+For further information on deploying Juno Orion in an air gapped environment, please see our [Air gapped installation guide](https://docs.juno-innovations.com/Orion-Documentation/latest/installation/advanced/air-gapped/) and our [Air gapped bundler](https://github.com/juno-fx/Airgap-Bundler) for easy image and chart preparation*
+
Fill in each field and press Enter to move on. Example values are shown in grey and disappear when you start typing.
- **Genesis** and **ingress-nginx**: chart URL, whether the source is a git repo (and if so the chart path inside it), and the chart version.
@@ -104,6 +107,14 @@ https:///orion/setup/
Open that address in a web browser and complete the Orion Admin setup wizard.
+[!NOTE]
+There is a chance that the images used to run Orion are taking longer than expected to be pulled into the cluster, we suggest checking your cluster for this by running `kubectl` commands such as `kubectl get pods -A` and searching for pods named as follows. If their status is "ContainerCreating" then more time is required, wait until they show as "Running" then attempt to visit the above URL.
+
+- genesis-*
+- terra-*
+- titan-*
+- metrics-gatherer-*
+
## Saved settings
Your answers are saved to:
From 288285a1027bebb5d09dc1224da3ce6fdf41d5ea Mon Sep 17 00:00:00 2001
From: ptownley
Date: Thu, 12 Nov 2026 16:40:25 +0000
Subject: [PATCH 6/6] Note and tip doesn't work
---
README.md | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index d5164ea..ec06821 100644
--- a/README.md
+++ b/README.md
@@ -72,8 +72,8 @@ sudo ./orion-bootstrap-
### 2. Offline installation details (offline installs only)
-[!TIP]
-For further information on deploying Juno Orion in an air gapped environment, please see our [Air gapped installation guide](https://docs.juno-innovations.com/Orion-Documentation/latest/installation/advanced/air-gapped/) and our [Air gapped bundler](https://github.com/juno-fx/Airgap-Bundler) for easy image and chart preparation*
+***Note:***
+For further information on deploying Juno Orion in an air gapped environment, please see our [Air gapped installation guide](https://docs.juno-innovations.com/Orion-Documentation/latest/installation/advanced/air-gapped/) and our [Air gapped bundler](https://github.com/juno-fx/Airgap-Bundler) for easy image and chart preparation
Fill in each field and press Enter to move on. Example values are shown in grey and disappear when you start typing.
@@ -107,7 +107,7 @@ https:///orion/setup/
Open that address in a web browser and complete the Orion Admin setup wizard.
-[!NOTE]
+***Note:***
There is a chance that the images used to run Orion are taking longer than expected to be pulled into the cluster, we suggest checking your cluster for this by running `kubectl` commands such as `kubectl get pods -A` and searching for pods named as follows. If their status is "ContainerCreating" then more time is required, wait until they show as "Running" then attempt to visit the above URL.
- genesis-*
@@ -115,6 +115,7 @@ There is a chance that the images used to run Orion are taking longer than expec
- titan-*
- metrics-gatherer-*
+
## Saved settings
Your answers are saved to: