# SERVER INFORMATION This file describes the server currently powering gopher.kgivler.com. For information about the HappyGopher software itself, see: /projects/happygopher.txt For the other public services running alongside it, see: /services.txt # NETWORK Hostname: gopher.kgivler.com Protocol: Gopher Port: TCP 70 Transport security: None Standard Gopher traffic is plaintext. # SOFTWARE Server: HappyGopher Language: C# Runtime: ..NET 10 Operating system: Ubuntu Linux host Deployment: Docker Compose Container: Linux Container user: Non-root .NET application user # DEPLOYMENT Host deployment directory: /opt/joyful-stack Container application directory: /app Production content on host: /var/lib/happygopher/content Content inside container: /app/content The production content directory is mounted into the container separately from the sample content included with HappyGopher. # HOW IT WORKS HappyGopher is a direct TCP Gopher server. There is no web server sitting in front of it. Clients connect directly to TCP port 70 and speak Gopher to HappyGopher. Static content comes from the mounted content directory. Directories may contain a custom gophermap or have a menu generated automatically. Compiled dynamic pages can also handle exact selectors before the static filesystem is checked. # DYNAMIC CONTENT This production gopherhole uses dynamic pages for things including: /server-time /qotd /random-quote /guestbook /guestbook/sign /server-time returns the current server time. /qotd and /random-quote retrieve quotes from HappyQOTD. /guestbook displays guestbook entries. /guestbook/sign uses Gopher type 7 input to add an entry. HappyGopher also provides an operational health selector which is not normally advertised in the public menus. # LIMITS AND SAFETY HappyGopher places limits on things such as: * Concurrent connections * Selector length * Type 7 input length * Request time Selectors are normalized before filesystem access. Directory traversal attempts are rejected. Symbolic links and other filesystem reparse points are not followed when serving content. The server also waits for active connections during graceful shutdown. # GOPHER OUTPUT HappyGopher handles protocol details including: * CRLF line endings * Dot-stuffing * Menu formatting * Menu field sanitization * Response termination Gophermaps use actual TAB characters to separate menu fields. I have now spent enough time debugging Gopher clients to feel the need to mention this. # OBSERVABILITY HappyGopher sends best-effort request telemetry to my private Mission Control system. Telemetry is intentionally non-critical. If Mission Control disappears, HappyGopher keeps serving Gopher. Observability should observe the server, not become a dependency required to serve a text file over a protocol from 1991. # OTHER SERVICES This VPS runs several other classic Internet protocol services. Rather than duplicate the constantly changing list here, see: /services.txt # SOURCE CODE https://github.com/JoyfulReaper/HappyGopher License: MIT Copyright 2026 Kyle Givler .