個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證非營利群眾募資平台,致力於維持開源生態系統。
AI 翻譯
Non-profit crowdfunding platform sustaining the open source ecosystem.
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
LFX Crowdfunding enables open source projects to raise funds for development, security audits, mentorship programs, events, and community initiatives. This is the rewritten platform — a Kubernetes-native monorepo replacing the original AWS Lambda + DynamoDB system.
This repo is the standalone Crowdfunding UI and API — it is separate from LFX Self Serve. Crowdfunding data ("My Donations", "My Initiatives") that appears in Self Serve originates from this application.檢視完整 README ↗LFX Crowdfunding enables open source projects to raise funds for development, security audits, mentorship programs, events, and community initiatives. This is the rewritten platform — a Kubernetes-native monorepo replacing the original AWS Lambda + DynamoDB system.
Not the Self Serve integration
This repo is the standalone Crowdfunding UI and API — it is separate from LFX Self Serve. Crowdfunding data ("My Donations", "My Initiatives") that appears in Self Serve originates from this application.
Self Serve authenticates to the CF Go API using a user-issued access token obtained via a silent second
authorization_codeflow for the CF audience — the sameaccess:metoken the CF frontend uses. Seedocs/authentication-architecture.mdfor the full auth design.
lfx-crowdfunding/
├── backend/ # Go API service
│ ├── cmd/
│ │ ├── initiatives-api/ # HTTP API entrypoint
│ │ └── ledger-stats-sync/ # CronJob: syncs financial stats from Ledger HTTP API
│ ├── internal/
│ │ ├── domain/ # Domain models and repository interfaces
│ │ ├── service/ # Business logic / orchestration
│ │ ├── handler/ # HTTP handlers (Chi router)
│ │ └── infrastructure/ # DB, external clients, auth middleware
│ ├── db/
│ │ ├── migrations/ # SQL migration files (golang-migrate)
│ │ ├── scripts/ # One-time DynamoDB → Postgres migration (Python)
│ │ └── seed.sql # Development seed data
│ └── charts/ # Helm chart
├── frontend/ # Nuxt 4 frontend (Vue 3, TypeScript, Tailwind, PrimeVue)
├── docker-compose.yml # Local Postgres
└── backend/docs/
└── rewrite/ # Architecture decisions, open questions, migration plan
The platform is split into two independently deployable services:
Frontend — Nuxt 4 BFF. Handles Auth0 PKCE authentication, HTTP-only session cookies, and Stripe.js. Calls the Go API to serve pages.
Go HTTP API — Chi router. Owns all business logic: initiative CRUD, Stripe payment processing, webhook handling, email, and read-only Ledger integration.
Both are deployed as Kubernetes Deployments behind an Ingress. Background jobs run as K8s CronJobs.
See docs/architecture.md for the full system diagram and component breakdown.
| Document | Contents |
|---|---|
docs/architecture.md | System overview, component breakdown, data flows, integrations |
docs/authentication-architecture.md | Auth design — scopes, flows (CF frontend, Self Serve, RS M2M), Auth0 config |
docs/release-plan.md | Go-live release plan and smoke test checklist |
backend/docs/rewrite/01-current-system.md | Inventory of the current Lambda system — endpoints, DynamoDB tables, integrations |
backend/docs/rewrite/02-decisions.md | All architectural decisions with rationale |
backend/docs/rewrite/03-open-questions.md | Open questions with owners and blocking status |
backend/docs/rewrite/04-target-architecture.md | Target system design — tech stack, repo layout, API surface, K8s resources |
backend/docs/rewrite/05-migration-plan.md | Step-by-step migration and cutover plan |
| Concern | Choice |
|---|---|
| Framework | Nuxt 4 + Vue 3 |
| Language | TypeScript (strict) |
| Styling | Tailwind CSS + PrimeVue v4 |
| State | Pinia + Vue Query |
| Auth | OAuth2 PKCE, HTTP-only cookies |
| Payments | Stripe.js |
| Concern | Choice |
|---|---|
| Language | Go (latest stable) |
| Router | Chi |
| Database | PostgreSQL via pgx/v5 |
| Migrations | golang-migrate |
| Auth | Auth0 JWT middleware |
| Logging | slog (stdlib) |
| Tracing | OpenTelemetry |
crowdfunding schemalinuxfoundation/lfx-v2-argocd| Service | Direction | Purpose |
|---|---|---|
| Stripe | CF → Stripe | Charges, subscriptions, Stripe Connect |
| Stripe webhook | Stripe → CF | customer.subscription.deleted |
| Ledger Service | CF → Ledger (read-only) | Balance and transaction data |
| Ledger Service | Ledger → CF | Donation email callbacks (GET /v1/projects/{id}) |
| Reimbursement Service | Bidirectional | Expense policy management, beneficiary lifecycle |
| lfx-v2-email-service | CF → email-service (NATS) | Transactional email (review, approval, decline, donation receipts); templates live in backend/internal/infrastructure/clients/email_templates/ |
| GitHub | CF → GitHub | Repo stats, OAuth for project creation |
| Snowflake | Snowflake → CF | Mentorship program sync (inbound CronJob) |
| Snowflake | CF → Snowflake | Fivetran CF→Snowflake sync for LFX Self Serve |
| Auth0 | CF → Auth0 | JWT validation, user identity |
| Job | Schedule | Purpose |
|---|---|---|
ledger-stats-sync | Hourly | Syncs financial stats (balance, sponsors) from Ledger HTTP API into cached columns on initiatives |
The crowdfunding schema lives on the shared LFX v2 RDS instance. The initial migration file is at backend/db/migrations/001_initial.up.sql.
One-time DynamoDB → Postgres data migration script: backend/db/scripts/migrate_dynamo_to_postgres.py.
See backend/docs/rewrite/05-migration-plan.md for cutover procedure.
docker compose up -d
cd backend
cp .env.example .env # then fill in values — see below
psql "$DATABASE_URL" -f db/migrations/001_initial.up.sql
go run ./cmd/initiatives-api/
To seed development data after the DB schema is applied:
make db-seed
Required env vars:
| Var | Notes |
|---|---|
DATABASE_URL | postgres://crowdfunding:crowdfunding@localhost:5432/crowdfunding (matches docker-compose) |
ALLOW_MOCK_LOCAL_PRINCIPAL_BYPASS | Must be set to true to enable DISABLED_MOCK_LOCAL_PRINCIPAL |
DISABLED_MOCK_LOCAL_PRINCIPAL | Set to any non-empty string to skip JWT validation locally (requires ALLOW_MOCK_LOCAL_PRINCIPAL_BYPASS=true) |
STRIPE_SECRET_KEY | Stripe test key |
STRIPE_WEBHOOK_SECRET | Stripe test webhook secret |
STRIPE_RETURN_URL | Frontend URL Stripe redirects to after 3DS (e.g. http://localhost:3000/payment/complete) |
LEDGER_BASE_URL | Ledger service URL |
LEDGER_API_KEY | Ledger API key |
FRONTEND_BASE_URL | Frontend base URL for email links (e.g. http://localhost:3000) |
S3_UPLOAD_BUCKET | S3 bucket name for logo uploads |
S3_REGION | AWS region for S3 bucket (optional — falls back to AWS_REGION env var or SDK default region resolution if unset) |
HEIMDALL_JWKS_URL and DISABLED_MOCK_LOCAL_PRINCIPAL are mutually exclusive — the server rejects startup if both are set. When using the mock principal locally, leave HEIMDALL_JWKS_URL unset or empty. Both ALLOW_MOCK_LOCAL_PRINCIPAL_BYPASS=true and DISABLED_MOCK_LOCAL_PRINCIPAL must be set together to enable the bypass.
Node 22 is required (pnpm 9+ and the husky hooks need it):
nvm use 22
cd frontend
pnpm install
cp .env.example .env # then fill in values — see below
pnpm dev
Required env vars:
| Var | Notes |
|---|---|
NUXT_PUBLIC_AUTH0_CLIENT_ID | Auth0 client ID for the dev tenant |
NUXT_AUTH0_CLIENT_SECRET | Auth0 client secret for the dev tenant |
NUXT_JWT_SECRET | Any random string for local session signing |
Auth0 domain is set automatically to linuxfoundation-dev.auth0.com when NUXT_PUBLIC_APP_ENV=development (the default).
All commits must be signed off per the Developer Certificate of Origin:
git commit --signoff
See SECURITY.md for vulnerability reporting.
Copyright The Linux Foundation and each contributor to LFX.