Files
timebank-cc-public/references/SETUP_GUIDE.md
Ronald Huynen 2547717edb Initial commit
2026-03-23 21:37:59 +01:00

1279 lines
30 KiB
Markdown

# Timebank.cc - Complete Debian Linux Server Setup Guide
This guide provides step-by-step instructions for setting up the Timebank.cc application on a Debian-based Linux server, including all external services and dependencies.
---
## **PART 1: SYSTEM PREPARATION**
### System Updates & Essential Packages
```bash
# Update system packages
sudo apt update && sudo apt upgrade -y
# Install essential build tools and utilities
sudo apt install -y curl wget git unzip software-properties-common \
apt-transport-https ca-certificates gnupg lsb-release \
build-essential supervisor ufw
```
### User Account Setup
```bash
# Create application user (optional, for security)
sudo adduser timebank
sudo usermod -aG www-data timebank
sudo usermod -aG sudo timebank # Only if needed for deployment
```
---
## **PART 2: PHP INSTALLATION & CONFIGURATION**
### PHP 8.3+ Installation with All Required Extensions
```bash
# Add PHP repository (if needed for latest versions)
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Install PHP 8.3 and required extensions
sudo apt install -y \
php8.3-fpm php8.3-cli php8.3-common \
php8.3-mysql \
php8.3-redis \
php8.3-gd php8.3-imagick \
php8.3-mbstring php8.3-xml php8.3-zip \
php8.3-bcmath php8.3-intl \
php8.3-curl \
php8.3-imap
# Verify PHP installation
php -v
php -m | grep -E "(redis|mysql|gd|bcmath|intl)"
```
### PHP-FPM Configuration
```bash
# Edit PHP-FPM configuration
sudo nano /etc/php/8.3/fpm/php.ini
```
Key settings to update:
```ini
# Memory and execution limits
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
post_max_size = 64M
upload_max_filesize = 12M
# OPcache (Production optimization)
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.validate_timestamps=1
# Note: For maximum performance in production, set opcache.validate_timestamps=0
# This requires manual cache clearing after code updates: php artisan opcache:clear
```
```bash
# Restart PHP-FPM
sudo systemctl restart php8.3-fpm
sudo systemctl enable php8.3-fpm
```
---
## **PART 3: DATABASE SETUP (MySQL 8.0+)**
### MySQL Server Installation
```bash
# Install MySQL 8.0+
sudo apt install -y mysql-server mysql-client
# Secure MySQL installation
sudo mysql_secure_installation
```
### UTF8MB4 Configuration & Performance Tuning
```bash
# Edit MySQL configuration
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
```
Add/update these settings:
```ini
[mysqld]
# Character set configuration
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# Performance settings
max_allowed_packet = 64M
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
# Window functions support (verify MySQL 8.0+)
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
```
### Database User & Permissions Setup
```bash
# Login to MySQL as root
sudo mysql
# Create database
CREATE DATABASE timebank_cc CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Create application user with transaction immutability enforcement
CREATE USER 'timebank_user'@'localhost' IDENTIFIED BY 'secure_password_here';
# Grant full privileges on all tables
GRANT SELECT, INSERT, UPDATE, DELETE ON timebank_cc.* TO 'timebank_user'@'localhost';
# Restrict transactions table to enforce immutability (no UPDATE or DELETE)
REVOKE UPDATE, DELETE ON timebank_cc.transactions FROM 'timebank_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
```bash
# Restart MySQL
sudo systemctl restart mysql
sudo systemctl enable mysql
# Verify window functions support (MySQL 8.0+ feature)
mysql -u timebank_user -p -e "SELECT VERSION(); SHOW VARIABLES LIKE 'sql_mode';"
```
---
## **PART 4: REDIS CACHE & SESSION STORAGE**
### Redis Server Installation
```bash
# Install Redis from official repository
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install -y redis-server
```
### Redis Configuration for Cache/Sessions/Queues
```bash
# Edit Redis configuration
sudo nano /etc/redis/redis.conf
```
Key settings:
```ini
# Memory management
maxmemory 512mb
maxmemory-policy allkeys-lru
# Persistence (for sessions and queues)
save 900 1
save 300 10
save 60 10000
# Security
bind 127.0.0.1 ::1
protected-mode yes
requirepass your_redis_password_here
# Multiple databases for different purposes
databases 16
```
```bash
# Restart and enable Redis
sudo systemctl restart redis-server
sudo systemctl enable redis-server
# Test Redis connection
redis-cli ping
```
---
## **PART 5: ELASTICSEARCH SEARCH SERVICE**
### Elasticsearch Installation (7.x/8.x)
```bash
# Import Elasticsearch signing key
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# Add Elasticsearch repository
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install -y elasticsearch
```
### JVM Memory Configuration & Multi-language Setup
```bash
# Configure JVM memory (minimum 2GB for production)
sudo nano /etc/elasticsearch/jvm.options.d/heap.options
```
```ini
# Set heap size (50% of available RAM, min 2GB)
-Xms2g
-Xmx2g
```
```bash
# Configure Elasticsearch
sudo nano /etc/elasticsearch/elasticsearch.yml
```
```yaml
# Basic configuration
cluster.name: timebank-search
node.name: timebank-node-1
network.host: localhost
http.port: 9200
# Security (for production)
xpack.security.enabled: false # Set to true for production with proper auth
# Memory and performance
bootstrap.memory_lock: true
```
```bash
# Enable memory locking
sudo nano /etc/systemd/system/elasticsearch.service.d/override.conf
```
```ini
[Service]
LimitMEMLOCK=infinity
```
```bash
# Start and enable Elasticsearch
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
# Verify Elasticsearch is running
curl -X GET "localhost:9200/"
```
---
## **PART 6A: WEB SERVER - NGINX OPTION**
### Nginx Installation & Configuration
```bash
# Install Nginx
sudo apt install -y nginx
# Remove default configuration
sudo rm /etc/nginx/sites-enabled/default
```
### Create Timebank.cc Site Configuration
```bash
# Create new site configuration
sudo nano /etc/nginx/sites-available/timebank.cc
```
```nginx
server {
listen 80;
listen [::]:80;
server_name your-domain.com www.your-domain.com;
root /var/www/timebank.cc/public;
index index.php index.html;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Handle Laravel routes
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP processing
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
# WebSocket proxy for Laravel Reverb (port 8080)
location /reverb/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Static assets optimization
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Security: deny access to sensitive files
location ~ /\. {
deny all;
}
}
```
### SSL Configuration (Production)
```bash
# Install Certbot for Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
# Enable site and restart Nginx
sudo ln -s /etc/nginx/sites-available/timebank.cc /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginx
# Generate SSL certificate (replace with your domain)
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
```
---
## **PART 6B: WEB SERVER - APACHE2 OPTION**
### Apache2 Installation & Modules
```bash
# Install Apache2 and required modules
sudo apt install -y apache2 libapache2-mod-php8.3
# Enable required modules
sudo a2enmod rewrite ssl headers proxy proxy_http proxy_wstunnel
sudo systemctl restart apache2
```
### Create Timebank.cc Virtual Host
```bash
# Create new virtual host
sudo nano /etc/apache2/sites-available/timebank.cc.conf
```
```apache
<VirtualHost *:80>
ServerName your-domain.com
ServerAlias www.your-domain.com
DocumentRoot /var/www/timebank.cc/public
<Directory /var/www/timebank.cc/public>
AllowOverride All
Require all granted
</Directory>
# Security headers
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
# WebSocket proxy for Laravel Reverb
ProxyPass /reverb/ ws://127.0.0.1:8080/
ProxyPassReverse /reverb/ ws://127.0.0.1:8080/
ErrorLog ${APACHE_LOG_DIR}/timebank_error.log
CustomLog ${APACHE_LOG_DIR}/timebank_access.log combined
</VirtualHost>
# SSL Virtual Host (add after SSL certificate generation)
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName your-domain.com
ServerAlias www.your-domain.com
DocumentRoot /var/www/timebank.cc/public
SSLEngine on
SSLCertificateFile /path/to/certificate.crt
SSLCertificateKeyFile /path/to/private.key
<Directory /var/www/timebank.cc/public>
AllowOverride All
Require all granted
</Directory>
# Same configuration as HTTP virtual host
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
ProxyPass /reverb/ ws://127.0.0.1:8080/
ProxyPassReverse /reverb/ ws://127.0.0.1:8080/
</VirtualHost>
</IfModule>
```
```bash
# Enable site and restart Apache
sudo a2ensite timebank.cc.conf
sudo a2dissite 000-default.conf
sudo systemctl restart apache2
sudo systemctl enable apache2
# Generate SSL certificate
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d your-domain.com -d www.your-domain.com
```
---
## **PART 7: FRONTEND BUILD ENVIRONMENT**
### Node.js 16+ LTS Installation
```bash
# Install Node.js from NodeSource repository
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# Verify installation
node --version
npm --version
# Update npm to latest version
sudo npm install -g npm@latest
```
### Build Tools Setup
```bash
# Install global build tools (optional)
sudo npm install -g yarn
# Set npm registry (optional, for faster installs)
npm config set registry https://registry.npmjs.org/
```
---
## **PART 8: LARAVEL APPLICATION DEPLOYMENT**
### Composer Installation
```bash
# Install Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
# Verify Composer
composer --version
```
### Project Clone & File Permissions
```bash
# Create web directory
sudo mkdir -p /var/www/timebank.cc
sudo chown -R www-data:www-data /var/www/timebank.cc
# Clone project (replace with your repository)
cd /var/www
sudo git clone https://github.com/your-repo/timebank.cc.git
sudo chown -R www-data:www-data timebank.cc
# Set proper permissions
sudo find /var/www/timebank.cc -type f -exec chmod 644 {} \;
sudo find /var/www/timebank.cc -type d -exec chmod 755 {} \;
sudo chmod -R 775 /var/www/timebank.cc/storage
sudo chmod -R 775 /var/www/timebank.cc/bootstrap/cache
```
### Environment Configuration (.env)
```bash
# Copy environment file
cd /var/www/timebank.cc
sudo cp .env.example .env
sudo nano .env
```
Configure the following key settings:
```env
APP_NAME="Timebank.cc"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com
# Theme Configuration
TIMEBANK_THEME=timebank_cc # Options: timebank_cc, uuro, vegetable, yellow
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=timebank_cc
DB_USERNAME=timebank_user
DB_PASSWORD=secure_password_here
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=your_redis_password_here
REDIS_PORT=6379
REDIS_CACHE_DB=1
ELASTICSEARCH_HOST=localhost:9200
SCOUT_DRIVER=matchish-elasticsearch
BROADCAST_DRIVER=reverb
PUSHER_APP_ID=timebank-app
PUSHER_APP_KEY=timebank-key
PUSHER_APP_SECRET=timebank-secret
PUSHER_HOST=your-domain.com
PUSHER_PORT=8080
PUSHER_SCHEME=https
MAIL_MAILER=smtp
MAIL_HOST=your-smtp-host
MAIL_PORT=587
MAIL_USERNAME=your-username
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@your-domain.com
```
### Dependencies Installation
```bash
# Install PHP dependencies
cd /var/www/timebank.cc
# For production (recommended)
sudo -u www-data composer install --optimize-autoloader --no-dev
# For development (includes testing tools and Faker for test data generation)
# sudo -u www-data composer install --optimize-autoloader
# Generate application key
sudo -u www-data php artisan key:generate
# Create symbolic link for storage
sudo -u www-data php artisan storage:link
```
### Database Migration & Seeding
```bash
# Run database migrations
sudo -u www-data php artisan migrate
# Seed database with initial data (required for application setup)
sudo -u www-data php artisan db:seed
# Verify database setup
sudo -u www-data php artisan tinker
# In tinker: User::count(); (should return number of users)
# Exit with: exit
```
### Elasticsearch Indexing
```bash
# Import all models to Elasticsearch
sudo -u www-data php artisan scout:import "App\Models\User"
sudo -u www-data php artisan scout:import "App\Models\Organization"
sudo -u www-data php artisan scout:import "App\Models\Bank"
sudo -u www-data php artisan scout:import "App\Models\Post"
# Verify Elasticsearch indices
curl -X GET "localhost:9200/_cat/indices?v"
```
### Frontend Asset Compilation
```bash
# Install Node.js dependencies
cd /var/www/timebank.cc
sudo -u www-data npm install
# Build production assets
sudo -u www-data npm run build
# Verify assets are compiled
ls -la public/build/
```
---
## **PART 9: PRODUCTION SERVICES & PROCESS MANAGEMENT**
### Supervisor Installation & Configuration
```bash
# Supervisor should already be installed from Part 1
sudo systemctl enable supervisor
sudo systemctl start supervisor
```
### Queue Worker Configuration
```bash
# Create queue worker configuration
sudo nano /etc/supervisor/conf.d/timebank-queue.conf
```
```ini
[program:timebank-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/timebank.cc/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/timebank.cc/storage/logs/worker.log
stopwaitsecs=3600
```
### WebSocket Server (Laravel Reverb) Setup
```bash
# Create Reverb WebSocket server configuration
sudo nano /etc/supervisor/conf.d/timebank-reverb.conf
```
```ini
[program:timebank-reverb]
process_name=%(program_name)s
command=php /var/www/timebank.cc/artisan reverb:start --host=0.0.0.0 --port=8080
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/timebank.cc/storage/logs/reverb.log
```
### Process Monitoring & Auto-restart
```bash
# Update supervisor configuration
sudo supervisorctl reread
sudo supervisorctl update
# Start all processes
sudo supervisorctl start timebank-queue:*
sudo supervisorctl start timebank-reverb:*
# Check process status
sudo supervisorctl status
```
---
## **PART 10: SECURITY & OPTIMIZATION**
### File Permissions & Ownership
```bash
# Set proper ownership
sudo chown -R www-data:www-data /var/www/timebank.cc
# Set secure permissions
sudo find /var/www/timebank.cc -type f -exec chmod 644 {} \;
sudo find /var/www/timebank.cc -type d -exec chmod 755 {} \;
# Storage and cache directories need write permissions
sudo chmod -R 775 /var/www/timebank.cc/storage
sudo chmod -R 775 /var/www/timebank.cc/bootstrap/cache
# Protect sensitive files
sudo chmod 600 /var/www/timebank.cc/.env
```
### Firewall Configuration
```bash
# Enable UFW firewall
sudo ufw --force reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Allow essential services
sudo ufw allow ssh
sudo ufw allow 'Nginx Full' # or 'Apache Full' if using Apache
sudo ufw allow 8080/tcp # WebSocket server
# Enable firewall
sudo ufw --force enable
sudo ufw status
```
### SSL Certificate Setup (if not done in web server section)
```bash
# Let's Encrypt certificate (already covered in web server sections)
# Verify auto-renewal
sudo certbot renew --dry-run
```
### Production Optimizations
```bash
# Laravel optimizations
cd /var/www/timebank.cc
sudo -u www-data php artisan config:cache
sudo -u www-data php artisan route:cache
sudo -u www-data php artisan view:cache
# Create optimization script for regular maintenance
sudo nano /usr/local/bin/timebank-optimize
```
```bash
#!/bin/bash
cd /var/www/timebank.cc
sudo -u www-data php artisan config:cache
sudo -u www-data php artisan route:cache
sudo -u www-data php artisan view:cache
sudo -u www-data php artisan queue:restart
echo "Timebank.cc optimization complete"
```
```bash
sudo chmod +x /usr/local/bin/timebank-optimize
```
---
## **PART 11: SERVICE MANAGEMENT & HEALTH CHECKS**
### Systemd Service Files (Alternative to Supervisor)
If you prefer systemd over supervisor, create these service files:
```bash
# Queue worker service
sudo nano /etc/systemd/system/timebank-queue.service
```
```ini
[Unit]
Description=Timebank.cc Queue Worker
After=redis-server.service mysql.service
[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/timebank.cc/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
```bash
# WebSocket service
sudo nano /etc/systemd/system/timebank-reverb.service
```
```ini
[Unit]
Description=Timebank.cc WebSocket Server
After=redis-server.service
[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/timebank.cc/artisan reverb:start --host=0.0.0.0 --port=8080
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
```bash
# Enable and start services
sudo systemctl daemon-reload
sudo systemctl enable timebank-queue.service
sudo systemctl enable timebank-reverb.service
sudo systemctl start timebank-queue.service
sudo systemctl start timebank-reverb.service
```
### Health Check Commands
Create a health check script:
```bash
sudo nano /usr/local/bin/timebank-health-check
```
```bash
#!/bin/bash
echo "=== Timebank.cc Health Check ==="
echo "Date: $(date)"
echo
# Check web server
echo "1. Web Server:"
if systemctl is-active --quiet nginx; then
echo " ✓ Nginx is running"
elif systemctl is-active --quiet apache2; then
echo " ✓ Apache2 is running"
else
echo " ✗ Web server is not running"
fi
# Check PHP-FPM
echo "2. PHP-FPM:"
if systemctl is-active --quiet php8.3-fpm; then
echo " ✓ PHP-FPM is running"
else
echo " ✗ PHP-FPM is not running"
fi
# Check MySQL
echo "3. MySQL:"
if systemctl is-active --quiet mysql; then
echo " ✓ MySQL is running"
else
echo " ✗ MySQL is not running"
fi
# Check Redis
echo "4. Redis:"
if systemctl is-active --quiet redis-server; then
echo " ✓ Redis is running"
else
echo " ✗ Redis is not running"
fi
# Check Elasticsearch
echo "5. Elasticsearch:"
if curl -s localhost:9200 > /dev/null; then
echo " ✓ Elasticsearch is running"
else
echo " ✗ Elasticsearch is not responding"
fi
# Check Queue Workers
echo "6. Queue Workers:"
if sudo supervisorctl status timebank-queue: | grep -q RUNNING; then
echo " ✓ Queue workers are running"
else
echo " ✗ Queue workers are not running"
fi
# Check WebSocket Server
echo "7. WebSocket Server:"
if sudo supervisorctl status timebank-reverb: | grep -q RUNNING; then
echo " ✓ WebSocket server is running"
else
echo " ✗ WebSocket server is not running"
fi
# Check Laravel application
echo "8. Laravel Application:"
cd /var/www/timebank.cc
if sudo -u www-data php artisan inspire > /dev/null 2>&1; then
echo " ✓ Laravel application is accessible"
else
echo " ✗ Laravel application has issues"
fi
echo
echo "=== End Health Check ==="
```
```bash
sudo chmod +x /usr/local/bin/timebank-health-check
# Run health check
timebank-health-check
```
### Monitoring & Log Management
```bash
# View application logs
sudo tail -f /var/www/timebank.cc/storage/logs/laravel.log
# View queue worker logs
sudo tail -f /var/www/timebank.cc/storage/logs/worker.log
# View WebSocket server logs
sudo tail -f /var/www/timebank.cc/storage/logs/reverb.log
# View web server logs (Nginx)
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
# View web server logs (Apache)
sudo tail -f /var/log/apache2/timebank_access.log
sudo tail -f /var/log/apache2/timebank_error.log
```
### Common Troubleshooting
#### Issue: Queue workers not processing jobs
```bash
# Restart queue workers
sudo supervisorctl restart timebank-queue:*
# Check queue status
cd /var/www/timebank.cc
sudo -u www-data php artisan queue:work --once --verbose
```
#### Issue: WebSocket connection failures
```bash
# Check if port 8080 is open
sudo netstat -tulpn | grep :8080
# Restart WebSocket server
sudo supervisorctl restart timebank-reverb:*
# Check WebSocket logs
sudo tail -f /var/www/timebank.cc/storage/logs/reverb.log
```
#### Issue: Elasticsearch not responding
```bash
# Check Elasticsearch status
sudo systemctl status elasticsearch
# Check Elasticsearch logs
sudo journalctl -u elasticsearch -f
# Restart Elasticsearch
sudo systemctl restart elasticsearch
```
#### Issue: Permission errors
```bash
# Fix Laravel permissions
sudo chown -R www-data:www-data /var/www/timebank.cc
sudo chmod -R 775 /var/www/timebank.cc/storage
sudo chmod -R 775 /var/www/timebank.cc/bootstrap/cache
```
---
## **PART 8: APPLICATION DEPLOYMENT**
After completing the server setup, you need to deploy your Laravel application. Choose between automated deployment using the provided script or manual deployment.
### Option A: Automated Deployment Using Deploy Script
The repository includes a comprehensive deployment script that handles the entire deployment process automatically.
#### Deploy Script Features
- Environment auto-detection (local vs. server)
- Git pull with conflict resolution
- Dependency installation (Composer + NPM)
- Database migrations with automatic backup
- Cache clearing and optimization
- Elasticsearch re-indexing
- Asset compilation (development or production mode)
- Permissions management
- Deployment status reporting
#### Using the Deploy Script
```bash
# Navigate to your application directory
cd /var/www/timebank.cc
# Make the deploy script executable
chmod +x deploy.sh
# Run deployment with default settings
./deploy.sh
# Deployment options:
./deploy.sh -m # Skip migrations
./deploy.sh -n # Skip NPM build
./deploy.sh -d # Force development build (even on production)
./deploy.sh -e server # Force server environment
./deploy.sh -e local # Force local environment
# Combined options example:
./deploy.sh -n -e server # Server deployment, skip NPM
```
#### Deploy Script Environment Detection
The script automatically detects the environment:
- **Server Environment**: Detected when hostname contains "dev", "prod", or "timebank"
- **Local Environment**: Default for other hostnames
#### What the Deploy Script Does
1. **Pre-deployment Checks**
- Checks for uncommitted changes
- Prompts for confirmation if changes exist
2. **Code Updates**
- Pulls latest code from main branch
- Handles merge conflicts with user interaction
- Options to stash, discard, or cancel on conflicts
3. **Dependencies**
- Runs `composer install` with production optimizations
- Installs NPM dependencies
- Builds assets (dev or production mode)
4. **Database & Search**
- Creates database backup before migrations
- Runs Laravel migrations
- Links storage directories
- Re-indexes Elasticsearch using `re-index-search.sh`
5. **Optimization**
- Clears Laravel caches
- Sets proper file permissions
- Optimizes autoloader
6. **Post-deployment**
- Reports deployment status
- Shows environment information
- Displays helpful URLs and versions
### Option B: Manual Deployment Process
If you prefer manual control or need to customize the deployment process:
#### Step 1: Code Deployment
```bash
# Navigate to application directory
cd /var/www/timebank.cc
# Pull latest code
git pull origin main
# Handle any merge conflicts if they occur
# git stash # if you need to stash local changes
# git pull origin main
```
#### Step 2: Backend Dependencies
```bash
# Install/update PHP dependencies
composer install --no-interaction --prefer-dist --optimize-autoloader
# Clear Laravel caches
php artisan optimize:clear
```
#### Step 3: Database Operations
```bash
# Create database backup (recommended)
DB_NAME=$(php artisan tinker --execute="echo config('database.connections.mysql.database');" | grep -v ">>>")
DB_USER=$(php artisan tinker --execute="echo config('database.connections.mysql.username');" | grep -v ">>>")
DB_PASS=$(php artisan tinker --execute="echo config('database.connections.mysql.password');" | grep -v ">>>")
# Create backup
mkdir -p storage/backups
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "storage/backups/db-backup-$(date +'%Y-%m-%d-%H%M%S').sql"
# Run migrations
php artisan migrate
# Link storage (if not already linked)
php artisan storage:link
```
#### Step 4: Search Index Management
```bash
# Re-index Elasticsearch (this is resource intensive)
bash re-index-search.sh
# Alternative: Re-index specific models
# php artisan scout:flush "App\Models\User"
# php artisan scout:import "App\Models\User"
# php artisan scout:flush "App\Models\Post"
# php artisan scout:import "App\Models\Post"
# php artisan scout:flush "App\Models\Organization"
# php artisan scout:import "App\Models\Organization"
# php artisan scout:flush "App\Models\Bank"
# php artisan scout:import "App\Models\Bank"
```
#### Step 5: Frontend Assets
```bash
# Install/update NPM dependencies
npm install
# Build assets for production
npm run build
# Alternative: Development build (starts dev server)
# npm run dev
```
#### Step 6: Permissions & Services
```bash
# Set proper permissions
sudo chown -R www-data:www-data storage bootstrap/cache public/storage public/build
sudo chmod -R 775 storage bootstrap/cache public/build
# Restart services to pick up changes
sudo supervisorctl restart timebank-queue:*
sudo supervisorctl restart timebank-reverb:*
# Restart web server (choose one)
sudo systemctl restart nginx
# sudo systemctl restart apache2
# Restart PHP-FPM
sudo systemctl restart php8.3-fpm
```
### Deployment Verification
After either deployment method, verify the deployment:
```bash
# Check Laravel application status
php artisan inspire # Should work without errors
# Check database connectivity
php artisan tinker
# In tinker: \App\Models\User::count()
# Verify search functionality
curl -X GET "localhost:9200/_cat/indices?v" # Should show search indices
# Check queue functionality
php artisan queue:work --once --verbose
# Test web server response
curl -I http://localhost # Should return 200 OK
```
### Post-Deployment Tasks
1. **Update Environment Variables**: Check `.env` file for any new configuration options
2. **SSL Certificate**: Ensure SSL certificates are up to date for production
3. **Monitor Logs**: Check application logs for any errors after deployment
4. **Performance**: Monitor system resources after deployment
5. **Backup**: Ensure regular backup schedules are in place
### Troubleshooting Deployment Issues
#### Common Deployment Problems
**Permission Errors:**
```bash
sudo chown -R www-data:www-data /var/www/timebank.cc
sudo chmod -R 775 /var/www/timebank.cc/storage
sudo chmod -R 775 /var/www/timebank.cc/bootstrap/cache
```
**Composer Memory Issues:**
```bash
php -d memory_limit=2G /usr/local/bin/composer install
```
**NPM Build Failures:**
```bash
rm -rf node_modules package-lock.json
npm cache clean --force
npm install
npm run build
```
**Elasticsearch Index Issues:**
```bash
# Check Elasticsearch health
curl localhost:9200/_cluster/health?pretty
# Clear and rebuild indices
bash re-index-search.sh
```
**Queue Worker Not Processing:**
```bash
sudo supervisorctl restart timebank-queue:*
php artisan queue:restart
```
---
## **FINAL VERIFICATION CHECKLIST**
After completing the setup, verify everything is working:
- [ ] Web server responds to HTTP/HTTPS requests
- [ ] PHP processes Laravel requests correctly
- [ ] Database connections work (test login)
- [ ] Redis caching is functional
- [ ] Elasticsearch search returns results
- [ ] Queue workers process background jobs
- [ ] WebSocket server handles real-time connections
- [ ] SSL certificates are valid and auto-renewing
- [ ] All services start automatically on boot
- [ ] Health check script runs without errors
- [ ] File permissions are secure
- [ ] Firewall rules are properly configured
## **REFERENCE DOCUMENTS**
This setup guide references the following documentation:
### Core Documentation
- `EXTERNAL_SERVICES_REQUIREMENTS.md` - Complete service specifications
- `CLAUDE.md` - Development commands and architecture details
- `SECURITY_OVERVIEW.md` - Security best practices
- `.env.example` - Environment configuration template
### Essential Setup Guides
- `references/BOUNCE_SETUP.md` - **Required**: Email bounce handling system setup for production environments
- `references/BRANDING_CUSTOMIZATION.md` - Complete guide for creating branded instances with custom themes, platform configurations, and content pages
### Additional References
The `references/` folder contains extensive documentation for various aspects of the application. Consult these guides for detailed information on customization, development patterns, and advanced features
---
**Setup Complete!** Your Timebank.cc application should now be fully functional on Debian Linux with all external services properly configured.