## Telegabber: like Zhabogram, but in Go! ## Now it's native, more asynchronous, and does not require to mess your server up with a monstrous third-party interpreter. The configuration file is compatible with Zhabogram 2.0, so you can easily copy your existing `config.yml`. ### Build ### Prerequisites: Go links the binary against the `glibc` version present in the system where the build process happens, so it should be less or equal to the version of `glibc` in the system where Telegabber will run. * Build TDLib according to [TDLib build instructions](https://tdlib.github.io/td/build.html). Roll back to commit 8d7bda00a535d1eda684c3c8802e85d69c89a14a if the compatibility got broken. * Install Go (tested with 1.13, but may work with earlier versions too). * Open the source dir in a new shell (to make sure that `$GOPATH` works) and run `make`. Dependencies will be installed automatically. After a successful build, you get a single binary to deploy on your server. In the deploy directory, you need only three files: * `telegabber` (the binary) * `config.yml` * `config_schema.json` (copy it from the repo) ### Installation ### A third-party Docker config was prepared to set up telegabber+Prosody: https://github.com/e1z0/telegabber-docker/ **Hard way:** First of all, you need to create component listener on your Jabber server. For example, for ejabberd in **/etc/ejabberd/ejabberd.yml**: ``` listen: - port: 8888 module: ejabberd_service access: all shaper_rule: fast ip: "127.0.0.1" service_check_from: false hosts: "tlgrm.localhost": password: "secret" ``` Next, rename **config.yml.example** to **config.yml** and edit **xmpp** section to match your component listener: ``` :xmpp: db 'users.db' jid: 'tlgrm.localhost' host: 'localhost' port: 8888 secret: 'secret' loglevel: :warn ``` ### Configuration ### It is good idea to obtain Telegram API ID from [**https://my.telegram.org**](https://my.telegram.org) to remove demo key requests limit, and then edit in **config.yml**: ``` :telegram: :tdlib: :client: :api_id: '845316' # telegram API ID (my.telegram.org) # :api_hash: '27fe5224bc822bf3a45e015b4f9dfdb7' # telegram API HASH (my.telegram.org) # ... ``` ### Arguments ### * `--profiling-port=xxxx`: start the pprof server on port `xxxx`. Access is limited to localhost. * `--config=/bla/bla/config.yml`: set the config file path (default: `config.yml`). * `--schema=/bla/bla/schema.json`: set the schema file path (default: `./config_schema.json`). ### How to receive files from Telegram ### First of all, you need to set up web server that will serve some directory in your filesystem. Example nginx config: ``` server { listen 80; server_name tlgrm.localhost; location /content { alias /var/zhabogram; } } ``` You need to set `:content: → :path: and :link:` **config.yml**. Set `:path:` according to location (for our example it will be `/var/zhabogram/content`). Set `:link:` according to server_name (for our example it will be `http://tlgrm.localhost`) ### How to send files to Telegram chats ### You need to setup `mod_http_upload` for your XMPP server. For example, for ejabberd in **/etc/ejabberd/ejabberd.yml** ``` modules: mod_http_upload: docroot: "/var/ejabberd/upload" # this must be a valid path, user ownership and SELinux flags must be set accordingly put_url: "https://xmpp.localhost:5443/upload/@HOST@" get_url: "https://xmppfiles.localhost/upload/@HOST@" access: local max_size: 500000000 #500 MByte thumbnail: false file_mode: "0644" dir_mode: "0744" ``` Then you need to setup nginx proxy that will serve `get_url` path, because Telegram will not handle URLs with non-default http(s) ports. Example nginx config: ``` server { listen 80; listen 443 ssl; server_name xmppfiles.localhost; # SSL settigns # keepalive_timeout 60; ssl_certificate /etc/ssl/domain.crt; ssl_certificate_key /etc/ssl/domain.key; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "RC4:HIGH:!aNULL:!MD5:!kEDH"; add_header Strict-Transport-Security 'max-age=604800'; location / { proxy_pass https://xmpp.localhost:5443; } } ``` Finally, update `:upload:` in your config.yml to match `server_name` in nginx config. ### Carbons ### Telegabber needs special privileges according to XEP-0356 to simulate message carbons from the users (to display messages they have sent earlier or via other clients). Example configuration for Prosody: ``` modules_enabled = { [...] "privilege"; } [...] Component "telegabber.yourdomain.tld" component_secret = "yourpassword" modules_enabled = {"privilege"} [...] VirtualHost "yourdomain.tld" [...] privileged_entities = { [...] ["telegabber.yourdomain.tld"] = { message = "outgoing"; }, } ```