diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e6396d7 --- /dev/null +++ b/.env.example @@ -0,0 +1,18 @@ +BACKEND_PORT=8000 +FRONTEND_PORT=4200 +IPFS_API_PORT=5001 +IPFS_GATEWAY_PORT=8080 +IPFS_SWARM_PORT=4001 + + +# ๐Ÿ› ๏ธ PostgreSQL DB +POSTGRES_USER=blockuser +POSTGRES_PASSWORD=blockpass +POSTGRES_DB=blocktrack_db +POSTGRES_PORT=15433 + +# ๐Ÿงช Adminer UI +ADMINER_PORT=8081 + +# Kafka +KAFKA_BROKER_URL=kafka:9092 diff --git a/blocktrack_backend/Dockerfile b/blocktrack_backend/Dockerfile new file mode 100644 index 0000000..d6c6a39 --- /dev/null +++ b/blocktrack_backend/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.11-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app + +RUN apt-get update && apt-get install -y \ + build-essential \ + libpq-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +# Use environment variable PORT or default to 8000 +CMD ["sh", "-c", "python manage.py migrate && python manage.py runserver 0.0.0.0:${BACKEND_PORT:-8000}"] diff --git a/blocktrack_backend/blocktrack_backend/settings.py b/blocktrack_backend/blocktrack_backend/settings.py index fc62278..de78030 100644 --- a/blocktrack_backend/blocktrack_backend/settings.py +++ b/blocktrack_backend/blocktrack_backend/settings.py @@ -12,7 +12,7 @@ import os from dotenv import load_dotenv load_dotenv() - +import dj_database_url from pathlib import Path @@ -95,6 +95,12 @@ 'PORT': os.getenv('DB_PORT'), } } + +DATABASES = { + 'default': dj_database_url.config( + default=f"postgresql://{os.getenv('POSTGRES_USER')}:{os.getenv('POSTGRES_PASSWORD')}@blocktrack_postgres:5432/{os.getenv('POSTGRES_DB')}" + ) +} REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'] } diff --git a/blocktrack_backend/requirements.txt b/blocktrack_backend/requirements.txt index 9f6b17a..651ed74 100644 --- a/blocktrack_backend/requirements.txt +++ b/blocktrack_backend/requirements.txt @@ -17,4 +17,5 @@ psycopg2-binary python-dotenv kafka-python django-cors-headers -drf_yasg \ No newline at end of file +drf_yasg +dj-database-url diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..5c87dbe --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,98 @@ +version: '3.9' + +services: + # ๐Ÿ”— Django backend + backend: + build: + context: ./blocktrack_backend + container_name: blocktrack_backend + volumes: + - ./blocktrack_backend:/app + ports: + - "${BACKEND_PORT:-8000}:8000" + depends_on: + - blocktrack_postgres + - ipfs + env_file: + - .env + environment: + - PYTHONUNBUFFERED=1 + + # ๐ŸŒ Angular frontend + frontend: + build: + context: ./frontend + container_name: frontend + volumes: + - ./frontend:/app + ports: + - "${FRONTEND_PORT:-4200}:4200" + env_file: + - .env + environment: + - NODE_ENV=development + + # ๐Ÿ—ƒ๏ธ PostgreSQL database + blocktrack_postgres: + image: postgres:15 + container_name: blocktrack_postgres + restart: always + environment: + POSTGRES_USER: ${POSTGRES_USER:-blockuser} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-blockpass} + POSTGRES_DB: ${POSTGRES_DB:-blocktrack_db} + ports: + - "${POSTGRES_PORT:-15433}:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + + # ๐Ÿงช Adminer UI + adminer: + image: adminer + container_name: blocktrack_adminer + restart: always + ports: + - "${ADMINER_PORT:-8081}:8080" + depends_on: + - blocktrack_postgres + + # ๐Ÿงฟ IPFS node + ipfs: + image: ipfs/go-ipfs:latest + container_name: ipfs_node + ports: + - "${IPFS_API_PORT:-5001}:5001" + - "${IPFS_GATEWAY_PORT:-8080}:8080" + - "${IPFS_SWARM_PORT:-4001}:4001" + volumes: + - ipfs_staging:/export + - ipfs_data:/data/ipfs + + kafka_broker: + image: bitnami/kafka:3.5 + container_name: kafka_broker + ports: + - "9092:9092" + environment: + - KAFKA_BROKER_ID=1 + - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092 + - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka_broker:9092 + - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT + - KAFKA_CFG_ZOOKEEPER_CONNECT=kafka_zookeeper:2181 + - ALLOW_PLAINTEXT_LISTENER=yes + depends_on: + - kafka_zookeeper + + kafka_zookeeper: + image: bitnami/zookeeper:latest + container_name: kafka_zookeeper + ports: + - "2181:2181" + environment: + - ALLOW_ANONYMOUS_LOGIN=yes + + +volumes: + postgres_data: + ipfs_data: + ipfs_staging: diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..77eb6a5 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,13 @@ +FROM node:18 + +WORKDIR /app + +# Copy dependency files first and install +COPY package*.json ./ +RUN npm install + +# Copy the rest of the Angular app +COPY . . + +# Serve the app +CMD ["sh", "-c", "npx ng serve --host 0.0.0.0 --port ${FRONTEND_PORT:-4200}"]