Integration with chats

AI-generated summary

The discussion addresses a user’s issue with integrating Telegram chat into their self-hosted Discourse instance. Vsekraski reported that after configuring the bot token, the plugin returned a 500 error and the bot did not respond. After being prompted to check logs by merefield, Vsekraski shared a backtrace revealing a Net::OpenTimeout error, indicating a failure to establish a TCP connection to api.telegram.org.

merefield identified this as a connectivity issue and suggested verifying network access via ping. The root cause was later clarified by Vsekraski, who noted that their server is located in Russia, where Telegram is blocked. merefield confirmed that this regional blockage is the primary obstacle (a “showstopper”) and suggested investigating the use of a proxy as a potential workaround, though they were unsure if such a solution currently exists for this specific integration.

I want to connect the integration to a Telegram chat. I created a bot and added the token in the plugin settings. But nothing is happening, and the bot isn’t responding.
When I send a test message through the plugin, I get a 500 error. Please help.

Check /logs for the actual error that lead to the 500 please and share it, including the backtrace

Message (11 copies reported)

Net::OpenTimeout (Failed to open TCP connection to api.telegram.org|2001:67c:4e8:f004::9,149.154.166.110.final-destination.invalid:443 (execution expired))
lib/freedom_patches/final_destination_connect.rb:35:in 'FinalDestinationTCPSocketPatch#open'
lib/final_destination/http.rb:20:in 'FinalDestination::HTTP#connect'
app/controllers/application_controller.rb:458:in 'block in ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:458:in 'ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:1140:in 'ApplicationController#ensure_dont_cache_page'
lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call'
lib/middleware/crawler_hooks.rb:13:in 'Middleware::CrawlerHooks#call'
lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call'
lib/middleware/anonymous_cache.rb:431:in 'Middleware::AnonymousCache#call'
lib/middleware/csp_script_nonce_injector.rb:13:in 'Middleware::CspScriptNonceInjector#call'
lib/middleware/track_view_session_id_injector.rb:12:in 'Middleware::TrackViewSessionIdInjector#call'
config/initializers/008-rack-cors.rb:14:in 'Discourse::Cors#call'
lib/middleware/default_headers.rb:13:in 'Middleware::DefaultHeaders#call'
config/initializers/100-quiet_logger.rb:20:in 'DiscourseRackQuietAssetsLogger#call'
config/initializers/100-silence_logger.rb:29:in 'SilenceLogger#call'
lib/middleware/enforce_hostname.rb:23:in 'Middleware::EnforceHostname#call'
lib/middleware/request_tracker.rb:384:in 'Middleware::RequestTracker#call'
lib/middleware/overload_protections.rb:18:in 'Middleware::OverloadProtections#call'
lib/middleware/processing_request.rb:14:in 'Middleware::ProcessingRequest#call'
lib/markdown_endpoint/vary_middleware.rb:10:in 'MarkdownEndpoint::VaryMiddleware#call'

Backtrace

/usr/local/lib/ruby/3.4.0/socket.rb:68:in 'Socket#connect'
/usr/local/lib/ruby/3.4.0/socket.rb:68:in 'Addrinfo#connect_internal'
/usr/local/lib/ruby/3.4.0/socket.rb:141:in 'Addrinfo#connect'
/usr/local/lib/ruby/3.4.0/socket.rb:753:in 'block in Socket.tcp_with_fast_fallback'
<internal:kernel>:168:in 'Kernel#loop'
/usr/local/lib/ruby/3.4.0/socket.rb:721:in 'Socket.tcp_with_fast_fallback'
/usr/local/lib/ruby/3.4.0/socket.rb:661:in 'Socket.tcp'
lib/freedom_patches/final_destination_connect.rb:35:in 'FinalDestinationTCPSocketPatch#open'
net-http (0.9.1) lib/net/http.rb:1792:in 'block in Net::HTTP#timeouted_connect'
timeout (0.6.1) lib/timeout.rb:296:in 'block in Timeout.timeout'
timeout (0.6.1) lib/timeout.rb:304:in 'Timeout.timeout'
net-http (0.9.1) lib/net/http.rb:1791:in 'Net::HTTP#timeouted_connect'
net-http (0.9.1) lib/net/http.rb:1677:in 'Net::HTTP#connect'
lib/final_destination/http.rb:20:in 'FinalDestination::HTTP#connect'
net-http (0.9.1) lib/net/http.rb:1655:in 'Net::HTTP#do_start'
net-http (0.9.1) lib/net/http.rb:1629:in 'Net::HTTP#start'
net-http (0.9.1) lib/net/http.rb:2401:in 'Net::HTTP#request'
rack-mini-profiler (5.0.0) lib/patches/net_patches.rb:19:in 'block in Net::HTTP#request_with_mini_profiler'
rack-mini-profiler (5.0.0) lib/mini_profiler/profiling_methods.rb:51:in 'Rack::MiniProfiler::ProfilingMethods#step'
rack-mini-profiler (5.0.0) lib/patches/net_patches.rb:18:in 'Net::HTTP#request_with_mini_profiler'
plugins/discourse-chat-integration/lib/discourse_chat_integration/provider/telegram/telegram_provider.rb:117:in 'DiscourseChatIntegration::Provider::TelegramProvider.do_api_request'
plugins/discourse-chat-integration/lib/discourse_chat_integration/provider/telegram/telegram_provider.rb:81:in 'DiscourseChatIntegration::Provider::TelegramProvider.sendMessage'
plugins/discourse-chat-integration/lib/discourse_chat_integration/provider/telegram/telegram_provider.rb:159:in 'DiscourseChatIntegration::Provider::TelegramProvider.trigger_notification'
plugins/discourse-chat-integration/app/controllers/discourse_chat_integration/chat_controller.rb:97:in 'DiscourseChatIntegration::ChatController#test'
actionpack (8.1.4) lib/action_controller/metal/basic_implicit_render.rb:8:in 'ActionController::BasicImplicitRender#send_action'
actionpack (8.1.4) lib/abstract_controller/base.rb:221:in 'AbstractController::Base#process_action'
actionpack (8.1.4) lib/action_controller/metal/rendering.rb:199:in 'ActionController::Rendering#process_action'
actionpack (8.1.4) lib/abstract_controller/callbacks.rb:267:in 'block in AbstractController::Callbacks#process_action'
activesupport (8.1.4) lib/active_support/callbacks.rb:121:in 'block in ActiveSupport::Callbacks#run_callbacks'
app/controllers/application_controller.rb:458:in 'block in ApplicationController#with_resolved_locale'
i18n (1.14.8) lib/i18n.rb:354:in 'I18n::Base#with_locale'
app/controllers/application_controller.rb:458:in 'ApplicationController#with_resolved_locale'
activesupport (8.1.4) lib/active_support/callbacks.rb:130:in 'block in ActiveSupport::Callbacks#run_callbacks'
app/controllers/application_controller.rb:1140:in 'ApplicationController#ensure_dont_cache_page'
activesupport (8.1.4) lib/active_support/callbacks.rb:130:in 'block in ActiveSupport::Callbacks#run_callbacks'
activesupport (8.1.4) lib/active_support/callbacks.rb:141:in 'ActiveSupport::Callbacks#run_callbacks'
actionpack (8.1.4) lib/abstract_controller/callbacks.rb:266:in 'AbstractController::Callbacks#process_action'
actionpack (8.1.4) lib/action_controller/metal/rescue.rb:36:in 'ActionController::Rescue#process_action'
actionpack (8.1.4) lib/action_controller/metal/instrumentation.rb:76:in 'block in ActionController::Instrumentation#process_action'
activesupport (8.1.4) lib/active_support/notifications.rb:210:in 'block in ActiveSupport::Notifications.instrument'
activesupport (8.1.4) lib/active_support/notifications/instrumenter.rb:58:in 'ActiveSupport::Notifications::Instrumenter#instrument'
activesupport (8.1.4) lib/active_support/notifications.rb:210:in 'ActiveSupport::Notifications.instrument'
actionpack (8.1.4) lib/action_controller/metal/instrumentation.rb:75:in 'ActionController::Instrumentation#process_action'
actionpack (8.1.4) lib/action_controller/metal/params_wrapper.rb:259:in 'ActionController::ParamsWrapper#process_action'
activerecord (8.1.4) lib/active_record/railties/controller_runtime.rb:39:in 'ActiveRecord::Railties::ControllerRuntime#process_action'
actionpack (8.1.4) lib/abstract_controller/base.rb:154:in 'AbstractController::Base#process'
actionview (8.1.4) lib/action_view/rendering.rb:40:in 'ActionView::Rendering#process'
rack-mini-profiler (5.0.0) lib/mini_profiler/profiling_methods.rb:90:in 'block in ActionController::Base#profile_method'
actionpack (8.1.4) lib/action_controller/metal.rb:252:in 'ActionController::Metal#dispatch'
actionpack (8.1.4) lib/action_controller/metal.rb:335:in 'ActionController::Metal.dispatch'
actionpack (8.1.4) lib/action_dispatch/routing/route_set.rb:65:in 'ActionDispatch::Routing::RouteSet::Dispatcher#dispatch'
actionpack (8.1.4) lib/action_dispatch/routing/route_set.rb:50:in 'ActionDispatch::Routing::RouteSet::Dispatcher#serve'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:35:in 'block in ActionDispatch::Journey::Router#serve'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:86:in 'block in ActionDispatch::Journey::Router#recognize'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:66:in 'Array#each'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:66:in 'ActionDispatch::Journey::Router#recognize'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:31:in 'ActionDispatch::Journey::Router#serve'
actionpack (8.1.4) lib/action_dispatch/routing/route_set.rb:906:in 'ActionDispatch::Routing::RouteSet#call'
railties (8.1.4) lib/rails/engine.rb:534:in 'Rails::Engine#call'
railties (8.1.4) lib/rails/railtie.rb:225:in 'Kernel#public_send'
railties (8.1.4) lib/rails/railtie.rb:225:in 'Rails::Railtie.method_missing'
actionpack (8.1.4) lib/action_dispatch/routing/mapper.rb:33:in 'block in <class:Constraints>'
actionpack (8.1.4) lib/action_dispatch/routing/mapper.rb:62:in 'ActionDispatch::Routing::Mapper::Constraints#serve'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:35:in 'block in ActionDispatch::Journey::Router#serve'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:92:in 'block in ActionDispatch::Journey::Router#recognize'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:66:in 'Array#each'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:66:in 'ActionDispatch::Journey::Router#recognize'
actionpack (8.1.4) lib/action_dispatch/journey/router.rb:31:in 'ActionDispatch::Journey::Router#serve'
actionpack (8.1.4) lib/action_dispatch/routing/route_set.rb:906:in 'ActionDispatch::Routing::RouteSet#call'
lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call'
lib/middleware/crawler_hooks.rb:13:in 'Middleware::CrawlerHooks#call'
rack (2.2.24) lib/rack/tempfile_reaper.rb:15:in 'Rack::TempfileReaper#call'
rack (2.2.24) lib/rack/conditional_get.rb:40:in 'Rack::ConditionalGet#call'
rack (2.2.24) lib/rack/head.rb:12:in 'Rack::Head#call'
lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call'
lib/middleware/anonymous_cache.rb:431:in 'Middleware::AnonymousCache#call'
lib/middleware/csp_script_nonce_injector.rb:13:in 'Middleware::CspScriptNonceInjector#call'
lib/middleware/track_view_session_id_injector.rb:12:in 'Middleware::TrackViewSessionIdInjector#call'
config/initializers/008-rack-cors.rb:14:in 'Discourse::Cors#call'
rack (2.2.24) lib/rack/session/abstract/id.rb:266:in 'Rack::Session::Abstract::Persisted#context'
rack (2.2.24) lib/rack/session/abstract/id.rb:260:in 'Rack::Session::Abstract::Persisted#call'
actionpack (8

Env

HTTP HOSTS:

well, that’s more clear, no?

what happens when you try to ping api.telegram.org from your server?

I get:

ping api.telegram.org
PING api.telegram.org (149.154.166.110) 56(84) bytes of data.
64 bytes from 149.154.166.110: icmp_seq=1 ttl=49 time=33.3 ms
64 bytes from 149.154.166.110: icmp_seq=2 ttl=49 time=31.5 ms
64 bytes from 149.154.166.110: icmp_seq=3 ttl=49 time=33.1 ms

which looks healthy.

Please put your logs in triple backticks. It’s quite a mouthful to scroll through.

```
logs here
```

I’m sorry, I still haven’t figured out how to do it (

Also, could this be related to the fact that Telegram is blocked in Russia? My server, where the forum is hosted, is also located in Russia.

yes that would be a showstopper

But you could investigate some kind of proxy. I have no idea if that exists.