<?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: Sahal</title>
    <description>The latest articles on DEV Community by Sahal (@stackedbysahal).</description>
    <link>https://dev.to/stackedbysahal</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%2F1110560%2Fe6fbb743-fb9f-4419-a1e5-59090766ca2a.png</url>
      <title>DEV Community: Sahal</title>
      <link>https://dev.to/stackedbysahal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stackedbysahal"/>
    <language>en</language>
    <item>
      <title>Tutorial: Deploy OwnCloud on GCP with Docker &amp; NGINX (Step-by-Step)</title>
      <dc:creator>Sahal</dc:creator>
      <pubDate>Thu, 17 Apr 2025 04:32:57 +0000</pubDate>
      <link>https://dev.to/stackedbysahal/tutorial-deploy-owncloud-on-gcp-with-docker-nginx-step-by-step-4i8m</link>
      <guid>https://dev.to/stackedbysahal/tutorial-deploy-owncloud-on-gcp-with-docker-nginx-step-by-step-4i8m</guid>
      <description>&lt;p&gt;Hey Devs 👋,&lt;br&gt;&lt;br&gt;
In this post, I’ll guide you through deploying &lt;strong&gt;OwnCloud&lt;/strong&gt; on a &lt;strong&gt;GCP VM instance&lt;/strong&gt; using &lt;strong&gt;Docker&lt;/strong&gt;, secured with &lt;strong&gt;NGINX&lt;/strong&gt; as a reverse proxy and HTTPS enabled via Let's Encrypt.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧰 What You’ll Need
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google Cloud Platform (GCP) account&lt;/li&gt;
&lt;li&gt;Basic Linux &amp;amp; Docker knowledge&lt;/li&gt;
&lt;li&gt;Domain name (e.g., &lt;code&gt;ceritadesain.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;SSH access to your VM&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📦 Step 1: Create a GCP VM Instance
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://console.cloud.google.com" rel="noopener noreferrer"&gt;Google Cloud Console&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to: &lt;code&gt;Compute Engine &amp;gt; VM instances&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a new instance:

&lt;ul&gt;
&lt;li&gt;OS: Ubuntu 22.04 LTS&lt;/li&gt;
&lt;li&gt;Firewall: Allow HTTP &amp;amp; HTTPS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SSH into your instance once it’s running.&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  🐳 Step 2: Install Docker &amp;amp; Docker Compose
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io docker-compose &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;🔁 &lt;em&gt;Logout and login again to apply Docker group permissions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  📁 Step 3: Setup OwnCloud with Docker Compose
&lt;/h3&gt;

&lt;p&gt;Create a folder for 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="nb"&gt;mkdir &lt;/span&gt;owncloud-docker &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;owncloud-docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;docker-compose.yml&lt;/code&gt;:&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.1'&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;owncloud&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;owncloud/server&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;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;8080:8080&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;OWNCLOUD_DOMAIN=ceritadesain.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OWNCLOUD_ADMIN_USERNAME=admin&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OWNCLOUD_ADMIN_PASSWORD=yourpassword&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;files:/mnt/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You can now access it at &lt;code&gt;http://your-external-ip:8080&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌐 Step 4: Point Your Domain to the VM IP
&lt;/h3&gt;

&lt;p&gt;On your domain provider, update the A record to point to your GCP VM's external IP.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A  @  -&amp;gt;  34.100.xxx.xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔐 Step 5: Setup NGINX Reverse Proxy + SSL
&lt;/h3&gt;

&lt;p&gt;Install NGINX and Certbot:&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx certbot python3-certbot-nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create an NGINX config:&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="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/owncloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;ceritadesain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&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;p&gt;Enable it:&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="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/owncloud /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add HTTPS via Certbot:&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="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; ceritadesain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done! 🎉 Now your OwnCloud is accessible via &lt;code&gt;https://ceritadesain.com&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Bonus Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use Docker volumes for persistent data.&lt;/li&gt;
&lt;li&gt;Set up automatic SSL renewal with:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  0 0 * * * certbot renew --quiet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🤝 Let’s Connect!
&lt;/h3&gt;

&lt;p&gt;If you found this helpful, feel free to comment or connect with me on &lt;a href="https://www.linkedin.com/in/muhammadsahalnurdin/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://github.com/SahalN" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. I'm always up for feedback or collaboration on DevOps, web, and ML projects.&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Automating My Cloud Workflow with OwnCloud, Docker, and GCP</title>
      <dc:creator>Sahal</dc:creator>
      <pubDate>Thu, 17 Apr 2025 04:30:23 +0000</pubDate>
      <link>https://dev.to/stackedbysahal/automating-my-cloud-workflow-with-owncloud-docker-and-gcp-1053</link>
      <guid>https://dev.to/stackedbysahal/automating-my-cloud-workflow-with-owncloud-docker-and-gcp-1053</guid>
      <description>&lt;p&gt;Hey folks! 👋&lt;br&gt;&lt;br&gt;
I'm Sahal, a software engineer currently diving deeper into the world of &lt;strong&gt;DevOps and cloud automation&lt;/strong&gt;. Recently, I’ve been working on deploying my own cloud storage solution using &lt;a href="https://owncloud.com/" rel="noopener noreferrer"&gt;OwnCloud&lt;/a&gt; — self-hosted, scalable, and privacy-friendly. Here’s a quick overview of what I’ve been hacking on.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ What I'm Building
&lt;/h3&gt;

&lt;p&gt;I’m setting up &lt;strong&gt;OwnCloud&lt;/strong&gt; on my domain &lt;a href="https://ceritadesain.com" rel="noopener noreferrer"&gt;&lt;code&gt;ceritadesain.com&lt;/code&gt;&lt;/a&gt;, powered by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; for containerizing services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NGINX&lt;/strong&gt; for reverse proxy and TLS handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GCP Compute Engine&lt;/strong&gt; for VM hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vagrant + Ansible (coming soon)&lt;/strong&gt; to automate the full provisioning flow&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔄 Why I’m Doing This
&lt;/h3&gt;

&lt;p&gt;As a DevOps learner, I wanted hands-on experience in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure automation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud service management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure, production-ready deployments&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t just a weekend project — it’s also helping me sharpen skills that are highly relevant in real-world deployments (and interviews).&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 Next Steps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrate &lt;strong&gt;OAuth2 login with Google&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;CI/CD&lt;/strong&gt; via GitHub Actions&lt;/li&gt;
&lt;li&gt;Automate SSL renewals with Let’s Encrypt&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;monitoring and logging&lt;/strong&gt; with Prometheus + Grafana&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💬 Let’s Connect!
&lt;/h3&gt;

&lt;p&gt;If you're working on similar projects or just want to nerd out about DevOps, frontend, or AI/LLMs — hit me up! Always happy to exchange ideas or collaborate 🤝&lt;/p&gt;

&lt;p&gt;Thanks for reading — feel free to drop questions or feedback in the comments!&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Follow Me
&lt;/h3&gt;

&lt;p&gt;You can find me on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/muhammadsahalnurdin/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/muhammadsahalnurdin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SahalN" rel="noopener noreferrer"&gt;https://github.com/SahalN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧠 &lt;em&gt;“Learning by building is the most powerful form of learning.”&lt;/em&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Hello World!</title>
      <dc:creator>Sahal</dc:creator>
      <pubDate>Thu, 07 Sep 2023 15:44:26 +0000</pubDate>
      <link>https://dev.to/stackedbysahal/hello-world-10ed</link>
      <guid>https://dev.to/stackedbysahal/hello-world-10ed</guid>
      <description></description>
    </item>
  </channel>
</rss>
