Web Hosting Serverë VPS Email Hosting Radio + AutoDJ Aplikacione me një klik IRC Hosting Domene Faqe interneti Shërbime Blog Kontakt
Hyr Ndize tani

Si të ngresh serverin tënd IRC: UnrealIRCd, Anope dhe webchat në një VPS

Udhëzues i plotë, hap pas hapi: nga një VPS bosh te rrjeti yt IRC me TLS, NickServ dhe ChanServ, dhe chat në shfletues me KiwiIRC dhe TheLounge. Ashtu siç e ngritëm irc.ndize.al.

IRC është ende mënyra më e thjeshtë dhe më e lirë për të mbajtur një komunitet në një vend: pa reklama, pa algoritme, me kanalet dhe rregullat e tua. Në këtë udhëzues ngremë një rrjet IRC të plotë në një VPS, saktësisht siç e ngritëm irc.ndize.al:

  • UnrealIRCd 6, serveri IRC, me TLS në portin 6697;
  • Anope, shërbimet NickServ, ChanServ, MemoServ, OperServ dhe BotServ;
  • certifikatë TLS falas nga Let's Encrypt, që rinovohet vetë;
  • systemd, që gjithçka niset vetë pas një restarti;
  • KiwiIRC dhe TheLounge, që njerëzit të hyjnë në chat direkt nga shfletuesi.

Gjithçka që lidhet me IRC jeton nën një përdorues të vetëm, ircd, jo nën root. Kështu është më e sigurt dhe më e lehtë për t'u mbajtur.

Çfarë të duhet

  • Një VPS me Ubuntu 24.04 ose Debian 12/13, 1 CPU dhe 1–2 GB RAM. Mjafton edhe paketa më e vogël.
  • Një domen, me dy regjistrime DNS të tipit A që tregojnë te IP-ja e VPS-it: irc.domeniyt.al dhe chat.domeniyt.al.
  • Qasje SSH si root ose si përdorues me sudo.

Në shembujt më poshtë përdorim irc.domeniyt.al, chat.domeniyt.al dhe rrjetin domeniyt. Zëvendësoji me emrat e tu.

Hapi 1: Përgatit serverin

Përditëso sistemin dhe instalo paketat që duhen për të ndërtuar UnrealIRCd dhe Anope:

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential pkg-config cmake libssl-dev libpcre2-dev \
  libargon2-dev libsodium-dev libc-ares-dev libcurl4-openssl-dev libjansson-dev \
  nginx certbot ufw curl unzip

Krijo përdoruesin ircd. Ai do të mbajë serverin, shërbimet dhe webchat-in:

sudo useradd --create-home --home-dir /home/ircd --shell /bin/bash ircd
sudo chmod 751 /home/ircd

Hap portet në firewall: SSH, web (80, 443) dhe IRC (6697 me TLS, 6667 pa TLS për klientët e vjetër):

sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw allow 6697,6667/tcp
sudo ufw enable

Hapi 2: Instalo UnrealIRCd 6

Nga ky hap e tutje punojmë si përdoruesi ircd:

sudo -iu ircd
mkdir -p ~/src && cd ~/src
wget https://www.unrealircd.org/downloads/unrealircd-latest.tar.gz
tar xzf unrealircd-latest.tar.gz
cd unrealircd-6.*
./Config

./Config bën disa pyetje. Për shumicën mjafton Enter. Kujdes vetëm me këto:

  • Directory për instalimin: /home/ircd/unrealircd.
  • TLS certificate: pranoje që ta krijojë tani. Më vonë e zëvendësojmë me Let's Encrypt.

Pastaj ndërto dhe instalo:

make -j$(nproc)
make install
cd ~/unrealircd
cp conf/examples/example.conf conf/unrealircd.conf

Krijo tre çelësat për cloaking. Ata fshehin IP-në e vërtetë të përdoruesve. Ruaji, se do t'i vendosësh në konfigurim:

./unrealircd gencloak

Hapi 3: Konfiguro UnrealIRCd

Hap ~/unrealircd/conf/unrealircd.conf. Shembulli i UnrealIRCd është i dokumentuar mirë. Këto janë pjesët që ndryshojmë ne. Në fillim të skedarit shto modulet:

include "modules.default.conf";
loadmodule "cloak_sha256";
loadmodule "webserver";
loadmodule "websocket";
include "aliases/anope.conf";   /* komandat e shkurtra /ns /cs /ms /os */

Emri i serverit, portet dhe kush lejohet të lidhet:

me {
    name "irc.domeniyt.al";
    info "Rrjeti IRC i domeniyt";
    sid "001";
}

allow {
    mask *;
    class clients;
    maxperip 5;
}

listen { ip *; port 6697; options { tls; } }
listen { ip *; port 6667; }
/* vetëm për Anope, nga vetë serveri */
listen { ip 127.0.0.1; port 6900; options { serversonly; } }

Një operator, domethënë ti, me fjalëkalim të enkriptuar. Krijo hash-in me ./unrealircd mkpasswd dhe vendose në bllok:

oper emri-yt {
    class opers;
    mask *;
    password "$argon2id$...";   /* rezultati nga ./unrealircd mkpasswd */
    operclass netadmin-with-override;
    vhost staff.domeniyt.al;
}

Lidhja me Anope. Fjalëkalimi këtu duhet të jetë i njëjtë me atë që vendos te Anope në hapin 5. Krijo një të gjatë dhe të rastësishëm, p.sh. me openssl rand -hex 24:

link services.domeniyt.al {
    incoming { mask 127.0.0.1; }
    password "FJALEKALIMI-I-LIDHJES";
    class servers;
}
ulines { services.domeniyt.al; }

Dhe cilësimet e rrjetit:

set {
    network-name "domeniyt";
    default-server "irc.domeniyt.al";
    services-server "services.domeniyt.al";
    help-channel "#ndihme";
    cloak-prefix "domeniyt";
    modes-on-connect "+ixw";
    cloak-keys {
        "çelësi-1-nga-gencloak";
        "çelësi-2-nga-gencloak";
        "çelësi-3-nga-gencloak";
    }
    /* pa TLS: përdoruesit marrin paralajmërim, operatorët dhe serverët refuzohen */
    plaintext-policy { user warn; oper deny; server deny; }
}

Te blloku drpass vendos fjalëkalime të forta për restart dhe die, edhe këto me mkpasswd. Kontrollo konfigurimin para se ta nisësh:

./unrealircd configtest

Kur nuk ka më gabime, mund të vazhdosh. Nëse diçka mungon, mesazhi i tregon saktë rreshtin dhe arsyen.

Hapi 4: Certifikatë TLS falas me Let's Encrypt

Për certifikatën përdorim nginx, që na duhet gjithsesi për webchat-in. Dil nga përdoruesi ircd (exit) dhe krijo një dosje për verifikimin:

sudo mkdir -p /var/www/letsencrypt

Krijo /etc/nginx/sites-available/irc.domeniyt.al:

server {
    listen 80;
    server_name irc.domeniyt.al chat.domeniyt.al;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
        default_type "text/plain";
    }
    location / { return 301 https://$host$request_uri; }
}

Aktivizoje dhe merr certifikatat:

sudo ln -s /etc/nginx/sites-available/irc.domeniyt.al /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot certonly --webroot -w /var/www/letsencrypt -d irc.domeniyt.al
sudo certbot certonly --webroot -w /var/www/letsencrypt -d chat.domeniyt.al

UnrealIRCd nuk mund të lexojë dosjen e Let's Encrypt, sepse ajo është vetëm për root. Prandaj krijojmë një skript të vogël që ia kopjon certifikatën dhe e ringarkon. Ruaje si /usr/local/sbin/ircd-cert-deploy:

#!/bin/sh
set -e
LIVE=/etc/letsencrypt/live/irc.domeniyt.al
DEST=/home/ircd/unrealircd/conf/tls
install -o ircd -g ircd -m 0644 "$LIVE/fullchain.pem" "$DEST/server.cert.pem"
install -o ircd -g ircd -m 0600 "$LIVE/privkey.pem"   "$DEST/server.key.pem"
if systemctl is-active --quiet unrealircd; then
    runuser -u ircd -- /home/ircd/unrealircd/unrealircd reloadtls || true
fi

Bëje të ekzekutueshëm, nise një herë dhe thuaji certbot-it ta nisë pas çdo rinovimi:

sudo chmod 755 /usr/local/sbin/ircd-cert-deploy
sudo /usr/local/sbin/ircd-cert-deploy
echo "renew_hook = /usr/local/sbin/ircd-cert-deploy" | sudo tee -a /etc/letsencrypt/renewal/irc.domeniyt.al.conf

Tani certifikata rinovohet vetë çdo dy-tre muaj, dhe UnrealIRCd e merr pa u rinisur dhe pa e shkëputur askënd.

Hapi 5: Instalo dhe konfiguro Anope

Anope sjell shërbimet që i bëjnë njerëzit të ndihen si në shtëpi: NickServ ruan nick-un, ChanServ ruan kanalin dhe operatorët e tij, MemoServ lë mesazhe për përdoruesit offline. Përsëri si ircd:

sudo -iu ircd
cd ~/src
wget https://github.com/anope/anope/archive/refs/tags/2.0.20.tar.gz -O anope-2.0.20.tar.gz
tar xzf anope-2.0.20.tar.gz
cd anope-2.0.20
./Config

Kur të pyesë për dosjen e instalimit, shkruaj /home/ircd/anope. Pastaj:

cd build
make -j$(nproc)
make install
cd ~/anope/conf
cp example.conf services.conf
for f in botserv chanserv global hostserv memoserv nickserv operserv modules; do cp $f.example.conf $f.conf; done

Te services.conf ndryshojmë tre pjesë. Lidhja me UnrealIRCd, me të njëjtin fjalëkalim si te blloku link:

uplink
{
    host = "127.0.0.1"
    ipv6 = no
    ssl = no
    port = 6900
    password = "FJALEKALIMI-I-LIDHJES"
}

Protokolli. UnrealIRCd 6 përdor modulin unreal4:

module
{
    name = "unreal4"
    use_server_side_mlock = yes
    use_server_side_topiclock = yes
}

Emri i shërbimeve dhe rrjeti:

serverinfo
{
    name = "services.domeniyt.al"
    description = "Shërbimet e domeniyt"
}

networkinfo
{
    networkname = "domeniyt"
    ...
}

Te blloku oper vendos nick-un tënd me tipin Services Root, që të kesh të gjitha të drejtat te shërbimet. Lidhja me UnrealIRCd bëhet vetëm në 127.0.0.1, kështu që ssl = no këtu është në rregull: trafiku nuk del kurrë nga serveri.

Hapi 6: systemd, që gjithçka niset vetë

Dil nga ircd (exit) dhe krijo /etc/systemd/system/unrealircd.service:

[Unit]
Description=UnrealIRCd
After=network-online.target
Wants=network-online.target

[Service]
User=ircd
Group=ircd
WorkingDirectory=/home/ircd/unrealircd
ExecStart=/home/ircd/unrealircd/bin/unrealircd -F
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=16384
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full

[Install]
WantedBy=multi-user.target

Dhe /etc/systemd/system/anope.service. Ai niset vetëm pasi UnrealIRCd të jetë gati:

[Unit]
Description=Anope IRC Services
After=unrealircd.service
Requires=unrealircd.service

[Service]
User=ircd
Group=ircd
WorkingDirectory=/home/ircd/anope
ExecStart=/home/ircd/anope/bin/services --nofork
Restart=on-failure
RestartSec=10
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full

[Install]
WantedBy=multi-user.target

Nisi të dyja dhe kontrollo logun:

sudo systemctl daemon-reload
sudo systemctl enable --now unrealircd anope
sudo systemctl status unrealircd anope
tail -f /home/ircd/unrealircd/logs/ircd.log

Në log duhet të shohësh që services.domeniyt.al u lidh. Kur ndryshon konfigurimin e UnrealIRCd, mjafton sudo systemctl reload unrealircd. Askush nuk shkëputet.

Hapi 7: Provoje me një klient IRC

Lidhu me HexChat, mIRC, irssi ose WeeChat te irc.domeniyt.al, porti 6697 me TLS. Pastaj:

/msg NickServ REGISTER fjalekalimi-yt emaili@yt.al
/oper emri-yt fjalekalimi-i-operit
/join #domeniyt
/msg ChanServ REGISTER #domeniyt
/msg ChanServ SET #domeniyt PERSIST ON

Regjistro edhe #ndihme, kanalin ku vijnë njerëzit kur kanë pyetje. Ne e vendosëm si help-channel te konfigurimi. Klientët modernë mund të hyjnë edhe me SASL: nick-u identifikohet vetë që në lidhje, pa /msg NickServ IDENTIFY.

Hapi 8: Webchat me KiwiIRC

Shumica e njerëzve nuk kanë klient IRC. KiwiIRC u jep chat-in direkt në shfletues, pa instaluar asgjë. KiwiIRC lidhet me UnrealIRCd me websocket: nginx merr lidhjen në wss://chat.domeniyt.al/webirc/ dhe ia kalon UnrealIRCd-së në një port lokal.

Te unrealircd.conf shto portin e websocket-it dhe i thuaj UnrealIRCd-së t'i besojë nginx-it për IP-në e vërtetë të përdoruesit:

listen { ip 127.0.0.1; port 8000; options { websocket { type text; } } }
proxy nginx {
    type x-forwarded;
    match { ip 127.0.0.1; }
}

Pa bllokun proxy, të gjithë përdoruesit e webchat-it do të dukeshin sikur vijnë nga 127.0.0.1. Atëherë nuk mund të ndalosh një person të vetëm pa i ndaluar të gjithë.

Shkarko KiwiIRC si ircd dhe vendose në dosjen e faqes:

sudo -iu ircd
mkdir -p ~/www/chat && cd ~/src
wget https://github.com/kiwiirc/kiwiirc/releases/download/v1.7.1/kiwiirc-1.7.1.zip
unzip kiwiirc-1.7.1.zip -d kiwi-unzip
mv kiwi-unzip/dist ~/www/chat/kiwi

Te ~/www/chat/kiwi/static/config.json vendos serverin tënd. Me restricted përdoruesit nuk mund të lidhen me rrjete të tjera përmes faqes sate:

{
  "windowTitle": "Chat domeniyt",
  "restricted": true,
  "hideAdvanced": true,
  "language": "sq-al",
  "startupOptions": {
    "server": "chat.domeniyt.al",
    "port": 443,
    "tls": true,
    "direct": true,
    "direct_path": "/webirc/",
    "channel": "#domeniyt,#ndihme",
    "nick": "mysafir???",
    "greetingText": "Mirë se erdhe",
    "buttonText": "Hyr në chat"
  }
}

??? zëvendësohet me numra të rastësishëm, që dy mysafirë të mos kenë të njëjtin nick.

Hapi 9: TheLounge, chat-i që nuk fle

TheLounge është klient IRC në shfletues që qëndron i lidhur edhe kur e mbyll faqen. Kur kthehesh, sheh gjithçka që u shkrua ndërkohë. Do Node.js 22 ose më të ri:

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -
sudo apt install -y nodejs
sudo -iu ircd
mkdir -p ~/thelounge && cd ~/thelounge
npm install thelounge
THELOUNGE_HOME=~/.thelounge npx thelounge config   # krijon ~/.thelounge/config.js

Te ~/.thelounge/config.js ndryshojmë këto:

public: true,          // pa llogari: kushdo zgjedh nick dhe hyn
host: "127.0.0.1",     // vetëm nginx flet me të
port: 9000,
reverseProxy: true,    // IP-ja e vërtetë vjen nga nginx
lockNetwork: true,     // vetëm rrjeti yt
defaults: {
    name: "domeniyt",
    host: "127.0.0.1",
    port: 6697,
    tls: true,
    rejectUnauthorized: false,   // lidhje lokale, certifikata është për emrin publik
    nick: "mysafir%%%",
    username: "lounge",
    join: "#domeniyt,#ndihme",
},

Që UnrealIRCd të shohë IP-në e vërtetë edhe nga TheLounge, përdorim WEBIRC. Krijo një fjalëkalim të gjatë dhe vendose në të dyja anët. Te unrealircd.conf:

proxy thelounge {
    type webirc;
    match { ip 127.0.0.1; }
    password "FJALEKALIMI-WEBIRC";
}

Dhe te config.js i TheLounge:

webirc: {
    "127.0.0.1": "FJALEKALIMI-WEBIRC",
},

Një shërbim systemd edhe për të, /etc/systemd/system/thelounge.service:

[Unit]
Description=TheLounge
After=unrealircd.service network-online.target

[Service]
User=ircd
Group=ircd
Environment=THELOUNGE_HOME=/home/ircd/.thelounge
Environment=NODE_ENV=production
WorkingDirectory=/home/ircd/thelounge
ExecStart=/usr/bin/node /home/ircd/thelounge/node_modules/thelounge/index.js start
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now thelounge
sudo systemctl reload unrealircd

Hapi 10: Faqja chat.domeniyt.al në nginx

Tani bashkojmë gjithçka në një adresë: një faqe hyrëse, KiwiIRC te /kiwi/ dhe TheLounge te /lounge/. Krijo /etc/nginx/sites-available/chat.domeniyt.al:

server {
    listen 443 ssl http2;
    server_name chat.domeniyt.al;

    ssl_certificate     /etc/letsencrypt/live/chat.domeniyt.al/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.domeniyt.al/privkey.pem;

    root /home/ircd/www/chat;
    index index.html;

    location / { try_files $uri $uri/ =404; }

    # KiwiIRC
    location ^~ /kiwi/ {
        try_files $uri $uri/ /kiwi/index.html;
        location = /kiwi/static/config.json { expires -1; }
    }

    # KiwiIRC -> UnrealIRCd (websocket)
    location = /webirc/ {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_read_timeout 1d;
    }

    # TheLounge
    location ^~ /lounge/ {
        proxy_pass http://127.0.0.1:9000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_read_timeout 1d;
    }
}

proxy_read_timeout 1d ka rëndësi: pa të, nginx e mbyll lidhjen e chat-it pas një minute qetësie. Hiq chat.domeniyt.al nga server_name te skedari i hapit 4, aktivizo faqen dhe ringarko:

sudo ln -s /etc/nginx/sites-available/chat.domeniyt.al /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Vendos një index.html të thjeshtë te /home/ircd/www/chat me dy butona, "Hyr me KiwiIRC" dhe "Hyr me TheLounge", dhe udhëzimet për klientët e zakonshëm. Shembulli ynë është chat.ndize.al.

Mirëmbajtja: pak punë, por e rregullt

  • Backup: ruaj rregullisht /home/ircd/unrealircd/conf, /home/ircd/anope/conf dhe /home/ircd/anope/data. Te anope/data janë nick-et dhe kanalet e regjistruara.
  • Përditësimet: UnrealIRCd njofton në log kur ka version të ri. Përditësimi bëhet me ./unrealircd upgrade si ircd. Ndiq edhe njoftimet e Anope.
  • Fjalëkalimet: mbaji në një skedar që lexon vetëm ircd (chmod 600), kurrë në kanal ose në chat.
  • Rregullat: shkruaji te conf/ircd.rules dhe te MOTD-ja, që çdo përdorues i ri t'i shohë.

Nuk ke kohë për gjithë këtë?

Një VPS nga ndize.al të jep gjithçka që të duhet për këtë udhëzues: Ubuntu ose Debian, qasje root dhe IP publike. Nëse do rrjetin pa u marrë me konfigurimin, me IRC Hosting e instalojmë dhe e mbajmë ne. Ti merresh me komunitetin. Dhe nëse ke ngecur diku, eja te #ndihme në chat.ndize.al.

Pyetje të shpeshta

Sa i fortë duhet të jetë VPS-i për një server IRC?

Shumë pak. UnrealIRCd dhe Anope bashkë përdorin rreth 100 MB RAM për qindra përdorues. Një VPS me 1 CPU dhe 1–2 GB RAM mjafton, edhe me KiwiIRC dhe TheLounge.

A më duhet domen?

Po, për certifikatën TLS falas nga Let's Encrypt të duhet një emër si irc.domeniyt.al, që tregon te IP-ja e VPS-it. Për webchat-in shto edhe chat.domeniyt.al.

Pse nuk e nis UnrealIRCd si root?

UnrealIRCd refuzon të niset si root, dhe kjo është e mirë: nëse dikush gjen një dobësi, ka në dorë vetëm përdoruesin ircd, jo gjithë serverin.

A mund ta bëni ju gjithë konfigurimin?

Po. Me paketat IRC Hosting të ndize.al marrim përsipër instalimin, përditësimet, botet dhe webchat-in, dhe ti merresh vetëm me komunitetin.