From 4aa574e75eb82a3dd87c56ccbe747805fcc12a5e Mon Sep 17 00:00:00 2001 From: root Date: Mon, 25 May 2026 15:25:46 +0200 Subject: [PATCH] docs: rewrite README in English with Linux/Windows setup guides and add auto-install scripts --- README.md | 493 +++++++++++++++++++++++++++++--------------- install-linux.sh | 288 ++++++++++++++++++++++++++ install-windows.ps1 | 397 +++++++++++++++++++++++++++++++++++ 3 files changed, 1009 insertions(+), 169 deletions(-) create mode 100755 install-linux.sh create mode 100644 install-windows.ps1 diff --git a/README.md b/README.md index 2312af1..f2780d7 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AtomCMS Remco Epicnabbo Edition +# AtomCMS — Remco Epicnabbo Edition
Atom CMS @@ -16,43 +16,25 @@ --- -## ⚡ Quick Start - -```bash -# Interactive mode (asks for confirmation before each step) -php artisan atom:check --fix - -# Auto mode (fixes everything automatically without asking) -php artisan atom:check --auto - -# Fix gamedata symlinks for optimal client performance -php artisan atom:fix-gamedata-symlinks -``` - ---- - -## 🎯 Features - -### 📻 Radio Station +## Features +### Radio Station - DJ applications & rank system -- Live DJ sessions with schedule/rooster +- Live DJ sessions with schedule - Song requests & voting - Shoutbox - Listener points & leaderboard - Contests & giveaways - Radio banners & history -### 🛒 Shop - +### Shop - Product catalog with categories - Virtual currency purchases - Voucher/promo codes - PayPal integration - Order history -### 👥 Community - +### Community - Articles with comments, reactions & tags - Photo gallery - Leaderboard @@ -61,34 +43,29 @@ php artisan atom:fix-gamedata-symlinks - Rare values tracker - Badge draw/lottery system -### 🎮 Hotel Client - +### Hotel Client - Nitro (HTML5) client support - Flash client support - FindRetros integration - VPN/proxy checker -### 👤 User System - +### User System - Public profiles with guestbook - Two-Factor Authentication (2FA) - Referral system with rewards - Account & password settings - Session logs -### 🎫 Help Center - +### Help Center - Support ticket system with replies & status management - Website rules - FAQ with categories -### 🎨 Themes - -- **Atom** — Default theme +### Themes +- **Atom** — Default light theme - **Dusk** — Dark theme -### 🔧 Filament Admin Panel - +### Filament Admin Panel - User & ban management - Radio management (applications, schedules, ranks, shouts, history, banners) - Shop & order management with charts @@ -100,8 +77,7 @@ php artisan atom:fix-gamedata-symlinks - Website navigation & settings - Camera/photo management -### 🌐 API Endpoints - +### API Endpoints - `GET /api/user/{username}` — Fetch user data - `GET /api/online-users` — Online users list - `GET /api/online-count` — Online user count @@ -114,64 +90,236 @@ php artisan atom:fix-gamedata-symlinks --- -## 🚀 Master Repair Tool +## Requirements -The `atom:check` command performs over **100 deep system checks** and offers to fix them automatically. - -### Diagnostic Checks - -| Section | What it Checks | -| --------------- | ------------------------------------------------------------ | -| **Environment** | .env, APP_KEY, Debug mode, Composer security | -| **Database** | Tables, columns, migrations, seeders, settings, radio, admin | -| **PHP Stack** | Extensions, PHP.ini, config cache, session | -| **Web Server** | Apache/Nginx/IIS config, SSL | -| **System** | Permissions, firewall ports | -| **Assets** | Frontend, Redis, Cron, Queue, Supervisor, Vite | -| **HTTP Errors** | 400, 401, 403, 404, 419, 429, 500, 502, 503, 504 | - -### Auto-Fix Steps - -| Step | Action | -| ---- | ----------------------------------- | -| 1 | Environment (.env, APP_KEY) | -| 2 | Clear all caches | -| 3 | Fix permissions | -| 4 | Run migrations | -| 5 | Run seeders | -| 6 | Fix storage (symlink, directories) | -| 6b | Fix Radio tables | -| 7 | Fix Gamedata symlinks | -| 8 | Create admin user | -| 9 | Web server config (.htaccess, etc.) | -| 10 | PHP config & extensions | -| 11 | Build assets (npm) | -| 12 | Fix HTTP errors | - -### Platform Support - -Auto-detects: **Linux, Windows IIS, XAMPP, WAMP, Apache, Nginx** +| Component | Requirement | +| ------------- | ------------------------------- | +| **PHP** | 8.1 or higher | +| **Database** | MariaDB 10.6+ or MySQL 8.0+ | +| **Web Server**| Apache (mod_rewrite) or Nginx | +| **Node.js** | 20 or higher | +| **Yarn** | 1.22+ or 4.x (Berry) | +| **Composer** | 2.x | --- -## 📥 Installation +## Installation + +### Linux (Ubuntu / Debian) ```bash -# 1. Clone -git clone https://github.com/your-repo/atomcms.git -cd atomcms +# 1. System dependencies +sudo apt update +sudo apt install -y git curl wget unzip nginx mariadb-server \ + php8.3 php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml \ + php8.3-mbstring php8.3-curl php8.3-zip php8.3-bcmath \ + php8.3-gd php8.3-sockets php8.3-intl -# 2. Install dependencies -composer install -npm install +# 2. Install Composer +curl -sS https://getcomposer.org/installer | php +sudo mv composer.phar /usr/local/bin/composer -# 3. Run the repair tool -php artisan atom:check --fix +# 3. Install Node.js & Yarn +curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - +sudo apt install -y nodejs +sudo corepack enable +corepack install -g yarn@latest + +# 4. Clone the project +git clone https://gitlab.epicnabbo.nl/RemcoEpic/atomcms-edit.git /var/www/atomcms +cd /var/www/atomcms + +# 5. Configure environment +cp .env.example .env +php artisan key:generate +# Edit .env with your database credentials: +# DB_DATABASE=habbo +# DB_USERNAME=root +# DB_PASSWORD=yourpassword + +# 6. Install PHP dependencies +composer install --no-dev --optimize-autoloader + +# 7. Install frontend dependencies +yarn install + +# 8. Create database +mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS habbo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" + +# 9. Run migrations & seeders (or use the auto-repair tool) +php artisan migrate --seed +# Or use the interactive repair tool: +# php artisan atom:check --fix + +# 10. Build frontend assets +yarn build:all + +# 11. Set permissions +sudo chown -R www-data:www-data storage bootstrap/cache public/build +sudo chmod -R 775 storage bootstrap/cache + +# 12. Configure web server + +# --- Nginx --- +sudo nano /etc/nginx/sites-available/atomcms +``` +server { + listen 80; + server_name your-domain.com; + root /var/www/atomcms/public; + + 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.3-fpm.sock; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} +``` +```bash +sudo ln -sf /etc/nginx/sites-available/atomcms /etc/nginx/sites-enabled/ +sudo nginx -t && sudo systemctl reload nginx + +# --- Apache --- +sudo a2enmod rewrite +sudo nano /etc/apache2/sites-available/atomcms.conf +``` + + ServerName your-domain.com + DocumentRoot /var/www/atomcms/public + + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog ${APACHE_LOG_DIR}/atomcms-error.log + CustomLog ${APACHE_LOG_DIR}/atomcms-access.log combined + +``` +```bash +sudo a2ensite atomcms +sudo systemctl reload apache2 +``` + +# 13. Restart PHP-FPM to clear opcache +sudo systemctl restart php8.3-fpm + +# 14. Visit http://your-domain.com in your browser ``` --- -## 🛠️ Usage +### Windows (XAMPP / WampServer) + +#### Prerequisites +- [XAMPP](https://www.apachefriends.org/) (PHP 8.1+, Apache, MariaDB) or [WampServer](https://www.wampserver.com/) +- [Node.js](https://nodejs.org/) (20 LTS or higher) +- [Yarn](https://yarnpkg.com/getting-started/install) (`npm install -g yarn` after Node.js) +- [Composer](https://getcomposer.org/download/) (Windows installer) +- [Git for Windows](https://git-scm.com/download/win) + +#### Steps + +```powershell +# 1. Open PowerShell or CMD as Administrator + +# 2. Clone the project +git clone https://gitlab.epicnabbo.nl/RemcoEpic/atomcms-edit.git C:\xampp\htdocs\atomcms +cd C:\xampp\htdocs\atomcms + +# 3. Configure environment +copy .env.example .env +php artisan key:generate + +# Edit .env with your XAMPP database credentials: +# DB_CONNECTION=mariadb +# DB_HOST=localhost +# DB_PORT=3306 +# DB_DATABASE=habbo +# DB_USERNAME=root +# DB_PASSWORD= + +# 4. Start XAMPP services +# Open XAMPP Control Panel → Start Apache & MySQL + +# 5. Create database +# Open phpMyAdmin (http://localhost/phpmyadmin) +# → New → Database name: habbo → Charset: utf8mb4_unicode_ci → Create + +# 6. Install PHP dependencies +composer install --no-dev --optimize-autoloader + +# 7. Install frontend dependencies +yarn install + +# 8. Run migrations & seeders +php artisan migrate --seed +# Or use the interactive repair tool: +# php artisan atom:check --fix + +# 9. Build frontend assets +yarn build:all + +# 10. Set permissions (required for storage & cache) +# Right-click storage\ and bootstrap\cache\ folders +# → Properties → Security → Edit → Add "Everyone" → Full Control +# Or run in PowerShell as Admin: +icacls storage /grant Everyone:F /T +icacls bootstrap/cache /grant Everyone:F /T +icacls public/build /grant Everyone:F /T + +# 11. Enable Apache mod_rewrite +# Open XAMPP Control Panel → Apache → Config → httpd.conf +# Uncomment: LoadModule rewrite_module modules/mod_rewrite.so + +# 12. Visit http://localhost/atomcms/public in your browser +``` + +> **Note:** If you use IIS on Windows, the repair tool supports auto-detection: +> `php artisan atom:check --fix` + +--- + +## Quick Start (Repair Tool) + +```bash +# Interactive mode (asks for confirmation before each step) +php artisan atom:check --fix + +# Auto mode (fixes everything automatically without asking) +php artisan atom:check --auto + +# Force platform detection +php artisan atom:check --platform=nginx + +# Dutch language output +php artisan atom:check --fix --lang=nl +``` + +--- + +## Commands ```bash # Check only (no changes) @@ -183,81 +331,44 @@ php artisan atom:check --fix # Automatic fix (no questions) php artisan atom:check --auto -# Force platform detection -php artisan atom:check --platform=nginx - -# Dutch language -php artisan atom:check --fix --lang=nl - # Fix gamedata symlinks for bundled assets php artisan atom:fix-gamedata-symlinks -# Preview what symlinks would be created (dry-run) +# Preview symlinks (dry-run) php artisan atom:fix-gamedata-symlinks --dry-run ``` ---- - -## ⚡ Performance Optimization - -### Gamedata Symlinks - -The `atom:fix-gamedata-symlinks` command creates symlinks in the Gamedata directory to point to optimized bundled assets. This significantly improves load times for the game client. - -| Symlink | Target | Purpose | -| ---------------- | ------------------- | --------------------- | -| `effect` | `bundled/effect` | Avatar effects | -| `furniture` | `bundled/furniture` | Furniture assets | -| `generic` | `bundled/generic` | Generic assets | -| `pet` | `bundled/pet` | Pet assets | -| `figure` | `bundled/figure` | Avatar figures | -| `generic_custom` | `bundled/generic` | Custom generic assets | - -### Recommended Nginx Optimizations - -The following optimizations are already configured: - -- `sendfile on` - Kernel-level file serving -- `open_file_cache` - File descriptor caching -- `gzip` - Automatic compression for JSON/JS/CSS - ---- - -## 🧑‍💻 Developer Tools - ### Yarn Scripts ```bash -# Build -yarn build # Build all themes -yarn build:atom # Build atom theme only -yarn build:dusk # Build dusk theme only -yarn build:all # Build both themes +# Build all themes +yarn build:all + +# Build single theme +yarn build:atom # Atom theme +yarn build:dusk # Dusk theme # Development -yarn dev # Start dev server -yarn dev:atom # Dev server atom theme +yarn dev # Start Vite dev server +yarn dev:atom # Dev server for Atom theme -# Code Quality -yarn lint # Check JS/Vue -yarn lint:fix # Fix JS/Vue -yarn lint:css # Check CSS -yarn lint:css:fix # Fix CSS -yarn lint:all # Check everything -yarn lint:fix:all # Fix everything +# Linting & Formatting +yarn lint # Check JS/Vue +yarn lint:fix # Fix JS/Vue +yarn lint:css # Check CSS +yarn lint:css:fix # Fix CSS +yarn format # Format everything +yarn format:check # Check formatting -yarn format # Format everything -yarn format:check # Check formatting - -# Check -yarn check # Full check -yarn check:php # Check PHP syntax -yarn check:security # Check security -yarn check:deps # Check outdated packages +# Full check +yarn check # Lint + format check +yarn check:php # PHP syntax check +yarn check:security # Composer & npm audit +yarn check:deps # Check outdated packages # Cache -yarn clean # Clear cache -yarn rebuild # Clean + install + build +yarn clean # Clear Vite cache +yarn rebuild # Clean + install + build ``` ### PHP Commands @@ -266,9 +377,6 @@ yarn rebuild # Clean + install + build # Auto-fix code style php artisan atom:fix-code -# Fix gamedata symlinks (run after installing client assets) -php artisan atom:fix-gamedata-symlinks - # Static analysis (PHPStan Level 3) ./vendor/bin/phpstan analyse @@ -278,48 +386,95 @@ yarn build:dusk # Development mode yarn dev:atom -yarn dev:dusk - -# Format code -yarn format ``` --- -## ⚡ Performance Optimizations +## Repair Tool Details -This CMS is fully optimized: +The `atom:check` command performs over **100 deep system checks** and offers to fix them automatically. -| Optimization | Description | -| ---------------------- | --------------------------------- | -| **Vite 8** | Fastest build tool | -| **esbuild** | Faster minification | -| **Better chunking** | Optimal code splitting | -| **Gzip + Brotli** | Compression (~70% smaller) | -| **Resource hints** | DNS prefetch, preconnect, preload | -| **HTTP/2** | Faster network requests | -| **Console removed** | Smaller JS bundles | -| **Caching** | Vite cache + optimizedeps | +### Diagnostic Checks + +| Section | What it Checks | +| ------------- | ------------------------------------------------------------- | +| **Environment** | .env, APP_KEY, Debug mode, Composer security | +| **Database** | Tables, columns, migrations, seeders, settings, radio, admin | +| **PHP Stack** | Extensions, php.ini, config cache, session | +| **Web Server**| Apache/Nginx/IIS config, SSL | +| **System** | Permissions, firewall ports | +| **Assets** | Frontend, Redis, Cron, Queue, Supervisor, Vite | +| **HTTP Errors** | 400, 401, 403, 404, 419, 429, 500, 502, 503, 504 | + +### Auto-Fix Steps + +| Step | Action | +| ---- | ---------------------------------- | +| 1 | Environment (.env, APP_KEY) | +| 2 | Clear all caches | +| 3 | Fix permissions | +| 4 | Run migrations | +| 5 | Run seeders | +| 6 | Fix storage (symlink, directories) | +| 6b | Fix Radio tables | +| 7 | Fix Gamedata symlinks | +| 8 | Create admin user | +| 9 | Web server config (.htaccess) | +| 10 | PHP config & extensions | +| 11 | Build assets (npm) | +| 12 | Fix HTTP errors | + +Auto-detects: **Linux, Windows IIS, XAMPP, WAMP, Apache, Nginx** --- -## 📦 Tech Stack +## Performance Optimizations + +| Optimization | Description | +| ------------------- | -------------------------------- | +| **Vite 8** | Fastest build tool | +| **esbuild** | Faster minification | +| **Better chunking** | Optimal code splitting | +| **Gzip + Brotli** | Compression (~70% smaller) | +| **Resource hints** | DNS prefetch, preconnect, preload| +| **HTTP/2** | Faster network requests | +| **Console removed** | Smaller JS bundles | +| **Caching** | Vite cache + optimizedeps | + +### Gamedata Symlinks + +The `atom:fix-gamedata-symlinks` command creates symlinks in the Gamedata directory to point to optimized bundled assets, significantly improving game client load times. + +| Symlink | Target | Purpose | +| ---------------- | ------------------- | ---------------- | +| `effect` | `bundled/effect` | Avatar effects | +| `furniture` | `bundled/furniture` | Furniture assets | +| `generic` | `bundled/generic` | Generic assets | +| `pet` | `bundled/pet` | Pet assets | +| `figure` | `bundled/figure` | Avatar figures | +| `generic_custom` | `bundled/generic` | Custom generic | + +--- + +## Tech Stack - **Backend:** Laravel 13 - **Frontend:** React 19 + Alpine.js - **Build:** Vite 8 - **CSS:** TailwindCSS 4 +- **Admin Panel:** Filament 5 +- **Database:** MariaDB / MySQL - **Linting:** ESLint + Stylelint + Prettier --- -## 🤝 Credits +## Credits -- **Remco (Epicnabbo)** - Core Maintainer, System Architecture -- **Kasja** - Design & Themes -- **Kani** - RCON & API -- **Atom Community** - Testing & Feedback +- **Remco (Epicnabbo)** — Core Maintainer, System Architecture +- **Kasja** — Design & Themes +- **Kani** — RCON & API +- **Atom Community** — Testing & Feedback
-Made with ❤️ for the Retro Community +Made with love for the Retro Community
diff --git a/install-linux.sh b/install-linux.sh new file mode 100755 index 0000000..4a27da3 --- /dev/null +++ b/install-linux.sh @@ -0,0 +1,288 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_URL="https://gitlab.epicnabbo.nl/RemcoEpic/atomcms-edit.git" +INSTALL_DIR="/var/www/atomcms" +DB_NAME="habbo" +DB_USER="root" +DB_PASS="" + +MAGENTA='\033[0;35m' +CYAN='\033[0;36m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' + +log() { echo -e "${MAGENTA}[AtomCMS]${NC} $1"; } +ok() { echo -e "${GREEN}[ OK ]${NC} $1"; } +info() { echo -e "${CYAN}[ INFO ]${NC} $1"; } +warn() { echo -e "${YELLOW}[ WARN ]${NC} $1"; } +err() { echo -e "${RED}[FAILED]${NC} $1"; exit 1; } + +if [[ $EUID -eq 0 ]]; then + SUDO="" +else + SUDO="sudo" + warn "Not running as root. I'll use sudo where needed." +fi + +detect_distro() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + OS_VER=$VERSION_ID + else + err "Cannot detect OS. Only Ubuntu/Debian are supported." + fi +} + +install_deps_debian() { + log "Installing system dependencies..." + $SUDO apt update + $SUDO apt install -y curl wget git unzip nginx mariadb-server \ + php8.3 php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml \ + php8.3-mbstring php8.3-curl php8.3-zip php8.3-bcmath \ + php8.3-gd php8.3-sockets php8.3-intl + ok "System dependencies installed" +} + +install_deps_ubuntu() { + install_deps_debian +} + +install_composer() { + if command -v composer &>/dev/null; then + ok "Composer already installed" + return + fi + log "Installing Composer..." + EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')" + php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" + ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" + if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then + rm composer-setup.php + err "Composer installer checksum mismatch" + fi + php composer-setup.php --quiet + rm composer-setup.php + $SUDO mv composer.phar /usr/local/bin/composer + ok "Composer installed" +} + +install_node_yarn() { + if command -v node &>/dev/null && command -v yarn &>/dev/null; then + ok "Node.js and Yarn already installed" + return + fi + log "Installing Node.js and Yarn..." + curl -fsSL https://deb.nodesource.com/setup_22.x | $SUDO bash - + $SUDO apt install -y nodejs + $SUDO corepack enable + $SUDO corepack install -g yarn@latest + ok "Node.js $(node -v) and Yarn $(yarn -v) installed" +} + +setup_database() { + log "Setting up MariaDB/MySQL..." + $SUDO systemctl enable --now mariadb 2>/dev/null || true + $SUDO mysql -u root -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>/dev/null || true + ok "Database '$DB_NAME' ready" +} + +clone_project() { + if [ -d "$INSTALL_DIR" ] && [ -f "$INSTALL_DIR/artisan" ]; then + ok "Project already cloned at $INSTALL_DIR" + return + fi + log "Cloning project..." + $SUDO mkdir -p "$(dirname "$INSTALL_DIR")" + git clone "$REPO_URL" "$INSTALL_DIR" + ok "Project cloned to $INSTALL_DIR" +} + +configure_env() { + log "Configuring environment..." + cd "$INSTALL_DIR" + if [ ! -f .env ]; then + cp .env.example .env + read -rp "Database password (leave empty for root without password): " DB_PASS + sed -i "s/DB_DATABASE=.*/DB_DATABASE=$DB_NAME/" .env + sed -i "s/DB_USERNAME=.*/DB_USERNAME=$DB_USER/" .env + sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=$DB_PASS/" .env + php artisan key:generate --quiet + ok ".env configured and APP_KEY generated" + else + info ".env already exists, skipping" + fi +} + +install_php_deps() { + log "Installing PHP dependencies..." + cd "$INSTALL_DIR" + composer install --no-interaction --optimize-autoloader --no-dev + ok "PHP dependencies installed" +} + +install_node_deps() { + log "Installing Node dependencies..." + cd "$INSTALL_DIR" + yarn install --frozen-lockfile + ok "Node dependencies installed" +} + +run_migrations() { + log "Running migrations and seeders..." + cd "$INSTALL_DIR" + php artisan migrate --seed --force || true + ok "Migrations and seeders complete" +} + +build_assets() { + log "Building frontend assets..." + cd "$INSTALL_DIR" + yarn build:all + ok "Frontend assets built" +} + +set_permissions() { + log "Setting filesystem permissions..." + cd "$INSTALL_DIR" + $SUDO chown -R www-data:www-data storage bootstrap/cache public/build 2>/dev/null || true + $SUDO chmod -R 775 storage bootstrap/cache + ok "Permissions set" +} + +configure_nginx() { + log "Configuring Nginx..." + read -rp "Enter your domain name (e.g. example.com or localhost): " DOMAIN + $SUDO tee /etc/nginx/sites-available/atomcms > /dev/null < /dev/null < + ServerName $DOMAIN + DocumentRoot $INSTALL_DIR/public + + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog \${APACHE_LOG_DIR}/atomcms-error.log + CustomLog \${APACHE_LOG_DIR}/atomcms-access.log combined + +EOF + $SUDO a2ensite atomcms.conf || true + $SUDO a2dissite 000-default.conf || true + $SUDO systemctl reload apache2 + ok "Apache configured for $DOMAIN" +} + +setup_finalize() { + log "Finalizing installation..." + cd "$INSTALL_DIR" + php artisan storage:link --force 2>/dev/null || true + php artisan optimize:clear 2>/dev/null || true + $SUDO systemctl restart php8.3-fpm 2>/dev/null || true + ok "Installation complete!" +} + +main() { + echo "" + echo -e "${MAGENTA}╔══════════════════════════════════════╗${NC}" + echo -e "${MAGENTA}║ AtomCMS Auto Installer (Linux) ║${NC}" + echo -e "${MAGENTA}╚══════════════════════════════════════╝${NC}" + echo "" + + detect_distro + echo -e "Detected: ${CYAN}$OS $OS_VER${NC}" + echo "" + + case "$OS" in + ubuntu) install_deps_ubuntu ;; + debian) install_deps_debian ;; + *) err "Unsupported distro: $OS. Only Ubuntu/Debian are supported." ;; + esac + + install_composer + install_node_yarn + clone_project + configure_env + install_php_deps + install_node_deps + setup_database + run_migrations + build_assets + set_permissions + + echo "" + info "Select web server:" + echo "1) Nginx (recommended)" + echo "2) Apache" + read -rp "Choice [1]: " WS_CHOICE + case "${WS_CHOICE:-1}" in + 2) configure_apache ;; + *) configure_nginx ;; + esac + + setup_finalize + + echo "" + echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║ AtomCMS is ready! ║${NC}" + echo -e "${GREEN}║ ║${NC}" + echo -e "${GREEN}║ Visit: http://$DOMAIN ║${NC}" + echo -e "${GREEN}║ Admin: http://$DOMAIN/admin ║${NC}" + echo -e "${GREEN}║ ║${NC}" + echo -e "${GREEN}║ Run the repair tool for extra checks: ║${NC}" + echo -e "${GREEN}║ php artisan atom:check --fix ║${NC}" + echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" +} + +main diff --git a/install-windows.ps1 b/install-windows.ps1 new file mode 100644 index 0000000..a0a3e42 --- /dev/null +++ b/install-windows.ps1 @@ -0,0 +1,397 @@ +<# +.SYNOPSIS + AtomCMS Auto Installer for Windows (XAMPP / WampServer) +.DESCRIPTION + Automates the full installation of AtomCMS on Windows. + Supports XAMPP and WampServer environments. +#> + +$ErrorActionPreference = "Stop" +$Host.UI.RawUI.WindowTitle = "AtomCMS Installer" + +$REPO_URL = "https://gitlab.epicnabbo.nl/RemcoEpic/atomcms-edit.git" +$DB_NAME = "habbo" +$DB_USER = "root" +$DB_PASS = "" + +function Write-Logo { + Write-Host "╔══════════════════════════════════════════╗" -ForegroundColor Magenta + Write-Host "║ AtomCMS Auto Installer (Windows) ║" -ForegroundColor Magenta + Write-Host "╚══════════════════════════════════════════╝" -ForegroundColor Magenta + Write-Host "" +} + +function Write-Step { + param([string]$Message) + Write-Host "[AtomCMS] $Message" -ForegroundColor Magenta +} + +function Write-OK { + param([string]$Message) + Write-Host "[ OK ] $Message" -ForegroundColor Green +} + +function Write-Info { + param([string]$Message) + Write-Host "[ INFO ] $Message" -ForegroundColor Cyan +} + +function Write-Warn { + param([string]$Message) + Write-Host "[ WARN ] $Message" -ForegroundColor Yellow +} + +function Write-Error { + param([string]$Message) + Write-Host "[FAILED] $Message" -ForegroundColor Red + exit 1 +} + +function Test-Admin { + $identity = [Security.Principal.WindowsIdentity]::GetCurrent() + $principal = New-Object Security.Principal.WindowsPrincipal($identity) + if (-not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { + Write-Warn "Not running as Administrator. Some operations may fail." + $continue = Read-Host "Continue anyway? (y/N)" + if ($continue -ne "y") { exit 1 } + } +} + +function Find-Xampp { + $paths = @( + "C:\xampp", + "D:\xampp", + "E:\xampp", + "${env:ProgramFiles}\XAMPP", + "${env:ProgramFiles(x86)}\XAMPP" + ) + foreach ($p in $paths) { + if (Test-Path "$p\php\php.exe") { return $p } + } + return $null +} + +function Find-Wamp { + $paths = @( + "C:\wamp64", + "C:\wamp", + "D:\wamp64", + "D:\wamp" + ) + foreach ($p in $paths) { + if (Test-Path "$p\bin\php\php8.?.?\php.exe") { return $p } + if (Test-Path "$p\bin\php\php8.??\php.exe") { return $p } + } + return $null +} + +function Find-PHP { + $php = Get-Command "php.exe" -ErrorAction SilentlyContinue + if ($php) { return Split-Path $php.Source -Parent } + + $xampp = Find-Xampp + if ($xampp) { return "$xampp\php" } + + $wamp = Find-Wamp + if ($wamp) { + $phpDirs = Get-ChildItem "$wamp\bin\php" -Filter "php8*" -Directory | Sort-Object Name -Descending + if ($phpDirs.Count -gt 0) { return $phpDirs[0].FullName } + } + return $null +} + +function Find-MySQL { + $mysql = Get-Command "mysql.exe" -ErrorAction SilentlyContinue + if ($mysql) { return Split-Path $mysql.Source -Parent } + + $xampp = Find-Xampp + if ($xampp -and (Test-Path "$xampp\mysql\bin\mysql.exe")) { return "$xampp\mysql\bin" } + + $wamp = Find-Wamp + if ($wamp -and (Test-Path "$wamp\bin\mariadb\*\bin\mysql.exe")) { + $dirs = Get-ChildItem "$wamp\bin\mariadb" -Directory | Sort-Object Name -Descending + if ($dirs.Count -gt 0) { return "$($dirs[0].FullName)\bin" } + } + return $null +} + +function Find-Apache { + $xampp = Find-Xampp + if ($xampp -and (Test-Path "$xampp\apache\bin\httpd.exe")) { return "$xampp\apache" } + + $wamp = Find-Wamp + if ($wamp -and (Test-Path "$wamp\bin\apache\*\bin\httpd.exe")) { + $dirs = Get-ChildItem "$wamp\bin\apache" -Directory | Sort-Object Name -Descending + if ($dirs.Count -gt 0) { return $dirs[0].FullName } + } + return $null +} + +function Ensure-Tool { + param([string]$Name, [string]$CheckCommand, [string]$Url, [string]$InstallHint) + + $found = Get-Command $CheckCommand -ErrorAction SilentlyContinue + if ($found) { + Write-OK "$Name is installed" + return $true + } + + Write-Warn "$Name is not found." + if ($Url) { + Write-Info "Download from: $Url" + } + if ($InstallHint) { + Write-Info "$InstallHint" + } + return $false +} + +function Install-Composer { + if (Get-Command "composer" -ErrorAction SilentlyContinue) { + Write-OK "Composer already installed" + return + } + Write-Step "Installing Composer..." + $installer = "$env:TEMP\composer-setup.php" + Invoke-WebRequest -Uri "https://getcomposer.org/installer" -OutFile $installer + php $installer --quiet --install-dir="$env:USERPROFILE\bin" + php -r "unlink('$installer');" + $env:Path += ";$env:USERPROFILE\bin" + [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";$env:USERPROFILE\bin", "User") + Write-OK "Composer installed. You may need to restart your terminal." +} + +function Clone-Project { + param([string]$TargetDir) + + if (Test-Path "$TargetDir\artisan") { + Write-OK "Project already cloned at $TargetDir" + return $TargetDir + } + + if (-not (Get-Command "git" -ErrorAction SilentlyContinue)) { + Write-Error "Git is not installed. Install Git for Windows: https://git-scm.com/download/win" + } + + Write-Step "Cloning project..." + git clone $REPO_URL $TargetDir + Write-OK "Project cloned to $TargetDir" + return $TargetDir +} + +function Configure-Env { + param([string]$ProjectDir) + + Write-Step "Configuring environment..." + $envFile = "$ProjectDir\.env" + if (Test-Path $envFile) { + Write-Info ".env already exists, skipping" + return + } + + Copy-Item "$ProjectDir\.env.example" $envFile + $dbPass = Read-Host "Database password (leave empty for root without password)" + + (Get-Content $envFile) -replace 'DB_DATABASE=.*', "DB_DATABASE=$DB_NAME" | Set-Content $envFile + (Get-Content $envFile) -replace 'DB_USERNAME=.*', "DB_USERNAME=$DB_USER" | Set-Content $envFile + (Get-Content $envFile) -replace 'DB_PASSWORD=.*', "DB_PASSWORD=$dbPass" | Set-Content $envFile + + Push-Location $ProjectDir + php artisan key:generate --quiet + Pop-Location + + Write-OK ".env configured and APP_KEY generated" +} + +function Create-Database { + param([string]$MySQLDir) + + Write-Step "Creating database '$DB_NAME'..." + + $mysqlExe = if ($MySQLDir) { "$MySQLDir\mysql.exe" } else { "mysql.exe" } + + if ($DB_PASS) { + & $mysqlExe -u $DB_USER -p$DB_PASS -e "CREATE DATABASE IF NOT EXISTS `$DB_NAME` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>$null + } else { + & $mysqlExe -u $DB_USER -e "CREATE DATABASE IF NOT EXISTS `$DB_NAME` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>$null + } + + if ($LASTEXITCODE -eq 0) { + Write-OK "Database '$DB_NAME' ready" + } else { + Write-Warn "Could not create database automatically." + Write-Info "Open phpMyAdmin (http://localhost/phpmyadmin) and create a database named '$DB_NAME' with charset utf8mb4_unicode_ci." + Read-Host "Press Enter after creating the database" + } +} + +function Run-Migrations { + param([string]$ProjectDir) + + Write-Step "Running migrations and seeders..." + Push-Location $ProjectDir + php artisan migrate --seed --force + Pop-Location + Write-OK "Migrations and seeders complete" +} + +function Build-Assets { + param([string]$ProjectDir) + + Write-Step "Building frontend assets..." + Push-Location $ProjectDir + yarn build:all + Pop-Location + Write-OK "Frontend assets built" +} + +function Set-Permissions { + param([string]$ProjectDir) + + Write-Step "Setting permissions..." + $folders = @("$ProjectDir\storage", "$ProjectDir\bootstrap\cache") + + foreach ($folder in $folders) { + if (Test-Path $folder) { + try { + icacls $folder /grant "Everyone:F" /T /Q 2>$null + } catch { + Write-Warn "Could not set permissions on $folder. You may need to do this manually." + } + } + } + + Write-OK "Permissions set" +} + +function Configure-Apache { + param([string]$ApacheDir, [string]$ProjectDir) + + Write-Step "Configuring Apache virtual host..." + + $domain = Read-Host "Enter your domain name (e.g. localhost)" + $publicDir = "$ProjectDir\public".Replace("\", "/") + + $vhost = @" + + ServerName $domain + DocumentRoot "$publicDir" + + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog logs/atomcms-error.log + CustomLog logs/atomcms-access.log combined + +"@ + + if ($ApacheDir) { + $confFile = "$ApacheDir\conf\extra\httpd-vhosts.conf" + Add-Content -Path $confFile -Value "`n$vhost" -ErrorAction SilentlyContinue + Write-OK "Virtual host added to $confFile" + Write-Info "Make sure these lines are uncommented in httpd.conf:" + Write-Info " Include conf/extra/httpd-vhosts.conf" + Write-Info " LoadModule rewrite_module modules/mod_rewrite.so" + } else { + Write-Warn "Apache directory not found. Add this virtual host manually:" + Write-Host $vhost -ForegroundColor Gray + } +} + +function Show-Summary { + param([string]$Domain) + + Write-Host "" + Write-Host "╔══════════════════════════════════════════════════════════════╗" -ForegroundColor Green + Write-Host "║ AtomCMS is ready! ║" -ForegroundColor Green + Write-Host "║ ║" -ForegroundColor Green + Write-Host "║ Visit: http://$Domain ║" -ForegroundColor Green + Write-Host "║ Admin: http://$Domain/admin ║" -ForegroundColor Green + Write-Host "║ ║" -ForegroundColor Green + Write-Host "║ Run the repair tool for extra checks: ║" -ForegroundColor Green + Write-Host "║ php artisan atom:check --fix ║" -ForegroundColor Green + Write-Host "╚══════════════════════════════════════════════════════════════╝" -ForegroundColor Green + Write-Host "" +} + +function Main { + Write-Logo + Test-Admin + + # Check environment + $phpDir = Find-PHP + $mysqlDir = Find-MySQL + $apacheDir = Find-Apache + + if (-not $phpDir) { + Write-Error "PHP not found. Install XAMPP (https://www.apachefriends.org/) or WampServer first." + } + + # Add PHP and MySQL to PATH for this session + if ($phpDir) { $env:Path = "$phpDir;$env:Path" } + if ($mysqlDir) { $env:Path = "$mysqlDir;$env:Path" } + + Write-OK "PHP found: $((Get-Command php).Source)" + if ($mysqlDir) { Write-OK "MySQL found: $mysqlDir" } + if ($apacheDir) { Write-OK "Apache found: $apacheDir" } + + # Ensure required tools + Ensure-Tool -Name "Node.js" -CheckCommand "node" -Url "https://nodejs.org/" -InstallHint "Install Node.js LTS" + $hasYarn = Ensure-Tool -Name "Yarn" -CheckCommand "yarn" -Url "https://yarnpkg.com/getting-started/install" -InstallHint "Run: npm install -g yarn" + Ensure-Tool -Name "Git" -CheckCommand "git" -Url "https://git-scm.com/download/win" -InstallHint "Install Git for Windows" + + if (-not $hasYarn) { + Write-Step "Installing Yarn via npm..." + npm install -g yarn + Write-OK "Yarn installed" + } + + Install-Composer + + # Where to install? + $defaultDir = if (Find-Xampp) { "$(Find-Xampp)\htdocs\atomcms" } else { "$env:USERPROFILE\atomcms" } + $projectDir = Read-Host "Installation directory [$defaultDir]" + if (-not $projectDir) { $projectDir = $defaultDir } + + Clone-Project -TargetDir $projectDir + Configure-Env -ProjectDir $projectDir + + # Install PHP deps + Write-Step "Installing PHP dependencies..." + Push-Location $projectDir + composer install --no-interaction --optimize-autoloader --no-dev + Pop-Location + Write-OK "PHP dependencies installed" + + # Install Node deps + Write-Step "Installing Node dependencies..." + Push-Location $projectDir + yarn install --frozen-lockfile + Pop-Location + Write-OK "Node dependencies installed" + + Create-Database -MySQLDir $mysqlDir + Run-Migrations -ProjectDir $projectDir + Build-Assets -ProjectDir $projectDir + Set-Permissions -ProjectDir $projectDir + + $configureWeb = Read-Host "Configure Apache virtual host? (y/N)" + if ($configureWeb -eq "y") { + Configure-Apache -ApacheDir $apacheDir -ProjectDir $projectDir + } + + # Finalize + Write-Step "Finalizing..." + Push-Location $projectDir + php artisan storage:link --force 2>$null + php artisan optimize:clear 2>$null + Pop-Location + + $domain = Read-Host "Enter your domain/path to access the site (e.g. localhost/atomcms/public or your-domain.com)" + Show-Summary -Domain $domain +} + +Main