diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..44dad06 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,26 @@ +.git +.github +.forgejo +__pycache__ +*.pyc +*.pyo +*.pyd +.Python +env/ +venv/ +.venv/ +pip-log.txt +pip-delete-this-directory.txt +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.log +.git* +tests/ +container-data/ +docker-compose.yml +.dockerignore diff --git a/.forgejo/workflows/build-and-publish.yml b/.forgejo/workflows/build-and-publish.yml new file mode 100644 index 0000000..0ddeaca --- /dev/null +++ b/.forgejo/workflows/build-and-publish.yml @@ -0,0 +1,48 @@ +name: Build and Publish Docker Image + +on: + push: + branches: [ main, master ] + tags: [ 'v*' ] + pull_request: + branches: [ main, master ] + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Registry + uses: docker/login-action@v2 + with: + registry: ${{ secrets.DOCKER_REGISTRY }} + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + if: github.event_name != 'pull_request' + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: ${{ secrets.DOCKER_REGISTRY }}/clevermicro/amq-adapter-python-demo + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha,format=short + + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/README.md b/README.md index 8e9b5ff..36ba7ce 100644 --- a/README.md +++ b/README.md @@ -116,3 +116,36 @@ AMQ_VERBOSE_LOGGING - if set to 1, the adapter will indicate in the log next to As an open-source project we run entierly off donations. Buy one of our hardworking developers a beer by [donating at OpenCollective](https://opencollective.com/cleverthis). All donations go to our bounty fund and allow us to place bounties on important bugs and enhancements. You may also use Beerpay linked via the above badges. +## Running with Docker Compose + +This project includes a Docker Compose configuration for easy local development and testing. + +### Prerequisites + +- Docker and Docker Compose installed on your system + +### Starting the services + +```bash +docker-compose up -d +``` + +This will start: +- The demo application (accessible at http://localhost:8000) +- Jaeger for distributed tracing (UI at http://localhost:16686) +- Prometheus for metrics collection (UI at http://localhost:9090) +- Alertmanager for alert handling (UI at http://localhost:9093) +- RabbitMQ for messaging (Management UI at http://localhost:15672) + +### Stopping the services + +```bash +docker-compose down +``` + +To remove volumes as well: + +```bash +docker-compose down -v +``` + diff --git a/demo.py b/demo.py index 18b38eb..fa30073 100644 --- a/demo.py +++ b/demo.py @@ -141,7 +141,7 @@ async def upload_document( # If running directly on host, use http://localhost:8000 # If running inside Docker and calling itself, use http://host.docker.internal:8000 # "http://localhost:8000/api/v3/documents/metadata", - "http://host.docker.internal:8000/api/v3/documents/metadata", + "http://app:8000/api/v3/documents/metadata", json=metadata_payload, ) response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b9c0e8e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,64 @@ +version: '3.8' +services: + app: + build: . + ports: + - "8000:8000" + - "8001:8001" + environment: + - OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4317 + depends_on: + - jaeger + - prometheus + - rabbitmq + - alertmanager + + jaeger: + image: jaegertracing/all-in-one:latest + ports: + - "6831:6831/udp" + - "14268:14268" + - "14250:14250" + - "4317:4317" + - "4318:4318" + - "16686:16686" + environment: + - COLLECTOR_OTLP_ENABLED=true + + prometheus: + image: prom/prometheus:latest + volumes: + - ./container-data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml + - ./container-data/prometheus/alert-rules.yml:/etc/prometheus/alert-rules.yml + ports: + - "9090:9090" + command: + - '--config.file=/etc/prometheus/prometheus.yml' + depends_on: + - alertmanager + + alertmanager: + image: prom/alertmanager:latest + ports: + - "9093:9093" + volumes: + - ./container-data/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml + command: + - '--config.file=/etc/alertmanager/alertmanager.yml' + + rabbitmq: + image: rabbitmq:3-management-alpine + ports: + - "5672:5672" + - "15672:15672" + - "15692:15692" + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + volumes: + - rabbitmq_data:/var/lib/rabbitmq + labels: + prometheus-job: rabbitmq + +volumes: + rabbitmq_data: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d6cc47c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +fastapi==0.111.0 +uvicorn[standard]==0.29.0 +python-multipart==0.0.9 +httpx==0.27.0 +opentelemetry-api==1.34.1 +opentelemetry-sdk==1.34.1 +opentelemetry-exporter-otlp-proto-grpc==1.34.1 +opentelemetry-exporter-prometheus==0.55b1 +opentelemetry-instrumentation-fastapi==0.55b1 +opentelemetry-instrumentation-httpx==0.55b1 +protobuf==5.28.3