<?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: Marek</title>
    <description>The latest articles on DEV Community by Marek (@marcoz).</description>
    <link>https://dev.to/marcoz</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%2F246631%2F9be6bbf5-f408-4e16-a149-baafbb564cb2.jpg</url>
      <title>DEV Community: Marek</title>
      <link>https://dev.to/marcoz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcoz"/>
    <language>en</language>
    <item>
      <title>The Right Way to Deploy Private GitHub Repos to Your VPS</title>
      <dc:creator>Marek</dc:creator>
      <pubDate>Fri, 23 Jan 2026 18:20:00 +0000</pubDate>
      <link>https://dev.to/marcoz/the-right-way-to-deploy-private-github-repos-to-your-vps-3725</link>
      <guid>https://dev.to/marcoz/the-right-way-to-deploy-private-github-repos-to-your-vps-3725</guid>
      <description>&lt;p&gt;Deploying code from a private repository to a VPS is something a lot of developers sort of know how to do — but most tutorials either rely on personal SSH keys or Personal Access Tokens. That works, but it gives your server much more access than it actually needs.&lt;/p&gt;

&lt;p&gt;In this guide you’ll learn how to set up a repository-specific SSH deploy key for your VPS so you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone your private repository securely&lt;/li&gt;
&lt;li&gt;Pull updates without storing personal credentials on the server&lt;/li&gt;
&lt;li&gt;Keep production access scoped narrowly and safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This method is slightly more advanced than a basic SSH clone, but it’s well worth it if you care about security and clean operations.&lt;/p&gt;

&lt;p&gt;What you'll learn: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to create repository-specific SSH deploy keys,&lt;/li&gt;
&lt;li&gt;Why deploy keys are more secure than personal credentials,&lt;/li&gt;
&lt;li&gt;How to configure SSH for multiple GitHub identities,&lt;/li&gt;
&lt;li&gt;The right way to structure your deployment directory,&lt;/li&gt;
&lt;li&gt;How to maintain and rotate deploy keys safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time required:&lt;/strong&gt; ~10–20 minutes&lt;br&gt;
&lt;strong&gt;Skill level:&lt;/strong&gt; Beginner to intermediate (comfortable with SSH and basic Linux) &lt;br&gt;
&lt;strong&gt;What you'll need:&lt;/strong&gt; SSH access to your VPS with sudo privileges and administrator access to your GitHub repository&lt;br&gt;
&lt;strong&gt;Prerequisites note:&lt;/strong&gt; This tutorial assumes you have SSH access to your server. If you haven't set up your firewall yet, I recommend checking out &lt;a href="https://dev.to/marcoz/dont-lock-yourself-out-enabling-ufw-on-a-linux-server-without-breaking-ssh-2p7o"&gt;my guide on securing SSH with UFW&lt;/a&gt; first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
There are several ways to authenticate to GitHub from a server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using your personal SSH key (this is risky, because it ties the server to your personal account )&lt;/li&gt;
&lt;li&gt;Using a Personal Access Token (it works, but provides overly broad access )&lt;/li&gt;
&lt;li&gt;Using a Repository-Specific Deploy Key (it’s ideal because it provides scoped access)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deploy keys follow the principle of least privilege: the server gets just enough access to pull the code it needs, no more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Prepare Your Deployment Environment&lt;/strong&gt;&lt;br&gt;
First create a dedicated deployment user. &lt;br&gt;
Rather than cloning as root or your own account, it’s better to use a dedicated user and by dedicated user, I mean a Linux system user created specifically to run and deploy a single application or repository — not a human login account. From my experience it is a good idea to use a name of the app/repository you’re going to deploy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo adduser --system --group yourappname
sudo mkdir -p /opt/yourappname
sudo chown yourappname:www-data /opt/yourappname
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment files are owned by a service user&lt;/li&gt;
&lt;li&gt;Permissions stay clear and restricted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why /opt and not /home, /srv, or somewhere else?&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;TL;DR:&lt;/strong&gt; /opt makes it immediately obvious what is system-owned and what you deployed yourself. &lt;/p&gt;

&lt;p&gt;In Linux, different top-level directories have different intentions. Using the right one is about keeping your server understandable six months from now.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;What /opt actually is&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
/opt stands for optional software.&lt;/p&gt;

&lt;p&gt;Historically (and still today), it’s meant for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;software not managed by the OS package manager&lt;/li&gt;
&lt;li&gt;applications you deploy yourself&lt;/li&gt;
&lt;li&gt;self-contained services that live outside the base system
That describes a manually deployed web application perfectly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why /opt is a good fit for deployed applications&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Putting your application in /opt/yourappname has several advantages:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;a. Clear separation from the operating system&lt;/em&gt;&lt;br&gt;
Your app is not part of the OS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/bin, /usr, /lib → operating system&lt;/li&gt;
&lt;li&gt;/opt → things you added&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS upgrades won’t touch your app&lt;/li&gt;
&lt;li&gt;you won’t accidentally overwrite system files&lt;/li&gt;
&lt;li&gt;backups and restores are simpler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;b. Clear separation from user home directories&lt;/em&gt;&lt;br&gt;
Using /home for production apps is tempting, but misleading.&lt;br&gt;
Home directories are meant for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;human users&lt;/li&gt;
&lt;li&gt;shell config&lt;/li&gt;
&lt;li&gt;personal files
A deployment user is not a human.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;By using /opt:&lt;/em&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there’s no expectation of interactive usage&lt;/li&gt;
&lt;li&gt;no confusion about “who owns what”&lt;/li&gt;
&lt;li&gt;no accidental exposure via home-directory defaults&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;c. Predictable layout for multi-app servers&lt;/em&gt;&lt;br&gt;
If you later deploy more applications, /opt scales cleanly:&lt;br&gt;
/opt/&lt;br&gt;
├── yourappname/&lt;br&gt;
├── anotherapp-1/&lt;br&gt;
├── anotherapp-2/&lt;/p&gt;

&lt;p&gt;Each app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;has its own directory&lt;/li&gt;
&lt;li&gt;has its own system user&lt;/li&gt;
&lt;li&gt;can have its own service, ports, and permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;audits easier&lt;/li&gt;
&lt;li&gt;troubleshooting faster&lt;/li&gt;
&lt;li&gt;future automation simpler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;d. Works well with permissions and service users&lt;/em&gt;&lt;br&gt;
The combination /opt/yourappname owned by yourappname:www-data means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the deploy user controls the code&lt;/li&gt;
&lt;li&gt;the web server can read what it needs&lt;/li&gt;
&lt;li&gt;root is not involved in daily operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s exactly what you want on a production server.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why not /srv?&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
You could use /srv, and some people do.&lt;br&gt;
However: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/srv is traditionally used for data served directly (FTP, NFS, static web roots)&lt;/li&gt;
&lt;li&gt;many distros barely use it in practice&lt;/li&gt;
&lt;li&gt; fewer people recognize it instantly and /opt is more universally understood for application installs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The key idea&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
The goal is to make it obvious what is system, what is application, and who owns it.&lt;br&gt;
Using /opt helps you do exactly that.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2 — Generate a Repository-Specific SSH Deploy Key
&lt;/h2&gt;

&lt;p&gt;Switch to the deployment user:&lt;br&gt;
&lt;code&gt;sudo su - yourappname&lt;/code&gt;&lt;br&gt;
Generate a new SSH key specifically for this repo:&lt;br&gt;
&lt;code&gt;ssh-keygen -t ed25519 -C "github-deploy-key-yourappname" -f ~/.ssh/id_ed25519_deploy_yourappname&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What this does: Creates a modern ed25519 key (more secure than RSA) with a descriptive comment and a specific filename so it doesn't conflict with other keys.&lt;/p&gt;

&lt;p&gt;When prompted for a passphrase, you can leave it empty for automated deployments — security comes from strict file permissions and the key being limited to a single repository. &lt;/p&gt;

&lt;p&gt;Display the public key:&lt;br&gt;
&lt;code&gt;cat ~/.ssh/id_ed25519_deploy_yourappname.pub&lt;/code&gt;&lt;br&gt;
Expected output: You should see something starting with ssh-ed25519 AAAA... followed by your comment.&lt;/p&gt;

&lt;p&gt;Copy this entire output — you'll paste it into GitHub next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Register the Deploy Key on GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your repository on GitHub&lt;/li&gt;
&lt;li&gt;Go to Settings → Deploy keys&lt;/li&gt;
&lt;li&gt;Click Add deploy key&lt;/li&gt;
&lt;li&gt;Paste the public key you generated&lt;/li&gt;
&lt;li&gt;Give it a sensible title, e.g., “VPS Deploy Key”&lt;/li&gt;
&lt;li&gt; Do NOT enable write access — this key should be read-only&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives your VPS the ability to read (clone/pull) this repository only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Configure SSH on the Server&lt;/strong&gt;&lt;br&gt;
On the yourappname user, create or edit the SSH config:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano ~/.ssh/config&lt;/code&gt;&lt;br&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;Host github-deploy
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_deploy_yourappname
    IdentitiesOnly yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells SSH to use the correct key just for this host alias.&lt;br&gt;
Test it:&lt;br&gt;
&lt;code&gt;ssh -T github-deploy&lt;/code&gt;&lt;br&gt;
If it says you’ve successfully authenticated (but can’t shell), you’re good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Clone the Repository&lt;/strong&gt;&lt;br&gt;
If you’re not logged in as the deployment user, switch to it first using &lt;code&gt;sudo su - yourappname&lt;/code&gt;. &lt;br&gt;
As the deployment user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /opt/yourappname
git clone git@github-deploy:yourusername/yourappname.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That command uses the custom github-deploy host alias — so Git uses the specific deploy key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6 — Verify Permissions and Security&lt;/strong&gt;&lt;br&gt;
Make sure the .ssh directory is locked down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_deploy_yourappname
chmod 644 ~/.ssh/id_ed25519_deploy_yourappname.pub
chmod 600 ~/.ssh/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;code&gt;ls -la ~/.ssh/&lt;/code&gt;&lt;br&gt;
You should see just the expected key, config, and correct permissions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7 — Pulling Updates Later&lt;/strong&gt;&lt;br&gt;
When you need to update the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo su - yourappname
cd /opt/yourappname
git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No passwords, no tokens — just the deploy key doing its job.&lt;/p&gt;

&lt;p&gt;If you have a systemd service (e.g., Gunicorn – I’ll cover it in the next blog article), restart it after the pull:&lt;br&gt;
&lt;code&gt;sudo systemctl restart yourappname&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8 — Key Rotation and Maintenance&lt;/strong&gt;&lt;br&gt;
Over time, you may want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotate the deploy key (generate a new one and update GitHub)&lt;/li&gt;
&lt;li&gt;Revoke older deploy keys from GitHub&lt;/li&gt;
&lt;li&gt;Monitor your repository’s key list for unused entries
Because this key is repo-specific, revoking it only affects this deployment — not your entire GitHub account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common Pitfalls &amp;amp; Quick Checks&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Wrong remote URL?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Make sure the Git remote uses your custom host:&lt;br&gt;
&lt;code&gt;git remote -v&lt;/code&gt;&lt;br&gt;
It should show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;origin git@github-deploy:yourusername/yourappname.git (fetch) 
origin git@github-deploy:yourusername/yourappname.git (push) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should NOT show: &lt;em&gt;&lt;a href="mailto:git@github.com"&gt;git@github.com&lt;/a&gt;&lt;/em&gt; (this would use the wrong key)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;SSH connection issues?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Run verbose SSH to debug:&lt;br&gt;
&lt;code&gt;ssh -vT github-deploy&lt;/code&gt;&lt;br&gt;
What this command does:&lt;br&gt;
-v → Verbose output — Shows what SSH is doing step by step: which key it tries, which config entry it uses, where authentication fails&lt;br&gt;
-T → Disable pseudo-terminal allocation — Tells SSH "Don't try to open a shell, just test authentication"&lt;br&gt;
This is important for GitHub because GitHub does not provide shell access. A successful connection will still exit immediately, but with a clear authentication message.&lt;/p&gt;

&lt;p&gt;Successful output looks like:&lt;br&gt;
&lt;code&gt;Hi yourusername/yourappname! You've successfully authenticated, but GitHub does not provide shell access.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When to use this command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH works locally but fails on the server&lt;/li&gt;
&lt;li&gt;Git can't clone or pull&lt;/li&gt;
&lt;li&gt;You suspect the wrong SSH key is being used&lt;/li&gt;
&lt;li&gt;You want to confirm which identity file is selected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Common error messages and fixes&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Permission denied (publickey)&lt;/em&gt; — The deploy key isn't registered on GitHub, or SSH is using the wrong key&lt;br&gt;
&lt;em&gt;Could not resolve hostname github-deploy&lt;/em&gt; — The SSH config file has a typo or wasn't saved properly&lt;br&gt;
&lt;em&gt;Host key verification failed&lt;/em&gt; — You need to accept GitHub's host key: run &lt;code&gt;ssh-keyscan github.com &amp;gt;&amp;gt; ~/.ssh/known_hosts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Permission problems?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
If you see "Permission denied" when trying to clone check file permissions:&lt;br&gt;
&lt;code&gt;ls -la ~/.ssh/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It should show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;drwx------  (700) for .ssh directory
-rw-------  (600) for private keys
-rw-r--r--  (644) for public keys
-rw-------  (600) for config file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If permissions are wrong, fix them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_deploy_yourappname
chmod 644 ~/.ssh/id_ed25519_deploy_yourappname.pub
chmod 600 ~/.ssh/config

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Wrapping Up&lt;/strong&gt;&lt;br&gt;
Using a repository-specific deploy key gives you a clean, secure way to pull private code onto a server without exposing broad access credentials. It's the professional default for small VPS deployments before you add CI/CD or automation.&lt;br&gt;
The principle is simple: give each server exactly the access it needs, nothing more. If this deploy key is ever compromised, you can revoke it on GitHub without affecting your other repositories or your personal access.&lt;/p&gt;

&lt;p&gt;Have you ever accidentally exposed credentials on a server? What's your preferred method for managing deploy access? Do you use deploy keys, CI/CD pipelines, or something else? Let me know in the comments!&lt;/p&gt;

&lt;p&gt;If you found this helpful, you might also want to check out the other articles in this series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/marcoz/dont-lock-yourself-out-enabling-ufw-on-a-linux-server-without-breaking-ssh-2p7o"&gt;Part 1: Don't Lock Yourself Out - Enabling UFW&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Don’t Lock Yourself Out: Enabling UFW on a Linux Server Without Breaking SSH</title>
      <dc:creator>Marek</dc:creator>
      <pubDate>Wed, 21 Jan 2026 20:27:57 +0000</pubDate>
      <link>https://dev.to/marcoz/dont-lock-yourself-out-enabling-ufw-on-a-linux-server-without-breaking-ssh-2p7o</link>
      <guid>https://dev.to/marcoz/dont-lock-yourself-out-enabling-ufw-on-a-linux-server-without-breaking-ssh-2p7o</guid>
      <description>&lt;p&gt;Setting up a firewall on your Linux server is essential for security — but one wrong move can lock you out of your own server via SSH. It happens more often than you'd think, and recovering from it can be frustrating (or expensive if you need to contact support).&lt;/p&gt;

&lt;p&gt;If you do get locked out, most VPS providers offer a web console or rescue mode — but relying on that is slower and avoidable. &lt;/p&gt;

&lt;p&gt;This tutorial walks you through enabling &lt;strong&gt;UFW&lt;/strong&gt; (&lt;em&gt;Uncomplicated Firewall&lt;/em&gt;) the safe way, with verification steps at every stage to ensure you maintain SSH access. Whether you're securing a new VPS, hardening an existing server, or just learning Linux system administration, this guide will help you set up your firewall with confidence.&lt;/p&gt;

&lt;p&gt;What you'll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to check your current SSH configuration &lt;/li&gt;
&lt;li&gt;The correct order to add firewall rules (SSH first!) &lt;/li&gt;
&lt;li&gt; How to verify everything is working before and after enabling the firewall &lt;/li&gt;
&lt;li&gt;A critical safety test that prevents lockouts &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time required:&lt;/strong&gt; 5-10 minutes&lt;br&gt;
&lt;strong&gt;Skill level:&lt;/strong&gt; Beginner to intermediate (comfortable with SSH) &lt;br&gt;
&lt;strong&gt;What you'll need:&lt;/strong&gt; SSH access to your Linux server with sudo privileges&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 1: Check Current SSH Connection&lt;/strong&gt;&lt;br&gt;
First, confirm you are connected via SSH and have sudo privileges. Use whoami command to see your username.&lt;br&gt;
Check what port SSH is using (usually 22)&lt;br&gt;
&lt;code&gt;sudo netstat -tlnp | grep ssh&lt;/code&gt;&lt;br&gt;
On newer systems, ss has replaced netstat &lt;br&gt;
&lt;code&gt;sudo ss -tlnp | grep ssh&lt;/code&gt; &lt;br&gt;
It should show something like: &lt;code&gt;tcp   LISTEN  0   128   0.0.0.0:22   0.0.0.0:*&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Note: Your SSH port might be different (like 2222). Remember this number!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Allow SSH BEFORE Enabling Firewall&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Method 1: If using default SSH port (22)&lt;/em&gt;&lt;br&gt;
&lt;code&gt;sudo ufw allow ssh&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;This rule allows the port associated with the SSH service - usually 22, as defined in /etc/services. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2: If using custom SSH port (replace 2222 with your port)&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;sudo ufw allow 2222&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 3: Be extra specific (replace YOUR_PORT with actual port)&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;sudo ufw allow YOUR_PORT/tcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verify the rule was added:&lt;br&gt;
&lt;code&gt;sudo ufw status verbose&lt;/code&gt;&lt;br&gt;
Should show your SSH rule as "ALLOW IN"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Add Other Required Rules&lt;/strong&gt;&lt;br&gt;
Allow web traffic (HTTP and HTTPS)&lt;br&gt;
&lt;code&gt;sudo ufw allow 'Nginx Full'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;OR manually allow ports 80 and 443:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ufw allow 80
sudo ufw allow 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set default policies (block everything except what we allow)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ufw default deny incoming
sudo ufw default allow outgoing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Please note that these default policies won’t take effect until UFW is enabled (Step 5 of this tutorial). &lt;br&gt;
By adding allow rules first, you ensure existing SSH traffic is permitted the moment the firewall activates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Test SSH Rule (Before Enabling)&lt;/strong&gt;&lt;br&gt;
Check UFW status (should still be inactive)&lt;br&gt;
&lt;code&gt;sudo ufw status&lt;/code&gt;&lt;br&gt;
Should show: &lt;code&gt;Status: inactive&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Double-check SSH is allowed:&lt;br&gt;
&lt;code&gt;sudo ufw show added&lt;/code&gt;&lt;br&gt;
Should show your SSH allow rule (from Step 2)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Enable Firewall (The Moment of Truth)&lt;/strong&gt;&lt;br&gt;
Enable UFW with confirmation&lt;br&gt;
&lt;code&gt;sudo ufw enable&lt;/code&gt;&lt;br&gt;
You'll see a warning like:"Command may disrupt existing ssh connections. Proceed with operation (y|n)?". Type: y.&lt;br&gt;
If everything is correct, you should still be connected!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Verify Everything Works&lt;/strong&gt;&lt;br&gt;
Check firewall status&lt;br&gt;
&lt;code&gt;sudo ufw status verbose&lt;/code&gt;&lt;br&gt;
You should see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: active
To                              Action          From
--                              ------          ----
22/tcp                               ALLOW IN    Anywhere
80,443/tcp (Nginx Full)              ALLOW IN    Anywhere
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check rule priority, which can help with troubleshooting.&lt;br&gt;
&lt;code&gt;sudo ufw status numbered&lt;/code&gt;&lt;br&gt;
You should see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: active
     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443/tcp                    ALLOW IN    Anywhere                  
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: By default, UFW mirrors rules for IPv6 if IPv6 is enabled. The (v6) rules are for IPv6 connections and are normal - UFW creates these automatically.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Differences from Regular status command.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Numbered rules: Each rule gets a bracketed number [1], [2], etc.&lt;br&gt;
Why this matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can delete specific rules by number: sudo ufw delete 3 &lt;/li&gt;
&lt;li&gt;Easier to see rule order (UFW processes rules top to bottom) &lt;/li&gt;
&lt;li&gt;More compact than status verbose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With More Complex Rules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have more specific rules (like allowing from certain IPs), it looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;To                          Action              From
     --                          ------             ----
[ 1] 22/tcp                     ALLOW IN        192.168.1.100            
[ 2] 22/tcp                     ALLOW IN        Anywhere                  
[ 3] 80/tcp                     ALLOW IN        Anywhere                  
[ 4] 3306/tcp                   ALLOW IN        10.0.0.0/8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 7: Critical safety test&lt;/strong&gt;&lt;br&gt;
After you’ve done all previous steps you should test that you can still connect. Open a NEW terminal window (DON’T CLOSE YOUR OLD WINDOW WHERE YOU CONFIGURED FIREWALL!) and SSH to your server. If this works, you're safe! &lt;br&gt;
If this test fails, fix the issue in your original terminal window!&lt;/p&gt;

&lt;p&gt;To finish, before you log out, confirm if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH works in a second terminal,&lt;/li&gt;
&lt;li&gt;ufw status shows ALLOW for your SSH port,&lt;/li&gt;
&lt;li&gt;Default policy is set to deny incoming.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have you ever accidentally locked yourself out of a server? What safety steps do you use?&lt;/p&gt;

</description>
      <category>linux</category>
      <category>vps</category>
      <category>devops</category>
    </item>
    <item>
      <title>What is Zero Trust, and why is it important?</title>
      <dc:creator>Marek</dc:creator>
      <pubDate>Wed, 18 Jun 2025 09:17:24 +0000</pubDate>
      <link>https://dev.to/marcoz/what-is-zero-trust-and-why-is-it-important-2obf</link>
      <guid>https://dev.to/marcoz/what-is-zero-trust-and-why-is-it-important-2obf</guid>
      <description>&lt;p&gt;For years the way many IT environments operated was if you could get past the firewall or connect to the company VPN, you were trusted.&lt;/p&gt;

&lt;p&gt;Today, when remote work is very common, cloud services run critical operations, and cyberattacks have grown significantly in frequency and sophistication, that approach no longer works.&lt;/p&gt;

&lt;p&gt;This is where Zero Trust security philosophy comes in. It was built on the idea that you should never trust anything or anyone by default, inside or outside your network. Every request for access must be verified explicitly, every time.&lt;/p&gt;

&lt;p&gt;In this post, I’ll explain what Zero Trust is, how it differs from traditional security models, and why it matters for anyone working in technology today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Zero Trust?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is a cybersecurity strategy based on the principle of “never trust, always verify.”&lt;/p&gt;

&lt;p&gt;Zero Trust assumes that a breach is either happening right now or will happen eventually. As a result, it treats every user, device, application, and network connection as untrusted until proven otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Components of Zero Trust&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1. Verify explicitly&lt;/em&gt;&lt;br&gt;
Always authenticate and authorize based on all available data points — including user identity, location, device health, and app sensitivity.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. Use least privilege access&lt;/em&gt;&lt;br&gt;
Limit access to just what’s needed for each person, system, or application to perform its job. Regularly review and adjust permissions. This component uses just-in-time (JIT) and just-enough access (JEA) principles.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3. Assume breach&lt;/em&gt;&lt;br&gt;
Operate as if attackers are already in your environment. Segment access by network, user, devices, and application, monitor continuously, and respond quickly to incidents.&lt;/p&gt;

&lt;p&gt;In Microsoft environment there are following services to implement Zero Trust philosophy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Microsoft Entra ID (formerly Azure Active Directory)&lt;/em&gt; for identity and access management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Microsoft Defender XDR (formerly Microsoft 365 Defender)&lt;/em&gt; for extended detection and response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Microsoft Sentinel&lt;/em&gt; for threat detection and hunting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Microsoft Entra Permissions Management&lt;/em&gt; for monitoring cloud entitlements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Zero Trust is important&lt;/strong&gt;&lt;br&gt;
Zero Trust is no longer optional — it’s the fundamental piece of modern environments protection, especially because remote and hybrid work is here to stay.&lt;br&gt;
The other important factor is that the regulatory standards (like GDPR, NIS2, and HIPAA) demand tighter control over data access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits of Adopting Zero Trust&lt;/strong&gt;&lt;br&gt;
Organizations that adopt a Zero Trust strategy experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reduced risk of breaches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved compliance and audit readiness&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced visibility over users, devices, and resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simplified and secure support for remote work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Faster incident detection and response&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Start with Zero Trust&lt;/strong&gt;&lt;br&gt;
Zero Trust can feel overwhelming at first. Start small and build progressively:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Enforce Multi-Factor Authentication (MFA) everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement Conditional Access policies in Entra ID to control access based on risk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Audit and minimize identity and permission sprawl.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Onboard logs into Microsoft Sentinel for visibility and analytics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adopt a Zero Trust mindset: question every access attempt, device, and connection.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Zero Trust is a necessary response to the way we work and operate technology today. By assuming breach, verifying explicitly, and enforcing least privilege, we significantly reduce the risks posed by modern cyber threats.&lt;/p&gt;

&lt;p&gt;In upcoming posts, I’ll continue to explore Microsoft security solutions, threat detection, and SC-900/SC-200 study insights.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>azure</category>
      <category>zerotrust</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>What is the difference between display:none and visibility:hidden?</title>
      <dc:creator>Marek</dc:creator>
      <pubDate>Sat, 07 Nov 2020 20:24:55 +0000</pubDate>
      <link>https://dev.to/marcoz/difference-between-display-none-and-visibility-hidden-ejm</link>
      <guid>https://dev.to/marcoz/difference-between-display-none-and-visibility-hidden-ejm</guid>
      <description>&lt;p&gt;If you are a frontend developer at the beginning of your career I’m sure you wonder how to prepare for your first interview. I’m going to focus on technical questions you may be asked and prepare answers for you. &lt;/p&gt;

&lt;p&gt;In this article, I’m going to explain to you a difference between display:none and visibility:hidden properties as this is one of the questions you may hear during an interview for a frontend developer position.&lt;/p&gt;

&lt;p&gt;Let’s use the following example to visualize the difference.&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%2Fi%2Fll41bk4wavfxgqoljrjg.jpg" 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%2Fi%2Fll41bk4wavfxgqoljrjg.jpg" alt="Alt Text" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we have four cards and want to make Card 2 invisible. In general, both properties make it possible. &lt;/p&gt;

&lt;p&gt;If we use &lt;em&gt;&lt;strong&gt;display:none&lt;/strong&gt;&lt;/em&gt; property the result will be the following:&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%2Fi%2Ftog472p7xr6libn3izpg.jpg" 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%2Fi%2Ftog472p7xr6libn3izpg.jpg" alt="Alt Text" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see Card 2 is not visible anymore and the remaining cards changed their positions so the margin we defined for them can be maintained. &lt;/p&gt;

&lt;p&gt;Let’s check now what happens if we set the &lt;em&gt;&lt;strong&gt;visibility:hidden&lt;/strong&gt;&lt;/em&gt; for Card 2.&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%2Fi%2Fd1o3wuxse5pzulio3bw5.jpg" 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%2Fi%2Fd1o3wuxse5pzulio3bw5.jpg" alt="Alt Text" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see it’s also not visible anymore like in the previous case but its spot is empty and other elements didn’t change their positions. The margins of the Card 2 have been maintained and all elements around behave as it was still there. &lt;/p&gt;

&lt;p&gt;I hope it explains well the difference between those two properties but if you still have any questions let me know. &lt;/p&gt;

</description>
      <category>css</category>
      <category>interview</category>
      <category>frontend</category>
      <category>junior</category>
    </item>
    <item>
      <title>The importance of your first app</title>
      <dc:creator>Marek</dc:creator>
      <pubDate>Fri, 17 Apr 2020 16:12:48 +0000</pubDate>
      <link>https://dev.to/marcoz/the-importance-of-your-first-app-35gh</link>
      <guid>https://dev.to/marcoz/the-importance-of-your-first-app-35gh</guid>
      <description>&lt;p&gt;So you are looking for a junior frontend developer position, right? Are you sure you know what you need to be successful? &lt;/p&gt;

&lt;p&gt;Many times when you start to learn a new skill you need to be familiar with the basics of a theoretical part before you move to the practical one. Learning to code is not different and you probably have heard many times that one can learn to code only by coding. It’s true because only this way you can learn the most important skill you need as a developer which is the ability to create. &lt;/p&gt;

&lt;p&gt;You may wonder why it is the most important skill. It is because as a software developer you will be responsible for the creation and it doesn’t matter if you remember all the theoretical parts or not. If you know what you need and where to find it you already have everything to start working and gaining experience. It’s the ability to join all different pieces of code together and create an app that can make you successful. &lt;/p&gt;

&lt;p&gt;I can tell you from my experience that it is good to start with some simple apps that you can make by following Youtube tutorials. This way you will get familiar with a structure of an app and the logic used to create it. Choose different kinds of apps to have a wider perspective and learn how to use different parts of the theory, ex. DOM operations, API, operations on arrays, etc.&lt;/p&gt;

&lt;p&gt;After you get comfortable with that comes the next step. Create your app. Think of something you would like to use and what features you would expect to have there as a user. Don’t get discouraged if you don’t know how to do something or the way you wanted to do it doesn’t work. This is where you learn the most important ability I have mentioned in the beginning. &lt;/p&gt;

&lt;p&gt;The first app I’ve ever created was a simple game written in HTML, CSS and pure JavaScript and the main logic that it used were DOM operations like hiding and showing divs. &lt;/p&gt;

&lt;p&gt;It made me very proud because I made it all by myself and as a result I got more courage and motivation to learn and to look for my first Frontend Developer job. &lt;br&gt;
I am convinced that it can be the same for all of you that are at the beginning of the coding journey and if you think you need some extra motivation or don’t know how to improve your skills remember the importance of your first app. &lt;/p&gt;

&lt;p&gt;#junior #beginners #motivation #impostersyndrome #career #mindset&lt;/p&gt;

</description>
      <category>junior</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Be ready to feel uncomfortable!</title>
      <dc:creator>Marek</dc:creator>
      <pubDate>Wed, 15 Jan 2020 22:18:39 +0000</pubDate>
      <link>https://dev.to/marcoz/be-ready-to-feel-uncomfortable-40i6</link>
      <guid>https://dev.to/marcoz/be-ready-to-feel-uncomfortable-40i6</guid>
      <description>&lt;p&gt;You may think it’s another article about motivation and all other related stuff. You are right! &lt;br&gt;
I would like to share with you my story about how and why I decided to make a career change and join the IT people. I hope some of you will find it inspiring and motivating if you are in a similar situation.&lt;br&gt;
I’m 38 and one year ago I’ve decided to start my career in the IT area. Some people advised me to become a tester as it might be easier but I didn’t want the easy way. I wanted to become a front-end developer so I started learning HTML, CSS and JavaScript. First I bought a book and started watching video tutorials and reading online articles about front-end technologies. &lt;br&gt;
Actually, my first thought was, “If I were a real front-end developer how would my day look like? What Twitter accounts would I follow? What Youtube channels would I watch? What podcasts would I listen to?”. Thanks to this approach I have discovered a lot of valuable resources online available for free and found out that tech people are usually helpful and eager to share their knowledge. &lt;br&gt;
So I’ve decided to become a front-end developer (let’s say I have already become it in my head at that point) and after a few months of self study I started (in Oct 2019) a 1-year front-end course at the local university. &lt;br&gt;
After all this time I’ve spent studying I can tell you that it’s not easy and you need to be ready to feel uncomfortable but at the end all this hard work pays off. &lt;br&gt;
If you are moving into IT from another industry like I am, don’t ever feel discouraged because of your age. If you put enough effort and self-confidence you are able to do it. Don’t stick to one learning method only. Try as many as you can. Watch videos, read articles and books, listen to podcasts and write a code. &lt;br&gt;
Probably you have heard many times that the most important thing is to write a code as much as you can. It’s true but if you become a front-end developer in your head and follow a daily routine of a real front-end dev even before getting a real job it may be actually easier for you. It works for me so it would probably work for you, too.&lt;br&gt;
If you think that if you are moving into IT from another industry you have to start from zero you are actually wrong. You may lack technical skills but don’t forget that some of your experience can be transferable. &lt;br&gt;
I worked more than 10 years with international business development and cooperation issues, lived in 3 countries and speak 6 languages. Based on this experience I know what I bring to the table and even though my IT knowledge is on the basic level I’m convinced that my adaptability, ambition, experience in the international environment and languages I speak can be of a real value for a company with an international presence. &lt;br&gt;
I am still waiting for my first IT job and even though I’ve applied for dozens companies the only feedback I’ve got is that they need a junior developer with experience. Is it going to discourage me? No, it is not, because I know the value I am bringing to the table and I know that there is a company out there that wants to grow and needs my help. &lt;/p&gt;

&lt;p&gt;Look at the bigger picture and believe in yourself!&lt;/p&gt;

&lt;p&gt;#junior #career #beginners #motivation #impostersyndrome #career #mindset&lt;/p&gt;

</description>
      <category>career</category>
      <category>junior</category>
      <category>motivation</category>
      <category>mindset</category>
    </item>
  </channel>
</rss>
