diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..29b1fa6 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +HOSTNAME=localhost +KAFKA_PORT=9092 diff --git a/backend/worker/main.py b/backend/worker/main.py new file mode 100644 index 0000000..481b832 --- /dev/null +++ b/backend/worker/main.py @@ -0,0 +1,23 @@ +import os +import time +from celery import Celery +from dotenv import load_dotenv +load_dotenv() + +# Redis connection +redis_url = os.getenv("REDIS_URL", "redis://localhost:6379") +app = Celery('worker', broker=redis_url, backend=redis_url) + +@app.task +def simple_task(message): + """A simple task that processes a message and returns a result""" + time.sleep(2) # Simulate some work + return f"Processed: {message}" + +@app.task +def add_numbers(x, y): + """Simple math task""" + return x + y + +if __name__ == '__main__': + app.start() diff --git a/docker-compose.yml b/docker-compose.yml index e69de29..61c26a9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +services: + zookeeper: + container_name: "PHANTOM-zookeeper" + image: confluentinc/cp-zookeeper:latest + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + ports: + - "2181:2181" + + kafka: + container_name: "PHANTOM-kafka" + image: confluentinc/cp-kafka:latest + depends_on: + - zookeeper + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + ALLOW_PLAINTEXT_LISTENER: yes + ports: + - "${KAFKA_PORT}:9092" + volumes: + - phantom_kafka_data:/var/lib/kafka/data + +volumes: + phantom_kafka_data: diff --git a/web/package-lock.json b/web/package-lock.json index 0890b71..33bebd6 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,6 +8,7 @@ "name": "web", "version": "0.1.0", "dependencies": { + "kafkajs": "^2.2.4", "next": "16.0.0", "react": "19.2.0", "react-dom": "19.2.0" @@ -1040,6 +1041,15 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/kafkajs": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", + "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/lightningcss": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", diff --git a/web/package.json b/web/package.json index c89f7a3..9b83e2d 100644 --- a/web/package.json +++ b/web/package.json @@ -8,16 +8,17 @@ "start": "next start" }, "dependencies": { + "kafkajs": "^2.2.4", + "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0", - "next": "16.0.0" + "react-dom": "19.2.0" }, "devDependencies": { - "typescript": "^5", + "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "@tailwindcss/postcss": "^4", - "tailwindcss": "^4" + "tailwindcss": "^4", + "typescript": "^5" } }