<?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: Serdar Shefketov</title>
    <description>The latest articles on DEV Community by Serdar Shefketov (@ssheffk).</description>
    <link>https://dev.to/ssheffk</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%2F814772%2F56d600a0-425f-4459-9689-57b397212916.png</url>
      <title>DEV Community: Serdar Shefketov</title>
      <link>https://dev.to/ssheffk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ssheffk"/>
    <language>en</language>
    <item>
      <title>FastAPI and Svelte: Local Docker Compose Setup</title>
      <dc:creator>Serdar Shefketov</dc:creator>
      <pubDate>Wed, 22 Jan 2025 07:21:11 +0000</pubDate>
      <link>https://dev.to/ssheffk/how-to-dockerize-a-fastapi-backend-and-svelte-frontend-locally-with-docker-compose-2le8</link>
      <guid>https://dev.to/ssheffk/how-to-dockerize-a-fastapi-backend-and-svelte-frontend-locally-with-docker-compose-2le8</guid>
      <description>&lt;p&gt;In this guide, we’ll walk through setting up a &lt;strong&gt;FastAPI&lt;/strong&gt; backend and a &lt;strong&gt;Svelte&lt;/strong&gt; frontend using &lt;strong&gt;Docker Compose&lt;/strong&gt; for seamless local development. We’ll also integrate an external cloud-hosted MongoDB database accessed via a connection URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;

&lt;p&gt;Here’s the general structure of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project-root/
├── backend/
│   ├── Dockerfile
│   ├── requirements.txt
│   └── main.py
├── web/
│   ├── Dockerfile
│   ├── package.json
│   ├── svelte.config.js
│   └── src/
└── docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Backend: FastAPI
&lt;/h2&gt;

&lt;p&gt;The backend is a FastAPI app with a &lt;code&gt;Dockerfile&lt;/code&gt; that sets up the environment and runs the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend Dockerfile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backend Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&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;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "9001"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Make sure to include the necessary dependencies for your FastAPI app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi
uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example &lt;code&gt;main.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s a simple example of your FastAPI app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;  &lt;span class="n"&gt;Dict&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.middleware.cors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Allow your Svelte app origin
&lt;/span&gt;&lt;span class="n"&gt;origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Replace with your local dev URL or production URL
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:5173&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;origins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# Allows all HTTP methods (GET, POST, etc.)
&lt;/span&gt;    &lt;span class="n"&gt;allow_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# Allows all headers
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello you successfully connected to the backend!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subtitle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You learn how to set up a docker compose file and use FastAPi with Svelte app.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Frontend: Svelte
&lt;/h2&gt;

&lt;p&gt;The frontend is built with Svelte, using the Node.js adapter for deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend Dockerfile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use a Node.js Alpine image for the builder stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build
&lt;span class="k"&gt;RUN &lt;/span&gt;npm prune &lt;span class="nt"&gt;--production&lt;/span&gt;

&lt;span class="c"&gt;# Use another Node.js Alpine image for the final stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/build build/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/node_modules node_modules/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json .&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; [ "node", "build/index.js" ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Svelte Configuration
&lt;/h3&gt;

&lt;p&gt;Your &lt;code&gt;svelte.config.js&lt;/code&gt; should use the Node.js adapter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;adapter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sveltejs/adapter-node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;kit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;prerender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// if your prerender is enabled&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Docker Compose Configuration
&lt;/h2&gt;

&lt;p&gt;Here’s the &lt;code&gt;docker-compose.yml&lt;/code&gt; file that ties everything together:&lt;br&gt;
&lt;/p&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="s1"&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;backend&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="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./backend&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fastapi-backend&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;9001:9001'&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MONGO_URI=your_mongo_connection_string&lt;/span&gt;

  &lt;span class="na"&gt;frontend&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="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./web&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;svelte-frontend&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3000:3000'&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;backend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running the Project Locally
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build the Docker images:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker-compose build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start the containers:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Access the services:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Backend: &lt;a href="http://localhost:9001" rel="noopener noreferrer"&gt;http://localhost:9001&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Issue: Frontend Not Communicating with Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Error&lt;/strong&gt;: “Network Error” or CORS issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Make sure the frontend points to the backend URL (e.g., &lt;code&gt;http://localhost:9001&lt;/code&gt;). If needed, add CORS middleware to FastAPI:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.middleware.cors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;allow_methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;allow_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With this setup, you’ve successfully dockerized a FastAPI backend and Svelte frontend, integrating them locally using Docker Compose. This approach ensures a smooth development workflow and consistent environment across systems.&lt;/p&gt;

&lt;p&gt;You can check out the &lt;a href="https://github.com/ssheffk/tech" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; !&lt;/p&gt;

</description>
      <category>docker</category>
      <category>svelte</category>
      <category>fastapi</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>🚀 Learning by Doing: Building an Incident Alert System 🛠️</title>
      <dc:creator>Serdar Shefketov</dc:creator>
      <pubDate>Mon, 23 Dec 2024 11:12:51 +0000</pubDate>
      <link>https://dev.to/ssheffk/learning-by-doing-building-an-incident-alert-system-4i2b</link>
      <guid>https://dev.to/ssheffk/learning-by-doing-building-an-incident-alert-system-4i2b</guid>
      <description>&lt;p&gt;👋 Introduction&lt;br&gt;
Learning new technologies is always exciting, but applying them to a real-world project is where the magic happens. ✨ Recently, I took on the challenge of building an Incident Alert System, and it turned into an incredible learning journey. 🚧&lt;/p&gt;

&lt;p&gt;This project helped me dive deep into:&lt;br&gt;
🎯 Kafka Messaging&lt;br&gt;
🔍 Go Microservices&lt;br&gt;
🐳 Kubernetes Orchestration&lt;br&gt;
📧 SMTP Email Alerts&lt;/p&gt;

&lt;p&gt;Here’s what I built, what I learned, and how you can check it out for yourself! 📝&lt;/p&gt;

&lt;p&gt;🛠️ What I Built: Incident Alert System&lt;br&gt;
The Incident Alert System is a microservice-based application designed to detect and alert users when specific metrics (e.g., memory usage, CPU usage) exceed predefined thresholds. It’s built on Kafka for messaging, Go for backend services, and Kubernetes for deployment. 🧩&lt;/p&gt;

&lt;p&gt;You can explore the full project here:&lt;br&gt;
👉 GitHub Repository: &lt;a href="https://github.com/ssheffk/go-alert-system" rel="noopener noreferrer"&gt;go-alert-system&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 System Architecture&lt;br&gt;
The system consists of four microservices, each playing a specific role:&lt;br&gt;
1️⃣ Metrics API Service: Collects metrics and sends them to Kafka.&lt;br&gt;
2️⃣ Rule Engine Service: Evaluates metrics against user-defined rules.&lt;br&gt;
3️⃣ Alert Dispatcher Service: Sends email notifications when rules are violated.&lt;br&gt;
4️⃣ Rule Management Service: Manages alert rules via REST APIs.&lt;/p&gt;

&lt;p&gt;Here’s a visual of the architecture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ud9c3rrpsh4jb0nu9ht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ud9c3rrpsh4jb0nu9ht.png" alt="microservices" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌟 Key Learnings&lt;br&gt;
1️⃣ Kafka Messaging Basics 📨&lt;br&gt;
I explored Kafka as the backbone for communication between services. It ensures reliable and asynchronous data flow.&lt;/p&gt;

&lt;p&gt;What I Learned:&lt;br&gt;
✅ Setting up Kafka topics for metrics processing.&lt;br&gt;
✅ Writing producers and consumers in Go.&lt;br&gt;
✅ Managing retries and offsets for reliability.&lt;/p&gt;

&lt;p&gt;2️⃣ Go Microservices 💻&lt;br&gt;
Building microservices in Go was a rewarding experience. Its simplicity and performance made it perfect for this project.&lt;/p&gt;

&lt;p&gt;What I Learned:&lt;br&gt;
✅ Structuring microservices for scalability.&lt;br&gt;
✅ Writing clean and efficient REST APIs.&lt;br&gt;
✅ Leveraging Go’s concurrency model for performance.&lt;/p&gt;

&lt;p&gt;3️⃣ Kubernetes for Deployment ☸️&lt;br&gt;
Deploying the application on Kubernetes taught me how to orchestrate containers at scale. Kubernetes simplified the process of managing microservices.&lt;/p&gt;

&lt;p&gt;Key Insights:&lt;br&gt;
✅ Writing Kubernetes manifests for deployments and services.&lt;br&gt;
✅ Managing service discovery between pods.&lt;br&gt;
✅ Using kubectl commands for monitoring and troubleshooting.&lt;/p&gt;

&lt;p&gt;4️⃣ SMTP for Email Alerts 📧&lt;br&gt;
Integrating SMTP for email notifications was a new and fun challenge. Alerts are dispatched in real-time when rules are violated, keeping users informed.&lt;/p&gt;

&lt;p&gt;🔑 Project Highlights&lt;br&gt;
💡 Dynamic Rules: Define and manage alerting rules via REST APIs.&lt;br&gt;
🔗 Kafka Integration: Ensures seamless and scalable message flow.&lt;br&gt;
📩 Real-Time Alerts: Receive email notifications when thresholds are breached.&lt;/p&gt;

&lt;p&gt;📖 Example Workflow&lt;br&gt;
1️⃣ Define a Rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST -H "Content-Type: application/json" \
     -d '{"metric": "cpu_usage", "threshold": 80, "operator": "&amp;gt;"}' \
     http://localhost:8004/api/rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ Send Metrics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST -H "Content-Type: application/json" \
     -d '{"metricName": "memory_usage", "value": 77, "timestamp": "2024-12-19T12:00:00Z"}' \
     http://localhost:8001/api/metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ Receive Alerts:&lt;br&gt;
🚨 Email notifications are sent when the rule is triggered!&lt;/p&gt;

&lt;p&gt;🛠️ Tools and Tech Stack&lt;br&gt;
Programming Language: 🐹 Go&lt;br&gt;
Message Broker: 📡 Kafka&lt;br&gt;
Orchestration: ☸️ Kubernetes&lt;br&gt;
Containerization: 🐳 Docker&lt;br&gt;
Email Notifications: 📧 SMTP&lt;br&gt;
🎯 Final Thoughts&lt;br&gt;
This project was a game-changer for my understanding of distributed systems, microservices, and tools like Kafka and Kubernetes. It was a challenging yet rewarding experience that pushed my skills to the next level. 🚀&lt;/p&gt;

&lt;p&gt;Want to explore the project or try it yourself? Check it out on GitHub:&lt;br&gt;
👉 &lt;a href="https://github.com/ssheffk/go-alert-system" rel="noopener noreferrer"&gt;go-alert-system&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you worked on similar projects or explored Kafka and Kubernetes? Let’s chat in the comments below! 💬 I’d love to hear your experiences and insights.&lt;/p&gt;

&lt;p&gt;Let me know if you'd like to tweak anything else or add more flair! 🌟&lt;/p&gt;

</description>
      <category>go</category>
      <category>kafka</category>
      <category>microservices</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Intelligent Automation</title>
      <dc:creator>Serdar Shefketov</dc:creator>
      <pubDate>Sat, 31 Aug 2024 10:45:40 +0000</pubDate>
      <link>https://dev.to/ssheffk/intelligent-automation-3lec</link>
      <guid>https://dev.to/ssheffk/intelligent-automation-3lec</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/nylas"&gt;Nylas Challenge&lt;/a&gt;: AI Expedition.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built and Why
&lt;/h2&gt;

&lt;p&gt;I created an intelligent automation tool for managing emails and events, utilizing the Nylas API to provide context-aware interactions. The application allows users to select specific contexts (e.g., emails from the current week or upcoming events) and then engage with an AI model to generate insights and summaries. This tool aims to enhance productivity by offering a seamless way to query and analyze email and calendar data through dynamic AI-driven responses.&lt;/p&gt;

&lt;p&gt;The motivation behind this project was to streamline email and event management by integrating advanced AI capabilities, making it easier for users to get actionable insights and summaries from their data. The ability to interact with an AI model in a context-aware manner enhances user experience and provides a more intuitive way to manage information.The integration of the LLaMA 3 model ensures that users receive accurate and relevant information based on their selected context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/_u16NEUNVO8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;You can review the code for this project on GitHub: &lt;a href="https://github.com/ssheffk/nylas-ai" rel="noopener noreferrer"&gt;https://github.com/ssheffk/nylas-ai&lt;/a&gt;. The project is licensed under the MIT License.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Journey
&lt;/h2&gt;

&lt;p&gt;Leveraging the Nylas API was central to this project. By using endpoints such as emails-current-week, emails-recent, emails-recent-unread, emails-drafts-recent, events-today, events-current-week, and events-current-month, we were able to pull relevant email and event data in real-time. This integration allowed us to build a system where users can select a context and interact with an AI model to generate precise answers and summaries.&lt;/p&gt;

&lt;p&gt;Throughout the development, we learned how to effectively integrate Nylas’ APIs to manage and process large volumes of email and event data. We optimized data handling to ensure real-time responses and enhanced the AI’s ability to generate meaningful insights based on the context.&lt;/p&gt;

&lt;p&gt;We are most proud of the seamless user experience we created. The ability to dynamically interact with the AI based on real-time data from the Nylas API offers a powerful tool for users to efficiently manage and gain insights from their emails and calendar events.&lt;/p&gt;

&lt;p&gt;Thank you !&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>nylaschallenge</category>
      <category>api</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
