Deployment
This guide covers deploying applications that use the YouVersion Bible Client.
Production Considerations
Environment Variables
Always use environment variables in production:
# Set in your deployment platform
export YOUVERSION_USERNAME="production_user"
export YOUVERSION_PASSWORD="production_password"
Docker Deployment
Dockerfile Example
FROM python:3.11-slim
WORKDIR /app
# Install dependencies
COPY pyproject.toml poetry.lock ./
RUN pip install poetry && \
poetry config virtualenvs.create false && \
poetry install --no-dev
# Copy application
COPY . .
# Set environment variables (or use docker-compose)
ENV YOUVERSION_USERNAME=""
ENV YOUVERSION_PASSWORD=""
CMD ["python", "app.py"]
Docker Compose Example
version: '3.8'
services:
app:
build: .
environment:
- YOUVERSION_USERNAME=${YOUVERSION_USERNAME}
- YOUVERSION_PASSWORD=${YOUVERSION_PASSWORD}
env_file:
- .env.production
Cloud Deployment
AWS Lambda
Example Lambda function:
import json
import os
from youversion.clients import SyncClient
def lambda_handler(event, context):
username = os.environ['YOUVERSION_USERNAME']
password = os.environ['YOUVERSION_PASSWORD']
with SyncClient(username=username, password=password) as client:
votd = client.verse_of_the_day()
return {
'statusCode': 200,
'body': json.dumps({
'day': votd.day,
'usfm': votd.usfm
})
}
Monitoring
Add Logging
Implement comprehensive logging:
import logging
from youversion.clients import AsyncClient
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def monitored_api_call():
logger.info("Starting API call")
try:
async with AsyncClient() as client:
result = await client.verse_of_the_day()
logger.info(f"API call successful: {result.usfm}")
return result
except Exception as e:
logger.error(f"API call failed: {e}", exc_info=True)
raise
Performance Monitoring
Monitor API call performance:
import time
import logging
from youversion.clients import AsyncClient
logger = logging.getLogger(__name__)
async def monitored_call():
start_time = time.time()
try:
async with AsyncClient() as client:
result = await client.verse_of_the_day()
duration = time.time() - start_time
logger.info(f"API call completed in {duration:.2f}s")
return result
except Exception as e:
duration = time.time() - start_time
logger.error(f"API call failed after {duration:.2f}s: {e}")
raise