Dev Environment: Missing port leads to broken images

I configured a logo in the site settings, but the logo’s URL is missing the default port, i.e. the logo URL looks like this http://localhost/uploads/… rather than http://localhost:3000/uploads/….

I’m starting the development server like this:

RAILS_ENV=development bundle exec rails server

I found that Discourse.base_url is set to "http://localhost" and in config/database.yml, I find this note for the development.hostnames key:

### Don't include the port number here.
Change the "port" site setting instead, at /admin/site_settings.

However, such a site setting does not exist. What do I do?

It’s a hidden setting. Try changing it in the rails console.

bin/rails c

SiteSetting.port = 3000

This works, thank you.

Shouldn’t this be set to 3000 by default in development mode?

No, I don’t think so. Not everyone is using port 3000 for development.

It’s the default, though, isn’t it? That one has to set the hidden port setting is not at all obvious, hence seeing a logo in the development environment not load is unexpected. In other words, setting a custom logo should just work.

Logos work. It’s not something you usually care about in development.

Alternatively, I believe you can use these entries in sitesettings.yml

developer:
  force_hostname:
    hidden: false
    default: '<my-ip>'
  port:
    hidden: false
    default: '<my-port>'

@pfaffman gave me that tip! (and what a life saver that was)

У меня возникла обратная проблема по сравнению с тем, что описал автор оригинального поста, когда я настраивал dev-сайт вчера: мой dev-сервер работает за прокси Nginx, поэтому мне нужны чистые URL-адреса, но что бы я ни менял в настройках, Discourse продолжал добавлять :3000 ко многим моим внутренним ссылкам, включая логотип сайта. В конце концов я выяснил, что проблема кроется в строках 291–293 файла lib/discourse.rb:

if Rails.env.development? && SiteSetting.port.blank?
    url << ":#{ENV["UNICORN_PORT"] || 3000}"
end

Комментирование этих строк позволило логотипу и другим ссылкам работать корректно, хотя я не знаю, не приведёт ли это к другим проблемам в будущем. Похоже, что переопределять SiteSetting.port таким образом немного противоречит интуиции.

Я немного поэкспериментировал с этим, и оказалось, что всё работает корректно, если просто установить SiteSetting.port = 443 и также включить опцию «принудительный HTTPS» (хотя, думаю, это сработает и с портом 80 без HTTPS). Я где-то читал, что настройки порта лучше оставить пустыми, но, похоже, это был плохой совет.