authentikate/docs/quick-start/manual-deployment.md
Javier Feliz 821e49288d
Some checks failed
linter / quality (push) Successful in 7m10s
tests / ci (push) Failing after 10m19s
Finally just moved the docs here
2025-08-04 19:12:42 -04:00

517 lines
11 KiB
Markdown

# Manual Deployment
This guide covers manual deployment of AuthentiKate without Docker. This method gives you more control over the server environment but requires more setup steps.
## Prerequisites
- PHP 8.1 or higher with extensions:
- BCMath
- Ctype
- Fileinfo
- JSON
- Mbstring
- OpenSSL
- PDO
- Tokenizer
- XML
- cURL
- GD (optional, for image processing)
- Composer (PHP dependency manager)
- Web server (Apache, Nginx, or similar)
- Database server (MySQL 8.0+, PostgreSQL 13+, or SQLite)
- Git (for cloning the repository)
## Installation Steps
### 1. Clone the Repository
```bash
# Clone from the source repository
git clone https://gitgud.foo/thegrind/authentikate.git
cd authentikate
# Or download and extract the latest release
wget https://gitgud.foo/thegrind/authentikate/-/archive/main/authentikate-main.tar.gz
tar -xzf authentikate-main.tar.gz
cd authentikate-main
```
### 2. Install PHP Dependencies
```bash
# Install Composer dependencies
composer install --optimize-autoloader --no-dev
# For development environments, omit --no-dev
composer install --optimize-autoloader
```
### 3. Environment Configuration
```bash
# Copy the example environment file
cp .env.example .env
# Generate application key
php artisan key:generate
```
Edit the `.env` file with your configuration:
```env
# Application Settings
APP_NAME=AuthentiKate
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com
APP_TIMEZONE=UTC
# Database Configuration (choose one)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=authentikate
DB_USERNAME=your-username
DB_PASSWORD=your-password
# Mail Configuration
MAIL_MAILER=smtp
MAIL_HOST=your-smtp-server.com
MAIL_PORT=587
MAIL_USERNAME=your-email@domain.com
MAIL_PASSWORD=your-email-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@your-domain.com
MAIL_FROM_NAME="AuthentiKate"
# Session Configuration
SESSION_DRIVER=file
SESSION_LIFETIME=120
# Cache Configuration
CACHE_DRIVER=file
```
### 4. Database Setup
Create a database for AuthentiKate:
::: code-group
```sql [MySQL]
CREATE DATABASE authentikate CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'authentikate'@'localhost' IDENTIFIED BY 'your-secure-password';
GRANT ALL PRIVILEGES ON authentikate.* TO 'authentikate'@'localhost';
FLUSH PRIVILEGES;
```
```sql [PostgreSQL]
CREATE DATABASE authentikate;
CREATE USER authentikate WITH PASSWORD 'your-secure-password';
GRANT ALL PRIVILEGES ON DATABASE authentikate TO authentikate;
```
```bash [SQLite]
# Create SQLite database file
touch database/database.sqlite
```
:::
Run database migrations:
```bash
# Run migrations
php artisan migrate --force
# Seed initial data (if available)
php artisan db:seed --force
```
### 5. Set Directory Permissions
```bash
# Set proper permissions for storage and cache directories
chmod -R 775 storage
chmod -R 775 bootstrap/cache
# Change ownership to web server user (adjust as needed)
chown -R www-data:www-data storage
chown -R www-data:www-data bootstrap/cache
# Create symbolic link for public storage
php artisan storage:link
```
### 6. Optimize for Production
```bash
# Cache configuration
php artisan config:cache
# Cache routes
php artisan route:cache
# Cache views
php artisan view:cache
# Optimize Composer autoloader
composer install --optimize-autoloader --no-dev
```
## Web Server Configuration
### Apache Configuration
Create a virtual host configuration:
```apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /path/to/authentikate/public
<Directory /path/to/authentikate/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/authentikate_error.log
CustomLog ${APACHE_LOG_DIR}/authentikate_access.log combined
</VirtualHost>
# SSL Configuration (recommended)
<VirtualHost *:443>
ServerName your-domain.com
DocumentRoot /path/to/authentikate/public
SSLEngine on
SSLCertificateFile /path/to/your/certificate.crt
SSLCertificateKeyFile /path/to/your/private.key
<Directory /path/to/authentikate/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/authentikate_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/authentikate_ssl_access.log combined
</VirtualHost>
```
Enable required Apache modules:
```bash
sudo a2enmod rewrite
sudo a2enmod ssl
sudo systemctl restart apache2
```
### Nginx Configuration
Create an Nginx server block:
```nginx
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
root /path/to/authentikate/public;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
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.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
```
### PHP-FPM Configuration
Optimize PHP-FPM for production:
```ini
; /etc/php/8.1/fpm/pool.d/authentikate.conf
[authentikate]
user = www-data
group = www-data
listen = /var/run/php/php8.1-fpm-authentikate.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
```
## Process Management
### Systemd Service (Optional)
Create a systemd service for queue workers (if using queues):
```ini
# /etc/systemd/system/authentikate-worker.service
[Unit]
Description=AuthentiKate Queue Worker
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /path/to/authentikate/artisan queue:work --sleep=3 --tries=3 --max-time=3600
WorkingDirectory=/path/to/authentikate
[Install]
WantedBy=multi-user.target
```
Enable and start the service:
```bash
sudo systemctl enable authentikate-worker
sudo systemctl start authentikate-worker
```
### Cron Jobs
Set up Laravel's task scheduler:
```bash
# Add to crontab (crontab -e)
* * * * * cd /path/to/authentikate && php artisan schedule:run >> /dev/null 2>&1
```
## Performance Optimization
### OPcache Configuration
Add to your PHP configuration:
```ini
; php.ini
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
```
### Redis Configuration (Optional)
For better performance, use Redis for caching and sessions:
```bash
# Install Redis
sudo apt install redis-server
# Install PHP Redis extension
sudo apt install php8.1-redis
```
Update your `.env` file:
```env
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
```
## Security Considerations
### File Permissions
```bash
# Set restrictive permissions
find /path/to/authentikate -type f -exec chmod 644 {} \;
find /path/to/authentikate -type d -exec chmod 755 {} \;
# Make artisan executable
chmod +x /path/to/authentikate/artisan
# Secure sensitive files
chmod 600 /path/to/authentikate/.env
```
### Environment Security
- Keep `.env` file outside web root or protect it via web server configuration
- Use strong, unique passwords for database and application key
- Enable HTTPS with valid SSL certificates
- Configure proper firewall rules
- Regularly update PHP, web server, and dependencies
## Backup Strategy
### Database Backup
```bash
#!/bin/bash
# backup-database.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/authentikate"
# MySQL
mysqldump -u authentikate -p authentikate > "$BACKUP_DIR/authentikate_$DATE.sql"
# PostgreSQL
pg_dump -U authentikate authentikate > "$BACKUP_DIR/authentikate_$DATE.sql"
# Compress backup
gzip "$BACKUP_DIR/authentikate_$DATE.sql"
```
### Application Backup
```bash
#!/bin/bash
# backup-app.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/authentikate"
APP_DIR="/path/to/authentikate"
# Backup storage directory
tar -czf "$BACKUP_DIR/storage_$DATE.tar.gz" -C "$APP_DIR" storage
# Backup environment file
cp "$APP_DIR/.env" "$BACKUP_DIR/env_$DATE.backup"
```
## Updates and Maintenance
### Application Updates
```bash
# Backup before updating
./backup-database.sh
./backup-app.sh
# Pull latest code
git pull origin main
# Update dependencies
composer install --optimize-autoloader --no-dev
# Run migrations
php artisan migrate --force
# Clear caches
php artisan config:clear
php artisan cache:clear
php artisan view:clear
# Rebuild caches
php artisan config:cache
php artisan route:cache
php artisan view:cache
```
### Log Rotation
Configure log rotation to prevent disk space issues:
```bash
# /etc/logrotate.d/authentikate
/path/to/authentikate/storage/logs/*.log {
daily
missingok
rotate 52
compress
notifempty
create 644 www-data www-data
copytruncate
}
```
## Troubleshooting
### Common Issues
1. **Permission Denied Errors**
```bash
sudo chown -R www-data:www-data /path/to/authentikate/storage
sudo chown -R www-data:www-data /path/to/authentikate/bootstrap/cache
```
2. **Database Connection Issues**
- Verify database credentials in `.env`
- Check database server is running
- Ensure user has proper permissions
3. **Internal Server Error (500)**
- Check web server error logs
- Verify PHP extensions are installed
- Check Laravel logs in `storage/logs/`
4. **Composer Issues**
```bash
# Clear Composer cache
composer clear-cache
# Update Composer
composer self-update
```
### Log Files
Monitor these log files for issues:
- Laravel logs: `/path/to/authentikate/storage/logs/laravel.log`
- Web server logs: `/var/log/apache2/` or `/var/log/nginx/`
- PHP-FPM logs: `/var/log/php8.1-fpm.log`
- System logs: `/var/log/syslog`
## Next Steps
After successful deployment:
1. Access your AuthentiKate installation at your configured domain
2. Complete the initial setup wizard
3. Configure your first OIDC clients
4. Set up user authentication providers
5. Review security settings and SSL configuration
For detailed configuration and usage instructions, see the [User Guide](/user-guide/).