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.aldhechat.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/confdhe/home/ircd/anope/data. Teanope/datajanë 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 upgradesiircd. 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.rulesdhe 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.