Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Use Python 3.11 slim image as base
FROM python:3.11-slim

# Set working directory
WORKDIR /app

# Set environment variables
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1

# Copy requirements first for better caching
COPY requirements.txt .

# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy application code
COPY mybot.py .

# Create a non-root user for security
RUN useradd -m -u 1000 botuser && \
chown -R botuser:botuser /app

USER botuser

# Run the bot
CMD ["python", "mybot.py"]
20 changes: 16 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,24 @@ Update the .env with your discord bot token and the key from OpenAI<br>
Token for the discord bot: https://discord.com/developers/applications<br>
OpenAI key: https://platform.openai.com/account/api-keys

# prepare

```bash
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```

# hello bot
To start the bot, run the following commands:<br>
To start the bot, run the following commands:

```bash
python discord_only.py
```

# pirate bot
run the following commands:<br>
pip install -r requirements.txt<br>
python mybot.py
run the following commands:

```bash
python mybot.py
```
14 changes: 14 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
version: '3.8'

services:
discord-bot:
build: .
container_name: mybot
restart: unless-stopped
environment:
- LLM_KEY=${LLM_KEY}
- LLM_URL=${LLM_URL}
- TOKEN=${TOKEN}
# Alternatively, you can use env_file:
# env_file:
# - .env
31 changes: 31 additions & 0 deletions gitops/base/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: discord-bot
labels:
app: discord-bot
spec:
replicas: 1
selector:
matchLabels:
app: discord-bot
template:
metadata:
labels:
app: discord-bot
spec:
containers:
- name: bot
image: quay.io/gfontana/dbot:latest
imagePullPolicy: IfNotPresent
envFrom:
- secretRef:
name: discord-bot-secrets
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
restartPolicy: Always
14 changes: 14 additions & 0 deletions gitops/base/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yaml

commonLabels:
app: discord-bot
managed-by: kustomize

images:
- name: mybot
newName: quay.io/gfontana/dbot
newTag: latest
23 changes: 23 additions & 0 deletions gitops/overlays/dev/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: dbot-dev

bases:
- ../../base

resources:
- namespace.yaml
- secret.yaml

replicas:
- name: discord-bot
count: 1

images:
- name: mybot
newName: quay.io/gfontana/dbot
newTag: dev

commonLabels:
environment: dev
4 changes: 4 additions & 0 deletions gitops/overlays/dev/namespace.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: dbot-dev
10 changes: 10 additions & 0 deletions gitops/overlays/dev/secret.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
apiVersion: v1
kind: Secret
metadata:
name: discord-bot-secrets
type: Opaque
stringData:
LLM_KEY: "REPLACE_ME"
LLM_URL: "REPLACE_ME"
DISCORD_TOKEN: "REPLACE_ME"
MODEL_NAME: "REPLACE_ME"
42 changes: 42 additions & 0 deletions gitops/overlays/prod/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: dbot-prod

bases:
- ../../base

resources:
- namespace.yaml
- secret-sealed.yaml

replicas:
- name: discord-bot
count: 1

images:
- name: mybot
newName: quay.io/gfontana/dbot
newTag: latest

commonLabels:
environment: prod

patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: discord-bot
spec:
template:
spec:
containers:
- name: bot
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
4 changes: 4 additions & 0 deletions gitops/overlays/prod/namespace.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: dbot-prod
19 changes: 19 additions & 0 deletions gitops/overlays/prod/secret-sealed.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: discord-bot-secrets
namespace: dbot-prod
spec:
encryptedData:
DISCORD_TOKEN: AgBcq+e+XxK6QEisjZ9S5JeeJUAoRVK7KZLOIgn4B5dhkcKjh+L9+iTpkC9z/vNx2RH3LvbJci+xTlJPRv432eL9CgCACE35WQHDLfutL5SwfEwVKPdNiAolkEoO2+WtQ+a4bK72B1tfk+iYrv9bqZ2ZaNGTM4g+QEh1xAWulOpWSbkF32g0ltUaMLuqkXrs9Y229Aj/S1HrBImpdyhTSI6dn7b9hEKjP01OeRQ+uqnDH4e82o8dQZs9uAMAD5wcMK21jRHi6CzD5OWr91bocQ4MAMNoHPMKwsGI1VaH7BmNFLMvh3WANV5tZ/e0VKEzDRBfKII8P6BGk2FQzZvYDm6AP9hm4aYcx0PgZclMPBnxJnZwXjdwCz1V9nsDc1KN1bcnRtWIHgAxubt5C1CSXmMGREKHlcNcXgG+Ykc0ygWmlcrzVWpNahh8l0dQ+ELzLv9Aug2SATxdkqcDvrOq4IoeYaVBEjH0afyvtrijQzbB7pufz+cDPDQqCf1sIUKl+FbTk/RVtrv3upfsIozgTWqaQVia8n8lSFt8uYTbeaNJyRIzDRbxRFTWpHTbsDgDVqDz2XXLqyvxrRIwua/QYW3GOcjUUfD0Q1e1ZqRRb+hmsadbmR3vxduob9j2YMDpBwxfthX6z5ce7dq7P9+k0lgFZ+Lx/0ZBCYZFlB9NV8jentf3LUQGmblRsgWe5twGT+Jy7eed4TO8WI2khQD+sdvYAXZtUl+VEELjqjFiuEupQPBij0/Qn929nW4Yoh/cAfxJCpGFG1dwEIGVt3MPDV1yyIpelX6wL1Q=
LLM_KEY: AgBnoIhvlt0lddETERb8mpctDM0BflkpmtlXKNCmnt6gBxmyzlcXtCTj6ti6gek5docckbhppJF8CMhJhqEvO6rm813316j3MINkQ4yjgujM3BXQpqN0IWnD8IPqn8YKSaE6Mj9TCkp8lhqcWGmy8kS4UL/z+Ws15RfXUp7vazyX/IpqLu4dWlmtvEJLmiLnrlVAaP+FsEz+wPTNZDvG+xjIg1s09Z5UQx2iToteyj6EyXdK6OhnLcETsOfyGXsw8KLxQE9ajIldBqf4Ky08Z58v1LyvUtB1VlanBQ3yXU6C8+DIR3GwxDNvhtrE9GcDqhvXwBp8+GBs6VtHYDSNWsvmY/DrHK4HIE5Nn0ogO1OCGN2qunvz27w17j429oUi73FPeUOEebFZQm19iXarvRdqyrGDUvLMMvoSzA7DnGg8MCbwQA0zjgR+x0dJWwfCrebkZbzAXycottn+ApNqmUF6QEZqM7Efmj9K3YUGClPHJubRUxOBGb7wabhr9CqZwEzJcPzapbYXQ/NK2C08I0Yq6TrHojt0RJYPbgRY50uAHVKlMl1hO4x0WRPYt6zA/aUPWHbxNM755n8aRO5RQKzW55P0hilhNTiD1by6c+VF5GeYh8h5Q0rkmAyuAhCeowWq0LJ0MDh37Jw6vkAGY07R5sVFZ0L/wBABE9DLyu9YNS12soPTXFpnloapk9y4S/xgo8A4mJss8AjcXlZMDwBllTsm2DJiSYPq
LLM_URL: AgCRXpJTyWqvFD7pr9abAHI4T6rtrMPm+bq0iRNHHCV7J/y/bUTzFZ0sq2W5nvzu3rmZbFpvTdjc3YL0zJP2M/NAWI55A9ACpupBxwCg9YGZ6c0r1RNViZu3eAwIWNK8H86CujKxSCwZhuybKU6EkAY/FsZhtyXbbPerAzGGGZ0JABngQt5WfcTjA+bAWddlcr8J4V+XH7KFq4yY8g0Hmf5VNGCGz/n8iuwCDDW1EoE6+lfEhqviMtDJraj2aAecXwpsS+4zjYJUIdaBxD/5Egx8QDZc7vqtxxpeufwsSZUwTz6PyKyEjz3yBh+xJd+yGNNax2lORZ4Pepn9gRbsZCHOb6QAZXIa1JZ4PIp9imRbSy21hCpmXWaBvJGJKWHAI7ReN+gqWlH+Am+p9/axAn8m/8ZhSGHdRVL1YlEpIBQE9hvxCvXUqhq10davf2KkagRsEqVOKZWtewylg7s5TPMB53BgNo5hNvc1jjS4GSbPeV8fz0auG795jwFeTpjOa9wvM0dU4Lpn/IHL+pQf6RHpIqnU6+JWoUmlMd2iBjDyR5SwLJC0FX7ic+iyUOMC/W52A3GTj26SLAkbrt+BhYtGa52Hhtm4SWkvtShPmdtxqBAgTr7qZRlTmF6VwvaZHT0cML5WF8MjIZ4gqAKfXR9A6srWs3BWY1Wf72qRLfAx9/oXSD7aikKycsnVSvtas7oWxig3zxQqNMCCgNX2/ov51rG5sYKU0vHxrMsXju+it3NZ0ClDkPIgBLIvh2HVRNXdweOv
MODEL_NAME: AgAz58fWWLCoxIcLJNhlJuEiZ6fZz469iT+choUGs4XFIdegfOPDQNcG6BM1SFut9FFQaXIZrww83OjzIzwEbv7nu9s9Oo5136Nc40ZYpoaCNcqkkz9/y7e/INK7vteo7uk7Qu3sI63tRAR885/c0rAbnix/pOmcXUOMZflvNFBbx+nfhD0fKrV1DEEACZCS11KfFS0ymMc4njIsUjbPFJO6KGCgTu+Mmmcpas9qGXCu01R2lLhmvIJ0ULQ4ECGSCADCR18b2QE7Umd/n51QX3YNVrs7wGLGzt1mhOWg4NIoX+RWTdJ5J28kkQUOV7uCSqYr6DQg6ekSFFiwFlJT5tkaKpZ7//iQQCvS7mqz6PnAoXvYY5oj0NSbXQDIOz7p9eLnk88f4sRw7JEnJgov+cakahIQpZFkpxtsQC7X//ntYDLNJdWbxE+1oIDvVnqyDsKgo0zuwGoab2RP6IKfMrhU0W2FOWPuMa1f+15DiZ3bUNIJjYaLPbQNjIKXC+E4CyLEVQNI386SgDO4vPDTM2ZCsy62yJBJCNtvJsczXOuZeBlaN6peB3Olw+BdmOnFiuK/Fmd4Fuz5ae16yWNSOeRFcFa+Q0hMoedn2A+Riz9PgG0IzZdmZXPGl/IOKLQFvKB8tH0vHNI3uNJtiEcbRHdpdJ7t+INimggmbmx9lN9mo/WipdG3SLyn0cobTzo2p2LARYHRs3d3JQU=
template:
metadata:
creationTimestamp: null
name: discord-bot-secrets
namespace: dbot-prod
type: Opaque

11 changes: 11 additions & 0 deletions gitops/overlays/prod/secret.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apiVersion: v1
kind: Secret
metadata:
name: discord-bot-secrets
namespace: dbot-prod
type: Opaque
stringData:
LLM_KEY: "REPLACE_ME"
LLM_URL: "REPLACE_ME"
DISCORD_TOKEN: "REPLACE_ME"
MODEL_NAME: "REPLACE_ME"
21 changes: 15 additions & 6 deletions mybot.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,28 @@

# Load environment variables from .env file
load_dotenv()
OPENAI_KEY = os.getenv('OPENAI_KEY')
DISCORD_TOKEN = os.getenv('TOKEN')
LLM_KEY = os.getenv('LLM_KEY')
LLM_URL = os.getenv('LLM_URL', 'https://api.openai.com/v1')
MODEL_NAME = os.getenv('MODEL_NAME', 'gpt-4o')
DISCORD_TOKEN = os.getenv('DISCORD_TOKEN')

# Initialize the OpenAI client
openai_client = OpenAI(api_key=OPENAI_KEY)
# Initialize the OpenAI client for on-prem LLM
openai_client = OpenAI(
api_key=LLM_KEY,
base_url=LLM_URL
)

def call_openai(question):
completion = openai_client.chat.completions.create(
model="gpt-4o",
model=MODEL_NAME,
messages=[
{
"role": "system",
"content": "You are a helpful assistant that responds like a pirate.",
},
{
"role": "user",
"content": f"Respond like a pirate to the following question: {question}",
"content": f"{question}",
},
]
)
Expand Down