- Created laravel-paths.php to override storage path - Patched bootstrap/app.php to load custom paths - Removed symlink approach as /app/code is read-only - Laravel will now use /app/data/storage directly
151 lines
4.3 KiB
Bash
151 lines
4.3 KiB
Bash
#!/bin/bash
|
|
set -eu
|
|
|
|
echo "==> Starting AnonAddy initialization"
|
|
|
|
# Initialize /app/data if empty
|
|
if [ ! -d "/app/data/storage" ]; then
|
|
echo "==> Initializing /app/data from /tmp/data"
|
|
cp -r /tmp/data/* /app/data/
|
|
chown -R cloudron:cloudron /app/data
|
|
fi
|
|
|
|
# Ensure proper permissions
|
|
chown -R cloudron:cloudron /app/data
|
|
chmod -R 755 /app/data/storage
|
|
|
|
# Create .env file in /app/data
|
|
echo "==> Configuring application environment"
|
|
cat > /app/data/.env <<EOF
|
|
APP_NAME="AnonAddy"
|
|
APP_ENV=production
|
|
APP_DEBUG=false
|
|
APP_URL=${CLOUDRON_APP_ORIGIN}
|
|
|
|
# Database Configuration
|
|
DB_CONNECTION=mysql
|
|
DB_HOST=${CLOUDRON_MYSQL_HOST}
|
|
DB_PORT=${CLOUDRON_MYSQL_PORT}
|
|
DB_DATABASE=${CLOUDRON_MYSQL_DATABASE}
|
|
DB_USERNAME=${CLOUDRON_MYSQL_USERNAME}
|
|
DB_PASSWORD=${CLOUDRON_MYSQL_PASSWORD}
|
|
|
|
# Redis Configuration
|
|
REDIS_HOST=${CLOUDRON_REDIS_HOST}
|
|
REDIS_PASSWORD=${CLOUDRON_REDIS_PASSWORD}
|
|
REDIS_PORT=${CLOUDRON_REDIS_PORT}
|
|
|
|
# Mail Configuration
|
|
MAIL_MAILER=smtp
|
|
MAIL_HOST=${CLOUDRON_MAIL_SMTP_SERVER}
|
|
MAIL_PORT=${CLOUDRON_MAIL_SMTP_PORT}
|
|
MAIL_USERNAME=${CLOUDRON_MAIL_SMTP_USERNAME}
|
|
MAIL_PASSWORD=${CLOUDRON_MAIL_SMTP_PASSWORD}
|
|
MAIL_ENCRYPTION=tls
|
|
MAIL_FROM_ADDRESS=noreply@${CLOUDRON_APP_DOMAIN}
|
|
MAIL_FROM_NAME="AnonAddy"
|
|
|
|
# AnonAddy Configuration
|
|
ANONADDY_DOMAIN=${CLOUDRON_APP_DOMAIN}
|
|
ANONADDY_HOSTNAME=${CLOUDRON_APP_DOMAIN}
|
|
ANONADDY_SIGNING_KEY_FINGERPRINT=""
|
|
|
|
# Queue Configuration
|
|
QUEUE_CONNECTION=redis
|
|
QUEUE_DRIVER=redis
|
|
|
|
# Session Configuration
|
|
SESSION_DRIVER=redis
|
|
SESSION_LIFETIME=120
|
|
|
|
# Cache Configuration
|
|
CACHE_DRIVER=redis
|
|
|
|
# Log Configuration
|
|
LOG_CHANNEL=stderr
|
|
LOG_LEVEL=info
|
|
|
|
# Security
|
|
BCRYPT_ROUNDS=12
|
|
EOF
|
|
|
|
# Create symlink for .env in /run (writable location)
|
|
ln -sf /app/data/.env /run/.env
|
|
ln -sf /app/data/.env /app/code/.env 2>/dev/null || true
|
|
|
|
# Generate APP_KEY if it doesn't exist
|
|
if [ ! -f "/app/data/app_key" ]; then
|
|
echo "==> Generating application key"
|
|
cd /app/code
|
|
sudo -u cloudron php artisan key:generate --force
|
|
# Save the key to persistent storage
|
|
grep "APP_KEY=" /app/data/.env | cut -d= -f2 > /app/data/app_key
|
|
else
|
|
echo "==> Using existing application key"
|
|
APP_KEY=$(cat /app/data/app_key)
|
|
sed -i "s|APP_KEY=.*|APP_KEY=${APP_KEY}|g" /app/data/.env
|
|
fi
|
|
|
|
# Generate ANONADDY_SECRET if it doesn't exist
|
|
if [ ! -f "/app/data/anonaddy_secret" ]; then
|
|
echo "==> Generating AnonAddy secret"
|
|
ANONADDY_SECRET=$(openssl rand -hex 32)
|
|
echo "$ANONADDY_SECRET" > /app/data/anonaddy_secret
|
|
echo "ANONADDY_SECRET=${ANONADDY_SECRET}" >> /app/data/.env
|
|
else
|
|
echo "==> Using existing AnonAddy secret"
|
|
ANONADDY_SECRET=$(cat /app/data/anonaddy_secret)
|
|
echo "ANONADDY_SECRET=${ANONADDY_SECRET}" >> /app/data/.env
|
|
fi
|
|
|
|
# Set proper ownership
|
|
chown cloudron:cloudron /app/data/.env
|
|
chmod 640 /app/data/.env
|
|
|
|
# Run database migrations
|
|
echo "==> Running database migrations"
|
|
cd /app/code
|
|
sudo -u cloudron php artisan migrate --force
|
|
|
|
# Clear and cache configuration
|
|
echo "==> Optimizing application"
|
|
sudo -u cloudron php artisan config:clear
|
|
sudo -u cloudron php artisan cache:clear
|
|
sudo -u cloudron php artisan view:clear
|
|
sudo -u cloudron php artisan config:cache
|
|
sudo -u cloudron php artisan route:cache
|
|
|
|
# Create default admin user if database is empty
|
|
USER_COUNT=$(sudo -u cloudron php artisan tinker --execute="echo \App\Models\User::count();")
|
|
if [ "$USER_COUNT" -eq "0" ]; then
|
|
echo "==> Creating default admin user"
|
|
sudo -u cloudron php artisan tinker <<TINKER
|
|
\$user = new \App\Models\User();
|
|
\$user->username = 'admin';
|
|
\$user->email = 'admin@example.com';
|
|
\$user->password = bcrypt('password');
|
|
\$user->save();
|
|
echo "Default admin user created: admin@example.com / password";
|
|
TINKER
|
|
echo "==> IMPORTANT: Change the default password after first login!"
|
|
fi
|
|
|
|
# Configure Postfix
|
|
echo "==> Configuring Postfix"
|
|
cp /tmp/postfix-main.cf /etc/postfix/main.cf
|
|
cp /tmp/postfix-master.cf /etc/postfix/master.cf
|
|
|
|
# Update Postfix configuration with domain
|
|
sed -i "s|CLOUDRON_APP_DOMAIN|${CLOUDRON_APP_DOMAIN}|g" /etc/postfix/main.cf
|
|
sed -i "s|CLOUDRON_MAIL_DOMAIN|${CLOUDRON_MAIL_DOMAIN}|g" /etc/postfix/main.cf
|
|
|
|
# Create Postfix directories
|
|
mkdir -p /app/data/postfix/spool
|
|
mkdir -p /var/spool/postfix
|
|
chown -R postfix:postfix /var/spool/postfix
|
|
chown -R cloudron:cloudron /app/data/postfix
|
|
|
|
# Start services via supervisor
|
|
echo "==> Starting services"
|
|
exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|