Overview
Memes are a way to take a little break from the stress of life and have a laugh.
Hello everyone, today I will be sharing my fun tool called "Memer Bot", which is a telegram bot that you can find here Click Here.
Github link - Click Here
I came across The Microsoft Azure Trial Hackathon on Dev.to and decided to participate in it by creating this small project.
Working of the bot
Memer Bot will let you search & create memes using thousands of templates & even your own custom images.
Basically, there are three major features -
*/search * command will let you search for a meme for a word/phrase (it will return the top meme if finds for that phrase)
/create command will let you create memes using two options - a Meme Template or a Custom Image
Instructions are fairly straightforward while using these bots.
At any point in time, if you feel, the bot is not responding, do try to use the /reset command and then try to do the operation again.
Submission Category:
Computing Captains
I have chosen Computing Captains category for this contest.
I have leveraged Azure's Azure Kubernetes Service for deploying this project.
Tech Stack
I have used below tech stack to build Memer
Main Stack
- NodeJS
- Express (using as the main server)
- Redis (using as key-value database for user session management)
- Telebot (library to interact with Telegram API)
Devops
- Docker (for creating images of NodeJs express server)
- Kubernetes (using kubernetes via Azure Kubernetes Service to manage containers)
Third Party
- Telegram API (to communicate with users)
- Imgflip (to search & create memes)
Architecture
Below is the basic architecture of the application:
As you can see there are multiple components here:
NodeJS Server - Communicates with Telegram API & all third party APIs along with managing user sessions using Redis. It is deployed as a Docker container in a kubernetes pod on AKS.
Redis - Used to manage user states & sessions via key value pairs model. It is deployed as a Docker container in a kubernetes pod on AKS.
Imgflip - Used to search & create memes. Actual logic to search and create memes can be found in the GitHub repository.
Telegram API - Used to listen to user's messages & respond to them via Telebot library for NodeJS.
Deployment
To deploy Memer's backend & redis, I created a Dockerfile
for NodeJS like this:
FROM node:latest COPY package.json . COPY package-lock.json . RUN npm install COPY . / RUN npm install pm2 -g RUN mkdir -p images EXPOSE 3000 ENTRYPOINT npm run start
I built the docker image and pushed it to docker hub
docker build -t memer-bot . docker tag memer-bot mtwn105/memer-bot docker push mtwn105/memer-bot
I then use Azure's Azure Kubernetes Service to use this docker image & manage containers using Kubernetes.
I created a kubernetes cluster called memer-k8s-cluster
Then I created Deployment configs for Redis & NodeJS Express like below:
NodeJS
apiVersion: apps/v1 kind: Deployment metadata: name: memer-nodejs-express labels: app: memer-nodejs-express spec: replicas: 1 selector: matchLabels: app: memer-nodejs-express template: metadata: labels: app: memer-nodejs-express spec: containers: - name: memer-nodejs-express image: mtwn105/memer-bot:latest ports: - containerPort: 3000 env: - name: APP_ENVIRONMENT valueFrom: secretKeyRef: name: memer-secrets key: APP_ENVIRONMENT - name: PORT valueFrom: secretKeyRef: name: memer-secrets key: PORT - name: TELEGRAM_KEY valueFrom: secretKeyRef: name: memer-secrets key: TELEGRAM_KEY - name: RAPID_API_KEY valueFrom: secretKeyRef: name: memer-secrets key: RAPID_API_KEY - name: IMGFLIP_USERNAME valueFrom: secretKeyRef: name: memer-secrets key: IMGFLIP_USERNAME - name: IMGFLIP_PASSWORD valueFrom: secretKeyRef: name: memer-secrets key: IMGFLIP_PASSWORD - name: APP_URL valueFrom: secretKeyRef: name: memer-secrets key: APP_URL - name: GRAPH_JSON_API_KEY valueFrom: secretKeyRef: name: memer-secrets key: GRAPH_JSON_API_KEY - name: MY_CHAT_ID valueFrom: secretKeyRef: name: memer-secrets key: MY_CHAT_ID - name: REDIS_URL valueFrom: secretKeyRef: name: memer-secrets key: REDIS_URL imagePullPolicy: Always --- apiVersion: v1 kind: Service metadata: name: memer-nodejs-express spec: selector: app: memer-nodejs-express ports: - port: 80 targetPort: 3000 type: LoadBalancer
Redis
apiVersion: apps/v1 # API version kind: Deployment metadata: name: redis-master # Unique name for the deployment labels: app: redis # Labels to be applied to this deployment spec: selector: matchLabels: # This deployment applies to the Pods matching these labels app: redis role: master tier: backend replicas: 1 # Run a single pod in the deployment template: # Template for the pods that will be created by this deployment metadata: labels: # Labels to be applied to the Pods in this deployment app: redis role: master tier: backend spec: # Spec for the container which will be run inside the Pod. containers: - name: master image: redis resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 6379 --- apiVersion: v1 kind: Service # Type of Kubernetes resource metadata: name: redis-master # Name of the Kubernetes resource labels: # Labels that will be applied to this resource app: redis role: master tier: backend spec: ports: - port: 6379 # Map incoming connections on port 6379 to the target port 6379 of the Pod targetPort: 6379 selector: # Map any Pod with the specified labels to this service app: redis role: master tier: backend
I created a kubernetes secret to store necessary environment variables' values
kubectl create secret generic memer-secrets kubectl edit secret memer-secrets
I now apply the kubernetes configurations
kubectl apply -f application.yaml kubectl apply -f redis.yaml
That's it. Now if I run kubectl get pods
I will all pods are successfully running.
NAME READY STATUS RESTARTS AGE memer-nodejs-express-7db7c48bd5-8chd9 1/1 Running 0 31s redis-master-85547b7b9-xbl5t 1/1 Running 0 3m24s
For more details do visit GitHub repo 👇
GitHub
mtwn105 / memer-telegram-bot
Memer Telegram Bot - Search & Create memes!
Memer Telegram Bot - Search & Create memes!
Bot Link - https://t.me/meme_mtwn105_bot
All in one telegram bot for meme-ing!
Features:
- Search from a collection of thousands of memes
- Create memes using many meme templates available
- Create custom memes by uploading your image and adding text
Tech Stack
- NodeJS
- Express
- Telebot
- Redis
Devops
Application has deployed on Microsoft Azure using Azure Kubernetes Services (AKS). Two deployments created, one for Redis & one for NodeJS express (which is deployed using the docker image)
All environment variables required are stored in the Kubernetes secrets.
- Azure Kubernetes Service
- Redis Kubernetes Pod
- Memer NodeJs Express Kubernetes Pod
Top comments (0)