DEV Community

Cover image for A comprehensive guide on how to deploy laravel application to vps, using github action, ssh key, server permissions and more.

A comprehensive guide on how to deploy laravel application to vps, using github action, ssh key, server permissions and more.

Comprehensive Laravel Deployment Guide with GitHub Actions and VPS

Prerequisites

  • A GitHub repository with your Laravel project
  • A VPS (Virtual Private Server) running Linux (Ubuntu recommended)
  • SSH access to your VPS
  • Basic understanding of Git, Laravel, and terminal commands

Step 1: Prepare Your Local Development Environment

1.1 Ensure Your Laravel Project is Ready

  1. Make sure your project is in a GitHub repository
  2. Check your .gitignore file to exclude unnecessary files:
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result_cache
Enter fullscreen mode Exit fullscreen mode

1.2 Prepare Environment Configuration

  1. Create a .env.production file with production-specific configurations
  2. Ensure sensitive information is not hardcoded

Step 2: Set Up SSH Keys for GitHub Actions

2.1 Generate SSH Keys on Your Local Machine

# Generate a new SSH key specifically for GitHub Actions
ssh-keygen -t ed25519 -C "github-actions-deployment"

# Save the key in a specific location, e.g., ~/.ssh/github_actions_key
# Do NOT use a passphrase for automated deployment
Enter fullscreen mode Exit fullscreen mode

2.2 Set Up SSH on VPS

  1. Connect to your VPS via SSH
ssh root@your_vps_ip
Enter fullscreen mode Exit fullscreen mode
  1. Create a deployment user
# Create a new user for deployments
adduser deployer

# Give sudo privileges (use carefully)
usermod -aG sudo deployer

# Switch to deployer user
su - deployer
Enter fullscreen mode Exit fullscreen mode
  1. Set up SSH directory for the deployer user
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Enter fullscreen mode Exit fullscreen mode

2.3 Configure GitHub Repository Secrets

  1. Go to your GitHub repository
  2. Navigate to Settings > Secrets and variables > Actions
  3. Add the following secrets:
    • VPS_HOST: Your VPS IP address
    • VPS_PORT: SSH port (default 22)
    • VPS_USER: deployer
    • SSH_PRIVATE_KEY: Content of the private key generated in step 2.1
    • SERVER_DESTINATION: Path on server (e.g., /home/deployer/your-app)
    • DEPLOYMENT_ENV_FILE: Base64 encoded production .env file contents

Step 3: Prepare VPS for Laravel Deployment *[Skip to step 4 if you are using any VPS panel]

3.1 Install Required Software

# Update system
sudo apt update && sudo apt upgrade -y

# Install PHP and extensions
sudo apt install -y php8.2-fpm php8.2-cli php8.2-common php8.2-mysql php8.2-zip php8.2-gd php8.2-mbstring php8.2-curl php8.2-xml php8.2-bcmath

# Install Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

# Install Nginx
sudo apt install -y nginx

# Install MySQL (if not already installed)
sudo apt install -y mysql-server

# Install Node.js and NPM
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
Enter fullscreen mode Exit fullscreen mode

3.2 Configure Nginx

  1. Create Nginx configuration
server {
    listen 80;
    server_name your-domain.com;
    root /home/deployer/your-app/public;

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
Enter fullscreen mode Exit fullscreen mode
  1. Enable configuration
sudo ln -s /etc/nginx/sites-available/your-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Enter fullscreen mode Exit fullscreen mode

Step 4: Create GitHub Actions Workflow *[Continue from here if you are using VPS panel on your server]

4.1 Create Workflow File

Create .github/workflows/laravel-deploy.yml:

name: Laravel Deployment

on:
  push:
    branches: [ "main" ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.2'
        extensions: mbstring, bcmath, zip

    - name: Install Composer Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist

    - name: Install NPM Dependencies
      run: npm install

    - name: Build Frontend
      run: npm run build

    - name: Prepare Environment File
      run: |
        echo "${{ secrets.DEPLOYMENT_ENV_FILE }}" | base64 --decode > .env

    - name: Deploy to VPS
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.VPS_HOST }}
        username: ${{ secrets.VPS_USER }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        script: |
          cd ${{ secrets.SERVER_DESTINATION }}
          git pull origin main
          composer install --no-interaction
          php artisan migrate --force
          php artisan config:clear
          php artisan cache:clear
          npm install
          npm run build
          sudo systemctl restart nginx
Enter fullscreen mode Exit fullscreen mode

Step 5: Final VPS Configuration

5.1 Set Up Git on VPS

cd /home/deployer/your-app
git init
git remote add origin https://github.com/your-username/your-repo.git
Enter fullscreen mode Exit fullscreen mode

5.2 Set Permissions

sudo chown -R deployer:deployer /home/deployer/your-app
sudo chmod -R 755 /home/deployer/your-app
sudo chmod -R 775 /home/deployer/your-app/storage
sudo chmod -R 775 /home/deployer/your-app/bootstrap/cache
Enter fullscreen mode Exit fullscreen mode

Step 6: Database Setup

# Create MySQL database
sudo mysql
CREATE DATABASE your_database_name;
CREATE USER 'your_username'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON your_database_name.* TO 'your_username'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Enter fullscreen mode Exit fullscreen mode

Troubleshooting Tips

  • Check GitHub Actions logs for specific errors
  • Verify SSH key permissions
  • Ensure all secrets are correctly set
  • Check Nginx and PHP-FPM logs for deployment issues

Security Recommendations

  • Use strong, unique passwords
  • Keep your system and dependencies updated
  • Configure firewall (UFW)
  • Use SSH key authentication
  • Limit sudo access

if you need more elaboration on any specific part of this comprehensive deployment guide, paste on the comment section.

Launch embedded dashboards in 10% of the time - with 100% of your standards.

Launch embedded dashboards in 10% of the time - with 100% of your standards.

Embed in minutes, load in milliseconds, extend infinitely. Import any chart, connect to any database, embed anywhere. Scale elegantly, monitor effortlessly, CI/CD & version control.

Get early access

Top comments (0)

Short-term memory for faster AI agents

Short-term memory for faster AI agents

AI agents struggle with latency and context switching. Redis fixes it with a fast, in-memory layer for short-term context—plus native support for vectors and semi-structured data to keep real-time workflows on track.

Start building

Join the Real-Time AI Agents Challenge: $5,000 in Prizes!

Put yourself at the forefront of AI agent development and build with n8n's automation platform combined with Bright Data's web data infrastructure.

Check out the challenge

DEV is bringing live events to the community. Dismiss if you're not interested. ❤️