/\*\* - Environment Configuration - Development | Staging | Production \*/ // ============================================================================ // BACKEND CONFIGURATION (PHP) // ============================================================================ // File: backend/config.php // ============================================================================ // MOBILE CONFIGURATION (Dart/Flutter) // ============================================================================ // File: mobile/lib/config/environment.dart const String kEnvironment = String.fromEnvironment('ENVIRONMENT', defaultValue: 'development'); class EnvironmentConfig { static const String apiHost = String.fromEnvironment( 'API_HOST', defaultValue: 'https://api.fitness-app.local', ); static const String mapTileServer = 'https://map-saas.intaleqapp.com/styles/basic-preview/style.json'; static const int locationUpdateInterval = 5; // seconds static const int mapRefreshInterval = 2; // seconds // API Configuration static const Duration requestTimeout = Duration(seconds: 30); static const int maxRetries = 3; // Location Configuration static const double minAccuracy = 10.0; // meters static const double minDistance = 10.0; // meters between coordinates static const int foregroundServicePriority = 1; // HIGH // Database Configuration static const String databaseName = 'fitness_app.db'; static const int databaseVersion = 1; // Feature Flags static const bool enableBackgroundTracking = true; static const bool enableOfflineSync = true; static const bool enableAnalytics = !kDebugMode; // Get API endpoint based on environment static String get apiEndpoint { return '$apiHost/api/v1'; } // Get workout submission endpoint static String get workoutSubmissionEndpoint { return '$apiEndpoint/workouts'; } } class DevEnvironment { static const String apiHost = 'http://localhost:8080'; static const bool debugLogging = true; } class StagingEnvironment { static const String apiHost = 'https://staging-api.fitness-app.com'; static const bool debugLogging = true; } class ProductionEnvironment { static const String apiHost = 'https://api.fitness-app.com'; static const bool debugLogging = false; } // ============================================================================ // DOCKER COMPOSE CONFIGURATION // ============================================================================ # File: docker-compose.yml version: '3.8' services: mysql: image: mysql:8.0 container_name: fitness_app_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: fitness_app MYSQL_USER: fitness_app MYSQL_PASSWORD: ${DB_PASSWORD} ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./backend/schema.sql:/docker-entrypoint-initdb.d/schema.sql networks: - fitness_network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 php_api: image: php:8.2-fpm container_name: fitness_app_php environment: APP_ENV: ${APP_ENV:-development} DB_HOST: mysql DB_USER: fitness_app DB_PASS: ${DB_PASSWORD} DB_NAME: fitness_app volumes: - ./backend:/app depends_on: mysql: condition: service_healthy networks: - fitness_network nginx: image: nginx:alpine container_name: fitness_app_nginx ports: - "80:80" - "443:443" volumes: - ./backend:/app - ./nginx.conf:/etc/nginx/nginx.conf - ./ssl:/etc/nginx/ssl depends_on: - php_api networks: - fitness_network redis: image: redis:7-alpine container_name: fitness_app_redis ports: - "6379:6379" networks: - fitness_network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 volumes: mysql_data: networks: fitness_network: driver: bridge # ============================================================================ // ENVIRONMENT VARIABLES (.env file) // ============================================================================ # File: .env.example (copy to .env for development) # Application APP_ENV=development APP_DEBUG=true TIMEZONE=UTC # Database DB_HOST=localhost DB_PORT=3306 DB_USER=fitness_app DB_PASS=your_secure_password_here DB_NAME=fitness_app # API Configuration API_HOST=http://localhost:8080 API_VERSION=v1 API_RATE_LIMIT=100 # Map Tile Server TILE_SERVER_URL=https://map-saas.intaleqapp.com/styles/basic-preview/style.json # Email (for notifications) MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USER=your_email@gmail.com MAIL_PASS=your_app_password # External Services MAPBOX_API_KEY= WEATHER_API_KEY= # Security HMAC_ALGORITHM=sha256 BCRYPT_COST=12 # Logging LOG_LEVEL=debug LOG_FILE=/var/log/fitness_api.log # Cache CACHE_DRIVER=redis CACHE_TTL=3600 # ============================================================================ // NGINX CONFIGURATION // ============================================================================ # File: nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # Gzip compression gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss; # Rate limiting limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s; limit_req_zone $http_x_api_key zone=api:10m rate=100r/m; upstream php_backend { server php_api:9000; } # Redirect HTTP to HTTPS server { listen 80; server_name _; return 301 https://$host$request_uri; } # HTTPS Server server { listen 443 ssl http2; server_name api.fitness-app.com; ssl_certificate /etc/nginx/ssl/cert.crt; ssl_certificate_key /etc/nginx/ssl/key.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # Security headers add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; root /app; # Rate limiting limit_req zone=api burst=20 nodelay; location / { try_files $uri $uri/ @rewrite; } location @rewrite { rewrite ^/(.*)$ /api_workouts.php?url=$1 last; } location ~ \.php$ { fastcgi_pass php_backend; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # Deny access to sensitive files location ~ /\. { deny all; } location ~ ~$ { deny all; } } } // ============================================================================ // BUILD CONFIGURATION (Android) // ============================================================================ # File: android/app/build.gradle android { compileSdkVersion 34 ndkVersion "25.1.8937393" defaultConfig { applicationId "com.fitness.tracker" minSdkVersion 21 targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } buildTypes { debug { debuggable true signingConfig signingConfigs.debug buildConfigField "String", "API_HOST", '"http://192.168.1.100:8080"' } staging { debuggable false signingConfig signingConfigs.release buildConfigField "String", "API_HOST", '"https://staging-api.fitness-app.com"' } release { signingConfig signingConfigs.release buildConfigField "String", "API_HOST", '"https://api.fitness-app.com"' } } } // ============================================================================ // GIT IGNORE (.gitignore) // ============================================================================ # File: .gitignore # Environment .env .env.local .env.\*.local # API Credentials api_key.txt api_secret.txt # Database _.db _.sqlite \*.sqlite3 # Logs \*.log logs/ # IDE .vscode/ .idea/ _.swp _.swo # Flutter .dart_tool/ .flutter-plugins .packages build/ # Backend vendor/ node_modules/ # OS .DS_Store Thumbs.db # Secrets secrets.json credentials.json