<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MD. Shahnawaz Hossan</title>
    <description>The latest articles on DEV Community by MD. Shahnawaz Hossan (@shahnawaz-pabon).</description>
    <link>https://dev.to/shahnawaz-pabon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F555993%2Fef3d047d-7737-4016-a1d3-cbf755ae9fa4.jpeg</url>
      <title>DEV Community: MD. Shahnawaz Hossan</title>
      <link>https://dev.to/shahnawaz-pabon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shahnawaz-pabon"/>
    <language>en</language>
    <item>
      <title>Trigger a task with FastAPI, Celery, Docker, and Docker Compose: A Step-by-Step Guide</title>
      <dc:creator>MD. Shahnawaz Hossan</dc:creator>
      <pubDate>Wed, 21 Jun 2023 18:30:08 +0000</pubDate>
      <link>https://dev.to/shahnawaz-pabon/trigger-a-task-with-fastapi-celery-docker-and-docker-compose-a-step-by-step-guide-35do</link>
      <guid>https://dev.to/shahnawaz-pabon/trigger-a-task-with-fastapi-celery-docker-and-docker-compose-a-step-by-step-guide-35do</guid>
      <description>&lt;p&gt;&lt;a href="https://docs.celeryq.dev/en/stable/getting-started/introduction.html" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FAwesome-Celery-informational%3Fstyle%3Dfor-the-badge%26logo%3Dawesomelists%26labelColor%3D17202A%26color%3D1abc9c%26logoColor%3D1abc9c" alt="Awesome" width="175" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Project Structure&lt;/li&gt;
&lt;li&gt;Dockerization&lt;/li&gt;
&lt;li&gt;Up and Run&lt;/li&gt;
&lt;li&gt;Trigger a task&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;In today's digital landscape, background tasks have become a crucial aspect of many applications. Whether it's automating repetitive processes or achieving instant responses, one popular solution that comes to the rescue is &lt;code&gt;Celery&lt;/code&gt;. In this article, we'll guide you through the process of creating and managing background tasks using Celery. By seamlessly integrating it with &lt;code&gt;FastAPI&lt;/code&gt;, we'll show you how to containerize your project. Get ready for a straightforward and exciting exploration!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;FastAPI:&lt;/u&gt;&lt;/strong&gt; It's is a modern web framework for building APIs with Python. Its utilization of asynchronous programming techniques combined with the power of the &lt;code&gt;Starlette&lt;/code&gt; framework allows &lt;code&gt;FastAPI&lt;/code&gt; to achieve remarkable performance levels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Celery:&lt;/u&gt;&lt;/strong&gt; A python-based distributed ask queue system with built-in support for task scheduling, result tracking and fault tolerance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Docker:&lt;/u&gt;&lt;/strong&gt; An open-source platform, empowers you to bundle applications and their dependencies into compact, portable containers. These containers guarantee a consistent runtime environment, enabling your application to run seamlessly on any host system. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Docker Compose:&lt;/u&gt;&lt;/strong&gt; A tool that simplifies the management of multi-container applications. It allows you to define and configure multiple Docker containers as a single application using a &lt;code&gt;YAML&lt;/code&gt; file. It also specifies the dependencies and relationships between different services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;celery-with-fastapi/
├── app/
│   ├── celery/
│   │   ├── app.py
│   │   ├── worker.py
│   │   └── __init__.py
│   ├── core/
│   │   ├── config.py
│   │   └── __init__.py
│   ├── __init__.py
│   └── main.py
├── .env
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── README.md
├── requirements.txt
└── run.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dockerization
&lt;/h3&gt;

&lt;p&gt;Make sure you've installed &lt;code&gt;Docker&lt;/code&gt; and &lt;code&gt;docker-compose&lt;/code&gt; in your pc. Your Dockerfile and docker-compose.yml file would be like as follows&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Base image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.10-buster&lt;/span&gt;

&lt;span class="c"&gt;# set work directory&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# set environment variables&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PYTHONDONTWRITEBYTECODE 1&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PYTHONUNBUFFERED 1&lt;/span&gt;

&lt;span class="c"&gt;# install dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; [ "requirements.txt", "run.sh", "./"]&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./run.sh

&lt;span class="c"&gt;# copy project&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Set entrypoint&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; bash ./run.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;run.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;celery &lt;span class="nt"&gt;-A&lt;/span&gt; app.celery.app worker  &lt;span class="nt"&gt;-l&lt;/span&gt; info &lt;span class="nt"&gt;--concurrency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &amp;amp;
celery &lt;span class="nt"&gt;-A&lt;/span&gt;  app.celery.app flower &lt;span class="nt"&gt;-l&lt;/span&gt; info &amp;amp; celery &lt;span class="nt"&gt;-A&lt;/span&gt; app.celery.app beat &lt;span class="nt"&gt;-l&lt;/span&gt; INFO &amp;amp;
uvicorn app.main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--workers&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;8001:8000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5556:5555&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;celerybackend&lt;/span&gt;

  &lt;span class="na"&gt;celerybackend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;6379:6379&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis-cli"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ping"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Up and Run
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/shahnawaz-pabon/celery-with-fastapi.git" rel="noopener noreferrer"&gt;This is the final code&lt;/a&gt;. Before getting started, clone the repository first.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file and copy these lines after cloning the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env file&lt;/span&gt;
&lt;span class="nv"&gt;CELERY_BROKER_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis://celerybackend:6379/0
&lt;span class="nv"&gt;CELERY_RESULT_BACKEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis://celerybackend:6379/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/shahnawaz-pabon/celery-with-fastapi.git
&lt;span class="nb"&gt;cd &lt;/span&gt;celery-with-fastapi
docker-compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll be able to see the backend project running at &lt;a href="http://0.0.0.0:8001/" rel="noopener noreferrer"&gt;http://0.0.0.0:8001/&lt;/a&gt; and the flower dashboard running at &lt;a href="http://0.0.0.0:5556/" rel="noopener noreferrer"&gt;http://0.0.0.0:5556/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Trigger a task
&lt;/h3&gt;

&lt;p&gt;Open a terminal and trigger a new task&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8001/tasks &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"type": 0}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To know more about celery, &lt;a href="https://docs.celeryq.dev/en/stable/getting-started/introduction.html" rel="noopener noreferrer"&gt;please visit this&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I would like to express my heartfelt gratitude to each and every one of you who took the time to read my articles. Your support and engagement mean the world to me. 🙏🙏🙏&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>celery</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
