<?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: Anton Yanchenko</title>
    <description>The latest articles on DEV Community by Anton Yanchenko (@simplylizz).</description>
    <link>https://dev.to/simplylizz</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%2F734369%2F84a00c31-0f95-414d-b8cb-b39e23bde99d.jpeg</url>
      <title>DEV Community: Anton Yanchenko</title>
      <link>https://dev.to/simplylizz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simplylizz"/>
    <language>en</language>
    <item>
      <title>Automating Cron Jobs in Docker with Ofelia: CVZilla's Experience</title>
      <dc:creator>Anton Yanchenko</dc:creator>
      <pubDate>Sun, 20 Oct 2024 11:51:19 +0000</pubDate>
      <link>https://dev.to/simplylizz/automating-cron-jobs-in-docker-with-ofelia-cvzillas-experience-3pkp</link>
      <guid>https://dev.to/simplylizz/automating-cron-jobs-in-docker-with-ofelia-cvzillas-experience-3pkp</guid>
      <description>&lt;p&gt;Cron jobs are an essential part of maintaining modern applications, automating tasks like data fetching, report generation, and updates. But when you're running containerized apps in Docker, traditional cron setups don’t work seamlessly. Enter &lt;a href="https://github.com/mcuadros/ofelia" rel="noopener noreferrer"&gt;Docker Ofelia&lt;/a&gt;, a simple and effective solution to run cron jobs in a containerized environment.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;CVZilla&lt;/strong&gt;, a &lt;a href="https://cvzilla.net/" rel="noopener noreferrer"&gt;tech job board&lt;/a&gt; connecting developers with jobs that match their exact tech stack, we rely on Docker Ofelia to keep things running smoothly. We use it for tasks like web scraping to ensure job listings are always up-to-date, posting updates to our Telegram channels, and keeping various system tasks automated.&lt;/p&gt;

&lt;p&gt;Ofelia acts as a cron daemon for Docker containers, allowing us to schedule and run jobs without leaving the containerized world. It's easy to configure, and it ensures that tasks are performed without the need for manual intervention.&lt;/p&gt;

&lt;p&gt;Here’s how we use Docker Ofelia to manage periodic tasks at CVZilla:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Web Scraping&lt;/strong&gt;: Our scrapers run at regular intervals to fetch the latest job postings from trusted sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram Updates&lt;/strong&gt;: Ofelia ensures our subscribers receive timely job updates on Telegram.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By automating these crucial processes, we can focus on what really matters: providing a seamless experience for both job seekers and employers. If you're building your own platform, or just looking for a reliable way to automate Docker tasks, give Docker Ofelia a try. It’s been a game-changer for us at CVZilla, and it might just do the same for you.&lt;/p&gt;

&lt;p&gt;Tasks themselves in this case are implemented as Django custom management commands and running via &lt;code&gt;django-admin&lt;/code&gt; CLI helper. Our &lt;code&gt;docker-compose.yaml&lt;/code&gt; looks like this:&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;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cvzilla&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ghcr.io/zetlabs/cvzilla:354"&lt;/span&gt;
    &lt;span class="s"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;ofelia.enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;

      &lt;span class="c1"&gt;# https://crontab.guru/&lt;/span&gt;
      &lt;span class="c1"&gt;# ofelia syntax has additional seconds field by some reason&lt;/span&gt;
      &lt;span class="c1"&gt;# even though it seems that it's not second-accurate&lt;/span&gt;

      &lt;span class="c1"&gt;# run every day at 07:30 UTC&lt;/span&gt;
      &lt;span class="na"&gt;ofelia.job-exec.exporters-telegram.schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;30&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;7&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
      &lt;span class="na"&gt;ofelia.job-exec.exporters-telegram.command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;django-admin&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;exporters_telegram"&lt;/span&gt;

      &lt;span class="c1"&gt;# run every hour&lt;/span&gt;
      &lt;span class="na"&gt;ofelia.job-exec.miners-publish-0.schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;30&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
      &lt;span class="na"&gt;ofelia.job-exec.miners-publish-0.command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;django-admin&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;miners_publish"&lt;/span&gt;

      &lt;span class="c1"&gt;# run daily at 10:00 &amp;amp; 17:00  UTC, Mon-Fri&lt;/span&gt;
      &lt;span class="na"&gt;ofelia.job-exec.miners.schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;10,17&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;
      &lt;span class="na"&gt;ofelia.job-exec.miners-vinted.command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;django-admin&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;miners_mine&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;args&amp;gt;"&lt;/span&gt;

  &lt;span class="na"&gt;ofelia&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;mcuadros/ofelia:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unless-stopped"&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;cvzilla&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;daemon --docker&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;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
