chore: Remove legacy Docker configuration and documentation
Some checks failed
API Gateway (Java Spring Boot) / test (21) (push) Successful in 2m2s
API Gateway (Java Spring Boot) / test (17) (push) Successful in 2m2s
Frontend (React) / test (20) (push) Successful in 2m11s
Integration Tests / integration-tests (push) Failing after 25s
Integration Tests / performance-tests (push) Has been skipped
API Docs (Node.js Express) / test (20) (push) Successful in 2m36s
API Gateway (Java Spring Boot) / build (push) Failing after 40s
Service Adapters (Python FastAPI) / test (3.11) (push) Successful in 1m24s
Service Adapters (Python FastAPI) / test (3.12) (push) Successful in 1m27s
Service Adapters (Python FastAPI) / test (3.13) (push) Successful in 1m27s
Frontend (React) / build (push) Failing after 58s
Service Adapters (Python FastAPI) / build (push) Failing after 21s
Frontend (React) / lighthouse (push) Has been skipped
API Docs (Node.js Express) / build (push) Failing after 1m24s
Some checks failed
API Gateway (Java Spring Boot) / test (21) (push) Successful in 2m2s
API Gateway (Java Spring Boot) / test (17) (push) Successful in 2m2s
Frontend (React) / test (20) (push) Successful in 2m11s
Integration Tests / integration-tests (push) Failing after 25s
Integration Tests / performance-tests (push) Has been skipped
API Docs (Node.js Express) / test (20) (push) Successful in 2m36s
API Gateway (Java Spring Boot) / build (push) Failing after 40s
Service Adapters (Python FastAPI) / test (3.11) (push) Successful in 1m24s
Service Adapters (Python FastAPI) / test (3.12) (push) Successful in 1m27s
Service Adapters (Python FastAPI) / test (3.13) (push) Successful in 1m27s
Frontend (React) / build (push) Failing after 58s
Service Adapters (Python FastAPI) / build (push) Failing after 21s
Frontend (React) / lighthouse (push) Has been skipped
API Docs (Node.js Express) / build (push) Failing after 1m24s
### Summary of Changes - Deleted `docker-compose.dev.yml` and `docker-compose.yml` files to streamline the project structure. - Removed outdated Dockerfiles for services (API Gateway, Service Adapters, API Docs, and Frontend) to eliminate redundancy. - Updated `env.example` to reflect changes in service configurations, including local host settings for PostgreSQL and Redis. - Revised `README.md` to remove references to Docker deployment and clarify local development setup instructions. - Cleaned up documentation structure by removing obsolete files related to Docker rate limits and compatibility fixes. ### Expected Results - Simplified project setup and improved clarity for developers by focusing on current configurations and removing legacy artifacts.
This commit is contained in:
@@ -1,234 +0,0 @@
|
||||
name: Docker Build and Push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, develop ]
|
||||
tags: [ 'v*' ]
|
||||
pull_request:
|
||||
branches: [ main, develop ]
|
||||
|
||||
env:
|
||||
REGISTRY: gittea.kammenstraatha.duckdns.org
|
||||
REGISTRY_URL: https://gittea.kammenstraatha.duckdns.org
|
||||
REPO_OWNER: admin
|
||||
IMAGE_PREFIX: labfusion
|
||||
|
||||
jobs:
|
||||
# Shared setup job for common steps
|
||||
setup:
|
||||
runs-on: self-hosted
|
||||
outputs:
|
||||
version: ${{ steps.meta.outputs.version }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-gateway
|
||||
${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/service-adapters
|
||||
${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-docs
|
||||
${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/frontend
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
type=sha,prefix={{branch}}-
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
|
||||
# API Gateway build and push
|
||||
build-push-api-gateway:
|
||||
runs-on: self-hosted
|
||||
needs: setup
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY_URL }}
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
|
||||
- name: Build and push API Gateway (Legacy Builder)
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./services/api-gateway
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-gateway:${{ needs.setup.outputs.version }}
|
||||
labels: ${{ needs.setup.outputs.labels }}
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-gateway:cache
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-gateway:cache,mode=max
|
||||
# Use legacy builder for maximum compatibility
|
||||
builder: default
|
||||
build-args: |
|
||||
BUILDKIT_INLINE_CACHE=0
|
||||
|
||||
# Service Adapters build and push
|
||||
build-push-service-adapters:
|
||||
runs-on: self-hosted
|
||||
needs: setup
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY_URL }}
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
|
||||
- name: Build and push Service Adapters (Legacy Builder)
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./services/service-adapters
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/service-adapters:${{ needs.setup.outputs.version }}
|
||||
labels: ${{ needs.setup.outputs.labels }}
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/service-adapters:cache
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/service-adapters:cache,mode=max
|
||||
# Use legacy builder for maximum compatibility
|
||||
builder: default
|
||||
build-args: |
|
||||
BUILDKIT_INLINE_CACHE=0
|
||||
|
||||
# API Docs build and push
|
||||
build-push-api-docs:
|
||||
runs-on: self-hosted
|
||||
needs: setup
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY_URL }}
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
|
||||
- name: Build and push API Docs (Legacy Builder)
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./services/api-docs
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-docs:${{ needs.setup.outputs.version }}
|
||||
labels: ${{ needs.setup.outputs.labels }}
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-docs:cache
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/api-docs:cache,mode=max
|
||||
# Use legacy builder for maximum compatibility
|
||||
builder: default
|
||||
build-args: |
|
||||
BUILDKIT_INLINE_CACHE=0
|
||||
|
||||
# Frontend build and push
|
||||
build-push-frontend:
|
||||
runs-on: self-hosted
|
||||
needs: setup
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY_URL }}
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
|
||||
- name: Build and push Frontend (Legacy Builder)
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./frontend
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/frontend:${{ needs.setup.outputs.version }}
|
||||
labels: ${{ needs.setup.outputs.labels }}
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/frontend:cache
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/frontend:cache,mode=max
|
||||
# Use legacy builder for maximum compatibility
|
||||
builder: default
|
||||
build-args: |
|
||||
BUILDKIT_INLINE_CACHE=0
|
||||
|
||||
# Compatibility test job
|
||||
test-compatibility:
|
||||
runs-on: self-hosted
|
||||
needs: [build-push-api-gateway, build-push-service-adapters, build-push-api-docs, build-push-frontend]
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Test API Docs compatibility
|
||||
run: |
|
||||
echo "Testing API Docs image compatibility..."
|
||||
|
||||
# Pull the latest image
|
||||
docker pull ${{ env.REGISTRY }}/admin/api-docs:${{ needs.setup.outputs.version }}
|
||||
|
||||
# Test running the container
|
||||
docker run --rm -d --name test-api-docs \
|
||||
-p 8083:8083 \
|
||||
${{ env.REGISTRY }}/admin/api-docs:${{ needs.setup.outputs.version }}
|
||||
|
||||
# Wait for container to start
|
||||
sleep 10
|
||||
|
||||
# Check if container is running
|
||||
if docker ps | grep -q test-api-docs; then
|
||||
echo "✓ API Docs container started successfully"
|
||||
else
|
||||
echo "✗ API Docs container failed to start"
|
||||
docker logs test-api-docs
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Clean up
|
||||
docker stop test-api-docs || true
|
||||
|
||||
- name: Test docker-compose compatibility
|
||||
run: |
|
||||
echo "Testing docker-compose configuration..."
|
||||
|
||||
# Validate docker-compose.yml
|
||||
docker-compose config > /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✓ docker-compose.yml is valid"
|
||||
else
|
||||
echo "✗ docker-compose.yml has syntax errors"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Compatibility test completed
|
||||
run: |
|
||||
echo "✓ All compatibility tests passed"
|
||||
echo "Images are ready for deployment with maximum Docker version compatibility"
|
||||
85
README.md
85
README.md
@@ -10,7 +10,7 @@ A unified dashboard and integration hub for your homelab services. LabFusion pro
|
||||
- **Data Correlation**: Cross-service insights and event correlation
|
||||
- **Customizable Widgets**: Build dashboards with charts, tables, and status cards
|
||||
- **Polyglot Architecture**: Java Spring Boot API gateway with Python FastAPI adapters
|
||||
- **Dockerized Deployment**: Easy setup with Docker Compose
|
||||
- **Multi-Service Architecture**: Modular services with clear separation of concerns
|
||||
|
||||
## Architecture
|
||||
|
||||
@@ -32,9 +32,12 @@ A unified dashboard and integration hub for your homelab services. LabFusion pro
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Docker and Docker Compose
|
||||
- Java 17+ (for API Gateway)
|
||||
- Python 3.9+ (for Service Adapters)
|
||||
- Node.js 18+ (for Frontend and API Docs)
|
||||
- Git
|
||||
- Access to container registry (optional, for pre-built images)
|
||||
- PostgreSQL (for data storage)
|
||||
- Redis (for message bus)
|
||||
|
||||
### Installation
|
||||
|
||||
@@ -51,11 +54,6 @@ cp env.example .env
|
||||
|
||||
3. Edit `.env` file with your configuration:
|
||||
```bash
|
||||
# Docker Registry Configuration (for pre-built images)
|
||||
DOCKER_REGISTRY=gittea.kammenstraatha.duckdns.org/admin
|
||||
DOCKER_USERNAME=admin
|
||||
IMAGE_TAG=main
|
||||
|
||||
# Service Integration URLs (update with your actual service URLs and tokens)
|
||||
HOME_ASSISTANT_URL=http://homeassistant.local:8123
|
||||
HOME_ASSISTANT_TOKEN=your-ha-token-here
|
||||
@@ -67,27 +65,23 @@ IMMICH_API_KEY=your-immich-api-key-here
|
||||
|
||||
4. Start the services:
|
||||
```bash
|
||||
# Using pre-built images from registry (recommended)
|
||||
docker-compose up -d
|
||||
# Start API Gateway (Java Spring Boot)
|
||||
cd services/api-gateway
|
||||
./mvnw spring-boot:run
|
||||
|
||||
# Or for development with local builds
|
||||
docker-compose -f docker-compose.dev.yml up -d
|
||||
# Start Service Adapters (Python FastAPI)
|
||||
cd services/service-adapters
|
||||
python -m uvicorn main:app --reload --port 8000
|
||||
|
||||
# Start Frontend (React)
|
||||
cd frontend
|
||||
npm start
|
||||
|
||||
# Start API Docs (Node.js Express)
|
||||
cd services/api-docs
|
||||
npm start
|
||||
```
|
||||
|
||||
**Docker Compatibility Issues?** If you encounter BuildKit cache errors (common with Docker 27.x), run our compatibility fix:
|
||||
|
||||
**Windows:**
|
||||
```powershell
|
||||
.\scripts\fix-docker-compatibility.ps1
|
||||
```
|
||||
|
||||
**Linux/macOS:**
|
||||
```bash
|
||||
./scripts/fix-docker-compatibility.sh
|
||||
```
|
||||
|
||||
See [Docker Compatibility Guide](docs/DOCKER_COMPATIBILITY.md) for detailed troubleshooting.
|
||||
|
||||
5. Access the application:
|
||||
- Frontend: http://localhost:3000
|
||||
- API Gateway: http://localhost:8080
|
||||
@@ -179,32 +173,33 @@ npm start
|
||||
- **API Gateway**: http://localhost:8080/swagger-ui.html
|
||||
- **Service Adapters**: http://localhost:8000/docs
|
||||
|
||||
## Docker Deployment
|
||||
## Development
|
||||
|
||||
LabFusion supports both pre-built images from container registries and local builds:
|
||||
|
||||
### Pre-built Images (Recommended)
|
||||
### Local Development Setup
|
||||
```bash
|
||||
# Configure registry settings in .env
|
||||
DOCKER_REGISTRY=gittea.kammenstraatha.duckdns.org/admin
|
||||
DOCKER_USERNAME=admin
|
||||
IMAGE_TAG=main
|
||||
# Start PostgreSQL and Redis (using your preferred method)
|
||||
# Then start each service in separate terminals:
|
||||
|
||||
# Deploy with pre-built images
|
||||
docker-compose up -d
|
||||
# Terminal 1: API Gateway
|
||||
cd services/api-gateway
|
||||
./mvnw spring-boot:run
|
||||
|
||||
# Terminal 2: Service Adapters
|
||||
cd services/service-adapters
|
||||
python -m uvicorn main:app --reload --port 8000
|
||||
|
||||
# Terminal 3: Frontend
|
||||
cd frontend
|
||||
npm start
|
||||
|
||||
# Terminal 4: API Docs
|
||||
cd services/api-docs
|
||||
npm start
|
||||
```
|
||||
|
||||
### Local Development
|
||||
```bash
|
||||
# Build and run locally
|
||||
docker-compose -f docker-compose.dev.yml up -d
|
||||
```
|
||||
|
||||
For detailed deployment instructions, see [Docker Deployment Guide](docs/DOCKER_DEPLOYMENT.md).
|
||||
|
||||
## Roadmap
|
||||
|
||||
- [x] Basic project structure and Docker setup
|
||||
- [x] Basic project structure and service setup
|
||||
- [x] Spring Boot API gateway with authentication
|
||||
- [x] FastAPI service adapters with modular structure
|
||||
- [x] React frontend with dashboard
|
||||
|
||||
@@ -1,124 +0,0 @@
|
||||
version: '3.8'
|
||||
|
||||
# Global BuildKit compatibility settings
|
||||
x-buildkit-args: &buildkit-args
|
||||
BUILDKIT_INLINE_CACHE: 1
|
||||
|
||||
services:
|
||||
# Database
|
||||
postgres:
|
||||
image: postgres:latest
|
||||
environment:
|
||||
POSTGRES_DB: labfusion
|
||||
POSTGRES_USER: labfusion
|
||||
POSTGRES_PASSWORD: labfusion_password
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
ports:
|
||||
- "5432:5432"
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
# Redis for message bus
|
||||
redis:
|
||||
image: redis:latest
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
# Java Spring Boot API Gateway (Development)
|
||||
api-gateway:
|
||||
build:
|
||||
context: ./services/api-gateway
|
||||
dockerfile: Dockerfile.dev
|
||||
args: *buildkit-args
|
||||
ports:
|
||||
- "8080:8080"
|
||||
environment:
|
||||
- SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/labfusion
|
||||
- SPRING_DATASOURCE_USERNAME=labfusion
|
||||
- SPRING_DATASOURCE_PASSWORD=labfusion_password
|
||||
- REDIS_HOST=redis
|
||||
- REDIS_PORT=6379
|
||||
- SPRING_PROFILES_ACTIVE=dev
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
networks:
|
||||
- labfusion-network
|
||||
volumes:
|
||||
- ./services/api-gateway:/app
|
||||
- maven_cache:/root/.m2
|
||||
|
||||
# Python FastAPI Service Adapters (Development)
|
||||
service-adapters:
|
||||
build:
|
||||
context: ./services/service-adapters
|
||||
dockerfile: Dockerfile.dev
|
||||
args: *buildkit-args
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
- REDIS_HOST=redis
|
||||
- REDIS_PORT=6379
|
||||
- POSTGRES_URL=postgresql://labfusion:labfusion_password@postgres:5432/labfusion
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
networks:
|
||||
- labfusion-network
|
||||
volumes:
|
||||
- ./services/service-adapters:/app
|
||||
|
||||
# React Frontend (Development)
|
||||
frontend:
|
||||
build:
|
||||
context: ./frontend
|
||||
dockerfile: Dockerfile.dev
|
||||
args: *buildkit-args
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- REACT_APP_API_URL=http://localhost:8080
|
||||
- REACT_APP_WEBSOCKET_URL=ws://localhost:8080/ws
|
||||
depends_on:
|
||||
- api-gateway
|
||||
networks:
|
||||
- labfusion-network
|
||||
volumes:
|
||||
- ./frontend:/app
|
||||
- /app/node_modules
|
||||
|
||||
# API Documentation Service (Development)
|
||||
api-docs:
|
||||
build:
|
||||
context: ./services/api-docs
|
||||
dockerfile: Dockerfile.dev
|
||||
args: *buildkit-args
|
||||
ports:
|
||||
- "8083:8083"
|
||||
environment:
|
||||
- API_GATEWAY_URL=http://api-gateway:8080
|
||||
- SERVICE_ADAPTERS_URL=http://service-adapters:8000
|
||||
- METRICS_COLLECTOR_URL=http://metrics-collector:8081
|
||||
- NOTIFICATION_SERVICE_URL=http://notification-service:8082
|
||||
depends_on:
|
||||
- api-gateway
|
||||
- service-adapters
|
||||
networks:
|
||||
- labfusion-network
|
||||
volumes:
|
||||
- ./services/api-docs:/app
|
||||
- /app/node_modules
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
maven_cache:
|
||||
|
||||
networks:
|
||||
labfusion-network:
|
||||
driver: bridge
|
||||
@@ -1,97 +0,0 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# Database
|
||||
postgres:
|
||||
image: postgres:14
|
||||
environment:
|
||||
POSTGRES_DB: labfusion
|
||||
POSTGRES_USER: labfusion
|
||||
POSTGRES_PASSWORD: labfusion_password
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
ports:
|
||||
- "5432:5432"
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
# Redis for message bus
|
||||
redis:
|
||||
image: redis:latest
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
# Java Spring Boot API Gateway
|
||||
api-gateway:
|
||||
image: gittea.kammenstraatha.duckdns.org/admin/api-gateway:main
|
||||
ports:
|
||||
- "8080:8080"
|
||||
environment:
|
||||
- SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/labfusion
|
||||
- SPRING_DATASOURCE_USERNAME=labfusion
|
||||
- SPRING_DATASOURCE_PASSWORD=labfusion_password
|
||||
- REDIS_HOST=redis
|
||||
- REDIS_PORT=6379
|
||||
- SPRING_PROFILES_ACTIVE=prod
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
# Python FastAPI Service Adapters
|
||||
service-adapters:
|
||||
image: gittea.kammenstraatha.duckdns.org/admin/service-adapters:main
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
- REDIS_HOST=redis
|
||||
- REDIS_PORT=6379
|
||||
- POSTGRES_URL=postgresql://labfusion:labfusion_password@postgres:5432/labfusion
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
# React Frontend
|
||||
frontend:
|
||||
image: gittea.kammenstraatha.duckdns.org/admin/frontend:main
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- REACT_APP_API_URL=http://localhost:8080
|
||||
- REACT_APP_WEBSOCKET_URL=ws://localhost:8080/ws
|
||||
depends_on:
|
||||
- api-gateway
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
# API Documentation Service
|
||||
api-docs:
|
||||
image: gittea.kammenstraatha.duckdns.org/admin/api-docs:cache
|
||||
ports:
|
||||
- "8083:8083"
|
||||
environment:
|
||||
- API_GATEWAY_URL=http://api-gateway:8080
|
||||
- SERVICE_ADAPTERS_URL=http://service-adapters:8000
|
||||
- METRICS_COLLECTOR_URL=http://metrics-collector:8081
|
||||
- NOTIFICATION_SERVICE_URL=http://notification-service:8082
|
||||
depends_on:
|
||||
- api-gateway
|
||||
- service-adapters
|
||||
networks:
|
||||
- labfusion-network
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
maven_cache:
|
||||
|
||||
networks:
|
||||
labfusion-network:
|
||||
driver: bridge
|
||||
@@ -1,201 +0,0 @@
|
||||
# Docker Hub Rate Limit Fix
|
||||
|
||||
## Problem
|
||||
```
|
||||
Error response from daemon: toomanyrequests: You have reached your unauthenticated pull rate limit. https://www.docker.com/increase-rate-limit
|
||||
```
|
||||
|
||||
Docker Hub has strict rate limits:
|
||||
- **Unauthenticated**: 100 pulls per 6 hours per IP
|
||||
- **Authenticated (free)**: 200 pulls per 6 hours per user
|
||||
- **Pro/Team**: Higher limits
|
||||
|
||||
## Solutions
|
||||
|
||||
### Solution 1: Use Docker Hub Authentication (Recommended)
|
||||
|
||||
#### 1.1. Create Docker Hub Account
|
||||
1. Go to [Docker Hub](https://hub.docker.com)
|
||||
2. Create a free account
|
||||
3. Note your username and password
|
||||
|
||||
#### 1.2. Update Runner Configurations
|
||||
|
||||
Add Docker authentication to each runner config:
|
||||
|
||||
**`runners/config_heavy.yaml`:**
|
||||
```yaml
|
||||
container:
|
||||
# Docker registry authentication
|
||||
docker_username: "your_dockerhub_username"
|
||||
docker_password: "your_dockerhub_password"
|
||||
```
|
||||
|
||||
**`runners/config_light.yaml`:**
|
||||
```yaml
|
||||
container:
|
||||
# Docker registry authentication
|
||||
docker_username: "your_dockerhub_username"
|
||||
docker_password: "your_dockerhub_password"
|
||||
```
|
||||
|
||||
**`runners/config_docker.yaml`:**
|
||||
```yaml
|
||||
container:
|
||||
# Docker registry authentication
|
||||
docker_username: "your_dockerhub_username"
|
||||
docker_password: "your_dockerhub_password"
|
||||
```
|
||||
|
||||
**`runners/config_security.yaml`:**
|
||||
```yaml
|
||||
container:
|
||||
# Docker registry authentication
|
||||
docker_username: "your_dockerhub_username"
|
||||
docker_password: "your_dockerhub_password"
|
||||
```
|
||||
|
||||
#### 1.3. Alternative: Use Environment Variables
|
||||
|
||||
Instead of hardcoding credentials, use environment variables:
|
||||
|
||||
**Update `runners/.env.runners`:**
|
||||
```bash
|
||||
# Docker Hub credentials
|
||||
DOCKER_USERNAME=your_dockerhub_username
|
||||
DOCKER_PASSWORD=your_dockerhub_password
|
||||
```
|
||||
|
||||
**Update config files:**
|
||||
```yaml
|
||||
container:
|
||||
docker_username: ${DOCKER_USERNAME}
|
||||
docker_password: ${DOCKER_PASSWORD}
|
||||
```
|
||||
|
||||
### Solution 2: Use Alternative Registries
|
||||
|
||||
#### 2.1. Use GitHub Container Registry (ghcr.io)
|
||||
|
||||
Update image references to use GitHub's registry:
|
||||
|
||||
**Heavy Runner:**
|
||||
```yaml
|
||||
labels:
|
||||
- "java:docker://ghcr.io/openjdk/openjdk:17-jdk-slim"
|
||||
- "python:docker://ghcr.io/library/python:3.11-slim"
|
||||
```
|
||||
|
||||
**Light Runner:**
|
||||
```yaml
|
||||
labels:
|
||||
- "nodejs:docker://ghcr.io/library/node:20-slim"
|
||||
- "frontend:docker://ghcr.io/library/node:20-slim"
|
||||
```
|
||||
|
||||
#### 2.2. Use Quay.io Registry
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- "java:docker://quay.io/eclipse/alpine_jdk17:latest"
|
||||
- "python:docker://quay.io/python/python:3.11-slim"
|
||||
- "nodejs:docker://quay.io/node/node:20-slim"
|
||||
```
|
||||
|
||||
### Solution 3: Use Local Image Caching
|
||||
|
||||
#### 3.1. Pre-pull Images on Runner Host
|
||||
|
||||
```bash
|
||||
# On your runner host machine
|
||||
docker pull openjdk:17-jdk-slim
|
||||
docker pull python:3.11-slim
|
||||
docker pull node:20-slim
|
||||
docker pull docker:24-dind
|
||||
docker pull alpine:3.19
|
||||
|
||||
# Tag as local images
|
||||
docker tag openjdk:17-jdk-slim localhost:5000/openjdk:17-jdk-slim
|
||||
docker tag python:3.11-slim localhost:5000/python:3.11-slim
|
||||
docker tag node:20-slim localhost:5000/node:20-slim
|
||||
docker tag docker:24-dind localhost:5000/docker:24-dind
|
||||
docker tag alpine:3.19 localhost:5000/alpine:3.19
|
||||
```
|
||||
|
||||
#### 3.2. Update Config to Use Local Images
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- "java:docker://localhost:5000/openjdk:17-jdk-slim"
|
||||
- "python:docker://localhost:5000/python:3.11-slim"
|
||||
- "nodejs:docker://localhost:5000/node:20-slim"
|
||||
```
|
||||
|
||||
### Solution 4: Reduce Image Pulls
|
||||
|
||||
#### 4.1. Disable Force Pull
|
||||
|
||||
Update all config files:
|
||||
```yaml
|
||||
container:
|
||||
# Don't pull if image already exists
|
||||
force_pull: false
|
||||
```
|
||||
|
||||
#### 4.2. Use Image Caching
|
||||
|
||||
```yaml
|
||||
container:
|
||||
# Enable image caching
|
||||
force_pull: false
|
||||
force_rebuild: false
|
||||
```
|
||||
|
||||
### Solution 5: Use Self-Hosted Registry
|
||||
|
||||
#### 5.1. Set up Local Registry
|
||||
|
||||
```bash
|
||||
# Run local Docker registry
|
||||
docker run -d -p 5000:5000 --name registry registry:2
|
||||
|
||||
# Mirror images to local registry
|
||||
docker pull openjdk:17-jdk-slim
|
||||
docker tag openjdk:17-jdk-slim localhost:5000/openjdk:17-jdk-slim
|
||||
docker push localhost:5000/openjdk:17-jdk-slim
|
||||
```
|
||||
|
||||
#### 5.2. Update Configs to Use Local Registry
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- "java:docker://localhost:5000/openjdk:17-jdk-slim"
|
||||
```
|
||||
|
||||
## Recommended Approach
|
||||
|
||||
**For immediate fix**: Use Solution 1 (Docker Hub authentication)
|
||||
**For long-term**: Combine Solutions 1 + 4 (auth + caching)
|
||||
|
||||
## Implementation Steps
|
||||
|
||||
1. **Create Docker Hub account** (if you don't have one)
|
||||
2. **Update `.env.runners`** with credentials
|
||||
3. **Update all config files** with authentication
|
||||
4. **Set `force_pull: false`** to reduce pulls
|
||||
5. **Test with a simple job**
|
||||
|
||||
## Verification
|
||||
|
||||
After implementing, test with:
|
||||
```bash
|
||||
# Check if authentication works
|
||||
docker login
|
||||
docker pull openjdk:17-jdk-slim
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
- [Docker Hub Rate Limits](https://www.docker.com/increase-rate-limit)
|
||||
- [Gitea Actions Documentation](https://docs.gitea.com/usage/actions/design#act-runner)
|
||||
- [Docker Registry Authentication](https://docs.docker.com/engine/reference/commandline/login/)
|
||||
@@ -149,12 +149,7 @@ runners/
|
||||
# Scripts
|
||||
scripts/
|
||||
├── check-registry.ps1 # Windows PowerShell registry check script
|
||||
├── check-registry.sh # Linux/macOS registry check script
|
||||
├── docker-compatibility.ps1 # Windows PowerShell Docker compatibility fix
|
||||
├── docker-compatibility.sh # Linux/macOS Docker compatibility fix
|
||||
├── fix-docker-compatibility.ps1 # Windows PowerShell quick fix script
|
||||
├── fix-docker-compatibility.sh # Linux/macOS quick fix script
|
||||
└── test-docker-compatibility.ps1 # Windows PowerShell compatibility test
|
||||
└── check-registry.sh # Linux/macOS registry check script
|
||||
|
||||
└── docs/ # Documentation
|
||||
├── specs.md # Project specifications
|
||||
@@ -163,9 +158,6 @@ scripts/
|
||||
├── RUNNERS.md # Gitea runners setup and management
|
||||
├── RUNNER_LABELS.md # Runner labels technical documentation
|
||||
├── OPTIMIZATION_RECOMMENDATIONS.md # CI/CD optimization recommendations
|
||||
├── DOCKER_RATE_LIMIT_FIX.md # Docker Hub rate limit solutions
|
||||
├── CI_CD.md # CI/CD pipeline documentation
|
||||
├── CACHE_TROUBLESHOOTING.md # Cache troubleshooting guide
|
||||
├── SONARQUBE_INTEGRATION.md # SonarQube integration documentation
|
||||
├── DOCKER_DEPLOYMENT.md # Docker deployment and registry guide
|
||||
└── DOCKER_COMPATIBILITY.md # Docker version compatibility guide
|
||||
├── SONARQUBE_INTEGRATION.md # SonarQube integration documentation
|
||||
@@ -1,15 +1,12 @@
|
||||
# Docker Registry Configuration
|
||||
DOCKER_REGISTRY=gittea.kammenstraatha.duckdns.org/admin
|
||||
DOCKER_USERNAME=admin
|
||||
IMAGE_TAG=main
|
||||
|
||||
# Database Configuration
|
||||
POSTGRES_DB=labfusion
|
||||
POSTGRES_USER=labfusion
|
||||
POSTGRES_PASSWORD=labfusion_password
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_PORT=5432
|
||||
|
||||
# Redis Configuration
|
||||
REDIS_HOST=redis
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
|
||||
# API Gateway Configuration
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files
|
||||
COPY package*.json ./
|
||||
|
||||
# Install dependencies
|
||||
RUN npm install
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
|
||||
# Build the application
|
||||
RUN npm run build
|
||||
|
||||
# Install serve to run the app
|
||||
RUN npm install -g serve
|
||||
|
||||
# Expose port
|
||||
EXPOSE 3000
|
||||
|
||||
# Start the application
|
||||
CMD ["serve", "-s", "build", "-l", "3000"]
|
||||
@@ -1,18 +0,0 @@
|
||||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files
|
||||
COPY package*.json ./
|
||||
|
||||
# Install dependencies
|
||||
RUN npm install
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
|
||||
# Expose port
|
||||
EXPOSE 3000
|
||||
|
||||
# Run in development mode with hot reload
|
||||
CMD ["npm", "start"]
|
||||
@@ -1,31 +0,0 @@
|
||||
FROM node:20-alpine
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files first for better caching
|
||||
COPY package*.json ./
|
||||
|
||||
# Install dependencies with npm ci for production builds
|
||||
RUN npm ci --only=production && npm cache clean --force
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
|
||||
# Create non-root user for security
|
||||
RUN addgroup -g 1001 -S nodejs && \
|
||||
adduser -S nextjs -u 1001
|
||||
|
||||
# Change ownership of the app directory
|
||||
RUN chown -R nextjs:nodejs /app
|
||||
USER nextjs
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8083
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:8083/health || exit 1
|
||||
|
||||
# Start the application
|
||||
CMD ["npm", "start"]
|
||||
@@ -1,31 +0,0 @@
|
||||
FROM node:18-alpine
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files first for better caching
|
||||
COPY package*.json ./
|
||||
|
||||
# Install dependencies with npm ci for production builds
|
||||
RUN npm ci --only=production && npm cache clean --force
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
|
||||
# Create non-root user for security
|
||||
RUN addgroup -g 1001 -S nodejs && \
|
||||
adduser -S nextjs -u 1001
|
||||
|
||||
# Change ownership of the app directory
|
||||
RUN chown -R nextjs:nodejs /app
|
||||
USER nextjs
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8083
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:8083/health || exit 1
|
||||
|
||||
# Start the application in development mode
|
||||
CMD ["npm", "run", "dev"]
|
||||
@@ -1,17 +0,0 @@
|
||||
FROM openjdk:17-jdk-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy Maven files
|
||||
COPY pom.xml .
|
||||
COPY src ./src
|
||||
|
||||
# Install Maven
|
||||
RUN apt-get update && apt-get install -y maven && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Build the application
|
||||
RUN mvn clean package -DskipTests
|
||||
|
||||
# Run the application
|
||||
EXPOSE 8080
|
||||
CMD ["java", "-jar", "target/api-gateway-1.0.0.jar"]
|
||||
@@ -1,21 +0,0 @@
|
||||
FROM openjdk:17-jdk-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install Maven
|
||||
RUN apt-get update && apt-get install -y maven && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy Maven files
|
||||
COPY pom.xml .
|
||||
|
||||
# Download dependencies
|
||||
RUN mvn dependency:go-offline -B
|
||||
|
||||
# Copy source code
|
||||
COPY src ./src
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8080
|
||||
|
||||
# Run in development mode with hot reload
|
||||
CMD ["mvn", "spring-boot:run", "-Dspring-boot.run.jvmArguments='-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005'"]
|
||||
@@ -1,21 +0,0 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy requirements and install Python dependencies
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copy application code
|
||||
COPY . .
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8000
|
||||
|
||||
# Run the application
|
||||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
|
||||
@@ -1,21 +0,0 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy requirements and install Python dependencies
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copy application code
|
||||
COPY . .
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8000
|
||||
|
||||
# Run in development mode with hot reload
|
||||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
|
||||
Reference in New Issue
Block a user