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.

Top comments (0)