{"id":42357795,"url":"https://github.com/astronomy-commons/science-platform","last_synced_at":"2026-01-27T16:37:05.822Z","repository":{"id":44767755,"uuid":"351848167","full_name":"astronomy-commons/science-platform","owner":"astronomy-commons","description":null,"archived":false,"fork":false,"pushed_at":"2024-08-05T19:53:45.000Z","size":9031,"stargazers_count":5,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-09T13:31:46.153Z","etag":null,"topics":["eks-cluster","helm-chart","jupyterhub","kubernetes"],"latest_commit_sha":null,"homepage":"https://hub.astronomycommons.org/","language":"TeX","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/astronomy-commons.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-26T16:39:35.000Z","updated_at":"2024-08-05T19:53:49.000Z","dependencies_parsed_at":"2024-07-17T00:10:28.036Z","dependency_job_id":null,"html_url":"https://github.com/astronomy-commons/science-platform","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/astronomy-commons/science-platform","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astronomy-commons%2Fscience-platform","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astronomy-commons%2Fscience-platform/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astronomy-commons%2Fscience-platform/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astronomy-commons%2Fscience-platform/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/astronomy-commons","download_url":"https://codeload.github.com/astronomy-commons/science-platform/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astronomy-commons%2Fscience-platform/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28816563,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T12:25:15.069Z","status":"ssl_error","status_checked_at":"2026-01-27T12:25:05.297Z","response_time":168,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["eks-cluster","helm-chart","jupyterhub","kubernetes"],"created_at":"2026-01-27T16:37:05.767Z","updated_at":"2026-01-27T16:37:05.812Z","avatar_url":"https://github.com/astronomy-commons.png","language":"TeX","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Repository Contents\n\n- `chart`: The Helm chart for deploying the JupyterHub on Kubernetes.\n- `cluster`: The scripts for creating a Kubernetes cluster on AWS EKS.\n- `scripts`: Scripts for deploying the JupyterHub on the EKS cluster.\n- `image`: The Dockerfile for the singleuser notebook server.\n\n# Deploying\n\nCreating the cluster:\n```\neksctl create cluster -f ./cluster/eksctl_config.yaml\n```\n\nAdd the cluster autoscaler. First update the values in `values-autoscaler.yaml`. You should update `clusterName` and `awsRegion` to match your EKS configuration, and change `tag` to match your Kubernetes version. Next install to the cluster with:\n```\n./scripts/install_autoscaler.sh\n```\n\nInstall the JupyterHub. First create a secret token to secure the JupyterHub Proxy API:\n```\ntoken=$(openssl rand -hex 32)\nprintf \"jupyterhub:\\n  proxy:\\n    secretToken: ${token}\\n\" \u003e\u003e values-customize.yaml\n```\n\nDeploy the JupyterHub Helm chart on the EKS cluster:\n```\nexport NAMESPACE=hub\nexport RELEASE=hub\n./scripts/deploy.sh\n```\n\n(Optional) Once the deployment is ready, intialize the Hive metastore to add our tables stored on S3:\n```\nexport NAMESPACE=hub\n./scripts/init_metastore.sh\n```\n\n(Optional) Once the deployment is ready, update DNS records on Route 53 for a domain you own to point to the JupyterHub:\n```\nexport HUB_FQDN=public-hub.astronomycommons.org\n./scripts/update_dns.sh\n```\n\n# Customizing\n\nAdd your own image by customizing the file `values-customize.yaml`:\n\n```\n# file: values-customize.yaml\njupyterhub:\n    singleuser:\n        image:\n            name: \u003cyour-image\u003e\n            tag: \u003cyour-image-tag\u003e\n```\n\nEnable HTTPS with letsencrypt:\n```\n# file: values-customize.yaml\nproxy:\n    https:\n      enabled: true\n      letsencrypt:\n        contactEmail: \u003cyour-email\u003e\n      hosts:\n      - \u003cyour-domain-name\u003e\n```\n\nAdd AWS access keys for your AWS account with:\n```\n# file: values-customize.yaml\njupyterhub:\n    singleuser:\n        extraEnv:\n            AWS_ACCESS_KEY_ID: \u003cAWS_ACCESS_KEY_ID\u003e\n            AWS_SECRET_ACCESS_KEY: \u003cAWS_SECRET_ACCESS_KEY\u003e\n            AWS_DEFAULT_REGION: \u003cAWS_DEFAULT_REGION\u003e\n```\n\nAdd requester pays headers to spark so you can access our data on your own deployments:\n```\n# file: values-customize.yaml\nspark-defaults.conf:\n    999-requester-pays: |\n        spark.hadoop.fs.s3a.requester-pays.enabled=true\n```\n\nAdd GitHub organization authentication. First, generate a token to encrypt the `auth_state` returned from GitHub: `token=$(openssl rand -hex 32)`\n\n```\n# file: values-customize.yaml\njupyterhub:\n  hub:\n    extraEnv:\n      JUPYTERHUB_CRYPT_KEY: ${token}\n    config:\n      Authenticator:\n        admin_users:\n        - \u003cyour-user-name\u003e\n      GitHubOAuthenticator:\n        allowed_organizations:\n        - \u003cyour-github-organziation\u003e\n        client_id: \u003cclient-id\u003e\n        client_secret: \u003cclient-secret\u003e\n        oauth_callback_url: \u003chub-fqdn\u003e/hub/oauth_callback\n      JupyterHub:\n        admin_access: true\n        authenticator_class: github\n      OAuthenticator:\n        scope:\n        - read:user\n        - read:org\n```\n\n# SSH\n\nBy default, a SSH \"jump host\" is deployed with this chart to allow users to use `scp` and `sftp` to copy files to the NFS. In addition, each notebook server starts its own SSH service, allowing users to access their notebook servers using `ssh` via the jump host.\n\nIf a user wants to utilize this, they should perform the following steps:\n1. Launch their notebook server.\n2. Start a terminal and open the file `~/.ssh/authorized_keys` with a text editor.\n3. On their local machine, generate a new or reuse an old SSH public key. Add their public key as a new line in the file from (2).\n4. Edit the file `~/.ssh/config` on their local machine to include the following:\n```\nHost jhub-ssh\n    User \u003cusername\u003e\n    Hostname \u003cssh-hostname\u003e\n\nHost jhub\n    User \u003cusername\u003e\n    Hostname \u003chost-prefix\u003e-\u003cusername\u003e.notebooks\n    ProxyJump jhub-ssh\n```\nAdministrators should set and provide to you the values for `\u003cssh-hostname\u003e` (e.g. `ssh.demo.dirac.dev`) and the `\u003chost-prefx\u003e` (e.g. `jupyter` or `demo`). `\u003cusername\u003e` should be set to your username on the JupyterHub. The host names `jhub-ssh` and `jhub` can be customized to the user's liking. A full example is:\n```\nHost dirac-demo-ssh\n    User stevenstetzler\n    Hostname ssh.demo.dirac.dev\n\nHost dirac-demo\n    User stevenstetzler\n    Hostname demo-stevenstetzler.notebooks\n    ProxyJump dirac-demo-ssh\n```\n\n5. On your local machine, ssh to your running notebook server: `ssh jhub`. \n\n## Caveats for Amazon Web Services\n\nThe SSH service prefers to have a static IP assigned to it. For some cloud providers, the default Kubernetes Service type that we use for the SSH service, the `LoadBalancer`, will be a static IP. However, AWS will instead provision a classic Elastic Load Balancer, which does not use static IP addresses. To obtain static IP functionality, an extra step must be taken to provision a Network Load Balancer instead, which will use a static IP address. See the `README.md` in `cluster` for more details and installation instructions.\n\nAdditionally, to support the `gp3` storage class, one must install the AWS EBS CSI driver. See the `README.md` in `cluster` for more details and installation instructions.\n\n# Build on this Helm chart\n\n```\nhelm repo add science-platform https://hub.astronomycommons.org/\nhelm repo update\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fastronomy-commons%2Fscience-platform","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fastronomy-commons%2Fscience-platform","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fastronomy-commons%2Fscience-platform/lists"}