<?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: Ravi Sengar Rajasthan</title>
    <description>The latest articles on DEV Community by Ravi Sengar Rajasthan (@ravi_sengarrajasthan_c6f).</description>
    <link>https://dev.to/ravi_sengarrajasthan_c6f</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%2F3488842%2Fa39a9559-b53a-4ad2-b67a-10af7c697104.png</url>
      <title>DEV Community: Ravi Sengar Rajasthan</title>
      <link>https://dev.to/ravi_sengarrajasthan_c6f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ravi_sengarrajasthan_c6f"/>
    <language>en</language>
    <item>
      <title>Deploying a Laravel Portfolio to AWS EC2: Complete Production Setup</title>
      <dc:creator>Ravi Sengar Rajasthan</dc:creator>
      <pubDate>Tue, 09 Sep 2025 10:09:35 +0000</pubDate>
      <link>https://dev.to/ravi_sengarrajasthan_c6f/deploying-a-laravel-portfolio-to-aws-ec2-complete-production-setup-329h</link>
      <guid>https://dev.to/ravi_sengarrajasthan_c6f/deploying-a-laravel-portfolio-to-aws-ec2-complete-production-setup-329h</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why AWS EC2 Over Shared Hosting?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full server control for custom configurations&lt;/p&gt;

&lt;p&gt;Scalability as your projects grow&lt;/p&gt;

&lt;p&gt;Professional credibility with clients&lt;/p&gt;

&lt;p&gt;Learning experience with cloud infrastructure&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;&lt;br&gt;
Backend: Laravel 12&lt;/p&gt;

&lt;p&gt;Frontend: Tailwind CSS&lt;/p&gt;

&lt;p&gt;Server: Ubuntu 22.04 on AWS EC2 t2.micro&lt;/p&gt;

&lt;p&gt;Web Server: Nginx&lt;/p&gt;

&lt;p&gt;Database: SQLite (perfect for portfolios)&lt;/p&gt;

&lt;p&gt;SSL: Let's Encrypt (free)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step Deployment&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. EC2 Setup&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Launch t2.micro instance (free tier)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Configure security groups: HTTP (80), HTTPS (443), SSH (22)
&lt;/h1&gt;

&lt;p&gt;Copy&lt;br&gt;
bash&lt;br&gt;
&lt;strong&gt;2. Server Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Update system
&lt;/h1&gt;

&lt;p&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;/p&gt;

&lt;h1&gt;
  
  
  Install PHP 8.3 and extensions
&lt;/h1&gt;

&lt;p&gt;sudo apt install php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl php8.3-zip&lt;/p&gt;

&lt;h1&gt;
  
  
  Install Nginx
&lt;/h1&gt;

&lt;p&gt;sudo apt install nginx&lt;/p&gt;

&lt;h1&gt;
  
  
  Install Composer
&lt;/h1&gt;

&lt;p&gt;curl -sS &lt;a href="https://getcomposer.org/installer" rel="noopener noreferrer"&gt;https://getcomposer.org/installer&lt;/a&gt; | php&lt;br&gt;
sudo mv composer.phar /usr/local/bin/composer&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
bash&lt;br&gt;
&lt;strong&gt;3. Laravel Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Clone your repository
&lt;/h1&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/yourusername/portfolio.git" rel="noopener noreferrer"&gt;https://github.com/yourusername/portfolio.git&lt;/a&gt; /var/www/portfolio&lt;/p&gt;

&lt;h1&gt;
  
  
  Install dependencies
&lt;/h1&gt;

&lt;p&gt;cd /var/www/portfolio&lt;br&gt;
composer install --optimize-autoloader --no-dev&lt;/p&gt;

&lt;h1&gt;
  
  
  Set permissions
&lt;/h1&gt;

&lt;p&gt;sudo chown -R www-data:www-data /var/www/portfolio&lt;br&gt;
sudo chmod -R 755 /var/www/portfolio&lt;br&gt;
sudo chmod -R 775 /var/www/portfolio/storage&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
bash&lt;br&gt;
&lt;strong&gt;4. Nginx Configuration&lt;/strong&gt;&lt;br&gt;
server {&lt;br&gt;
    listen 80;&lt;br&gt;
    server_name yourdomain.com;&lt;br&gt;
    root /var/www/portfolio/public;&lt;br&gt;
    index index.php;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
nginx&lt;br&gt;
&lt;strong&gt;5. SSL with Let's Encrypt&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Install Certbot
&lt;/h1&gt;

&lt;p&gt;sudo apt install certbot python3-certbot-nginx&lt;/p&gt;

&lt;h1&gt;
  
  
  Get SSL certificate
&lt;/h1&gt;

&lt;p&gt;sudo certbot --nginx -d yourdomain.com&lt;/p&gt;

&lt;h1&gt;
  
  
  Auto-renewal (already configured)
&lt;/h1&gt;

&lt;p&gt;sudo systemctl status certbot.timer&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
bash&lt;br&gt;
Auto-Deployment with GitHub Webhooks&lt;br&gt;
Created a webhook endpoint that automatically pulls changes:&lt;/p&gt;

&lt;p&gt;&amp;lt;?php&lt;br&gt;
// webhook.php&lt;br&gt;
$payload = json_decode(file_get_contents('php://input'), true);&lt;/p&gt;

&lt;p&gt;if (isset($payload['ref']) &amp;amp;&amp;amp; $payload['ref'] === 'refs/heads/main') {&lt;br&gt;
    shell_exec('cd /var/www/portfolio &amp;amp;&amp;amp; git pull origin main');&lt;br&gt;
    shell_exec('cd /var/www/portfolio &amp;amp;&amp;amp; php artisan config:clear');&lt;br&gt;
    shell_exec('cd /var/www/portfolio &amp;amp;&amp;amp; php artisan cache:clear');&lt;br&gt;
    echo "Deployed successfully!";&lt;br&gt;
}&lt;br&gt;
?&amp;gt;&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
php&lt;br&gt;
Workflow: Edit locally → Push to GitHub → Auto-deploy to production&lt;/p&gt;

&lt;p&gt;Security Hardening&lt;br&gt;
Security Headers Middleware&lt;br&gt;
class SecurityHeaders&lt;br&gt;
{&lt;br&gt;
    public function handle($request, Closure $next)&lt;br&gt;
    {&lt;br&gt;
        $response = $next($request);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $response-&amp;gt;headers-&amp;gt;set('X-Content-Type-Options', 'nosniff');
    $response-&amp;gt;headers-&amp;gt;set('X-Frame-Options', 'DENY');
    $response-&amp;gt;headers-&amp;gt;set('X-XSS-Protection', '1; mode=block');

    return $response;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
php&lt;br&gt;
&lt;strong&gt;Environment Security&lt;/strong&gt;&lt;br&gt;
Never commit .env files&lt;/p&gt;

&lt;p&gt;Use strong database passwords&lt;/p&gt;

&lt;p&gt;Configure proper file permissions&lt;/p&gt;

&lt;p&gt;Regular security updates&lt;/p&gt;

&lt;p&gt;Performance Optimizations&lt;/p&gt;

&lt;h1&gt;
  
  
  Enable OPcache
&lt;/h1&gt;

&lt;p&gt;sudo nano /etc/php/8.3/fpm/php.ini&lt;/p&gt;

&lt;h1&gt;
  
  
  opcache.enable=1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Optimize Composer autoloader
&lt;/h1&gt;

&lt;p&gt;composer install --optimize-autoloader --no-dev&lt;/p&gt;

&lt;h1&gt;
  
  
  Laravel optimizations
&lt;/h1&gt;

&lt;p&gt;php artisan config:cache&lt;br&gt;
php artisan route:cache&lt;br&gt;
php artisan view:cache&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
bash&lt;br&gt;
Monitoring and Maintenance&lt;br&gt;
Log Monitoring&lt;/p&gt;

&lt;h1&gt;
  
  
  Check Laravel logs
&lt;/h1&gt;

&lt;p&gt;tail -f /var/www/portfolio/storage/logs/laravel.log&lt;/p&gt;

&lt;h1&gt;
  
  
  Check Nginx logs
&lt;/h1&gt;

&lt;p&gt;tail -f /var/log/nginx/error.log&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
bash&lt;br&gt;
Backup Strategy&lt;br&gt;
Database backups via cron jobs&lt;/p&gt;

&lt;p&gt;Code versioning with Git&lt;/p&gt;

&lt;p&gt;Server snapshots (AWS AMI)&lt;/p&gt;

&lt;p&gt;Cost Breakdown&lt;br&gt;
EC2 t2.micro: Free for 12 months, then ~$9/month&lt;/p&gt;

&lt;p&gt;Domain: ~$12/year&lt;/p&gt;

&lt;p&gt;SSL: Free (Let's Encrypt)&lt;/p&gt;

&lt;p&gt;Total: Essentially free for the first year&lt;/p&gt;

&lt;p&gt;Results&lt;br&gt;
The deployed portfolio (&lt;a href="https://sengaram.com" rel="noopener noreferrer"&gt;https://sengaram.com&lt;/a&gt;) features:&lt;/p&gt;

&lt;p&gt;⚡ Sub-2 second load times&lt;/p&gt;

&lt;p&gt;🔒 A+ SSL rating&lt;/p&gt;

&lt;p&gt;📱 Mobile-responsive design&lt;/p&gt;

&lt;p&gt;🚀 Automatic deployments&lt;/p&gt;

&lt;p&gt;📊 Google Analytics integration&lt;/p&gt;

&lt;p&gt;Key Takeaways&lt;br&gt;
Start simple - t2.micro is perfect for portfolios&lt;/p&gt;

&lt;p&gt;Automate everything - deployment, SSL renewal, backups&lt;/p&gt;

&lt;p&gt;Security first - proper headers, permissions, updates&lt;/p&gt;

&lt;p&gt;Monitor actively - logs, performance, uptime&lt;/p&gt;

&lt;p&gt;Common Pitfalls to Avoid&lt;br&gt;
Forgetting to set proper file permissions&lt;/p&gt;

&lt;p&gt;Not configuring security groups correctly&lt;/p&gt;

&lt;p&gt;Skipping SSL certificate setup&lt;/p&gt;

&lt;p&gt;Ignoring log monitoring&lt;/p&gt;

&lt;p&gt;Next Steps&lt;br&gt;
Consider adding:&lt;/p&gt;

&lt;p&gt;CDN integration (CloudFront)&lt;/p&gt;

&lt;p&gt;Database migration to RDS for scaling&lt;/p&gt;

&lt;p&gt;Load balancing for high traffic&lt;/p&gt;

&lt;p&gt;CI/CD pipelines with AWS CodePipeline&lt;/p&gt;

&lt;p&gt;Have you deployed Laravel applications to AWS? What challenges did you face?&lt;/p&gt;

&lt;p&gt;Check out the live result at (&lt;a href="https://sengaram.com" rel="noopener noreferrer"&gt;https://sengaram.com&lt;/a&gt;) - built following these exact steps.&lt;/p&gt;

&lt;h1&gt;
  
  
  laravel #aws #deployment #portfolio #webdev #php #nginx #ssl
&lt;/h1&gt;

</description>
      <category>laravel</category>
      <category>kubernetes</category>
      <category>portfolio</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
