# AtomCMS — Remco Epicnabbo Edition
Atom CMS ### The Ultimate Retro Hotel CMS **Modern • Fast • Self-Repairing** [![Discord](https://img.shields.io/badge/Discord-Join%20Server-5865F2?style=flat&logo=discord&logoColor=white)](https://discord.gg/pP6HyZedAj) [![Laravel](https://img.shields.io/badge/Laravel-13.x-FF2D20?style=flat&logo=laravel&logoColor=white)](https://laravel.com) [![PHP](https://img.shields.io/badge/PHP-8.1+-777BB4?style=flat&logo=php&logoColor=white)](https://php.net)
--- ## Features ### Commandocentrum (Admin Panel) - **Nitro V3 Update** — One-click update system for Emulator, Nitro-V3, and Nitro_Render_V3 - **Configurable paths** — All directories (emulator, nitro client, renderer, gamedata, SQL, backups) configurable via the Housekeeping UI, stored in the database - **Emulator control** — Start, stop, restart, and check emulator status - **Hotel alert** — Send messages to all online users - **Live monitoring** — Online users, emulator status, database status, server load, system diagnostics - **Emulator logs viewer** — Live log viewer - **Clothing sync** — Sync catalog clothing from FigureMap - **Notification settings** — Email & Discord alerts with rank-based filtering - **Social login** — Google, Discord, GitHub OAuth configuration - **Staff activity log** — Track recent housekeeping actions ### Radio Station - DJ applications & rank system - Live DJ sessions with schedule - Song requests & voting - Shoutbox - Listener points & leaderboard - Contests & giveaways - Radio banners & history ### Shop - Product catalog with categories - Virtual currency purchases - Voucher/promo codes - PayPal integration - Order history ### Community - Articles with comments, reactions & tags - Photo gallery - Leaderboard - Teams & team applications - Staff page & staff applications - Rare values tracker - Badge draw/lottery system ### Hotel Client - Nitro (HTML5) client support - VPN/proxy checker ### User System - Public profiles with guestbook - Two-Factor Authentication (2FA) - Referral system with rewards - Account & password settings - Session logs ### Help Center - Support ticket system with replies & status management - Website rules - FAQ with categories ### Themes - **Atom** — Default light theme - **Dusk** — Dark theme ### Filament Admin Panel - User & ban management - Radio management (applications, schedules, ranks, shouts, history, banners) - Shop & order management with charts - Article & tag management - Emulator settings, texts & catalog editors - Chatlog viewer (rooms & private messages) - Word filters & moderation tools - Housekeeping permissions - Website navigation & settings - Camera/photo management --- ## Nitro V3 Update System The **Commandocentrum** page in the Filament admin panel provides a one-click update system for your entire retro hotel stack. ### How It Works 1. **Configure paths** — Click "Configureer Paths" to set directories for your emulator, Nitro-V3 client, Nitro_Render_V3, Gamedata, SQL updates, and backups. Paths are stored in the database and editable at any time. 2. **Run Update** — Click "Run Update" to execute `update-Nitrov3.sh`, which performs: - `git pull` on the emulator source - Automatic database backup via `mariadb-dump` - Import new SQL update files - Maven build (`mvn package`) - Update the emulator launch script to point to the newly built JAR - `git pull` on Nitro_Render_V3 (with automatic `yarn install` if `package.json` changed) - `git pull` on Nitro-V3 (with automatic `yarn install` if `package.json` changed) - `yarn build` for Nitro-V3 - Sync Gamedata configuration files (renderer-config, ui-config, UITexts) - Cleanup old emulator logs (14+ days) and database backups (keep last 5) - Clear Yarn cache - Fix filesystem permissions - Restart the emulator service ### Sudo Configuration The update script requires `sudo` access for `www-data` to restart the emulator service and fix permissions. Add this sudoers file: ```bash sudo tee /etc/sudoers.d/www-data << 'EOF' www-data ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart emulator www-data ALL=(ALL) NOPASSWD: /usr/bin/systemctl status emulator www-data ALL=(ALL) NOPASSWD: /usr/bin/chown EOF sudo chmod 440 /etc/sudoers.d/www-data ``` The script gracefully skips sudo operations if they're not available. ### Configurable Paths | Setting | Default | Description | | ------- | ------- | ----------- | | Emulator hoofdmap | `/var/www/emulator` | Root emulator directory | | Emulator service naam | `emulator` | systemd service name | | Database naam | `habbo` | MySQL/MariaDB database | | SQL updates map | `{emulator}/Database Updates` | Directory with `.sql` update files | | Backup map | `{emulator}/Database Updates/backups` | Database backup storage | | Gamedata config map | `/var/www/Gamedata/config` | Gamedata configuration | | Nitro client config map | `{nitro}/public/configuration` | Client configuration output | | Nitro-V3 bronmap | `/var/www/Nitro-V3` | Nitro client source | | Nitro Render V3 bronmap | `/var/www/Nitro_Render_V3` | Nitro renderer source | Database credentials are read automatically from the Laravel `.env` file. --- ## Requirements | 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 | > **⚠️ XAMPP wordt niet ondersteund.** XAMPP is extreem onveilig voor productieomgevingen — het gebruikt standaard accounts zonder wachtwoord, mist essentiële PHP-beveiligingsconfiguraties en biedt geen isolatie tussen services. Wij willen onze gebruikers en hun hotels beschermen tegen vermijdbare risico's. Gebruik een propere Linux-server met Nginx of Apache. --- ## Installation ### Linux (Ubuntu / Debian) ```bash # 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 Composer curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer # 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 ssh://git@5.252.100.130:8422/remco/Atomcms-edit.git /var/www/atomcms cd /var/www/atomcms # 5. Configure environment cp .env.example .env php artisan key:generate # 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 php artisan migrate --seed # 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 example) ``` ```nginx 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 ~ \.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 sudo systemctl restart php8.3-fpm ``` --- ## Yarn Scripts ```bash # Build all themes yarn build:all # Build single theme yarn build:atom # Atom theme yarn build:dusk # Dusk theme # Development yarn dev # Start Vite dev server yarn dev:atom # Dev server for Atom theme # Linting & Formatting yarn lint # Check JS/Vue yarn lint:fix # Fix JS/Vue yarn format # Format everything # Cache yarn clean # Clear Vite cache yarn rebuild # Clean + install + build ``` --- ## Tech Stack - **Backend:** Laravel 13 - **Frontend:** React 19 + Alpine.js - **Build:** Vite 8 - **CSS:** TailwindCSS 4 - **Admin Panel:** Filament 5 - **Database:** MariaDB / MySQL --- ## Changelog (May 27, 2026) - **Added OPcache troubleshooting** — 500 error after `php artisan optimize` fix in README - **Fixed Dashboard navigation translation** — added `Dashboard` key to Dutch Filament `resources.php` - **Fixed Homepage navigation label** — added `Homepage` translation to `nl.json` - **Disabled OPcache in FPM** — `99-opcache.ini` set to `opcache.enable=0` to prevent stale cache issues ## Changelog (May 26, 2026) - **Removed auto-recovery** — caused race conditions by running `view:clear` during live traffic, fixed `filemtime(): stat failed` errors - **Fixed debug banner** — now uses `config('app.debug')` with proper `(bool)` cast, no more false positives - **Added `(bool)` casts** to all `env()` calls with boolean defaults across 6 config files (habbo, activitylog, database, filesystems, log-viewer, session) - **Removed dangerous public scripts** — `check_icons.php` and `test_open_basedir.php` (public Laravel bootstrap + DB queries) - **Removed root `index.php`** — duplicate front controller, unsafe if docroot misconfigured - **Cleaned Clockwork debug data** — 42 JSON files with SQL queries, tokens, and paths - **Hardened `.htaccess`** — block `.env`/`.git`/`composer.json` access + security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy) - **Fixed `robots.txt`** — blocks crawlers from `/admin`, `/filament`, `/log-viewer` - **Disabled Log Viewer by default** — no longer accessible without explicit config - **Disabled Boost browser logs watcher** — stopped logging JS errors from every visitor to disk - **Fixed `REDIS_PASSWORD`** — was literal string `"null"`, now empty - **Fixed Session `same_site`** — now reads from `.env` instead of being hardcoded - **Fixed non-existent model import** — `App\Models\Article` didn't exist, now aliased to `WebsiteArticle` - **Removed unused traits** — `HasNotificationUrl` and `HasCommonScopes` (dead code) - **Restricted CORS headers** — from wildcard `['*']` to specific allowed list - **Rebuilt all caches** — config, views, routes, opcache reset, PHP-FPM restart ## Credits - **Remco (Epicnabbo)** — Core Maintainer, System Architecture - **Kasja** — Design & Themes - **Kani** — RCON & API - **Atom Community** — Testing & Feedback
Made with love for the Retro Community