Files
bluejay-infra/apps/irc/irc.yaml

548 lines
11 KiB
YAML

# UnrealIRCd + Anope IRC Services
# ArgoCD managed - BlueJay Lab
---
apiVersion: v1
kind: Namespace
metadata:
name: irc
labels:
app.kubernetes.io/part-of: bluejay-infra
---
# TLS Certificate for IRC
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: irc-tls
namespace: irc
spec:
secretName: irc-tls
issuerRef:
name: step-ca-acme
kind: ClusterIssuer
dnsNames:
- irc.iamworkin.lan
---
# UnrealIRCd configuration
apiVersion: v1
kind: Secret
metadata:
name: unrealircd-config
namespace: irc
type: Opaque
stringData:
unrealircd.conf: |
/* BlueJay Lab IRC - UnrealIRCd 6.x config */
/* Managed by ArgoCD */
include "modules.default.conf";
include "help/help.conf";
include "operclass.default.conf";
include "snomasks.default.conf";
loadmodule "cloak_sha256";
me {
name "irc.iamworkin.lan";
info "BlueJay Lab IRC Server";
sid 001;
}
admin {
"BlueJay Lab IRC";
"admin@iamwork.in";
}
class clients {
pingfreq 90;
maxclients 500;
sendq 200k;
recvq 8000;
}
class opers {
pingfreq 90;
maxclients 50;
sendq 1M;
recvq 8000;
}
class servers {
pingfreq 60;
connfreq 15;
maxclients 10;
sendq 20M;
}
allow {
mask *;
class clients;
maxperip 5;
}
listen {
ip *;
port 6667;
}
listen {
ip *;
port 6697;
options { tls; }
tls-options {
certificate "/app/conf/tls/server.cert.pem";
key "/app/conf/tls/server.key.pem";
}
}
listen {
ip *;
port 8067;
}
oper bluejay {
mask *;
password "BlueJay-IRC-Oper-2026";
operclass netadmin-with-override;
class opers;
}
drpass {
restart "BlueJay-IRC-Oper-2026";
die "BlueJay-IRC-Oper-2026";
}
link services.iamworkin.lan {
incoming {
mask *;
}
password "BlueJay-Services-Link-2026";
class servers;
}
ulines {
services.iamworkin.lan;
}
log {
source {
all;
\!debug;
}
destination {
channel "#ops";
}
}
set {
network-name "BlueJayIRC";
default-server "irc.iamworkin.lan";
services-server "services.iamworkin.lan";
stats-server "stats.iamworkin.lan";
help-channel "#general";
cloak-keys {
"ZWKeb8YevNiL45Xdh2p5u4tv2xksWgb8YPQSvmerBmNObyGbTDGnU4PNomZaLbZ1D9M2Cy6njM1XLJUkJhAx1oY3coBdZoPykEo7";
"KqRaLeA6ijOnWDdCqYtJ6rb1VgR8lYnU9Sey7cbRhi3PsGzD5gZONJXyUdbJ7bD26QKCuiDydBsccUVKC3lYN0HJ9sGTlOYR3c2m";
"2I4oopLDY79Fr4Mucy63EVOfkelVV23nESPWoqMnP1pUc8Yg0D4RK1mVtxyEhdTPpLFyKgG4fRlb6R33eHoQe7yi7moOu4W1Waw6";
}
kline-address "admin@iamwork.in";
maxchannelsperuser 25;
anti-flood {
everyone {
connect-flood 3:60;
}
}
options {
hide-ulines;
show-connect-info;
}
/* TLS config */
tls {
certificate "/app/conf/tls/server.cert.pem";
key "/app/conf/tls/server.key.pem";
}
}
---
# Anope configuration
apiVersion: v1
kind: Secret
metadata:
name: anope-config
namespace: irc
type: Opaque
stringData:
services.conf: |
define
{
name = "services.host"
value = "services.iamworkin.lan"
}
uplink
{
host = "unrealircd.irc.svc.cluster.local"
port = 8067
password = "BlueJay-Services-Link-2026"
}
serverinfo
{
name = "services.iamworkin.lan"
description = "BlueJay IRC Services"
pid = "/anope/data/services.pid"
motd = "/anope/data/services.motd"
}
module { name = "unreal4" }
networkinfo
{
networkname = "BlueJayIRC"
nicklen = 31
userlen = 10
hostlen = 64
chanlen = 32
}
options
{
casemap = "ascii"
strictpasswords = yes
readtimeout = 5s
warningtimeout = 4h
}
module { name = "enc_sha256" }
module { name = "db_flatfile" }
module { name = "nickserv" }
module { name = "ns_identify" }
module { name = "ns_register" }
module { name = "ns_set" }
module { name = "ns_drop" }
module { name = "ns_recover" }
module { name = "ns_info" }
module { name = "ns_list" }
module { name = "ns_access" }
module { name = "ns_group" }
module { name = "chanserv" }
module { name = "cs_register" }
module { name = "cs_set" }
module { name = "cs_access" }
module { name = "cs_ban" }
module { name = "cs_kick" }
module { name = "cs_mode" }
module { name = "cs_topic" }
module { name = "cs_info" }
module { name = "cs_list" }
module { name = "cs_drop" }
module { name = "operserv" }
module { name = "os_akill" }
module { name = "os_mode" }
module { name = "os_kick" }
module { name = "os_kill" }
module { name = "os_list" }
module { name = "os_stats" }
module { name = "os_reload" }
module { name = "os_shutdown" }
module { name = "botserv" }
module { name = "bs_bot" }
module { name = "bs_assign" }
module { name = "hostserv" }
module { name = "hs_set" }
module { name = "hs_request" }
module { name = "memoserv" }
module { name = "ms_send" }
module { name = "ms_read" }
module { name = "ms_del" }
module { name = "ms_list" }
module { name = "global" }
module { name = "gl_global" }
nickserv
{
nick = "NickServ"
defaults = "kill_quick ns_secure ns_private hide_email"
registration = "none"
expire = 90d
}
chanserv
{
nick = "ChanServ"
defaults = "keeptopic peace cs_secure"
expire = 14d
}
operserv
{
nick = "OperServ"
}
botserv
{
nick = "BotServ"
defaults = "dontkickops fantasy greet"
}
hostserv
{
nick = "HostServ"
}
memoserv
{
nick = "MemoServ"
maxmemos = 20
}
global
{
nick = "Global"
}
oper
{
name = "bluejay"
type = "Services Root"
}
db_flatfile
{
database = "/anope/data/anope.db"
fork = yes
}
log
{
target = "/anope/data/services.log"
admin = "*"
override = "chanserv/* nickserv/* operserv/*"
commands = "chanserv/* nickserv/* operserv/*"
servers = "*"
channels = "*"
users = "connect disconnect"
}
---
# UnrealIRCd PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: unrealircd-data
namespace: irc
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 1Gi
---
# Anope PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: anope-data
namespace: irc
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 1Gi
---
# UnrealIRCd Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: unrealircd
namespace: irc
labels:
app: unrealircd
spec:
replicas: 1
selector:
matchLabels:
app: unrealircd
template:
metadata:
labels:
app: unrealircd
spec:
initContainers:
- name: copy-tls
image: busybox:1.36
command: ["sh", "-c"]
args:
- |
cp /tls-secret/tls.crt /tls/server.cert.pem
cp /tls-secret/tls.key /tls/server.key.pem
chmod 644 /tls/server.cert.pem
chmod 644 /tls/server.key.pem
chown 1000:1000 /tls/server.cert.pem /tls/server.key.pem 2>/dev/null || true
volumeMounts:
- name: irc-tls-secret
mountPath: /tls-secret
readOnly: true
- name: irc-tls
mountPath: /tls
containers:
- name: unrealircd
image: djlegolas/unrealircd:6.1.9.1
ports:
- containerPort: 6667
name: irc-plain
- containerPort: 6697
name: irc-tls
- containerPort: 8067
name: services-link
volumeMounts:
- name: unrealircd-config
mountPath: /app/conf/unrealircd.conf
subPath: unrealircd.conf
- name: unrealircd-data
mountPath: /app/data
- name: irc-tls
mountPath: /app/conf/tls
resources:
requests:
memory: 64Mi
cpu: 50m
limits:
memory: 256Mi
cpu: 250m
volumes:
- name: unrealircd-config
secret:
secretName: unrealircd-config
- name: unrealircd-data
persistentVolumeClaim:
claimName: unrealircd-data
- name: irc-tls-secret
secret:
secretName: irc-tls
- name: irc-tls
emptyDir: {}
---
# Anope IRC Services Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: anope
namespace: irc
labels:
app: anope
spec:
replicas: 1
selector:
matchLabels:
app: anope
template:
metadata:
labels:
app: anope
spec:
initContainers:
- name: fix-perms
image: busybox:1.36
command: ["sh", "-c"]
args:
- |
mkdir -p /data/db /data/logs
chown -R 10000:10000 /data 2>/dev/null || chmod -R 777 /data
volumeMounts:
- name: anope-data
mountPath: /data
containers:
- name: anope
image: anope/anope:latest
volumeMounts:
- name: anope-config
mountPath: /anope/conf/services.conf
subPath: services.conf
- name: anope-data
mountPath: /anope/data
resources:
requests:
memory: 64Mi
cpu: 25m
limits:
memory: 128Mi
cpu: 100m
volumes:
- name: anope-config
secret:
secretName: anope-config
- name: anope-data
persistentVolumeClaim:
claimName: anope-data
---
# UnrealIRCd Service
apiVersion: v1
kind: Service
metadata:
name: unrealircd
namespace: irc
spec:
selector:
app: unrealircd
ports:
- port: 6667
targetPort: 6667
name: irc-plain
- port: 6697
targetPort: 6697
name: irc-tls
- port: 8067
targetPort: 8067
name: services-link
---
# Anope Service
apiVersion: v1
kind: Service
metadata:
name: anope
namespace: irc
spec:
selector:
app: anope
ports:
- port: 8067
targetPort: 8067
name: services-link
---
# Traefik IngressRouteTCP - IRC plain (6667)
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: irc-plain
namespace: irc
spec:
entryPoints:
- irc
routes:
- match: HostSNI(`*`)
services:
- name: unrealircd
port: 6667
---
# Traefik IngressRouteTCP - IRC TLS passthrough (6697)
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: irc-tls
namespace: irc
spec:
entryPoints:
- irctls
routes:
- match: HostSNI(`*`)
services:
- name: unrealircd
port: 6697
tls:
passthrough: true