99.9% uptime · 24/7 support
Help Center · Managed VPS

Documentation

Everything you need to ship on RifatXtra — domains, SSL, PHP & Node apps, databases and email.

Your hosting at a glance

#

After logging in, open My Hosting and click Manage on a package. That opens the hosting dashboard — a searchable grid of tools grouped into Files, Domains, Email, Databases, Software, Security, Advanced and Metrics, with a left sidebar to move between them and a panel on the right showing live CPU, RAM, disk and bandwidth plus counters for your domains, databases and email.

  1. 1

    Log in at the client area and open My Hosting.

  2. 2

    Click Manage on the package you want to work on.

  3. 3

    Search, or pick a tool from the grid or the left sidebar (Domains, Databases, Email, Setup App, …).

Add a domain

#

Open your hosting → Domains, then add your domain or subdomain. First point its DNS to your server with these records at your registrar:

  1. 1

    At your registrar, add an A record for @, www and * pointing to your server IP (shown on the Domains page).

  2. 2

    Back in the panel, click Add domain and enter the name.

  3. 3

    Wait for DNS to propagate, then install SSL (next section).

Your server IP is per package. We run multiple servers and each hosting package lives on one of them — even two packages on the same account can be on different servers. Always use the IP shown on this package's Domains page; never copy it from another package, an old note, or a guide.

Cloudflare users: set the domain to DNS Only (grey cloud) before adding it or installing SSL, so Let's Encrypt can verify it. Re-enable the proxy (orange cloud) after the certificate is issued.

Free SSL (HTTPS)

#

Every domain can get a free Let's Encrypt certificate. On the Domains page, click Install SSL next to the domain. It renews automatically.

SSL validation needs the domain to resolve to your server. If you use Cloudflare, keep it grey-cloud (DNS Only) until the certificate is installed.

Set up an app — pick your stack

#

Every new domain serves a welcome page until you set up an app. Open Setup App (under Software), pick the domain and choose your framework. Upload your code into the app folder first (use File Manager, or SFTP) — it lives at /var/www/apps/<your-domain>. Then follow the guide for your stack below.

You install dependencies and run maintenance from Command Runner (under Software) — there is no separate shell to log into. See Command Runner.

Plain PHP

#

For a plain PHP site with no framework:

  1. 1

    In Setup App, choose PHP (FPM).

  2. 2

    Leave Document root blank if your index.php is at the top of the app folder, or set it to the sub-folder that holds index.php.

  3. 3

    Upload your files in File Manager and open the domain — done.

Static site / SPA (React, Vite, Vue)

#

Host a built single-page app or any static site — no PHP or Node server, just files served straight off disk. In Setup App choose Static / SPA and set Document root to your build output folder (dist for Vite, build for Create React App). Client-side routing (React Router, Vue Router) and deep-link refreshes work automatically — any unknown path falls back to index.html.

  1. 1

    Build your app — locally / in CI with npm run build, or on the server from Command Runner (npm install, then npm run build).

  2. 2

    Upload the build (the dist / build folder) in File Manager.

  3. 3

    In Setup App pick Static / SPA and set Document root to dist (or build).

  4. 4

    Install SSL and open the site — there is no port to set and no restart needed.

Environment variables are build-time, not server-side. Vite (VITE_*) and CRA (REACT_APP_*) bake env into the JS bundle when you run npm run build — set them in .env before building, not on the server. They are public (anyone can read them in the browser), so only put public config like an API URL there — never secrets or keys.

Laravel (PHP-FPM)

#

Standard Laravel on PHP-FPM. After uploading your code:

  1. 1

    In Setup App choose PHP (FPM) and set Document root to public.

  2. 2

    Open Command Runner, set the folder to your domain, and click composer install.

  3. 3

    Click artisan storage:link so uploaded files under public/storage are reachable.

  4. 4

    Create a database in Databases, then put the credentials into your .env (edit it in File Manager).

  5. 5

    Click artisan migrate --force, then Restart the domain.

  6. 6

    Need background jobs or scheduled tasks? In Setup App tick Queue Worker and/or Scheduler — the panel runs queue:work and schedule:run for you, no crontab needed.

storage link: always use the panel's artisan storage:link button — it creates a relative link that works for both the website and the file manager. Running php artisan storage:link yourself over SSH makes an absolute link that 404s. After editing .env or config, click artisan config:clear / artisan optimize:clear.

Laravel Octane

#

High-performance Laravel served by a long-running Octane worker — faster than FPM.

  1. 1

    Install Octane: open Command Runner, set the folder to your domain, and click install Laravel Octane (swoole). The Swoole engine is already on the server — this adds the laravel/octane package your app needs.

  2. 2

    In Setup App choose Laravel Octane and set Document root to public.

  3. 3

    From Command Runner run composer install and artisan storage:link, set up your .env and database, then artisan migrate --force.

  4. 4

    Click Restart after every deploy — Octane holds your app in memory, so new code only loads on restart.

Queue & scheduler are automatic. Tick them in Setup App and the panel runs the queue worker and scheduler for you — you never start queue:work or set up cron. (Available for plain PHP-FPM Laravel apps too, not just Octane.) Just deploy and Restart.

WordPress

#

Install and manage WordPress from the dedicated WordPress tool (under Software) — no framework to pick and no password to remember.

  1. 1

    Open WordPress and click Install WordPress. Choose the domain and set your site title and admin account.

  2. 2

    The panel installs WordPress with its own database automatically — the site shows Installing…, then Installed.

  3. 3

    Click Log in to Admin for one-click, passwordless sign-in to wp-admin; use Show login to reveal the admin username and password any time.

Prefer the manual route? Setup App still offers WordPress as a framework choice too — both work.

Node.js (Express, plain Node…)

#

In Setup App choose Node.js and set the Startup file (server.js, app.js or index.js). Your app must listen on the port shown on the domain row — read it from process.env.PORT — and bind 0.0.0.0, not localhost.

server.js
const http = require('http');
const port = process.env.PORT || 3000;

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end('Hello, World!');
}).listen(port, '0.0.0.0', () => console.log('Listening on ' + port));
A plain script with no dependencies runs as-is. If your app uses packages, open Command Runner and click npm install first, then Restart. A 502 means your app isn't listening on its port yet — fix the code and Restart.

Next.js

#

There is no startup file for Next.js, and you don't need a standalone build. Run a normal next build, upload the output, and we run it for you with npm start — you just click Restart.

  1. 1

    Run a plain next build on Ubuntu / Linux (a CI runner or a Linux machine — not Windows or macOS). A Linux build is required: npm start loads the Linux-native binaries in node_modules, so a Windows/macOS build will crash on the server.

  2. 2

    In Setup App choose Next.js. You don't set a startup file, a port, or a run command — we run npm start for you.

  3. 3

    Upload the build output into the app folder — these four items:

  4. 4

    Click Restart. We launch npm start bound to 0.0.0.0 on the correct port; nginx serves .next/static and public straight from disk.

files to upload
app-folder/
├─ .next/           # the full `next build` output (do NOT use output: 'standalone')
├─ node_modules/    # installed on Linux — never ship Windows/macOS ones
├─ public/          # your static assets
├─ package.json     # we read its "start" script
└─ next.config.js   # include it if you have one (rewrites, images, …)
Your package.json needs a start script (the default next start is fine). A 502 right after Restart usually means the build is still starting, or node_modules was built on the wrong OS — rebuild on Linux and upload again.

NestJS

#

NestJS runs from its compiled output.

  1. 1

    Run npm run build (locally or in CI) to produce dist/.

  2. 2

    In Setup App choose NestJS and set Startup file to dist/main.js.

  3. 3

    Open Command Runner → npm install, then Restart.

  4. 4

    Listen on process.env.PORT and bind 0.0.0.0.

Databases

#

Open your hosting → Databases to create MySQL databases and users.

  1. 1

    Click Create database; a database and user are created for you.

  2. 2

    Use Open phpMyAdmin for one-click access — no password to type.

  3. 3

    Use Reset password if you need fresh credentials for your app config.

Email accounts

#

Open your hosting → Email to create mailboxes on your domains.

  1. 1

    Click Create email, set the address and password.

  2. 2

    Add the shown mail DNS records (MX, SPF, DKIM, DMARC) at your registrar so mail delivers and isn't marked spam. These values are generated for your server — copy them exactly as shown.

  3. 3

    Use Open Webmail to read mail in the browser — one click, no password to type, and it always opens the right webmail for your server.

We run multiple mail servers. Which one hosts your email depends on which server your package is on, so the mail server name and DNS values differ per package. Everything shown on your Email page is already correct for your server — always copy from there, never from another account or an old tutorial.

Email on your phone or Outlook (IMAP & SMTP)

#

Any standard mail app works — Outlook, Apple Mail, Gmail app, Thunderbird. Your exact server name is shown on your hosting → Email page under Mail Client Settings; enter it with the settings below.

  1. 1

    Username: the full email address (e.g. [email protected]). Password: the mailbox password you set.

  2. 2

    Incoming (IMAP): the server shown on your Email page — port 993, SSL/TLS.

  3. 3

    Outgoing (SMTP): the same server — port 587, STARTTLS (or 465, SSL/TLS). Tick "outgoing server requires authentication" and use the same username and password.

  4. 4

    Send yourself a test email both ways (to and from another address) to confirm sending and receiving work.

Don't guess the server name. Your package may live on any of our servers, so the mail server can be mail.rifatxtra.com, mail2.rifatxtra.com, etc. — always copy it from your own Email page. If mail suddenly stops working in your app after your hosting was moved, re-check the server name there first.

File manager

#

From your hosting overview, click File Manager to browse, upload, edit and delete your app files in the browser. It is locked to your own hosting — you only ever see your own files, at /var/www/apps/<your-domain>.

Use it to upload code, edit your .env, or check logs. For larger transfers, SFTP also works.

Backups and restoring

#

We back your hosting up automatically, twice a day, to off-site storage — you don't schedule anything. Open Backups (under Files) to see every snapshot and restore one yourself, without opening a ticket. Three kinds are kept: your website files, each database, and each mailbox.

  1. 1

    Website files — pick a snapshot and click Restore files. Your current files are overwritten and the container restarts; your domains, databases and plan settings are untouched.

  2. 2

    Databases — each database lists its own dumps. Restoring overwrites that one database; the others are not affected.

  3. 3

    Email — each mailbox lists its own snapshots. Restoring replaces the messages in that one mailbox only.

  4. 4

    A restore runs in the background — the page shows its progress and refreshes itself when it finishes.

A restore overwrites — it does not merge. Anything created after the snapshot you pick is lost, so choose the timestamp deliberately. Deleting a container, mailbox or database also keeps a recovery copy in our 30-day trash, so accidental deletions can usually still be undone — contact support. Only one restore runs at a time.

Command Runner (your in-app terminal)

#

Instead of a raw shell, your hosting gives you a safe Command Runner (under Software) — the maintenance commands you actually need, nothing more. Each one runs inside your own container as your app user, so it can only ever touch your hosting.

  1. 1

    Open Command Runner from the Software group.

  2. 2

    Set the folder to the app you're working on — pick your domain (it maps to /var/www/apps/<domain>).

  3. 3

    Click a command; its full output appears below so you can see exactly what happened.

Available: composer install / update, npm install (and install a single package), install Laravel Octane (swoole), artisan storage:link, artisan migrate --force, composer dump-autoload, the cache clears (optimize:clear, config:clear, cache:clear, route:clear, view:clear), artisan queue:restart and artisan octane:reload. We don't expose a raw terminal for security — these cover normal deploys. For Laravel apps (Octane or PHP-FPM) the queue worker and scheduler are added for you when you tick them.

Auto-deploy from GitHub (CI/CD)

#

Every push builds on GitHub and ships the finished code straight to your hosting over SSH — nothing builds on the server, so it never eats your plan's CPU/RAM. Works for public and private repos. Set the key once and every push after that deploys itself. Your .env, storage/ and uploaded files are never touched.

  1. 1

    Open Git Deploy (under Advanced), click Deploy on your app, then Enable SSH deploy. A one-time private key and your connection details (host, user appdeploy) appear.

  2. 2

    Copy the key into your GitHub repo as an Actions secret named DEPLOY_SSH_KEY (Settings → Secrets and variables → Actions → New repository secret). Lost it later? Click Rotate key for a fresh one.

  3. 3

    Commit the workflow below as .github/workflows/deploy.yml, replacing YOUR_SERVER_IP with the host shown in the panel and adjusting the build steps for your stack. Push to your branch.

  4. 4

    GitHub builds your app and rsyncs it here, then runs your migrate/restart steps — watch the Deploying… badge on the app turn live. The full build + deploy log is in your GitHub Actions run.

.github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [ "main" ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # --- Build your app on GitHub (edit for your stack) ---
      - uses: shivammathur/setup-php@v2
        with: { php-version: '8.3' }
      - run: composer install --no-dev --optimize-autoloader --no-interaction
      # Node build (uncomment if you need it):
      # - uses: actions/setup-node@v4
      #   with: { node-version: '20' }
      # - run: npm ci && npm run build

      # --- Ship the built code straight to your hosting over SSH ---
      # HOST is shown in your Deploy panel; the key is the DEPLOY_SSH_KEY secret.
      - name: Set up SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -H YOUR_SERVER_IP >> ~/.ssh/known_hosts
      - name: Push code
        run: |
          rsync -az --exclude='.git' --exclude='.env' --exclude='storage/' \
            -e "ssh -i ~/.ssh/deploy_key" ./ appdeploy@YOUR_SERVER_IP:/
      - name: Migrate & restart
        run: |
          ssh -i ~/.ssh/deploy_key appdeploy@YOUR_SERVER_IP "run migrate"
          ssh -i ~/.ssh/deploy_key appdeploy@YOUR_SERVER_IP "run restart"
          ssh -i ~/.ssh/deploy_key appdeploy@YOUR_SERVER_IP "run report ${{ github.sha }}"
The deploy key is locked to this one app: it can rsync into this app's folder and run a fixed set of safe maintenance commands (run migrate, run restart, run cache:clear, run artisan:<your-command>, …) — it cannot open a shell, reach another app, or touch the server itself. Files land already owned by the web user, so permissions are always correct. Build on Linux runners (ubuntu-latest) so native modules match the server. An older artifact push method (upload a pre-built release through the panel) is still available under Advanced in the Deploy panel for builds you'd rather not send over SSH.

Restart and troubleshooting

#

After deploying new code — or if an app stops responding — restart it. Use the per-domain Restart button on the Domains page for one site, or Restart Hosting (under Advanced) to restart everything. It brings your sites back in a few seconds.

  1. 1

    502 Bad Gateway on a Node app → it isn't listening on its port (or crashed). Check your code uses process.env.PORT and binds 0.0.0.0, then Restart.

  2. 2

    Images / uploads 404 under /storage (Laravel) → re-run artisan storage:link from Command Runner — the panel makes the correct relative link.

  3. 3

    Still stuck? Contact [email protected] — we manage the servers for you.

What's supported (runtimes & services)

#

Everything below is included with your hosting and already running — you don't install or pay extra for any of it. Pick a runtime per app when you Setup App; the services are shared infrastructure your apps simply connect to.

  1. 1

    PHP 8.3 or 8.4 — as classic PHP-FPM or high-performance Laravel Octane. Composer is built in.

  2. 2

    Node.js 24 — Express / plain Node, Next.js and NestJS. npm is built in.

  3. 3

    MySQL — create your own databases and users in Databases, and manage them in one click with phpMyAdmin.

  4. 4

    Redis — your own private instance for cache, sessions and queues (see the next section for setup).

  5. 5

    Free SSL (Let's Encrypt, auto-renewing) and email — mailboxes with SPF/DKIM/DMARC plus Roundcube webmail.

Need a PHP extension or a service that isn't listed here? Email [email protected] — most common extensions can be enabled for you.

Redis, cache, sessions & queues

#

Every package includes its own Redis server, private to your hosting — ready for cache, sessions and queues. It's already running and wired into your container, so you only point your app at it; there is no Redis server to install or configure.

  1. 1

    It's reachable at host redis-main, port 6379, with no password — REDIS_HOST and REDIS_PORT are already set for you.

  2. 2

    In Laravel the driver is redis — never predis. Set SESSION_DRIVER=redis, CACHE_STORE=redis and/or QUEUE_CONNECTION=redis as you need them.

  3. 3

    Choose the Redis client with REDIS_CLIENT. The reliable option is predis (pure PHP, nothing to compile): run composer require predis/predis once from Command Runner, then set REDIS_CLIENT=predis.

  4. 4

    Edit your .env in File Manager, then run artisan config:clear from Command Runner and Restart the app.

.env
SESSION_DRIVER=redis
CACHE_STORE=redis
QUEUE_CONNECTION=redis

REDIS_CLIENT=predis      # then run once: composer require predis/predis
REDIS_HOST=redis-main
REDIS_PORT=6379
REDIS_PASSWORD=null
Saw Driver [predis] not supported? That means your .env set SESSION_DRIVER=predis (or CACHE_STORE=predis). predis is the client library, never the driver — the driver is always redis. Fix the value, run artisan config:clear, and Restart.

Still stuck?

We manage the servers for you — reach out and we'll sort it.

Contact support