A microservices platform for exploring the cosmos β NASA Open APIs, community blog posts, and an AI astronomy assistant β deployed on AWS + k3s.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β http://<EC2_IP>/
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β k3s on EC2 (Traefik Ingress) β
β βββββββββββββββββββββββ ββββββββββββββββββββββββββββββββ β
β β frontend-ui-ingress β β backend-api-ingress β β
β β / β frontend β β /auth β auth-service β β
β βββββββββββββββββββββββ β /blogs β blog-service β β
β β /agent β agent-service β β
β ββββββββββββββββββββββββββββββββ β
ββββββββββββ¬βββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β β
ββββββββΌβββββββ ββββββββΌβββββββ βββββββββββββ
β frontend β β auth-serviceβ βblog-serviceβ
β (React) β β (FastAPI) β β (FastAPI) β
βββββββββββββββ ββββββββ¬βββββββ βββββββ¬ββββββ
β β
ββββββββΌβββββββ ββββββββΌβββββββ
β RDS Postgresβ β DynamoDB+S3 β
βββββββββββββββ βββββββββββββββ
βββββββββββββββ
βagent-serviceβ β Groq + Tavily (no own database)
β (FastAPI) β
βββββββββββββββ
| Service | Directory | Port | Database | Responsibility |
|---|---|---|---|---|
| Frontend | apps/frontend |
80 | β | React SPA, NASA data UI, chat widget |
| Auth | apps/core-backend |
8000 | PostgreSQL | User registration, login, sessions (Firebase) |
| Blog | apps/blogpost-backend |
8001 | DynamoDB + S3 | Blog posts and image uploads |
| Agent | apps/agent-backend |
8002 | β | AI chat (Groq, LangGraph, Tavily) |
Each backend service has its own Dockerfile, Poetry dependencies, and .env.example.
The fastest way to run the full stack on your machine without AWS or Kubernetes.
- Docker and Docker Compose
- Copy
.env.exampleβ.envin each app directory (see below) - Place Firebase service account JSON at
secrets/firebase-service-account.json
cp apps/core-backend/.env.example apps/core-backend/.env
cp apps/blogpost-backend/.env.example apps/blogpost-backend/.env
cp apps/agent-backend/.env.example apps/agent-backend/.env
cp apps/frontend/.env.example apps/frontend/.envFill in API keys: NASA, Groq, Tavily (optional), Firebase.
docker compose up --build| Service | URL |
|---|---|
| Frontend | http://localhost:8080 |
| Auth API | http://localhost:8000 |
| Blog API | http://localhost:8001 |
| Agent API | http://localhost:8002 |
Local databases: PostgreSQL (auth) and LocalStack (DynamoDB + S3 for blog) run inside Compose β no AWS account needed.
Full cloud reproduction from this repository:
terraform/README.mdβ Provision AWS (VPC, EC2/k3s, RDS, DynamoDB, S3)k8s/README.mdβ Build images, create secrets, deploy manifests
| Secret / credential | Where to set it |
|---|---|
| AWS credentials | aws configure or env vars |
db_password |
terraform/terraform.tfvars |
| PostgreSQL password | k8s/secrets.yaml (same as db_password) |
| AWS IAM keys (blog S3/DynamoDB) | k8s/secrets.yaml |
| Groq / Tavily API keys | k8s/secrets.yaml |
| Firebase service account | kubectl create secret + secrets/firebase-service-account.json |
| Docker Hub token | kubectl create secret docker-registry |
| Path | Purpose |
|---|---|
docker-compose.yml |
Local full-stack |
terraform/*.tf + terraform.tfvars.example |
AWS infrastructure |
k8s/*.yaml + k8s/secrets.example.yaml |
Kubernetes workloads |
apps/*/.env.example |
Per-app local configuration templates |
Each backend app also has a .env.example in its directory for local configuration.
GitHub Actions workflows under .github/workflows/ run linting and tests per service on push.
See apps/frontend/LICENSE, apps/core-backend/LICENSE, and apps/blogpost-backend/LICENSE.