Changelog¶
All notable changes to Apiary will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.3.1 - 2026-02-21¶
Fixed¶
- nginx static file serving: Removed the
location /staticnginx block that was causing CSS files to returntext/html(MIME type mismatch) and favicon/image requests to 403. All requests now proxy through to FastAPI, which serves static files correctly via its mountedStaticFileshandler - nginx syntax error: Added missing opening
{brace on thelocation /block
0.3.0 - 2026-02-21¶
Added¶
- Docker Compose support:
docker-compose.ymlruns the application on host port 3002 withconfig/andservices/bind-mounted as volumes for live editing without rebuilds - Config validation at container startup: Dockerfile CMD now runs
apiary testbefore launching uvicorn — the container exits immediately ifsettings.jsonorendpoints.jsonare invalid apiary dockerCLI commands: New subcommand group for managing the Docker container:apiary docker up [--build]— start the container in the background;--buildrebuilds the image firstapiary docker down— stop and remove the containerapiary docker restart— restart the container (use after editing mounted volumes)- Docker deployment docs:
docs/deployment/docker.mdcovers volumes, startup validation, and the typical edit→restart workflow
0.2.0 - 2026-02-20¶
Added¶
- AWS Lightsail install script:
_server/scripts/install.shautomates full server setup — installs system packages (git,nginx,curl,certbot), installsuv, clones the repository, syncs production dependencies, initializes config, generates a random 256-bitSECRET_KEY, configures nginx and systemd, and enables the service - Update script:
_server/scripts/update.shprovides a one-command update workflow (git pull→uv sync→systemctl restart) - Deployment docs: Updated
server-setup.mdto lead with the automated install script; updatedupdating.mdto documentupdate.shas the recommended update path
Fixed¶
- systemd service: Changed
Group=nginxtoGroup=www-data— on Ubuntu/Debian, nginx runs aswww-data, notnginx(which is an RHEL/CentOS convention)
0.1.1 - 2026-02-14¶
Fixed¶
- pytest-asyncio version: Changed from
>=1.3.0(nonexistent) to>=0.24.0 - pytest.ini: Removed buggy
--ignore=testsdirective that contradictedtestpaths=tests, consolidated all pytest config intopyproject.toml - HTTPMethod enum: Migrated from
(str, Enum)toStrEnum(Python 3.12+, fixes ruff UP042)
Changed¶
- Health readiness probe: Removed hardcoded CoinLore crypto API dependency check from
/health/ready; now checks configuration validity and reports registered services without coupling to specific service implementations - CLI serve command: Changed
hostandportfrom positional arguments to--host/-hand--port/-poptions with defaults shown - Service registry exports: Added
__all__tocore/services/__init__.pyfor clean public API
Added¶
py.typedmarker: PEP 561 compliance for downstream type checking- Multi-worker documentation: Added warnings to
RateLimiterandMetricsCollectorclasses noting that in-memory state is per-process and not shared across Gunicorn workers - Deployment docs: Added multi-worker caveats to monitoring and deployment configuration guides
- Version bump:
0.1.0to0.1.1inpyproject.toml
0.1.0 - 2026-01-26¶
Added¶
Core Framework¶
- FastAPI-based modular API framework
- Dynamic endpoint creation from JSON configuration
- Service-based architecture with
BaseServiceclass - Dependency injection for services and settings
- Structured logging with correlation IDs and request tracking
- Custom exception handling with detailed error responses
Authentication & Security¶
- API key authentication system with header-based validation
- Support for inline API keys (comma-separated strings)
- File-based API key management with automatic reloading
- Endpoint-specific API key configuration (override global keys)
- Optional authentication for public endpoints
- API key validation CLI tool
Rate Limiting¶
- Configurable rate limiting per minute
- Separate limits for authenticated and unauthenticated requests
- IP-based rate tracking
Built-in Endpoints¶
GET /- HTML landing page with API informationGET /health- Basic health checkGET /health/live- Kubernetes liveness probeGET /health/ready- Kubernetes readiness probe with dependency checksGET /metrics- Application metrics (requests, errors, uptime)GET /endpoints- Endpoint discovery (lists all registered endpoints)GET /auth/status- Check authentication statusPOST /auth/validate- Validate API key
Services¶
HelloService- Simple greeting service (example/demo)CryptoService- Cryptocurrency price data from CoinCap API
Configuration¶
- JSON-based configuration files (
settings.json,endpoints.json) - Template files for easy initialization
- Pydantic-based settings validation
- Environment variable support
- Configurable API documentation (Swagger UI, ReDoc, OpenAPI JSON)
- Router enable/disable configuration
CLI Tools¶
apiary init- Initialize configuration from templatesapiary serve- Start the development server with optional reloadapiary validate-config- Validate API key configurationsapiary clean- Clean up generated files and caches
Documentation¶
- Complete user guide with examples
- Getting started guide (installation, quickstart, configuration)
- Advanced topics (authentication, API key validation, advanced endpoints)
- Deployment guides (server setup, configuration, monitoring)
- API reference (core modules, services, models, configuration)
- CLI reference with detailed command documentation
Deployment¶
- nginx reverse proxy configuration template
- systemd service unit template
- Docker support
- Production configuration examples
- Health check endpoints for orchestration
Technical Details¶
- Python 3.12+ required
- Built with FastAPI 0.128.0+
- Uses Pydantic v2 for data validation
- Uvicorn ASGI server with uvloop
- Watchdog for file monitoring
- httpx for async HTTP requests
Release Notes¶
Version Compatibility¶
- Python: 3.12 or higher required
- FastAPI: 0.128.0 or higher
- Pydantic: 2.5.0 or higher
Upgrade Notes¶
From 0.3.0 to 0.3.1¶
- nginx config: Apply the updated
_server/nginx/apiary.nginxto your server:
From 0.2.0 to 0.3.0¶
- No API or configuration changes — this release adds Docker Compose support and CLI docker commands.
- If you already have a
docker-compose.yml, replace it with the new one (port 3002, mounted volumes). - The Dockerfile CMD now runs
apiary teston startup; ensureconfig/settings.jsonandconfig/endpoints.jsonexist and are valid before starting the container.
From 0.1.1 to 0.2.0¶
- systemd service: If you have an existing deployment, update the
Group=in your service file:sudo sed -i 's/Group=nginx/Group=www-data/' /etc/systemd/system/apiary.service && sudo systemctl daemon-reload && sudo systemctl restart apiary - No API or configuration changes — this release is purely infrastructure and tooling.
From 0.1.0 to 0.1.1¶
- CLI:
apiary serve HOST PORTis nowapiary serve --host HOST --port PORT. The old positional syntax no longer works. - Health check:
/health/readyno longer checks the CoinLore API. If you were relying on thecrypto_apifield in the readiness response, it has been replaced by aservicesfield listing all registered services. - pytest config:
pytest.inihas been removed. All pytest configuration is now inpyproject.toml. If you had local customizations inpytest.ini, migrate them to[tool.pytest.ini_options]inpyproject.toml.
Breaking Changes¶
apiary servepositional arguments replaced with--host/--portoptions (v0.1.1)