尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
The best open source courseware to learn cloud engineering
翻译准备中
正在加载完整 README。
查看完整 README ↗A web application for tracking your progress through the Learn to Cloud guide.
Note: This project is open source under the MIT License.
| Layer | Technology |
|---|---|
| Backend | Python 3.13+, FastAPI, SQLAlchemy (async), PostgreSQL |
| Verification | Sequential API background worker |
| Frontend | HTMX, Jinja2 templates, Alpine.js, Tailwind CSS v4 |
| Auth | GitHub OAuth (Authlib) |
| Infra | Azure Container Apps, Azure PostgreSQL, Terraform |
| CI/CD | GitHub Actions |
GitHub login establishes revocable, PostgreSQL-backed sessions. See Authentication and sessions for route dependencies, login redirects, expiry, and logout guarantees.
Development runs directly in WSL or Linux. On Windows, install WSL 2, keep the clone inside the WSL filesystem, and make Docker Desktop's WSL integration available to that distribution.
uv installs the required Python 3.13 runtime. Frontend, verification,
infrastructure, and agent workflows need additional optional tools documented
in the Contributing Guide.
1. Start local dependencies (Docker)
docker compose up -d db aspire-dashboard
2. Install Python dependencies
Install the app and its development tools into a virtual environment:
uv sync --locked
cp .env.example .env # Create environment config (edit if needed)
Run database migrations:
uv run alembic upgrade head
Start the API:
uv run python -m uvicorn learn_to_cloud.main:app --reload --port 8000
Or use VS Code's debugger with the "API: FastAPI (uvicorn)" launch configuration.
The API starts verification automatically: one sequential background loop per API process atomically claims attempts from PostgreSQL. No separate host, external queue, or verification job is required. Attempts have an execution timeout and overdue cleanup, with no workflow retries or checkpoints.
Notes:
docker compose up -d db aspire-dashboard first.docker compose start / docker compose stop.| Service | URL |
|---|---|
| App | http://localhost:8000 |
| API Docs | http://localhost:8000/docs (enabled in development or with WEB_SECURITY__ENABLE_DOCS=true) |
| PostgreSQL | 127.0.0.1:55432 (user: postgres, password: postgres) |
| Aspire Dashboard | http://localhost:18888 |
├── src/
│ └── learn_to_cloud/ # FastAPI app (serves HTML + JSON API)
│ ├── main.py # App entry point
│ ├── routes/ # API + page endpoints
│ ├── services/ # Business logic
│ ├── core/ # Config, auth, database, telemetry
│ ├── repositories/ # Database access
│ ├── verification/ # Verification checks and engine
│ ├── content/ # Curriculum YAML and compiled JSON
│ ├── migrations/ # Alembic migrations (shipped in the package)
│ ├── templates/ # Jinja2 templates (HTMX)
│ └── static/ # CSS, JS, images
├── tests/ # pytest suite
├── scripts/ # Dev and operator scripts
├── docs/ # Contributor docs
├── infra/ # Terraform (Azure)
├── Dockerfile # API and migration images
├── pyproject.toml # Dependencies, tool config, poe tasks
└── .github/
├── workflows/ # CI/CD
├── copilot-instructions.md # Copilot custom instructions
└── skills/ # Copilot agent skills
Start with the Contributing Guide for setup, quality gates, and links to focused development guides.
CI runs on pull requests. Pushes to main that change infrastructure,
application runtime files, or the deploy workflow run deploy.yml, one ordered
pipeline that runs a single deploy at a time:
src/, Dockerfile, dependency
manifests) differ from the commit production currently runs. It builds and
pushes the API and migration images, runs migrations, and updates the API./ready.Each run releases the latest main, not just the commit that triggered it, so
a run that waited behind another deploy cannot roll production back. Tests and
documentation do not deploy.
Ship infrastructure and application changes as separate pull requests, infrastructure first, so either can be reverted on its own.
A manual Deploy run redeploys the current main; select force_rebuild to
rebuild the API without cache. Select plan_only to plan Terraform for the
selected branch without applying or deploying.
After a failed deployment, fix and rerun it before shipping another release. Do not use an old workflow run as an image-only rollback.
MIT License. See LICENSE.