Minimum resources required to install and run Sunbird-ED on any cloud provider
- vCPUs: 48
- RAM: 192 GB
- Domain Name
- SSL Certificate: The FullChain, consisting of the private key and Certificate+CA_Bundle, is mandatory for installation.
- Google OAuth Credentials: Create credentials
- Google V3 ReCaptcha Credentials: Create credentials
- Email Service Provider
- MSG91 SMS Service Provider API Token (Optional): Required for sending OTPs to registered email addresses during user registration or password reset.
- YouTube API Token (Optional): Necessary for uploading video content directly via YouTube URL.
- jq
- yq (for YAML processing)
- rclone
- Terraform
- Terragrunt
- Linux / MacOS / GitBash (Windows)
- Python 3
- PyJWT Python Package (install via pip)
- kubectl
- helm
- Postman CLI
- For cloud-specific tools, follow the instructions in the respective README file based on your provider.
Example for Azure: terraform/azure/README.md
- Existing files in the following locations will be backed up with a
.bakextension, and the files will be overwritten:~/.config/rclone/rclone.conf~/.kube/config
- In the instructions below,
demois used as the environment name. You can replace it with your desired environment name, such asdev,stage, etc.
-
Clone the repository:a
git clone https://github.com/project-sunbird/sunbird-ed-installer.git
-
Copy the template directory:
cd terraform/<cloud-provider> # Replace <cloud-provider> with your cloud provider (e.g., azure, aws, gcp) cp -r template demo cd demo
-
Fill in the variables in
demo/global-values.yaml. take reference from [terraform/azure/README.md] -
Controlling DIAL Services and Flink Jobs
If you need DIAL-related services and Flink jobs, you can enable them using the
deploy_dial_servicesflag.-
Default:
false(DIAL services are not deployed) -
To enable: set it to
truein yourglobal-values.yamlfile. For example:deploy_dial_services: true
-
-
Log in to your cloud provider:
# If cloud provider is Azure az login --tenant AZURE_TENANT_ID # If cloud provider is AWS aws configure # If cloud provider is GCP gcloud auth login
-
Run the installation script:
time ./install.sh
This installation setup creates the following default users with different roles. You can update the passwords using the "Forgot Password" option or create new users using APIs.
| Role | Email/User Name | Password |
|---|---|---|
| Admin | admin@yopmail.com | Admin@123 |
| Content Creator | contentcreator@yopmail.com | Creator@123 |
| Content Reviewer | contentreviewer@yopmail.com | Reviewer@123 |
| Book Creator | bookcreator@yopmail.com | Bookcreator@123 |
| Book Reviewer | bookreviewer@yopmail.com | BookReviewer@123 |
| Public User 1 | user1@yopmail.com | User1@123 |
| Public User 2 | user2@yopmail.com | User2@123 |
cd terraform/<cloud-provider>/<env>
time ./install.sh destroy_tf_resourcesIf you are using Let’s Encrypt for SSL certificate management, follow the steps below to ensure proper setup and renewal handling.
In your global-values.yaml, set the following flag:
lets_encrypt_ssl: trueThis enables automatic SSL certificate issuance and renewal via a Kubernetes Certbot CronJob.
When lets_encrypt_ssl is enabled:
- The Certbot CronJob automatically renews your SSL certificates approximately every 85 days.
- After renewal, it updates the SSL certificate and private key in the Kubernetes ConfigMap named
nginx-public-ingress.
Once the renewal completes:
- Fetch the renewed keys from the ConfigMap.
- Update your
terraform/<cloud-provider>/<env>/global-values.yamlfile with the new values:
proxy_private_key: |
<paste the renewed private key from ConfigMap>
proxy_certificate: |
<paste the renewed certificate from ConfigMap>These values are essential because edbb bundle fetches SSL certificates from the global level defined in above file.
If you are not using Let’s Encrypt: x
- Keep
lets_encrypt_ssl: false. - Manually provide your SSL certificate and private key under the same fields in
global-values.yaml.
- The CronJob handles only Let’s Encrypt–issued certificates.
- The default renewal schedule is every 85 days.
- Always ensure your domain DNS records are properly configured and reachable before renewal.