Shared FastAPI/Celery scaffolding for Sweet Potato service backends.
Project description
SPAPS Server Quickstart
Reusable scaffolding for Sweet Potato service backends. This package gathers the FastAPI application factory, Celery bootstrap, Pydantic settings base classes, and other utilities that HTMA, Ingredient, and future services can share.
Installation
Use either Poetry (preferred inside this repo) or pip editable installs:
# with poetry
poetry install -C packages/python-server-quickstart
# or with pip (installs package + dev extras)
python3 -m pip install -e 'packages/python-server-quickstart[dev]'
The editable install ensures FastAPI, SQLAlchemy, Celery, and other dependencies are available when the pre-push scripts execute.
Local Development
poetry run -C packages/python-server-quickstart pytest
The shared modules are designed to be imported by individual service packages. Tests live alongside the shared code to guard the common behaviour.
Operational Templates
For infrastructure parity with live SPAPS services, the directory
templates/operations contains a ready-to-copy bundle (Makefile, GHCR-aware deploy script,
.env.production.example, and production docker-compose/reverse-proxy stubs). Copy it into a
service repository when adopting the quickstart so CI/CD, GHCR pulls, and the shared reverse proxy
follow the same playbook used by Ingredient, HTMA, and Sweet Potato.
RBAC Helpers & Sample Routers
- Use
spaps_server_quickstart.rbac.require_rolesas a FastAPI dependency to guard admin/staff-only routes. It returns the authenticated user when the role check passes and raisesHTTPException(401/403) otherwise. spaps_server_quickstart.rbac.has_required_rolesprovides a lightweight predicate when you need to branch on roles outside of dependency injection.- Copy the sample routers under
spaps_server_quickstart.templates.domains(users/admin) when spinning up new services—they demonstrate how to wire the RBAC helpers into typical CRUD endpoints.
Configuration Highlights
Services configure behaviour by subclassing BaseServiceSettings. Override fields like
spaps_auth_exempt_paths to expose unauthenticated endpoints or set cors_allow_origins
(and related CORS knobs) to attach the shared CORSMiddleware without writing per-service
plumbing. All list-like settings accept comma-separated environment variables for easy deployment.
Auth Channels (Magic Link & Wallet)
SpapsAuthChannelServicewraps SPAPS magic-link and wallet authentication so services can drop the boilerplate client calls.- Use
send_magic_link/verify_magic_linkfor email links andrequest_wallet_nonce/verify_walletfor Solana or Ethereum sign-ins. - The helpers raise
AuthChannelErrorwithstatus_codeanderror_code, giving your routes enough context to map responses cleanly. - Lifecycle management mirrors the main auth service—call
await service.aclose()during shutdown if you create a long-lived instance.
Environment Reference
| Variable | Description | Notes |
|---|---|---|
SPAPS_API_URL |
Base URL for SPAPS API requests | Defaults to https://api.sweetpotato.dev |
SPAPS_API_KEY |
Service API key used for auth + channel helpers | Required when spaps_auth_enabled is true |
SPAPS_APPLICATION_ID |
Application identifier enforced during session validation | Required when spaps_auth_enabled is true |
SPAPS_AUTH_ENABLED |
Toggle for the auth middleware | Enables SpapsAuthMiddleware when true |
SPAPS_AUTH_EXEMPT_PATHS |
Comma-separated paths that bypass auth | Parsed into a tuple automatically |
SPAPS_REQUEST_TIMEOUT |
Timeout (seconds) for SPAPS HTTP calls | Applies to both auth and channel helpers |
CORS_ALLOW_ORIGINS / CORS_ALLOW_METHODS / CORS_ALLOW_HEADERS |
Comma-separated CORS configuration | Leave empty to skip the middleware |
CORS_EXPOSE_HEADERS |
Headers exposed to clients | Defaults to empty tuple |
CORS_ALLOW_CREDENTIALS |
Whether CORS requests include credentials | Defaults to true |
CORS_MAX_AGE |
CORS preflight cache duration | Must be non-negative |
Lifecycle Hooks
create_app now uses FastAPI's lifespan context to close shared resources (e.g., SPAPS auth
clients). When you need additional startup/shutdown logic, extend the lifespan in your service
by wrapping the provided app with your own context manager or closing resources within your
domain packages. Running tests with TestClient(app) will automatically exercise the shutdown
path and catch missing aclose() implementations.
Upgrading Downstream Services
Guidance for publishing new versions and upgrading consumer services lives in
docs/UPGRADING.md. Review those steps before bumping the package or
pulling a newer release into htma_server, ingredient_server, or other SPAPS services.
Migrating an Existing Service
See docs/MIGRATION_GUIDE.md for a step-by-step walkthrough of
adopting the shared package inside an existing FastAPI/Celery service. It covers settings
integration, router wiring, database session management, Celery bootstraps, and the final
cleanup checklist.
Release Workflow
- Use the GitHub Action Publish Python Server Quickstart (
.github/workflows/python-server-quickstart-release.yml) to cut releases. It reuses the genericpython-package-releaseworkflow alongsidescripts/manage_python_package_version.py. - Ensure the repository secret
PYPI_SERVER_QUICKSTART_TOKENholds the PyPI API token for this package. - For manual bumps, dispatch the workflow and choose the bump type (major/minor/patch). For automated publishes, pushing a commit that updates
packages/python-server-quickstart/pyproject.tomlwill trigger the workflow.
Status
- Initial package scaffold
- Shared application factories
- Shared Celery bootstrap
- Shared middleware, logging, and settings base classes
- Health endpoint helpers
- Documentation and usage examples
Repository Integration
The root package.json includes lint:python-server-quickstart, typecheck:python-server-quickstart,
and test:python-server-quickstart commands. These run automatically via npm run prepush, and the npm
scripts install packages/python-server-quickstart[dev] on demand so the editable install step is handled
for you.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spaps_server_quickstart-0.1.2.tar.gz.
File metadata
- Download URL: spaps_server_quickstart-0.1.2.tar.gz
- Upload date:
- Size: 42.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
767f0078a70d390f6f66091ec1761424b3043faea4d32343e683d3f2717940ac
|
|
| MD5 |
b6f5f0c22359bf22e2541764b420d6d1
|
|
| BLAKE2b-256 |
1216ae859bd78b8a7f1fc7af24c7e51284dfd3e4847d51d5752af1b08858affc
|
File details
Details for the file spaps_server_quickstart-0.1.2-py3-none-any.whl.
File metadata
- Download URL: spaps_server_quickstart-0.1.2-py3-none-any.whl
- Upload date:
- Size: 33.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ae55f19fb8f7ee02484107723362387d3e9a0cc1b8429ac2c5947a406bea32b
|
|
| MD5 |
24a674cf6a80cc266a68469da1d3e5e0
|
|
| BLAKE2b-256 |
a44efd35fa1e3caeb20929c3fb12bf3034d93903669767102c16f3fae22851b0
|