Posodobitve kritičnih PHP ranljivosti (CVE-2026-109618, CVE-2026-109619). VEČ O TEM

✕
Košarica (0)
  • Vaša košarica je trenutno prazna

NEOSERV BLOG

Nasveti, vodiči in koristne informacije o domenah, gostovanju, SSL certifikatih, e-pošti, spletni optimizaciji in varnosti na spletu.

Node.js aplikacija in MySQL (MariaDB)
Kategorija: Triki in nasveti
Objavljeno:

Skoraj vsaka spletna aplikacija hrani podatke v bazi. Aplikacije, ki jih pripravite z AI asistentom, pogosto uporabljajo SQLite ali pričakujejo bazo na localhost. V tem prispevku boste izvedeli, kako Node.js aplikacijo na našem gostovanju povezati z bazo MySQL (MariaDB) in na kaj morate paziti. Postopek smo preizkusili na paketih Zeleni in Turbo.

Kazalo

Povezava Node.js aplikacije z bazo MySQL

Poglejmo, kako v cPanel ustvariti bazo MySQL, nastaviti podatke za povezavo in jo povezati z Node.js aplikacijo.

1. korak: ustvarite bazo in uporabnika

  1. V cPanel odprite MySQL Databases (ali Database Wizard).
  2. Ustvarite bazo, npr. mojaapi. Pred ime se samodejno doda predpona vašega uporabniškega imena: uporabnik_mojaapi.
  3. Ustvarite uporabnika z močnim geslom in ga dodajte k bazi z vsemi pravicami (ALL PRIVILEGES).

Na strežnikih teče MariaDB 11.4, ki je združljiva z MySQL.

2. korak: podatke za povezavo shranite v spremenljivke okolja

V Setup Node.js App → Environment variables dodajte:

Ime Vrednost
DB_HOST localhost
DB_USER uporabnik_mojaapi
DB_PASS geslo uporabnika
DB_NAME uporabnik_mojaapi

Nato aplikacijo ponovno zaženite. Gesla ne pišite v kodo.

3. korak: povezava s paketom mysql2

V virtualnem okolju aplikacije namestite paket:

npm install mysql2
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  database: process.env.DB_NAME,
  charset: 'utf8mb4',
  connectionLimit: 5,
  enableKeepAlive: true,
  idleTimeout: 60000,
});

app.get('/api/igralci', async (req, res) => {
  const [rows] = await pool.query('SELECT id, ime FROM igralci');
  res.json(rows);
});

Zakaj te nastavitve:

  • connectionLimit: 5: število hkratnih povezav z bazo je omejeno (npr. 50 pri paketu Zeleni, 200 pri paketih Turbo), povezave pa si delijo vse aplikacije na paketu.
  • idleTimeout: strežnik baze zapre povezavo, ki 3 minute ni bila uporabljena. Bazen povezav s krajšim časom neaktivne povezave zapre sam in ne vrne napake »Connection lost«.
  • charset: 'utf8mb4': pravilen prikaz šumnikov in emojijev.

Šumniki in emoji: ustvarite tabele z utf8mb4

Nova baza na strežniku ima lahko privzet nabor znakov latin1. Tabele, ustvarjene brez navedbe nabora znakov, ne shranijo emojijev (napaka »Incorrect string value«), šumniki pa se lahko prikažejo napačno. Zato tabele vedno ustvarite z utf8mb4:

CREATE TABLE igralci (
  id INT AUTO_INCREMENT PRIMARY KEY,
  ime VARCHAR(100) NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Lahko pa takoj po ustvarjanju spremenite privzeti nabor znakov celotne baze (v phpMyAdmin → zavihek SQL):

ALTER DATABASE uporabnik_mojaapi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Sprememba velja za tabele, ustvarjene po tem ukazu. Obstoječe tabele pretvorite z ALTER TABLE ime CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;.

ORM: Sequelize, Knex, Drizzle

ORM knjižnice, ki uporabljajo paket mysql2, delujejo enako. Nastavite jim enake podatke za povezavo, majhen bazen povezav (npr. pool: { max: 5 }) in nabor znakov utf8mb4. Migracije zaženite v virtualnem okolju aplikacije, npr. npx sequelize-cli db:migrate ali npx knex migrate:latest.

Prisma

Prisma privzeto uporablja pogon, napisan v jeziku Rust, ki na strežniku zazna vse procesorje strežnika in ustvari več kot 50 niti. Na paketih Zeleni, Modri in Rdeči to zapolni omejitev procesov in niti paketa (100 pri paketu Zeleni): poizvedbe vračajo napako »timer has gone away«, nehajo pa delovati tudi druge strani na paketu. Na paketih Turbo privzeta nastavitev deluje.

Na paketih Zeleni, Modri in Rdeči uporabite Prismo brez pogona Rust, z gonilnikom za MariaDB (preizkušeno s Prisma 6):

npm install prisma@6 @prisma/client@6 @prisma/adapter-mariadb@6

V schema.prisma:

generator client {
  provider   = "prisma-client-js"
  engineType = "client"
}

V aplikaciji:

const { PrismaClient } = require('@prisma/client');
const { PrismaMariaDb } = require('@prisma/adapter-mariadb');

const prisma = new PrismaClient({
  adapter: new PrismaMariaDb({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME,
    connectionLimit: 5,
  }),
});

Aplikacija tako porabi približno 11 niti in 95 MB pomnilnika.

Ukaze Prisma CLI (prisma generate, prisma db push, prisma migrate deploy) na strežniku zaženite z omejitvijo na en procesor, sicer se lahko ustavijo z zavajajočo napako »P1001: Can’t reach database server«:

taskset -c 0 npx prisma db push

Migracije lahko zaženete tudi s svojega računalnika prek oddaljenega dostopa do baze (glejte spodaj).

Pozor: npm install prisma brez različice trenutno namesti predizdajo Prisma 8. Različico vedno navedite.

SQLite ali MySQL?

SQLite (paket better-sqlite3, namesti se v nekaj sekundah brez prevajanja) deluje za manjše aplikacije z enim uporabnikom ali malo pisanja. Datoteko baze hranite v mapi aplikacije (ne v public_html), uporabite absolutno pot in vklopite način WAL:

const Database = require('better-sqlite3');
const db = new Database(require('path').join(__dirname, 'data.db'));
db.pragma('journal_mode = WAL');

Za aplikacije z več uporabniki priporočamo MySQL.

Omejitve gostovanja

Pri uporabi baz MySQL/MariaDB je treba upoštevati omejitve posameznega paketa:

  • Velikost posamezne baze je omejena (npr. 2 GB pri paketih Zeleni, Modri in Rdeči, 10 GB pri paketih Turbo). Podrobnosti so v pogojih uporabe.
  • Število hkratnih povezav z bazo je omejeno (npr. 50 pri paketu Zeleni).

Oddaljen dostop do baze

Do baze lahko dostopate tudi z drugega strežnika ali svojega računalnika, na primer, ko zaledje vaše aplikacije teče drugje ali ko želite bazo upravljati z orodjem, kot je DBeaver ali MySQL Workbench.

  1. V cPanel odprite Remote MySQL.
  2. Dodajte javni IP naslov strežnika ali računalnika, s katerega se boste povezovali.
  3. Kot strežnik baze uporabite ime strežnika vašega gostovanja (najdete ga v cPanel), vrata 3306.

Povezava je lahko šifrirana (TLS 1.3). Certifikat strežnika baze je samopodpisan, zato mora biti odjemalec nastavljen tako, da certifikata ne preverja.

Če za povezavo z bazo uporabljate paket mysql2, šifrirano povezavo nastavite tako:

const pool = mysql.createPool({
  host: 'ime-streznika.neoserv.si',
  // ... uporabnik, geslo, baza
  ssl: { rejectUnauthorized: false },
});

Nasveti

  • Dodajte samo IP naslove, ki jih res potrebujete, in jih odstranite, ko jih ne potrebujete več.
  • Za aplikacijo, ki teče na drugem strežniku, je vsak klic do baze počasnejši zaradi omrežne razdalje. Kadar je mogoče, naj aplikacija teče na istem paketu kot baza.
  • Če potrebujete preverjen certifikat ali posebne nastavitve baze, priporočamo VPS strežnik.

Zunanje baze

Aplikacija se lahko poveže tudi z zunanjo bazo MongoDB (npr. MongoDB Atlas, vrata 27017).

Zunanje baze PostgreSQL in Redis na vratih 5432 in 6379 niso dosegljive.

Če potrebujete pomoč pri povezavi aplikacije z bazo, smo vam na voljo.

KOMENTARJI

KOMENTIRAJTE OBJAVO

(obvezno)
(obvezno, e-poštni naslov bo skrit)
(neobvezno)
Varnostno vprašanje, ki potrdi, da ste resnična oseba.