<?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: Jackfiallos</title>
    <description>The latest articles on DEV Community by Jackfiallos (@jackfiallos).</description>
    <link>https://dev.to/jackfiallos</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%2F97620%2F297976c5-bb5f-4466-925b-54b4f4cb04be.jpeg</url>
      <title>DEV Community: Jackfiallos</title>
      <link>https://dev.to/jackfiallos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jackfiallos"/>
    <language>en</language>
    <item>
      <title>Building Solo: Architecture, Decisions, and Challenges After Launching Deeditt</title>
      <dc:creator>Jackfiallos</dc:creator>
      <pubDate>Fri, 23 May 2025 15:05:30 +0000</pubDate>
      <link>https://dev.to/jackfiallos/building-solo-architecture-decisions-and-challenges-after-launching-deeditt-1769</link>
      <guid>https://dev.to/jackfiallos/building-solo-architecture-decisions-and-challenges-after-launching-deeditt-1769</guid>
      <description>&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%2F37ffkp3hghni75e67v75.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%2F37ffkp3hghni75e67v75.png" alt="Deeditt Infrastructure" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A solid infrastructure doesn't guarantee users. Neither does a good idea, but sharing the journey?&lt;br&gt;
That changes things.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  👋 Who I Am and What I'm Building
&lt;/h2&gt;

&lt;p&gt;I'm a software developer with years of experience building products from scratch, scaling infrastructure, and leading teams, but for the past few years, I've been working on something personal that I have named &lt;strong&gt;Deeditt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deeditt&lt;/strong&gt; is a different kind of social network. While platforms like LinkedIn only celebrate achievements, Medium rewards articles written for algorithms rather than people, and the others where you can post anything you want, Deeditt offers something more authentic: documenting the journey whether personal or professional. What you learned, what you did wrong, what you had to rebuild from scratch.&lt;/p&gt;

&lt;p&gt;It's a platform where you can share your real experiences through &lt;strong&gt;"deeds"&lt;/strong&gt; (individual posts) and organize them into &lt;strong&gt;"journeys"&lt;/strong&gt; (collections that tell a complete story over time). Think of it as a way to show "how I got here" not just "look where I am."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Have you ever wanted to share the stumbles in a project but couldn't find where that story fits?&lt;/strong&gt; you're right, this is what Deeditt was built for.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤔 Why I decided to build such thing
&lt;/h2&gt;

&lt;p&gt;During job interviews and team building, I noticed how people often told small lies about their experience because there was no tangible way to prove otherwise. I kept thinking, "&lt;strong&gt;If there was a platform where people documented their actual journey, this wouldn't happen&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;Like many who work behind complex systems, I felt something was missing: a space where people could share the process, not just the outcome. I wanted to read more about difficult decisions and less about brilliant successes, to have a better idea of people's real experiences.&lt;/p&gt;

&lt;p&gt;So I decided to build it myself, because it's definitely better to learn from someone else's experience than from their final achievement where they usually say "I learned to roller skate, here are 5 tips that will teach you to go faster."&lt;/p&gt;

&lt;p&gt;It took me about a year to mentally prepare for this long-term commitment, another year to develop the backend, frontend, server setup, and basic security, and yet another year to start testing the idea with real users. This timeline stretched out because I had a full-time job and Deeditt was my side project, which meant evenings and weekends were my development time.&lt;/p&gt;




&lt;h2&gt;
  
  
  📱 A wrong beginning? I Started with a Mobile App
&lt;/h2&gt;

&lt;p&gt;When I imagined Deeditt, I saw it as a social network and automatically thought of a mobile app. It seemed logical, so I started building with &lt;a href="https://reactnative.dev/" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;, a technology I already knew well and that allowed me to maintain a single codebase for iOS and Android.&lt;/p&gt;

&lt;p&gt;So I started building the mobile app using &lt;strong&gt;React Native&lt;/strong&gt; with &lt;strong&gt;TypeScript&lt;/strong&gt;, along with &lt;strong&gt;Zustand&lt;/strong&gt; for state management and &lt;strong&gt;React Navigation&lt;/strong&gt; for routing. I chose this stack because it offered the best balance between development speed and performance. Some might argue that using &lt;strong&gt;Expo&lt;/strong&gt; would have been a better choice, but at the time I started the project, Expo didn’t meet my needs. I required more flexibility and control than Expo could offer back then.&lt;/p&gt;

&lt;p&gt;I started with just a few screens, but within months it grew so much that I kept introducing more and more features that I thought were "needed." This was the first trap - feature creep without users to validate what was actually necessary but on the other hand, I always was building this for myself.&lt;/p&gt;

&lt;p&gt;But wait! Deeditt is also a &lt;strong&gt;free space&lt;/strong&gt; for writing, for expanding ideas, for reflection, and that's not so comfortable on a small screen. Over time like a year after, I realized that starting with web might have been more effective for initial adoption. Visibility and long-form content fit better there. It wasn't a critical mistake, but an important lesson about how the platform defines product dynamics.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Building the Web Version: A Work in Progress
&lt;/h2&gt;

&lt;p&gt;This realization led me to start working on a complete web version, which is what I'm doing now. Even though it's partially completed, there's a lot of work to do to fully match what I built in the mobile app.&lt;/p&gt;

&lt;p&gt;For the web version, I'm using &lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;Astro Framework&lt;/a&gt; with Preact islands for interactive components - a perfect match for a content-first platform that needs good SEO and performance. I've decided to work in small stages and introduce features one by one. The first stage was deed details and journey detail pages, and now I'm working on authentication, deed posting, and more navigation pages for deeds discovery.&lt;/p&gt;

&lt;p&gt;Though the mobile experience is excellent, I discovered many people prefer not to install new apps, especially in markets with geographic restrictions where the web offers greater accessibility. Fortunately, my architecture allows me to extend easily without having to rebuild everything from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Architecture: When the Stack Works But Isn't Enough
&lt;/h2&gt;

&lt;p&gt;Technically, I set out to build a system that could sustain itself without constant intervention. So I developed a self-sufficient architecture, focused on efficiency and low cost. Basically, much of what cloud service providers do for you, I decided to do myself. The result is many hours of work, but an extremely low monthly expense to maintain the infrastructure.&lt;/p&gt;

&lt;p&gt;I work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; for containerization, with services defined for production&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; for CI/CD pipelines&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.redhat.com/en/ansible-collaborative" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; with custom scripts that manage remote deployments on my VPS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt; with &lt;a href="https://grafana.com/" rel="noopener noreferrer"&gt;Grafana&lt;/a&gt; for monitoring and visualization&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://newrelic.com/" rel="noopener noreferrer"&gt;New Relic&lt;/a&gt; for performance monitoring&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://grafana.com/oss/loki/" rel="noopener noreferrer"&gt;Loki&lt;/a&gt; for log aggregation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://slack.com" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; for real-time alerts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rollbar.com/" rel="noopener noreferrer"&gt;Rollbar&lt;/a&gt; for exception tracking&lt;/li&gt;
&lt;li&gt;A set of microservices divided by functionality, each with its isolated &lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt; database that is using &lt;a href="https://www.pgbouncer.org/" rel="noopener noreferrer"&gt;PgBouncer&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most services are written in Node.js (&lt;a href="https://nestjs.com/" rel="noopener noreferrer"&gt;NestJS framework&lt;/a&gt;), Python (&lt;a href="https://fastapi.tiangolo.com/" rel="noopener noreferrer"&gt;FastAPI&lt;/a&gt;), and Go (&lt;a href="https://gofiber.io/" rel="noopener noreferrer"&gt;Fiber&lt;/a&gt;), depending on the type of workload. API-heavy services are built with NestJS for its structure, computation-intensive services use Go for its performance, and data processing pipelines use Python for its rich ecosystem of libraries.&lt;/p&gt;

&lt;p&gt;I don't use tools like Terraform or EKS. I want to maintain control and avoid unnecessary costs. My infrastructure-as-code consists of Ansible playbooks and shell scripts, which together handle everything from server provisioning to automatic SSL certificate management with &lt;a href="https://certbot.eff.org/" rel="noopener noreferrer"&gt;certbot&lt;/a&gt;. Automation allows me to make monthly releases that rarely take more than a few minutes.&lt;/p&gt;

&lt;p&gt;Background services run with &lt;a href="https://www.prefect.io/" rel="noopener noreferrer"&gt;Prefect&lt;/a&gt; for workflow orchestration, and asynchronous communications between applications use &lt;a href="https://bullmq.io/" rel="noopener noreferrer"&gt;BullMQ&lt;/a&gt; with Redis as the message broker. For real-time features, I use Socket.IO with Redis adapters to support scaling. Currently, Deeditt costs me not more than $150 USD monthly, and that's enough to support a few hundred more users before needing to scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔀 The Challenge of Service Communication
&lt;/h2&gt;

&lt;p&gt;One of the most complex challenges was establishing communication between different micro-services and servers. With &lt;a href="https://docs.docker.com/engine/swarm/" rel="noopener noreferrer"&gt;Docker Swarm&lt;/a&gt; orchestrating several nodes, I had to make difficult decisions about how to distribute limited resources most efficiently.&lt;/p&gt;

&lt;p&gt;I implemented an internal API gateway pattern where each service communicates through a central orchestrator that handles routing, authentication, and rate limiting. This reduces point-to-point communications and simplifies the overall architecture. Since everything runs under Docker Swarm, I don't need additional service discovery tools - the built-in networking handles service location efficiently.&lt;/p&gt;

&lt;p&gt;For data consistency across services, I implemented an event-driven architecture using a message queue system. When a service makes a state change, it publishes an event to a topic that other interested services subscribe to. This maintains eventual consistency without tight coupling.&lt;/p&gt;

&lt;p&gt;I had to write several custom rules to ensure stable connections between containers. Nothing overly complex, but certainly delicate. This is where my previous experience with distributed systems proved invaluable. I could have started with more sophisticated methods, but maintaining them would have been a headache I wanted to avoid at this stage.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 The Hidden Complexity Behind Simplicity
&lt;/h2&gt;

&lt;p&gt;There's a whole world of complexity beneath Deeditt's surface that users never see. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Internationalization&lt;/strong&gt;: While Deeditt is prepared for multiple languages, I've currently implemented 6 languages in the frontend and 2 in the backend. The infrastructure is ready for full localization including time formats and cultural contexts, but it's not completely set up yet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content Caching&lt;/strong&gt;: What appears real-time actually involves caching systems with slight delays, optimizing the balance between immediacy and server load. User feeds are cached with intelligent invalidation to ensure content stays fresh.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security Layers&lt;/strong&gt;: Multiple security systems work together to protect user data and ensure platform integrity, from authentication to data validation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recommendation Engine&lt;/strong&gt;: I'm working on a system that suggests relevant content and connections based on user interests and behavior patterns. It's still a work in progress, but even in its early stages, it helps users discover content they might find valuable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interface Complexity&lt;/strong&gt;: The UI might resemble &lt;a href="https://x.com/" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://www.threads.com/?hl=en" rel="noopener noreferrer"&gt;Threads&lt;/a&gt; at first glance, but once inside each "deed," there's a different world of options to discover—creating this intuitive complexity was one of the toughest design challenges.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these elements taught me something valuable, both technically and about user expectations. The most elegant solutions are often those the user never notices are there.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Deployment and Recovery: Versions, Environments, and Pragmatism
&lt;/h2&gt;

&lt;p&gt;I work with three branches (dev, staging, production). Since my budget is limited, my sandbox is very restricted and shares some resources with production plus a local mix, which forces me to be careful, but it works.&lt;/p&gt;

&lt;p&gt;To stay organized, I use &lt;a href="https://linear.app/" rel="noopener noreferrer"&gt;Linear&lt;/a&gt; for project management, and each ticket number becomes a branch name. This approach clearly helps me identify what I'm building and keeps my work focused. Once a feature is ready, it gets merged into dev. This simple system creates a clear connection between planning and implementation that's invaluable when working solo.&lt;/p&gt;

&lt;p&gt;Each deployment is linked to a version tag, both in GitHub and Docker Hub. If something fails, I rollback to a previous stable image. My deployment strategy ensures minimal disruption when updating services, with health checks confirming stability before completing the transition.&lt;/p&gt;

&lt;p&gt;For smaller projects, this level of organization might seem excessive, but when managing multiple micro-services and a growing feature set, having this structured approach to deployment and recovery has saved me countless hours of troubleshooting.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Technical (and Not-So-Technical) Learnings
&lt;/h2&gt;

&lt;p&gt;One of the first systems I implemented was a scoring algorithm with many rules and a popularity system based on multiple factors. It considered interaction patterns, content quality, and user engagement signals to determine what should be shown in feeds.&lt;/p&gt;

&lt;p&gt;But over time, I realized I had over-designed things that actually needed to be simple. I refactored the system to focus on just a few core metrics, which resulted in both better performance and more intuitive results for users.&lt;/p&gt;

&lt;p&gt;I also spent many hours creating monitoring dashboards. I tracked everything from resource usage to user engagement patterns. But eventually, I understood I was optimizing things that didn't yet need attention. In early stages, less is more.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Have you spent hours optimizing something that didn't really need optimization at that moment?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If I were to go back, I would simplify. Not everything needs to be perfect from day one. Sometimes, "&lt;strong&gt;good enough&lt;/strong&gt;" is exactly what's needed.&lt;/p&gt;

&lt;p&gt;In retrospect, developing such comprehensive metrics at an early stage was premature. Although it gives me visibility into the platform, that time could have been invested in features more important for attracting users.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 The Unique Value: Journeys as a Differentiator
&lt;/h2&gt;

&lt;p&gt;What truly distinguishes &lt;strong&gt;Deeditt&lt;/strong&gt; from other platforms are &lt;strong&gt;"Journeys"&lt;/strong&gt;. While other social networks show isolated moments, Deeditt allows grouping related &lt;strong&gt;"deeds"&lt;/strong&gt; (achievements/actions) that together tell a complete story over time.&lt;/p&gt;

&lt;p&gt;Technically, Journeys are implemented as a flexible structure where each journey can contain multiple deeds, and journeys can also connect to other journeys. This creates a way to organize content that mirrors how real experiences are interconnected.&lt;/p&gt;

&lt;p&gt;Each deed within a journey can include images, videos, hashtags, and mentions of other users. Additionally, you can configure privacy settings and define who has access to specific journeys and deeds through customizable visibility policies.&lt;/p&gt;

&lt;p&gt;This approach solves a silent but critical problem of our time: &lt;strong&gt;the difficulty of verifying if someone really has the experience they claim&lt;/strong&gt;. By seeing a complete story with all its parts, including obstacles and failures, you get an authentic context that traditional platforms don't offer.&lt;/p&gt;

&lt;p&gt;And like many things we do in life, we're always involved in more than just one thing. I'm a clear example—while writing about the development process of Deeditt, I also share thoughts about my son, my journey learning open water swimming, some health issues, and other topics. Each of these is separate, without needing to share too many personal details—just a general view of the moment I'm going through.&lt;/p&gt;

&lt;p&gt;The most beautiful part so far is that search engines are already starting to discover the content being created on Deeditt, and that means a lot of positive things.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌪️ The Real Challenge: Users, Community, and Visibility
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;None of this matters if nobody uses it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And there's the real challenge: building community. I returned to social media after years away, only to discover that organic marketing, content, and interaction are completely different worlds from distributed systems and CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;On platforms like Medium, I encountered the usual problem: algorithms that don't show what you write if you're not "playing the game." Claps, reads, comments... nothing seemed to have consistency. On LinkedIn, I saw an avalanche of "perfect posts" where everyone is successful, brilliant, and unstoppable.&lt;/p&gt;

&lt;p&gt;Deeditt doesn't want that, Deeditt wants the journey, the stumbles, the questionable decisions, the discarded versions.&lt;/p&gt;

&lt;p&gt;And of course, that's not easy to sell.&lt;/p&gt;

&lt;h2&gt;
  
  
  👂 What I've Learned from Feedback
&lt;/h2&gt;

&lt;p&gt;User feedback has been revealing. many get excited about the concept, suggest features, and celebrate updates... but then don't actively use the platform.&lt;/p&gt;

&lt;p&gt;This paradox—the gap between what people say and what they do—has been one of my biggest learning. By tracking feature adoption and identifying drop-off points, I discovered that while users loved the concept of Journeys, the friction of creating them was too high.&lt;/p&gt;

&lt;p&gt;I'm using that behavior to adjust the experience, but I'm doing it calmly. I want to listen more than I assume, and I'm prepared to change whatever is necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Breaking the Technical-Human Barrier
&lt;/h2&gt;

&lt;p&gt;Perhaps the most unexpected challenge has been learning to express myself effectively. As a developer, I was used to communicating with computers, not people. Marketing, clear communication, and emotional connection are skills I've had to develop from scratch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's ironic: I created a platform to improve authentic communication, and in the process, I'm learning to be more authentic in my own communication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ✋ To Those Who Haven't Started Yet: Don't Wait for Everything to Be Figured Out
&lt;/h2&gt;

&lt;p&gt;If you're reading this and haven't started your project yet because you're waiting for your idea to be ready or the stack to be perfect, I'll tell you honestly: it won't be.&lt;/p&gt;

&lt;p&gt;Start with what you know. Adjust along the way. Nothing is definitive. I've modified many parts I thought were immovable. Building is iterating, and if you can share what you experience, even a little, you're doing something much more valuable than it seems.&lt;/p&gt;

&lt;p&gt;If you have an idea, start it and don't wait for it to be perfect, don't wait to have everything clear. You'll solve things as you go, and what seems like a great solution today might not be tomorrow. That's okay. That's what building is about.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before Closing
&lt;/h2&gt;

&lt;p&gt;I'm still building &lt;strong&gt;Deeditt&lt;/strong&gt;. I'm still writing about its evolution under the title "&lt;a href="https://deeditt.com/app/users/@jackfiallos/journeys/a7b3836d-e7cd-4023-9baf-4a5a8035befb" rel="noopener noreferrer"&gt;Building Deeditt&lt;/a&gt;" I don't know when it will grow, or how many people will use it. But I do know that every line of code, every adjustment, and every decision is made with purpose.&lt;/p&gt;

&lt;p&gt;What I want to convey is that building solo is possible—even rewarding—but requires balancing technical and human skills. You don't need to spend fortunes on cloud services to create something valuable, but the time you invest is perhaps your most precious resource.&lt;/p&gt;

&lt;p&gt;I continue working on &lt;strong&gt;Deeditt&lt;/strong&gt; because I believe it makes sense, even if growth is slow. I do it because I want there to be a place where we can show our processes—without fear and without embellishment.&lt;/p&gt;

&lt;p&gt;In the end, it's about creating spaces where we can all grow, share, and learn together.&lt;/p&gt;

&lt;p&gt;If you're curious, I invite you to take a look at what I've been building. I'm always eager to hear others' stories—feedback, good or bad, is always welcome. And if you're feeling a bit tired of traditional social media, I propose a different model for sharing content. One where you don’t need to chase validation or constantly post something flashy. I call it &lt;strong&gt;"slow content"&lt;/strong&gt;—a way of publishing that encourages you to write only when you have something meaningful to share, something that adds value to your knowledge and might resonate with others.&lt;/p&gt;

&lt;p&gt;And if you're also building something, I'd love to hear your story on Deeditt—or tell me in the comments.&lt;/p&gt;

</description>
      <category>indiehacker</category>
      <category>learning</category>
      <category>buildinpublic</category>
      <category>startup</category>
    </item>
    <item>
      <title>How do you deploy your applications?</title>
      <dc:creator>Jackfiallos</dc:creator>
      <pubDate>Sun, 17 May 2020 10:13:12 +0000</pubDate>
      <link>https://dev.to/jackfiallos/how-do-you-deploy-your-applications-4i32</link>
      <guid>https://dev.to/jackfiallos/how-do-you-deploy-your-applications-4i32</guid>
      <description>&lt;p&gt;Usually I use Mina and Codeship and before Capistrano and Jenkins but I'm interested of knowing what you people use to deploy your applications. Comments and links are very welcome.&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>question</category>
      <category>deployment</category>
      <category>tools</category>
    </item>
    <item>
      <title>Create your own tunnelling like ngrok does</title>
      <dc:creator>Jackfiallos</dc:creator>
      <pubDate>Wed, 19 Feb 2020 18:36:48 +0000</pubDate>
      <link>https://dev.to/jackfiallos/create-your-own-tunnelling-like-ngrok-does-kg4</link>
      <guid>https://dev.to/jackfiallos/create-your-own-tunnelling-like-ngrok-does-kg4</guid>
      <description>&lt;p&gt;If you're here is because you don't want to use &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; or you are looking for an alternative to it, which is pretty valid because if somebody did that, why you don't?&lt;/p&gt;

&lt;p&gt;Well, this story begins with me trying to make my local development environment public and here is where &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; came to the rescue, this tool works really well, but with some limitations, like having a random subdomain every time you restart your application or using more than one connection, are the things you will need to deal with unless you don't pay for it.&lt;/p&gt;

&lt;p&gt;So basically everything works behind ssh tunnelling connections, and if you want to create your own &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; clone, mainly you will need a VPS server running Linux preferentially.&lt;/p&gt;

&lt;p&gt;Now try to connect your local computer to the VPS server through SSH (111.111.111.111 in this case).&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="nv"&gt;$ &lt;/span&gt;ssh root@111.111.111.111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are some different ways to get this done, every connection string depends on the service provider you're using, could need to type your password or could be using a .pem key but in the end, will have the same result.&lt;/p&gt;

&lt;p&gt;With your VPS session opened, just type the next command in your terminal, if you have issues with this command try to open the &lt;a href="https://www.ssh.com/ssh/sshd_config" rel="noopener noreferrer"&gt;sshd_config&lt;/a&gt; file and write at the very end "&lt;a href="https://www.ssh.com/ssh/tunneling/example" rel="noopener noreferrer"&gt;GatewayPorts yes&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;$ echo "GatewayPorts yes" &amp;gt;&amp;gt; /etc/ssh/sshd_config&lt;br&gt;
By default, OpenSSH only allows connecting to remote forwarded ports from the server host. However, the GatewayPorts option in the server configuration file sshd_config can be used to control this.&lt;/p&gt;

&lt;p&gt;Restart the SSH service and exit from your session&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="nv"&gt;$ &lt;/span&gt;service ssh restart
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should be able to run a command similar to this one, and guess what!!&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="nv"&gt;$ &lt;/span&gt;ssh &lt;span class="nt"&gt;-R&lt;/span&gt; 8080:localhost:3000 root@111.111.111.111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voilá, this will open the port 8080 on the VPS server and will forward it to the port 3000 on our local machine, basically means you can type on your browser &lt;a href="http://111.111.111.111:8080" rel="noopener noreferrer"&gt;http://111.111.111.111:8080&lt;/a&gt; and effectively will redirect the traffic to your local computer.&lt;/p&gt;

&lt;p&gt;I know you want more, say.. subdomains and https connections? yeah, why not, let's finish this.&lt;/p&gt;

&lt;p&gt;The next part of this mini how-to is creating a subdomain and link it with your public VPS IP, but I'm will leave this to you, again .. this depends on what service provider you're using.&lt;/p&gt;

&lt;p&gt;At this point, you have your VPS server running and ready to forward from source to destination ports, let's assume you have your subdomain created as well, now the next step will be setting up your web server with a reverse proxy tweak. In my case I decided to use Nginx, it's my favourite and it's really simple to set up, actually, my current configuration is similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
    listen 80 default_server&lt;span class="p"&gt;;&lt;/span&gt;
    listen &lt;span class="o"&gt;[&lt;/span&gt;::]:80 default_server&lt;span class="p"&gt;;&lt;/span&gt;

    server_name _&lt;span class="p"&gt;;&lt;/span&gt;
    location / &lt;span class="o"&gt;{&lt;/span&gt;
        proxy_pass http://127.0.0.1:8080&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And again, works! my VPS server receives traffic from my subdomain and redirects to 127.0.0.1:8080 which is the same server but through SSH tunnelling.&lt;/p&gt;

&lt;p&gt;If we test again typing in the browser address bar &lt;a href="http://yoursubdomain.domain.com" rel="noopener noreferrer"&gt;http://yoursubdomain.domain.com&lt;/a&gt; should work and redirect again all petitions to your local computer.&lt;/p&gt;

&lt;p&gt;This still needs to work with SSL and to complete this step I recommend you to install &lt;a href="https://certbot.eff.org/" rel="noopener noreferrer"&gt;certbot&lt;/a&gt; and follow the instructions, it's pretty straight forward so I don't have a doubt you will get it.&lt;/p&gt;

&lt;p&gt;This is my first article as a non-native English-speaker, so be kind and patient.&lt;/p&gt;

&lt;p&gt;Happy Coding! :D&lt;/p&gt;

</description>
      <category>ssh</category>
      <category>tunnelling</category>
      <category>ngrok</category>
      <category>forward</category>
    </item>
  </channel>
</rss>
