A modern IRC server (daemon/ircd) written in Go.

Oragono logo

Oragono is a modern IRC server written in Go. Its core design principles are:

  • Being simple to set up and use
  • Combining the features of an ircd, a services framework, and a bouncer (integrated account management, history storage, and bouncer functionality)
  • Bleeding-edge IRCv3 support, suitable for use as an IRCv3 reference implementation
  • Highly customizable via a rehashable (i.e., reloadable at runtime) YAML config

Oragono is a fork of the Ergonomadic IRC daemon <3


Go Report Card Build Status Download Latest Release Freenode #oragono Crowdin

If you want to take a look at a running Oragono instance or test some client code, feel free to play with testnet.oragono.io (TLS on port 6697 or plaintext on port 6667).


Features

  • integrated services: NickServ for user accounts, ChanServ for channel registration, and HostServ for vanity hosts
  • bouncer-like features: storing and replaying history, allowing multiple clients to use the same nickname
  • UTF-8 nick and channel names with rfc7613 (PRECIS)
  • native TLS/SSL support, including support for client certificates
  • yaml configuration
  • updating server config and TLS certificates on-the-fly (rehashing)
  • SASL authentication
  • LDAP support
  • supports multiple languages (you can also set a default language for your network)
  • advanced security and privacy features (support for requiring SASL for all logins, cloaking IPs, and running as a Tor hidden service)
  • an extensible privilege system for IRC operators
  • ident lookups for usernames
  • automated client connection limits
  • passwords stored with bcrypt
  • UBAN, a unified ban system that can target IPs, networks, masks, and registered accounts (KLINE and DLINE are also supported)
  • IRCv3 support
  • a focus on developing with specifications

Quick start guide

Download the latest release from this page: https://github.com/oragono/oragono/releases/latest

Extract it into a folder, then run the following commands:

cp default.yaml ircd.yaml
vim ircd.yaml   # modify the config file to your liking
oragono mkcerts
oragono run     # server should be ready to go!

Note: See the productionizing guide in our manual for recommendations on how to run a production network, including obtaining valid TLS certificates.

Platform Packages

Some platforms/distros also have Oragono packages maintained for them:

Using Docker

A Dockerfile and example docker-compose recipe are available in the distrib/docker directory. Oragono is automatically published to Docker Hub at oragono/oragono. For more information, see the distrib/docker README file.

From Source

You can also install this repo and use that instead! However, keep some things in mind if you go that way:

devel branches are intentionally unstable, containing fixes that may not work, and they may be rebased or reworked extensively.

The master branch should usually be stable, but may contain database changes that either have not been finalised or not had database upgrade code written yet. Don't run master on a live production network.

The stable branch contains the latest release. You can run this for a production version without any trouble.

Building

You'll need an up-to-date distribution of the Go language for your OS and architecture. Once you have that, just clone the repository and run make build. If everything goes well, you should now have an executable named oragono in the base directory of the project.

Configuration

The default config file default.yaml helps walk you through what each option means and changes.

You can use the --conf parameter when launching Oragono to control where it looks for the config file. For instance: oragono run --conf /path/to/ircd.yaml. The configuration file also stores where the log, database, certificate, and other files are opened. Normally, all these files use relative paths, but you can change them to be absolute (such as /var/log/ircd.log) when running Oragono as a service.

Logs

By default, logs go to stderr only. They can be configured to go to a file, or you can use systemd to direct the stderr to the system journal (see the manual for details). The configuration format of logs is designed to be easily pluggable, and is inspired by the logging config provided by InspIRCd.

Passwords

Passwords (for both PASS and oper logins) are stored using bcrypt. To generate encrypted strings for use in the config, use the genpasswd subcommand as such:

oragono genpasswd

With this, you receive a blob of text which you can plug into your configuration file.

Nickname and channel registration

Oragono relies heavily on user accounts to enable its distinctive features (such as allowing multiple clients per nickname). As a user, you can register your current nickname as an account using /msg NickServ register . Once you have done so, you should enable SASL in your clients, ensuring that you will be automatically logged into your account on each connection. This will prevent problems claiming your registered nickname.

Once you have registered your nickname, you can use it to register channels:

  1. Join the channel with /join #channel
  2. Register the channel with /CS REGISTER #channel

After this, your channel will remember the fact that you're the owner, the topic, and any modes set on it!

Credits

Owner
Oragono
A modern IRC server written in Go.
Oragono
Comments
  • Running on concurrent connection larger than 2000

    Running on concurrent connection larger than 2000

    hi guys

    i'm using ergo for my chat service on mobile apps, but when it on 2000 concurrent connection the service become slowed down heavily, some user can connect after waiting 2-5 minutes, do i need to adjust config for handling this many connection.

    lovin this projects so far 👍

  • high-availability without s2s/federation

    high-availability without s2s/federation

    #26 is going to be difficult to implement and may impact our ability to rapidly iterate on experimental IRCv3 features. Meanwhile, we know (#237) that a single oragono instance can scale to approximately 10k clients and 2k clients per channel --- enough for most teams / communities.

    Let's explore options for deploying oragono that would be highly available (i.e., resilient to server failure) while maintaining the invariant that at any given time, all clients are connected to a single server (eliminating the need for true s2s). Possible primitives:

    1. A load balancer (haproxy?) that elects a single "live" server, then directs all connections to the live server
    2. Leader election among the cluster so that only one server is "live", with the others remaining hot spares. This is Hashicorp Vault's model: https://www.vaultproject.io/docs/concepts/ha.html

    cc @eklitzke

  • Option to disable message replay for a specific user.

    Option to disable message replay for a specific user.

    Hello!

    Yesterday I was working on setting up a bridge between Discord and IRC. It uses a Discord bot account, and an IRC account which is connected 24/7 to "relay" the messages. I set the message replay option to 100 messages in ergo, so new users connecting could understand the context.

    However whenever the bot reconnects to the server, all of the 100 messages get sent to the relay bot, which starts briding the messages to Discord.

    I connected to ergo's irc server yesterday, and asked if there is a command to disable this behavior for a specific user, but it seems like there isn't one implemented currently. This would be my feature request.

    Thank you for reading.

  • Who query for opers returns all nicks

    Who query for opers returns all nicks

    When requesting the who list, using the o (oper only) parameter from rfc1459 results in returning all nicks.

    C: WHO * o
    

    If the "o" parameter is passed only operators are returned according to the name mask supplied [rfc1459]

  • support LDAP

    support LDAP

    Hi,

    tl;dr Oragono could have multiple password backends, incl. PAM on UNIXes, libsasl2, or it could talk to LDAP. PAM and libsasl2 are very customizable, but just LDAP would be enough.

    PAM and libsasl2 probably require CGo to be acceptable, but hiding this code behind a build-tag is an option.


    It would be great if username+password could be checked on a backend separate from the rest.

    I run a Samba4 server to serve as a single store of user accounts (both for passwords, and for other generic user account information such as real name).

    This is, on my side, used for:

    • accounts in Prosody for XMPP,
    • accounts in Dovecot for IMAP,
    • accounts in Postfix for SMTP,
    • provide username+password portion handling for an OAuth2 server,
    • log into a Windows with it,
    • log into Gerrit
    • etc

    How?

    • Mostly things go straight into checking password via a direct LDAP bind,
    • sometimes it's LDAP bind+username lookup+actual LDAP bind for password check
    • sometimes things go through PAM towards LDAP,
    • sometimes libsasl2 + LDAP (though it could be libsasl2 + PAM + LDAP., not sure).

    Gecos fields are also populated from LDAP.

    Adding IRC to the mix would be great.

  • VHost System

    VHost System

    I have no strong opinions about prioritization.

    Cloaks should:

    • Be integrated with the account registration system
    • Have no effect on server operators
    • Optionally require a server operator to create?
  • Cloaks

    Cloaks

    It would be great to add the option to define a default cloak for every users, which would replace their real hostname. If I am not mistaken, this is similar to the vhost parameter for opers (?). Being able to attribute a custom cloak to an user would be even better.

  • @draft/label tags and commands that never reply

    @draft/label tags and commands that never reply

    From #oragono:

    What's the expected behaviour when you send a @draft/label tag on a message that doesn't generate a reply (like CAP END or PONG)? The spec implies the server will send an empty batch, but Ora just ignores it.

    It's a bit nonsensical to label those, but it's a lot easier to just label all outgoing messages than figure out which are sensible things and which aren't...

  • oragono thrashes on large numbers of concurrent JOINs to the same channel

    oragono thrashes on large numbers of concurrent JOINs to the same channel

    I patched out DanielOaks/irc-stress-test#4 for testing purposes and observed that:

    1. connectflood scales almost linearly, which is nice
    2. Somewhere between 1024 and 4096 clients, chanflood starts to thrash on regenerateMembersCache.

    This situation may not be completely avoidable; if there are n consecutive JOINs to the same channel, we actually do have to send O(n^2) JOIN messages. But, worth looking into.

  • SASL doesn't work for a grouped nick

    SASL doesn't work for a grouped nick

    With the nick eskimo registered and esk1mo as a grouped nick that that account, I can't sasl using esk1mo as the username.

    Shouldn't any grouped nick also work? I'm fairly certain most networks allow this.

  • Make the opers section in the config files simpler/easier to read

    Make the opers section in the config files simpler/easier to read

    Include a couple more commented-out example opers in the config file, to make it clear how real oper blocks look and how to add more, etc. Doesn't need to be anything too in-depth, just e.g.:

    opers:
        # operator named 'admin'; log in with /OPER admin [password]
        admin:
            # which capabilities this oper has access to
            class: "server-admin"
    
            # custom whois line
            whois-line: is a server admin
    
            # custom hostname
            vhost: "staff"
    
            # normally, operator status is visible to unprivileged users in WHO and WHOIS
            # responses. this can be disabled with 'hidden'. ('hidden' also causes the
            # 'vhost' line above to be ignored.)
            hidden: false
    
            # modes are modes to auto-set upon opering-up. uncomment this to automatically
            # enable snomasks ("server notification masks" that alert you to server events;
            # see `/quote help snomasks` while opered-up for more information):
            #modes: +is acjknoqtuxv
    
            # operators can be authenticated either by password (with the /OPER command),
            # or by certificate fingerprint, or both. if a password hash is set, then a
            # password is required to oper up (e.g., /OPER dan mypassword). to generate
            # the hash, use `oragono genpasswd`.
            password: "$2a$04$0123456789abcdef0123456789abcdef0123456789abcdef01234"
    
            # if a SHA-256 certificate fingerprint is configured here, then it will be
            # required to /OPER. if you comment out the password hash above, then you can
            # /OPER without a password.
            #certfp: "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
            # if 'auto' is set (and no password hash is set), operator permissions will be
            # granted automatically as soon as you connect with the right fingerprint.
            #auto: true
    
        # oper named 'alice': /OPER alice [password]
        #alice:
        #    class: "network-oper"
        #    vhost: "staff/alice"
        #    password: "$2a$04$0123456789abcdef0123456789abcdef0123456789abcdef01234"
    
        # oper named 'dan': /OPER dan [password]
        #dan:
        #    class: "server-admin"
        #    vhost: "staff/dan"
        #    modes: +is acjknoqtuxv
        #    password: "$2a$04$0123456789abcdef0123456789abcdef0123456789abcdef01234"
    
  • server.DeleteMessage catches channel or client==nil

    server.DeleteMessage catches channel or client==nil

    Fixes #2020

    Calling /msg histserv delete #wrongchan returns spurrious success message. Calling /msg histserv delete returns similar message.

    These would lead to the pointer hist == nil, and server.historyDB.DeleteMsgid() would return nil.

    Returns errNoSuchChannel or errInvalidTarget if channel or client == nil

  • histserv delete returns spurrious success message if incorrect parameters

    histserv delete returns spurrious success message if incorrect parameters

    Just checked that this works on v2.11.0-rc1

    msg histserv delete returns the success message no matter what the two parameters are (it does correctly throw an error if not enough or two many parameters are given).

    On latest ergo, the following should all return the same message

    msg histserv delete #<channel> <wrong msgid> msg histserv delete #<nonexistent channel> <some msgid> msg histserv delete first second

  • switch to disable fakelag for all registered users

    switch to disable fakelag for all registered users

    We got some interest in a config switch that would turn off fakelag for all registered users. This is not safe for most use cases, but would be pretty easy to implement for those operators willing to take the risk.

  • reevaluate

    reevaluate "insecure reattach" error

    See #955 for some context. Bouncer reattach that mixes secure and insecure connections has been disallowed ever since the functionality was first built (in c2faeed4b515033a6e1029572b55315f45f010f2). The following year (998ac6928b904f6cab64aec4b8881dd9327fd0ab) we removed the plaintext listener by default.

    Ever since, it seems like most errors due to mixing secure and insecure connections are spurious: the connection is actually secure, but is being transported over an incorrectly configured reverse proxy (e.g. WEBIRC is being sent without the secure flag, or a websocket is being proxied without adding X-Forwarded-Proto: https). It may be time to delete this check; we are already pushing operators hard to disable plaintext, and it's not clear what purpose it serves if plaintext is enabled nonetheless (the SASL PLAIN handshake is still being transmitted and acknowledged in plaintext, we just don't allow the reattach).

  • investigate channel detach functionality

    investigate channel detach functionality

    https://wiki.znc.in/Detaching

    Let's investigate how hard this would be. It seems like it should be per-session (but is that how ZNC does it?). One challenge is disconnecting while detached and then reconnecting: you should receive the messages that were played on that channel while you were detached, but your lastseen timestamp will be ahead of this. (Is there a way to do this without maintaining per-channel, per-session lastseen timestamps?)

  • support OAUTHBEARER

    support OAUTHBEARER

    https://emersion.fr/blog/2022/irc-and-oauth2/

    In terms of ergo, all we need to do is:

    1. Add a config option (to the auth-script block?) to enable advertising the OAUTHBEARER mechanism
    2. Modify authenticateHandler to process OAUTHBEARER by forwarding it to an auth-script
    3. Extend the auth-script protocol to take an additional oauthbearer field in the input (the output type is already sufficiently expressive)
go irc client for twitch.tv

go-twitch-irc This is an irc client for connecting to twitch. It handles the annoying stuff like irc tag parsing. I highly recommend reading the docum

Dec 27, 2022
The Tenyks IRC bot.

Tenyks is a computer program designed to relay messages between connections to IRC networks and custom built services written in any number of languages.

Sep 26, 2022
This is my first IRC bot for launch ddos attack, Write on Go language.
This is my first IRC bot for launch ddos attack, Write on Go language.

This is my first IRC bot for launch ddos attack, Write on Go language. For education purpose only. Please test it on your lab, And i create this for join university in the future not for attack anyone server with out any permission!!!

Sep 23, 2022
IRC bot for launch ddos attack, Mainly of scan target are IoT device that run linux and open default SSH port
IRC bot for launch ddos attack, Mainly of scan target are IoT device that run linux and open default SSH port

This is my first IRC bot for launch ddos attack, Mainly of scan target are IoT device that run linux and open default SSH port, This bot is write on Go language. For education purpose only. Please test it in your lab. And i create this for join university in the future not for attack anyone server with out any permission!!!

Jan 2, 2023
Jaken - A general purpose IRC bot featuring user acls and arbitrary plugins

Design principles This bot is based on the premise of a loosely coupling between

Jul 21, 2022
The modern cryptocurrency trading bot written in Go.

bbgo A trading bot framework written in Go. The name bbgo comes from the BB8 bot in the Star Wars movie. aka Buy BitCoin Go! Current Status Features E

Jan 2, 2023
Open-IM-Server is open source instant messaging Server.Backend in Go.
Open-IM-Server is open source instant messaging Server.Backend in Go.

Open-IM-Server Open-IM-Server: Open source Instant Messaging Server Instant messaging server. Backend in pure Golang, wire transport protocol is JSON

Jan 2, 2023
Fastest light-weight Discord server joiner written in GO
Fastest light-weight Discord server joiner written in GO

DiscordInviterGO! Fastest light-weight Discord server joiner written in GO Disclaimer For Educational purposes only. Use at your own risk. Automation

Jan 3, 2023
WIP Telegram Bot API server in Go

botapi The telegram-bot-api, but in go. WIP. Reference: https://core.telegram.org/bots/api Reference implementation: https://github.com/tdlib/telegram

Jan 2, 2023
A simple Discord bot developed for the Bedrock Gophers discord server.

Bedrock Gopher A simple Discord bot developed for the Bedrock Gophers discord server. Click here to invite the bot to your guild. You will also need t

Mar 12, 2022
This utility allows you to execute Minecraft server commands through the RCON protocol via Telegram chat.

Minecraft RCON by Telegram This utility allows you to execute Minecraft server commands through the RCON protocol via Telegram chat. FAQ When you run

Jul 24, 2022
CoachCarter: a discord bot which lets a server know if its inactive for too long
CoachCarter: a discord bot which lets a server know if its inactive for too long

I took this job because I wanted to affect change in a special group of young me

Jan 7, 2022
RaunchBot brings you the latest Raunchy content straight to your favorite Discord server.

RaunchBot RaunchBot brings you the latest Raunchy content straight to your favorite Discord server. Development: Compile and run the project. TOKEN=ab

Jan 22, 2022
RaunchBot brings you the latest Raunchy content straight to your favorite Discord server.

RedditBot RedditBot brings you the latest Raunchy content straight to your favorite Discord server. Get RedditBot in your discord here. Bot Commands:

Jan 22, 2022
Bot to automatically approve Bitbucket Server PRs

renovate-approve-bot-bitbucket-server Introduction This is a small application, similar to renovatebot/renovate-approve-bot-bitbucket-cloud to automat

Nov 2, 2022
This is a program that auctions minecraft names, its self hostable and can be used via your server.

Auction-Bot This is a discord bot made in go, its a wip and will be updated over time. This bot atm can create channels in your discord for users to p

Feb 13, 2022
Simple yet customizable bot framework written in Go.
Simple yet customizable bot framework written in Go.

Introduction Sarah is a general-purpose bot framework named after the author's firstborn daughter. This comes with a unique feature called "stateful c

Dec 12, 2022
Slack bot core/framework written in Go with support for reactions to message updates/deletes
Slack bot core/framework written in Go with support for reactions to message updates/deletes

Overview Requirements Features Demo The Name Concepts Create Your Own Slackscot Assembling the Parts and Bringing Your slackscot to Life Configuration

Oct 28, 2022
A general-purpose bot library inspired by Hubot but written in Go. :robot:

Joe Bot ?? A general-purpose bot library inspired by Hubot but written in Go. Joe is a library used to write chat bots in the Go programming language.

Dec 24, 2022