initial commit
This commit is contained in:
@@ -0,0 +1,411 @@
|
||||
# Apache Deployment Guide for Bike Service Application
|
||||
|
||||
This guide will help you deploy your Laravel + Vue.js application to Ubuntu 22.04 with Apache and MySQL.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Ubuntu 22.04 server with root/sudo access
|
||||
- Domain name (optional but recommended)
|
||||
- SSH access to your server
|
||||
|
||||
## Server Setup
|
||||
|
||||
### 1. Update System
|
||||
```bash
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
```
|
||||
|
||||
### 2. Install Required Software
|
||||
```bash
|
||||
# Install Apache
|
||||
sudo apt install apache2 -y
|
||||
|
||||
# Install PHP 8.2 and extensions
|
||||
sudo apt install software-properties-common -y
|
||||
sudo add-apt-repository ppa:ondrej/php -y
|
||||
sudo apt update
|
||||
sudo apt install php8.2 libapache2-mod-php8.2 php8.2-mysql php8.2-xml php8.2-mbstring php8.2-curl php8.2-zip php8.2-gd php8.2-cli php8.2-common php8.2-bcmath php8.2-json php8.2-tokenizer php8.2-fileinfo php8.2-opcache -y
|
||||
|
||||
# Install Composer
|
||||
curl -sS https://getcomposer.org/installer | php
|
||||
sudo mv composer.phar /usr/local/bin/composer
|
||||
|
||||
# Install Node.js and npm
|
||||
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
|
||||
# Install Git
|
||||
sudo apt install git -y
|
||||
|
||||
# Install MySQL
|
||||
sudo apt install mysql-server -y
|
||||
|
||||
# Install additional tools
|
||||
sudo apt install unzip curl wget htop ufw fail2ban -y
|
||||
```
|
||||
|
||||
### 3. Configure MySQL
|
||||
```bash
|
||||
# Secure MySQL installation
|
||||
sudo mysql_secure_installation
|
||||
|
||||
# Create database and user
|
||||
sudo mysql -u root -p
|
||||
```
|
||||
|
||||
In MySQL console:
|
||||
```sql
|
||||
CREATE DATABASE bikeservice_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
CREATE USER 'bikeservice_user'@'localhost' IDENTIFIED BY 'your_secure_password';
|
||||
GRANT ALL PRIVILEGES ON bikeservice_db.* TO 'bikeservice_user'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EXIT;
|
||||
```
|
||||
|
||||
### 4. Configure PHP
|
||||
```bash
|
||||
# Edit PHP configuration
|
||||
sudo nano /etc/php/8.2/apache2/php.ini
|
||||
|
||||
# Set these values:
|
||||
# memory_limit = 256M
|
||||
# upload_max_filesize = 64M
|
||||
# post_max_size = 64M
|
||||
# max_execution_time = 300
|
||||
# opcache.enable = 1
|
||||
# opcache.memory_consumption = 128
|
||||
# opcache.max_accelerated_files = 4000
|
||||
|
||||
# Restart Apache
|
||||
sudo systemctl restart apache2
|
||||
sudo systemctl enable apache2
|
||||
```
|
||||
|
||||
### 5. Enable Apache Modules
|
||||
```bash
|
||||
sudo a2enmod rewrite
|
||||
sudo a2enmod ssl
|
||||
sudo a2enmod headers
|
||||
sudo a2enmod deflate
|
||||
sudo a2enmod expires
|
||||
sudo systemctl restart apache2
|
||||
```
|
||||
|
||||
## Application Deployment
|
||||
|
||||
### 1. Create Application Directory
|
||||
```bash
|
||||
sudo mkdir -p /var/www/bikeservice
|
||||
sudo chown -R $USER:$USER /var/www/bikeservice
|
||||
cd /var/www/bikeservice
|
||||
```
|
||||
|
||||
### 2. Clone Your Repository
|
||||
```bash
|
||||
git clone <your-repository-url> .
|
||||
# Or upload your files via SCP/SFTP
|
||||
```
|
||||
|
||||
### 3. Backend Setup (Laravel)
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# Install dependencies
|
||||
composer install --no-dev --optimize-autoloader
|
||||
|
||||
# Set permissions
|
||||
sudo chown -R www-data:www-data storage bootstrap/cache
|
||||
sudo chmod -R 775 storage bootstrap/cache
|
||||
|
||||
# Create .env file
|
||||
cp .env.example .env
|
||||
|
||||
# Generate application key
|
||||
php artisan key:generate
|
||||
|
||||
# Configure database in .env file
|
||||
# DB_CONNECTION=mysql
|
||||
# DB_HOST=127.0.0.1
|
||||
# DB_PORT=3306
|
||||
# DB_DATABASE=bikeservice_db
|
||||
# DB_USERNAME=bikeservice_user
|
||||
# DB_PASSWORD=your_secure_password
|
||||
|
||||
# Run migrations
|
||||
php artisan migrate --force
|
||||
|
||||
# Clear and cache config
|
||||
php artisan config:cache
|
||||
php artisan route:cache
|
||||
php artisan view:cache
|
||||
|
||||
# Set production environment
|
||||
echo "APP_ENV=production" >> .env
|
||||
echo "APP_DEBUG=false" >> .env
|
||||
```
|
||||
|
||||
### 4. Frontend Setup (Vue.js)
|
||||
```bash
|
||||
cd ../frontend
|
||||
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Build for production
|
||||
npm run build
|
||||
|
||||
# Copy built files to Laravel public directory
|
||||
cp -r dist/* ../backend/public/
|
||||
```
|
||||
|
||||
## Apache Configuration
|
||||
|
||||
### 1. Create Apache Virtual Host
|
||||
```bash
|
||||
sudo nano /etc/apache2/sites-available/bikeservice.conf
|
||||
```
|
||||
|
||||
Add this configuration:
|
||||
```apache
|
||||
<VirtualHost *:80>
|
||||
ServerName your-domain.com
|
||||
ServerAlias www.your-domain.com
|
||||
DocumentRoot /var/www/bikeservice/backend/public
|
||||
|
||||
<Directory /var/www/bikeservice/backend/public>
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
# Security headers
|
||||
Header always set X-Frame-Options "SAMEORIGIN"
|
||||
Header always set X-XSS-Protection "1; mode=block"
|
||||
Header always set X-Content-Type-Options "nosniff"
|
||||
Header always set Referrer-Policy "no-referrer-when-downgrade"
|
||||
|
||||
# Gzip compression
|
||||
LoadModule deflate_module modules/mod_deflate.so
|
||||
<Location />
|
||||
SetOutputFilter DEFLATE
|
||||
SetEnvIfNoCase Request_URI \
|
||||
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
|
||||
SetEnvIfNoCase Request_URI \
|
||||
\.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
|
||||
</Location>
|
||||
|
||||
# Cache static assets
|
||||
<LocationMatch "\.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$">
|
||||
ExpiresActive On
|
||||
ExpiresDefault "access plus 1 year"
|
||||
Header append Cache-Control "public, immutable"
|
||||
</LocationMatch>
|
||||
|
||||
# Logging
|
||||
ErrorLog ${APACHE_LOG_DIR}/bikeservice_error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/bikeservice_access.log combined
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
### 2. Enable Site and Restart Apache
|
||||
```bash
|
||||
sudo a2ensite bikeservice.conf
|
||||
sudo a2dissite 000-default.conf
|
||||
sudo apache2ctl configtest
|
||||
sudo systemctl restart apache2
|
||||
```
|
||||
|
||||
## SSL Certificate (Optional but Recommended)
|
||||
|
||||
### 1. Install Certbot
|
||||
```bash
|
||||
sudo apt install certbot python3-certbot-apache -y
|
||||
```
|
||||
|
||||
### 2. Obtain SSL Certificate
|
||||
```bash
|
||||
sudo certbot --apache -d your-domain.com -d www.your-domain.com
|
||||
```
|
||||
|
||||
## Final Configuration
|
||||
|
||||
### 1. Set Proper Permissions
|
||||
```bash
|
||||
sudo chown -R www-data:www-data /var/www/bikeservice
|
||||
sudo chmod -R 755 /var/www/bikeservice
|
||||
sudo chmod -R 775 /var/www/bikeservice/backend/storage
|
||||
sudo chmod -R 775 /var/www/bikeservice/backend/bootstrap/cache
|
||||
```
|
||||
|
||||
### 2. Configure Queue Worker (if using queues)
|
||||
```bash
|
||||
# Create systemd service for queue worker
|
||||
sudo nano /etc/systemd/system/bikeservice-queue.service
|
||||
```
|
||||
|
||||
Add this content:
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Bike Service Queue Worker
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=www-data
|
||||
Group=www-data
|
||||
WorkingDirectory=/var/www/bikeservice/backend
|
||||
ExecStart=/usr/bin/php artisan queue:work --sleep=3 --tries=3 --max-time=3600
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Enable and start the service:
|
||||
```bash
|
||||
sudo systemctl enable bikeservice-queue
|
||||
sudo systemctl start bikeservice-queue
|
||||
```
|
||||
|
||||
### 3. Set up Cron for Laravel Scheduler
|
||||
```bash
|
||||
crontab -e
|
||||
```
|
||||
|
||||
Add this line:
|
||||
```
|
||||
* * * * * cd /var/www/bikeservice/backend && php artisan schedule:run >> /dev/null 2>&1
|
||||
```
|
||||
|
||||
## Deployment Script
|
||||
|
||||
Create a deployment script for future updates:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# deploy-apache.sh
|
||||
|
||||
cd /var/www/bikeservice
|
||||
|
||||
# Pull latest changes
|
||||
git pull origin main
|
||||
|
||||
# Backend deployment
|
||||
cd backend
|
||||
composer install --no-dev --optimize-autoloader
|
||||
php artisan config:cache
|
||||
php artisan route:cache
|
||||
php artisan view:cache
|
||||
|
||||
# Frontend deployment
|
||||
cd ../frontend
|
||||
npm install
|
||||
npm run build
|
||||
cp -r dist/* ../backend/public/
|
||||
|
||||
# Set permissions
|
||||
sudo chown -R www-data:www-data /var/www/bikeservice
|
||||
sudo chmod -R 755 /var/www/bikeservice
|
||||
sudo chmod -R 775 /var/www/bikeservice/backend/storage
|
||||
sudo chmod -R 775 /var/www/bikeservice/backend/bootstrap/cache
|
||||
|
||||
# Restart services
|
||||
sudo systemctl restart apache2
|
||||
|
||||
echo "Deployment completed!"
|
||||
```
|
||||
|
||||
Make it executable:
|
||||
```bash
|
||||
chmod +x deploy-apache.sh
|
||||
```
|
||||
|
||||
## Monitoring and Maintenance
|
||||
|
||||
### 1. Check Application Status
|
||||
```bash
|
||||
# Check Apache status
|
||||
sudo systemctl status apache2
|
||||
|
||||
# Check MySQL status
|
||||
sudo systemctl status mysql
|
||||
|
||||
# Check queue worker status
|
||||
sudo systemctl status bikeservice-queue
|
||||
|
||||
# Check Laravel logs
|
||||
tail -f /var/www/bikeservice/backend/storage/logs/laravel.log
|
||||
```
|
||||
|
||||
### 2. Regular Maintenance
|
||||
```bash
|
||||
# Update system packages
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# Clear Laravel caches
|
||||
cd /var/www/bikeservice/backend
|
||||
php artisan cache:clear
|
||||
php artisan config:clear
|
||||
php artisan route:clear
|
||||
php artisan view:clear
|
||||
|
||||
# Rebuild caches
|
||||
php artisan config:cache
|
||||
php artisan route:cache
|
||||
php artisan view:cache
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues:
|
||||
1. **Permission denied errors**: Check file ownership and permissions
|
||||
2. **500 Internal Server Error**: Check Apache error logs and Laravel logs
|
||||
3. **Database connection issues**: Verify MySQL configuration in .env
|
||||
4. **Static assets not loading**: Check Apache configuration and file paths
|
||||
5. **URL rewriting not working**: Ensure mod_rewrite is enabled
|
||||
|
||||
### Useful Commands:
|
||||
```bash
|
||||
# Check Apache error logs
|
||||
sudo tail -f /var/log/apache2/error.log
|
||||
|
||||
# Check Apache access logs
|
||||
sudo tail -f /var/log/apache2/access.log
|
||||
|
||||
# Test Apache configuration
|
||||
sudo apache2ctl configtest
|
||||
|
||||
# Restart all services
|
||||
sudo systemctl restart apache2 mysql bikeservice-queue
|
||||
|
||||
# Check MySQL status
|
||||
sudo mysql -u root -p -e "SHOW DATABASES;"
|
||||
|
||||
# Check PHP version and modules
|
||||
php -v
|
||||
php -m
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **Firewall**: Configure UFW firewall
|
||||
2. **SSH**: Use key-based authentication and change default port
|
||||
3. **Database**: Use strong passwords and limit access
|
||||
4. **Updates**: Keep system and packages updated
|
||||
5. **Backups**: Set up regular backups of your application and database
|
||||
6. **Apache Security**: Disable server signature and unnecessary modules
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
1. **OPcache**: Enable PHP OPcache for better performance
|
||||
2. **MySQL**: Optimize MySQL configuration
|
||||
3. **Apache**: Enable compression and caching
|
||||
4. **CDN**: Use a CDN for static assets
|
||||
5. **Monitoring**: Set up application monitoring
|
||||
|
||||
## Apache vs Nginx Differences
|
||||
|
||||
- **Configuration**: Apache uses `.htaccess` files and virtual hosts
|
||||
- **Modules**: Apache modules need to be enabled with `a2enmod`
|
||||
- **Sites**: Apache sites are enabled with `a2ensite`
|
||||
- **Logs**: Apache logs are in `/var/log/apache2/`
|
||||
- **Restart**: Use `sudo systemctl restart apache2`
|
||||
Reference in New Issue
Block a user