Discourse 1.2 released

Jeff Atwood February 19, 2015

With the help of our community and our customers, we’re proud to release Discourse 1.2 today!

The complete release notes have a detailed summary of the hundreds of fixes, UI improvements, feature tweaks, and new features. The focus of this release was performance and extensibility; here are a few highlights:

Export Your Posts

One of the promises of Discourse is that your data belongs to you! Not just for site owners, but for every participant in every Discourse discussion, for all time, forever! We had the button in V1 but it was cut due to time constraints. It’s back in 1.2 and now it works. Give it a shot — head to your profile page and press the Download My Posts button.

Improved Emoji Support

You could always type : to autocomplete the full Emoji list, but now it’s even easier — just look for the little smiley button in the editor and there’s a full tabbed Emoji picker.

You can also select from four default Emoji “families”: Apple, Android, Twitter, and EmojiOne. Even better, you can now upload and define your own custom Emoji! If you wanted :trollface: on your Discourse, now you can have it.

Better Custom Profile Fields

You can now define custom user fields that are editable by the user on their profile page, and visible on their user profile, too.

Cleaner Category Styles

Discourse is a system of rainbows, yes, but the category badges styles were perhaps a bit too colorful, and when a lot of topics were displayed together it could be a bit noisy. In the interest of sticking with the Discourse design goal of being simple, clean, and clear, we restyled the default badges to reduce the amount of color shown to just a bar next to the category title.

(If you prefer the older, more colorful “box” category badge style, that can be selected in your site settings.)

Combining Stars and Bookmarks

bookmark feature was merged with stars

The relationship between bookmarking (which worked on any post) and starring (which only worked on topics) was always a subject of debate. To keep Discourse easy to understand, we’ve now combined those two very similar concepts into bookmark. You’ll notice that any topic with a bookmark on it, anywhere, will show up with a bookmark icon — and clicking or tapping on that bookmark icon will take you to your first bookmarked post in the topic. Try it out!

Official Tag Plugin

Discourse supports categories and subcategories — but what if you want hundreds or thousands of categories? It just doesn’t scale, either in our brains (which category did I want again?) or in the software. So we’ve created an official tagging plugin that lets you arbitrarily tag topics with as many keywords as you like, browse those tags, search for those tags, and generally have a much more flexible, lightweight method of organization for your topics. And it all works in harmony with your existing categories and subcategories.

Official Akismet Anti-Spam Plugin

We’ve seen the rise of far more human spammers than we expected — and existing anti-bot methods and CAPTCHAs are completely powerless against people. So we built an official Akismet plugin to help vet posts by new users to make sure they don’t look spammy before they hit your site. We’ve tested this with a number of our customers and it greatly reduces community and moderator load by zapping the most obvious human spam.

(You do need to purchase an Akismet key for this to work, but anyone on our hosted platform will get Akismet support for free.)

Even More Importers

If you’re thinking of making the switch to Discourse, it is easier than ever, because we now have open source importers for vBulletin, phpBB, Vanilla, Ning, Kunena, Discuz!, bbPress, Simple Machines, Drupal, and myBB.

You’ll still need to be a developer to perform the import, but this is something we plan to make easier over the next year. The more the merrier!

Better Topic List Performance

We dramatically improved the performance of rendering in topic lists — you should feel the 3x improvement in performance when browsing topics, or returning to the topic list, especially on older devices.

Easy One Click Upgrade

Sound good? Of course it does! As always, upgrade your Discourse instance today to get these amazing new Discourse features (and OK, maybe 1 or 2 bug fixes) via our easy one click admin panel updater.

Thank You

We’d like to thank our customers for their support, and the broader Discourse community for all their contributions toward this release — whether it was in pull requests, feedback on meta.discourse, or feedback on your own Discourse instance. Thank you!

(Also, a particular thanks to avid meta.discourse user erlendsh who created the super cool feature demo videos that you see above.)

For insight into what’s coming up in future releases of Discourse, keep an eye on the releases category at meta discourse.

Leave a reply

Discourse Standard Hosting Plan Now Available

Jeff Atwood February 5, 2015

As of today, it’s been two years since we launched Discourse as a public project! To celebrate, we’re making one of our most common requests available — a standard hosting plan.

It includes the following:

  • The full Discourse feature set, of course!
  • High speed custom colocated servers with SSDs
  • 100k monthly page views
  • 10GB storage
  • Unlimited members
  • 5 staff users
  • Single sign-on
  • Option for SSL / HTTPS

We’ve been working hard on streamlining our signup process to handle the additional scale, and to make sure creating new Discourse instances was simple and easy. This is the most affordable hosting plan we’ve ever offered.

Discourse is now powering over 3,000 discussion sites on the Internet:

And being, as always, a 100% open source project, we couldn’t have done any of this without the support of our customers and users:

Thanks for letting us host your amazing communities. We hope that Discourse can fit your community, too, whether it is large, medium, small, or anything in between. We’re proud to be a part of your team.

We have big things planned this year, starting with the Discourse 1.2 release which is currently in late beta and should arrive within a week or two.

Stay tuned!

Leave a reply

Our Discourse Hosting Configuration

Michael Brown January 27, 2015

We’ve talked about the Discourse server hardware before. But now let’s talk about the Discourse network. In the physical and software sense, not the social sense, mmmk? How exactly do we host Discourse on our servers?

Here at Discourse, we prefer to host on our own super fast, hand built, colocated physical hardware. The cloud is great for certain things but like Stack Exchange, we made the decision to run on our own hardware. That turned out to be a good decision as Ruby didn’t virtualize well in our testing.

The Big Picture

(Yes, that’s made with Dia – still the quickest thing around for network diagramming, even if the provided template images are from the last century.)

Tie Interceptors

Nothing but the finest bit of Imperial technology sits out front of everything, ready to withstand an assault from the Internet at large on our application:

The tieinterceptor servers handle several important functions:

  • ingress/egress: artisinally handcrafted iptables firewall rules control all incoming traffic and ensure that certain traffic can’t leave the network
  • mail gateway: the interceptors are responsible for helping to ensure that mail reaches the destination. DKIM signing, hashcash (potentially) signing, header cleanup
  • haproxy: using haproxy allows the interceptors to act as load balancers, dispatching requests to the web tier and massaging the responses
  • keepalived: we use keepalived for its VRRP implementation. We give keepalived rules such as “if haproxy isn’t running, this node shouldn’t have priority” and it performs actions based on those rules – in this case adding or removing a shared IPv4 (and IPv6) address from the Internet-facing network

Tie Fighters (web)

The tiefighters represent the mass fleet of our Death Star, our Docker servers. They are small, fast, identical – and there are lots of them.

They run the Discourse server application in stateless docker containers, allowing us to easily set up continuous deployment of Discourse with Jenkins.

What’s running in each Docker container?

  • Nginx: Wouldn’t be web without a webserver, right? We chose Nginx because it is one of the fastest lightweight web servers.
  • Unicorn: We use Unicorn to run the Ruby processes that serve Discourse. More Unicorns = more concurrent requests.
  • Anacron: Server scheduling is handled by Anacron, which keeps track of scheduled commands and scripts, even if the container is rebooted or offline.
  • Logrotate and syslogd: Logs, logs, logs. Every container generates a slew of logs via syslogd and we use Logrotate to handle log rotation and maximum log sizes.
  • Sidekiq: For background server tasks at the Ruby code level we use Sidekiq.

Shared data files are persisted on a common GlusterFS filesystem shared between the hosts in the web tier using a 3-Distribute 2-Replicate setup. Gluster has performed pretty well, but doesn’t seem to tolerate change that well – replacing/rebuilding a node is a bit of a gut-wrenching operation that kind of feels like yanking a disk out of a RAID10 array, plugging a new one in and hoping the replication goes well. I want to look at Ceph as a distributed filesystem store – able to provide both a S3-like interface as well as a multimount POSIX filesystem.

Tie Fighters (database)

We are using three of the Ties with newer SSDs as our Postgres database servers:

  1. One hosts the databases for our business class (single Discourse application image hosting many sites) containers and standard-tier plans.
  2. One hosts the databases for the enterprise class instances.
  3. One is the standby for both of these – it takes the streaming replication logs from the primary DBMSes and is ready to be promoted in the event of a serious failure.

Tie Fighter Prime

The monster of the group is tiefighter1. Unlike all the other Ties, it is provisioned with 8 processors and 128 GB memory. We’ve been trying to give it more and more to do over the past year. I’d say that’s been a success:

Although it is something of a utility and VM server, one of the most important jobs it handles is our redis in-memory network cache.

Properly separating redis instances from each other has been on our radar for a while – they were already configured to use separate databases for partitioning, but that also meant that instances could still affect each other. Notably the multisite configurations which connected to the same redis server but used different redis databases.

We had an inspiration: use the password functionality provided by the redis server to automatically drop any connections using the same password into its own isolated redis backend. A new password will automatically create a new instance specifically tied to that password. Separation, security, ease of use. A few days later, Sam came back with redismux. It’s been chugging along after being moved inside docker in September.


Jenkins is responsible for “all” of our internal management routines – why would you do tasks over and over when you can automate them? Of course, the elephant is our build and deployment process. We have a series of jobs set up that automatically run on a github update:

Total duration from a push to the main github repository to the code running in production: 12 minutes, 8 of which are spent building the new master docker image.

It’s taken us about a year (and many, many betas of Docker and Discourse) to reach this as a reasonably stable configuration for hosting Discourse. We’re sure it will change over time, and we will continue to scale it out as we grow.

Leave a reply