# Installing Anope [Anope](https://anope.org/) is a set of IRC services. It is cross-platform (runs on Linux and BSD) and works well with a variety of IRCds such as [ngircd](/ngircd/install). Anope provides users with the NickServ, ChanServ and other *Serv that users expect from IRC. This allows users to register their nicknames, channels, and much more. The main drawback to anope is that it is written in C++ and has too many configurable parameters for most new admins of IRC. ## Building First, install `cmake` and `gettext-tools` (internationalization support): $ doas pkg_add cmake gettext-tools Create a new user for anope: $ doas useradd -m -g =uid -c "anope" -d /home/anope -s /bin/ksh anope $ doas su anope $ cd Next, download the latest [https://github.com/anope/anope/releases](https://github.com/anope/anope/releases) of Anope: $ ftp https://github.com/anope/anope/archive/refs/tags/2.0.10.tar.gz $ tar -zxf 2.0.10.tar.gz $ cd anope-2.0.10 Before proceeding, make sure to thoroughly read README.md and the docs/ folder. $ ./Config Default settings are recommended. Press enter for every question asked. For these two questions, type NONE in all caps. Next, build Anope: $ cd build/ $ make $ make install Create services.conf: $ cd ~/services/conf/ $ cp example.conf services.conf Edit services.conf: define { name = "services.host" value = "services.irc.example.com" } Replace `services.irc.example.com` with your real hostname. uplink { host = "127.0.0.1" ipv6 = no ssl = no port = 16667 password = "NGIRCDMYPASSWORD" } The host is the address of the server you want to connect to. In this setup, anope will be running on the same server that [ngircd](/ngircd/install) will be running on. We want to disable [IPv6](/ipv6/overview) and use [IPv4](/ipv4/overview) only. SSL is not necessary because we are connecting to localhost. **NOTE**: ngircd must be set to [listen on port 16667](/ngircd/install) (or whatever port you decide to use). The server password must match MyPassword in [ngircd.conf](https://ngircd.barton.de/doc/sample-ngircd.conf)'s [Server block](/ngircd/link). serverinfo { name = "services.irc.example.com" description = "Services for IRC Networks" pid = "data/services.pid" motd = "conf/services.motd" } Replace `services.irc.example.com` with the actual hostname. Replace the description. The rest should be left untouched. module { name = "ngircd" use_server_side_mlock = yes use_server_side_topiclock = yes } **WARNING**: Your module must match your ircd. In this guide, we use the [ngircd](/ngircd/install) module. networkinfo { networkname = "ExampleNet" nicklen = 16 userlen = 16 hostlen = 64 chanlen = 32 modelistsize = 100 vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-" allow_undotted_vhosts = false disallow_start_or_end = ".-" } Replace `ExampleNet` with your actual network name. On IRCNow, `nicklen` (the maximum nick length) and `userlen` (the maximum [ident](/ident/intro) length) are both 16. The rest are left at defaults. You will need to configure the rest of services.conf according to the comments. The defaults are generally sensible. ### Adding Operators For each IRC operator, create a block: oper { name = "OPERNICK" type = "Services Root" require_oper = yes password = "OPERPASSWORD" #certfp = "ed3383b3f7d74e89433ddaa4a6e5b2d7" #host = "*@*.anope.org ident@*" #vhost = "oper.mynet" } Replace `OPERNICK` with your operator's nickname. require_oper will require the user first be an oper on the IRCd before he can be services operator. The user must first type `/quote oper OPERNICK PASSWORD` Anope has four levels of operators: | Type | Commands | | ---------------------- | --------------------------------------------- | | Helper | [HostServ](/anope/hostserv) (approves vhosts) | | Services Operator | [HostServ](/anope/hostserv), [ChanServ](/anope/chanserv) (some), [OperServ](/anope/operserv) (some) | | Services Administrator | [HostServ](/anope/hostserv), [ChanServ](/anope/chanserv) (some), [OperServ](/anope/operserv) (some), [BotServ](/anope/botserv), [MemoServ](/anope/memoserv), [Global](/anope/global) | | Services Root | All | If a password is defined, the user must login using `/squery OPERSERV LOGIN`. mail { usemail = yes sendmailpath = "/usr/sbin/sendmail -t" sendfrom = "services@example.com" delay = 5m registration_subject = "Nickname registration for %25n" registration_message = "Hi, You have requested to register the nickname %25n on %25N. Please type \" /msg NickServ CONFIRM %25c \" to complete registration. If you don't know why this mail was sent to you, please ignore it silently. %25N administrators." reset_subject = "Reset password request for %25n" reset_message = "Hi, You have requested to have the password for %25n reset. To reset your password, type \" /msg NickServ CONFIRM %25n %25c \" If you don't know why this mail was sent to you, please ignore it silently. %25N administrators." emailchange_subject = "Email confirmation" emailchange_message = "Hi, You have requested to change your email address from %25e to %25E. Please type \" /msg NickServ CONFIRM %25c \" to confirm this change. If you don't know why this mail was sent to you, please ignore it silently. %25N administrators." memo_subject = "New memo" memo_message = "Hi %25n, You've just received a new memo from %25s. This is memo number %25d. Memo text: %25t" } We set usemail to yes so that users can reset their passwords. Make sure your [mail server](/opensmtpd/intro) is [configured](/opensmtpd/configure) and [running properly](/opensmtpd/test) before enabling this option. Replace `services@example.com` with the actual email address you plan to send mail from. **NOTE**: sendmail must be able to send from this email address. The rest of the configuration uses the defaults. Edit `/home/anope/services/conf/nickserv.conf`: defaults = "killprotect ns_secure ns_private hide_email hide_mask memo _signon memo_receive autoop" killprotect will give users 60 seconds to identify if they use a registered nick. If they do not identify within that time, they are killed. restrictopernicks = yes ## Configuring ngircd.conf In ngircd.conf, you need a block that looks like this: [Server] Name = services.irc.example.com Host = 127.0.0.1 ;Bind = 192.168.0.1 Port = 16667 MyPassword = NGIRCDMYPASSWORD PeerPassword = NGIRCDPEERPASSWORD ;Group = 123 Passive = yes SSLConnect = false ServiceMask = *Serv,Global Replace `services.irc.example.com` with the actual services hostname. The host will likely be 127.0.0.1 (again, because anope is running on the same server as ngircd). The port should be 16667. Make sure that MyPassword matches the server password for the uplink block in anope. Set Passive to yes so that ngircd does not automatically connect to anope (let anope initiate the connection), and turn off SSL. Finally, we set the ServiceMask. This lets ngircd know that the nicknames *Serv and Global belong to IRC Services. If ngircd is already running, remember to reload changes to ngircd.conf: $ doas rcctl reload ngircd **NOTE**: restarting ngircd is unnecessary and results in downtime. To start services: $ cd ~/services/bin $ ./anoperc start If './anoperc start' fails, please double check the conf file. ## Automation While logged in as user anope: $ cp ~/services/conf/{example,services}.chk $ chmod +x ~/services/conf/services.chk Edit the lines in ~/services/conf/services.chk to read as follows: # Anope binary directory ANOPATH=/home/anope/services/bin # Anope data directory ANODATA=/home/anope/services/data # Name of the pid file ANOPIDF=services.pid # Name of the executable ANOPROG=services # Parameters to pass to the executable ANOARGS="" #ANOARGS="-debug" While logged in as user anope, set up a [cronjob](/crontab/usage) with this entry: $ crontab -e */5 * * * * /home/anope/services/conf/services.chk >/home/anope/services/logs/services.log 2>&1 ## Troubleshooting If you run into issues, check /home/anope/services/logs.