Skip to content

Erudika/scoold

Repository files navigation

Scoold Q&A

Scoold - Stack Overflow in a JAR

Docker pulls Docker pulls Join the chat at https://gitter.im/Erudika/scoold

Scoold is a Q&A and a knowledge sharing platform for teams. The project was created back in 2008, released in 2012 as social network for schools inspired by Stack Overflow. In 2017 it was refactored, repackaged and open-sourced.

Scoold can run anywhere - Heroku, DigitalOcean, AWS, Azure or any VPS hosting provider. It's lightweight (~7000 LOC), the backend is handled by a separate service called Para. All the heavy lifting is delegated to Para which can also be configured to store the data in any of the popular databases. This makes the Scoold code base easy to read and can be learned quickly, even by junior developers.

Scoold Pro, the paid version of Scoold, has premium features which make it the perfect knowledge sharing platform for your company or team.

This project is fully funded and supported by Erudika - an independent, bootstrapped company.

Features

  • Full featured Q&A platform
  • Database-agnostic, optimized for cloud deployment
  • Full-text search
  • Distributed object cache
  • Location-based search and "near me" filtering of posts
  • I18n with RTL language support
  • Reputation and voting system with badges
  • Custom badges - add your own text, icon and color
  • Spaces (Teams) - groups of isolated questions and users
  • Webhooks with signature signing
  • Zapier integration
  • Minimal frontend JS code based on jQuery
  • Modern, responsive layout powered by Materialize CSS
  • Suggestions for similar questions and hints for duplicate posts
  • Email notifications for post replies and comments
  • Backup and Restore
  • RESTful API defined with OpenAPI 3.0
  • Spring Boot project (single JAR)
  • Mutual authentication support (mTLS)
  • LDAP authentication support
  • Social login (Facebook, Google, GitHub, LinkedIn, Microsoft, Slack, Amazon, Twitter) with Gravatar support
  • Syntax highlighting for code in posts, GFM markdown support with tables, task lists and strikethrough
  • Import data from Stack Overflow for Teams
  • Emojis! - using this cheat sheet or inline Unicode
  • Support for uploading custom avatars (to Imgur, Cloudinary)
  • SEO friendly
  • Cookie consent (for GDPR, CCPA, etc.)

Buy Scoold Pro and also get these premium features:

  • Slack integration
  • Mattermost integration
  • Microsoft Teams integration
  • SAML authentication support
  • Custom authentication support
  • SCIM 2.0 for automatic user provisioning
  • Mentions with notifications
  • File uploads (local, AWS S3, Azure Blob)
  • Account suspensions (permabans)
  • Anonymous posts
  • Unlimited spaces
  • Multiple admins
  • Multiple identity domains
  • Sticky / Favorite posts
  • Advanced syntax highlighting
  • Email digest of recent questions
  • Security notifications
  • Wiki-style answers

...and more!

Live Demos

For admin access, open the Scoold Pro demo and login with "Demo login".

Scoold architecture intro (or 'what the heck is Para?')

Scoold is a client application of the Para backend server. Almost every request to Scoold produces at least one request to Para as well. When you ask a question on Scoold, a create request is sent to Para to the location POST /v1/questions. Here are a few key points about that architecture:

  • A Para server can be hosted anywhere and store data inside any of the supported databases.
  • Para is a multi-tenant server which stores data in isolated environments called "apps".
  • One or more instance of Scoold (like a cluster) can connect to the same Para app environment and share the data.
  • Multiple separate Scoold websites can be powered by the same Para backend using different Para apps.
  • Each app environment is completely independent from others and has its own database table and search index.
  • Both Scoold and Para can be hosted on the same machine or on multiple machines, on different networks.
  • Scoold talks to Para via HTTP(S) so Para must be directly accessible from Scoold, but can also be hosted on a private network.

Here's an overview of the architecture:

                              ┌────────────┐
                          ┌───►  Database  │
┌──────────┐  ┌────────┐  │   ┌────────────┤
│ Scoold 1 ├──►        │  │   └────────────┤
├──────────┤  │  Para  ◄──┼───►   Search   │
│ Scoold 2 ├──►        │  │   ┌────────────┤
└──────────┘  └────────┘  │   └────────────┤
                          └───►   Cache    │
                              └────────────┘

Quick Start with a managed Para backend (easier)

JDK 21 or higher and Maven are required to build the project. You can build the project with JDK 11/17 until version 1.59.0, at which point Scoold switches to JDK 21 and Spring Boot 3.x.

  1. Create a new app on ParaIO.com and copy your access keys to a file.
  2. Create Scoold's configuration file named scoold-application.conf with these properties:
    scoold.env = "production"
    scoold.app_name = "Scoold"
    scoold.para_access_key = "app:scoold"
    scoold.para_secret_key = "_secret_key_from_para_"
    scoold.para_endpoint = "https://paraio.com"
    # add your email here
    scoold.admins = "my@email.com"
    # (optional) require authentication for viewing content
    scoold.is_default_space_public = false
  3. Start Scoold with java -jar -Dconfig.file=./scoold-application.conf scoold-*.jar.
  4. Open localhost:8000/signin/register and register a new account with same email you put in the configuration.

To login with a social account, you must create a developer app with Facebook, Google or any other identity provider. This is not required when you log in with LDAP, SAML or email/password.

Save the obtained API keys in the scoold-application.conf file that you have created above.

For all identity providers, you must whitelist the Para host with the appropriate authentication endpoint:

  • GitHub: https://paraio.com/github_auth
  • OAuth 2: https://paraio.com/oauth2_auth Learn more about custom authentication

Quick Start with a self-hosted Para backend (harder)

Note: The Para backend server is deployed separately and is required for Scoold to run.

  1. Download the latest executable Para JAR package
  2. Start Para with the command java -jar -Dconfig.file=./para-application.conf para-*.jar
  3. Create a separate folder scoold and inside, a new configuration file named scoold-application.conf (see example above)
  4. Start Scoold with the following command, pointing it to the location of the Para configuration file:
    java -jar -Dconfig.file=./scoold-application.conf \
      -Dscoold.autoinit.para_config_file=../para-application.conf scoold-*.jar`
    

On startup, Para will initialize and create its own configuration file. Scoold will then try to initialize and configure itself automatically by reading the para-application.conf. Alternatively you could provide Scoold with the root access key directly, instead of pointing it to the Para configuration file, like so:

	java -jar -Dconfig.file=./scoold-application.conf \
	  -Dscoold.autoinit.root_app_secret_key="{secret key for root app}" scoold-*.jar`

The secret key for the root Para app can be found inside the Para configuration file, or para-application.conf, labeled para.root_secret_key.

  1. Open localhost:8000/signin/register and register a new account with same email you put in the configuration

Optionally, you can also install the Para CLI tool for browsing and managing data in your Scoold app.

Important:

  • The convention is to use para-application.conf and scoold-application.conf for Para and Scoold respectively.
  • All settings shown here are meant to be kept inside the Scoold configuration file.
  • SMTP settings must be configured before deploying Scoold to production.
  • Scoold does not have a default user account with default username and password.

Read the Para docs for further details on how to run and configure your Scoold backend.

Hardware requirements

Scoold and Para can both be hosted on the same machine, provided it has at least 3 GB of RAM.

Scoold requires:

  • at least 500 MB RAM
  • 1 vCPU or more
  • 10 GB disk space or more (primarily for logs and storing images)

Para requires:

  • at least 1 GB RAM
  • 1 vCPU (2 are recommended)
  • 10 GB disk space or more (unless the database is stored on the same machine)

JVM parameters: e.g. java -jar -Xms600m -Xmx600m scoold-*.jar

Configuration

Scoold requires a persistent and direct connection to a Para server to function properly. By default, Scoold will load its configuration from a file named application.conf but that file can be renamed to scoold-application.conf or app.conf and then loaded with the system property -Dconfig.file=app.conf. The configuration can also be loaded from a JSON file or a URL.

Copy this Scoold example configuration to your scoold-application.conf (edit the values if needed):

# the name of the application
scoold.app_name = "Scoold"
# the port for Scoold
scoold.port = 8000
# environment - "production" or "development"
scoold.env = "production"
# the public-facing URL where Scoold is hosted
scoold.host_url = "http://localhost:8000"
# the URL of Para - can also be "https://paraio.com"
scoold.para_endpoint = "http://localhost:8080"
# access key for your Para app
scoold.para_access_key = "app:scoold"
# secret key for your Para app
scoold.para_secret_key = ""
# the email or identifier of the admin user - check Para user object
scoold.admins = "admin@domain.com"
# Enable/disable password authentication
scoold.password_auth_enabled = true
View ALL Scoold configuration options

Core

Property key & Description Default Value Type
scoold.app_name
The formal name of the web application.
Scoold String
scoold.para_access_key requires restart
App identifier (access key) of the Para app used by Scoold.
app:scoold String
scoold.para_secret_key requires restart
Secret key of the Para app used by Scoold.
x String
scoold.para_endpoint requires restart
The URL of the Para server for Scoold to connects to. For hosted Para, use https://paraio.com
http://localhost:8080 String
scoold.host_url
The internet-facing (public) URL of this Scoold server.
http://localhost:8000 String
scoold.port requires restart
The network port of this Scoold server. Port number should be a number above 1024.
8000 Integer
scoold.env requires restart
The environment profile to be used - possible values are production or development
development String
scoold.app_secret_key
A random secret string, min. 32 chars long. Must be different from the secret key of the Para app. Used for generating JWTs and passwordless authentication tokens.
String
scoold.admins
A comma-separated list of emails of people who will be promoted to administrators with full rights over the content on the site. This can also contain Para user identifiers.
String
scoold.is_default_space_public
When enabled, all content in the default space will be publicly visible, without authentication, incl. users and tags. Disable to make the site private.
true Boolean
scoold.context_path requires restart
The context path (subpath) of the web application, defaults to the root path /.
String
scoold.webhooks_enabled
Enable/disable webhooks support for events like question.create, user.signup, etc.
true Boolean
scoold.api_enabled
Enable/disable the Scoold RESTful API. Disabled by default.
false Boolean
scoold.feedback_enabled
Enable/disable the feedback page on the site. It is intended for internal discussion about the website itself.
false Boolean

Emails

Property key & Description Default Value Type
scoold.support_email
The email address to use for sending transactional emails, like welcome/password reset emails.
contact@scoold.com String
scoold.mail.host
The SMTP server host to use for sending emails.
String
scoold.mail.port
The SMTP server port to use for sending emails.
587 Integer
scoold.mail.username
The SMTP server username.
String
scoold.mail.password
The SMTP server password.
String
scoold.mail.tls
Enable/disable TLS for the SMTP connection.
true Boolean
scoold.mail.ssl
Enable/disable SSL for the SMTP connection.
false Boolean
scoold.mail.debug
Enable/disable debug information when sending emails through SMTP.
false Boolean
scoold.favtags_emails_enabled
Set the default toggle value for all users for receiving emails for new content with their favorite tags.
false Boolean
scoold.reply_emails_enabled
Set the default toggle value for all users for receiving emails for answers to their questions.
false Boolean
scoold.comment_emails_enabled
Set the default toggle value for all users for receiving emails for comments on their posts.
false Boolean
scoold.summary_email_period_days Pro
The time period between each content digest email, in days.
7 Integer
scoold.summary_email_items
The number of posts to include in the digest email (a summary of new posts).
25 Integer
scoold.notification_emails_allowed
Enable/disable all notification emails.
true Boolean
scoold.newpost_emails_allowed
Enable/disable all email notifications for every new question that is posted on the site.
true Boolean
scoold.favtags_emails_allowed
Enable/disable all email notifications for every new question tagged with a favorite tag.
true Boolean
scoold.reply_emails_allowed
Enable/disable all email notifications for every new answer that is posted on the site.
true Boolean
scoold.comment_emails_allowed
Enable/disable all email notifications for every new comment that is posted on the site.
true Boolean
scoold.mentions_emails_allowed Pro
Enable/disable all email notifications every time a user is mentioned.
true Boolean
scoold.summary_email_controlled_by_admins Pro
Controls whether admins can enable/disable summary emails for everyone from the 'Settings' page
false Boolean
scoold.mention_emails_controlled_by_admins Pro
Controls whether admins can enable/disable mention emails for everyone from the 'Settings' page
false Boolean
scoold.emails.welcome_text1
Allows for changing the default text (first paragraph) in the welcome email message.
You are now part of {0} - a friendly Q&A community... String
scoold.emails.welcome_text2
Allows for changing the default text (second paragraph) in the welcome email message.
To get started, simply navigate to the "Ask question" page and ask a question... String
scoold.emails.welcome_text3
Allows for changing the default text (signature at the end) in the welcome email message.
Best, <br>The {0} team String
scoold.emails.default_signature
The default email signature for all transactional emails sent from Scoold.
Best, <br>The {0} team String

Security

Property key & Description Default Value Type
scoold.approved_domains_for_signups
A comma-separated list of domain names, which will be used to restrict the people who are allowed to sign up on the site.
String
scoold.security.allow_unverified_emails
Enable/disable email verification after the initial user registration. Users with unverified emails won't be able to sign in, unless they use a social login provider.
false Boolean
scoold.session_timeout
The validity period of the authentication cookie, in seconds. Default is 24h.
86400 Integer
scoold.jwt_expires_after
The validity period of the session token (JWT), in seconds. Default is 24h.
86400 Integer
scoold.security.one_session_per_user
If disabled, users can sign in from multiple locations and devices, keeping a few open sessions at once. Otherwise, only one session will be kept open, others will be closed.
true Boolean
scoold.min_password_length
The minimum length of passwords.
8 Integer
scoold.min_password_strength
The minimum password strength - one of 3 levels: 1 good enough, 2 strong, 3 very strong.
2 Integer
scoold.pass_reset_timeout
The validity period of the password reset token sent via email for resetting users' passwords. Default is 30 min.
1800 Integer
scoold.profile_anonimity_enabled
Enable/disable the option for users to anonimize their profiles on the site, hiding their name and picture.
false Boolean
scoold.signup_captcha_site_key
The reCAPTCHA v3 site key for protecting the signup and password reset pages.
String
scoold.signup_captcha_secret_key
The reCAPTCHA v3 secret.
String
scoold.csp_reports_enabled
Enable/disable automatic reports each time the Content Security Policy is violated.
false Boolean
scoold.csp_header_enabled
Enable/disable the Content Security Policy (CSP) header.
true Boolean
scoold.csp_header
The CSP header value which will overwrite the default one. This can contain one or more {{nonce}} placeholders, which will be replaced with an actual nonce on each request.
String
scoold.hsts_header_enabled
Enable/disable the Strict-Transport-Security security header.
true Boolean
scoold.framing_header_enabled
Enable/disable the X-Frame-Options security header.
true Boolean
scoold.xss_header_enabled
Enable/disable the X-XSS-Protection security header.
true Boolean
scoold.contenttype_header_enabled
Enable/disable the X-Content-Type-Options security header.
true Boolean
scoold.referrer_header_enabled
Enable/disable the Referrer-Policy security header.
true Boolean
scoold.permissions_header_enabled
Enable/disable the Permissions-Policy security header.
true Boolean
scoold.csp_connect_sources
Additional sources to add to the connect-src CSP directive. Used when adding external scripts to the site.
String
scoold.csp_frame_sources
Additional sources to add to the frame-src CSP directive. Used when adding external scripts to the site.
String
scoold.csp_font_sources
Additional sources to add to the font-src CSP directive. Used when adding external fonts to the site.
String
scoold.csp_style_sources
Additional sources to add to the style-src CSP directive. Used when adding external fonts to the site.
String

Basic Authentication

Property key & Description Default Value Type
scoold.password_auth_enabled
Enabled/disable the ability for users to sign in with an email and password.
true Boolean
scoold.fb_app_id
Facebook OAuth2 app ID.
String
scoold.fb_secret
Facebook app secret key.
String
scoold.gp_app_id
Google OAuth2 app ID.
String
scoold.gp_secret
Google app secret key.
String
scoold.in_app_id
LinkedIn OAuth2 app ID.
String
scoold.in_secret
LinkedIn app secret key.
String
scoold.tw_app_id
Twitter OAuth app ID.
String
scoold.tw_secret
Twitter app secret key.
String
scoold.gh_app_id
GitHub OAuth2 app ID.
String
scoold.gh_secret
GitHub app secret key.
String
scoold.ms_app_id
Microsoft OAuth2 app ID.
String
scoold.ms_secret
Microsoft app secret key.
String
scoold.ms_tenant_id
Microsoft OAuth2 tenant ID
common String
scoold.az_app_id
Amazon OAuth2 app ID.
String
scoold.az_secret
Amazon app secret key.
String
scoold.sl_app_id Pro
Slack OAuth2 app ID.
String
scoold.sl_secret Pro
Slack app secret key.
String
scoold.mm_app_id Pro
Mattermost OAuth2 app ID.
String
scoold.mm_secret Pro
Mattermost app secret key.
String
scoold.security.custom.provider Pro
The text on the button for signing in with the custom authentication scheme.
Continue with Acme Co. String
scoold.security.custom.login_url Pro
The URL address of an externally hosted, custom login page.
String

LDAP Authentication

Property key & Description Default Value Type
scoold.security.ldap.server_url
LDAP server URL. LDAP will be disabled if this is blank.
String
scoold.security.ldap.base_dn
LDAP base DN.
String
scoold.security.ldap.user_search_base
LDAP search base, which will be used only if a direct bind is unsuccessfull.
String
scoold.security.ldap.user_search_filter
LDAP search filter, for finding users if a direct bind is unsuccessful.
(cn={0}) String
scoold.security.ldap.user_dn_pattern
LDAP user DN pattern, which will be comined with the base DN to form the full path to theuser object, for a direct binding attempt.
uid={0} String
scoold.security.ldap.ad_mode_enabled
Enable/disable support for authenticating with Active Directory. If true, AD is enabled.
false Boolean
scoold.security.ldap.active_directory_domain
AD domain name. Add this only if you are connecting to an Active Directory server.
String
scoold.security.ldap.password_attribute
LDAP password attribute name.
userPassword String
scoold.security.ldap.bind_dn
LDAP bind DN
String
scoold.security.ldap.bind_pass
LDAP bind password.
String
scoold.security.ldap.username_as_name
Enable/disable the use of usernames for names on Scoold.
false Boolean
scoold.security.ldap.provider Pro
The text on the LDAP sign in button.
Continue with LDAP String
scoold.security.ldap.mods_group_node
Moderators group mapping, mapping LDAP users with this node, to moderators on Scoold.
String
scoold.security.ldap.admins_group_node
Administrators group mapping, mapping LDAP users with this node, to administrators on Scoold.
String
scoold.security.ldap.compare_passwords
LDAP compare passwords.
String
scoold.security.ldap.password_param
LDAP password parameter name.
password String
scoold.security.ldap.username_param
LDAP username parameter name.
username String
scoold.security.ldap.is_local Pro
Enable/disable local handling of LDAP requests, instead of sending those to Para.
false Boolean

SAML Authentication

Property key & Description Default Value Type
scoold.security.saml.idp.metadata_url Pro
SAML metadata URL. Scoold will fetch most of the necessary information for the authentication request from that XML document. This will overwrite all other IDP settings.
String
scoold.security.saml.sp.entityid Pro
SAML SP endpoint address - e.g. https://paraio.com/saml_auth/scoold. The IDP will call this address for authentication.
String
scoold.security.saml.sp.x509cert Pro
SAML client x509 certificate for the SP (public key). Value must be Base64-encoded.
String
scoold.security.saml.sp.privatekey Pro
SAML client private key in PKCS#8 format for the SP. Value must be Base64-encoded.
String
scoold.security.saml.attributes.id Pro
SAML attribute name of the user id.
UserID String
scoold.security.saml.attributes.picture Pro
SAML attribute name of the user picture.
Picture String
scoold.security.saml.attributes.email Pro
SAML attribute name of the user email.
EmailAddress String
scoold.security.saml.attributes.name Pro
SAML attribute name of the user name.
GivenName String
scoold.security.saml.attributes.firstname Pro
SAML attribute name of the user firstname.
FirstName String
scoold.security.saml.attributes.lastname Pro
SAML attribute name of the user lastname.
LastName String
scoold.security.saml.provider Pro
The text on the button for signing in with SAML.
Continue with SAML String
scoold.security.saml.sp.assertion_consumer_service.url Pro
SAML ACS URL.
String
scoold.security.saml.sp.nameidformat Pro
SAML name id format.
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified String
scoold.security.saml.idp.entityid Pro
SAML IDP entity id for manually setting the endpoint address of the IDP, instead of getting it from the provided metadata URL.
String
scoold.security.saml.idp.single_sign_on_service.url Pro
SAML SSO service URL of the IDP.
String
scoold.security.saml.idp.x509cert Pro
SAML server x509 certificate for the IDP (public key). Value must be Base64-encoded.
String
scoold.security.saml.security.authnrequest_signed Pro
Enable/disable SAML authentication request signing.
false Boolean
scoold.security.saml.security.want_messages_signed Pro
Enable/disable SAML message signing.
false Boolean
scoold.security.saml.security.want_assertions_signed Pro
Enable/disable SAML assertion signing.
false Boolean
scoold.security.saml.security.want_assertions_encrypted Pro
Enable/disable SAML assertion encryption.
false Boolean
scoold.security.saml.security.want_nameid_encrypted Pro
Enable/disable SAML NameID encryption.
false Boolean
scoold.security.saml.security.want_nameid Pro
Enable/disable SAML NameID requirement.
true Boolean
scoold.security.saml.security.sign_metadata Pro
Enable/disable SAML metadata signing.
false Boolean
scoold.security.saml.security.want_xml_validation Pro
Enable/disable SAML XML validation.
true Boolean
scoold.security.saml.security.signature_algorithm Pro
SAML signature algorithm.
String
scoold.security.saml.domain Pro
SAML domain name.
paraio.com String
scoold.security.saml.is_local Pro
Enable/disable local handling of SAML requests, instead of sending those to Para.
false Boolean

OAuth 2.0 Authentication

Property key & Description Default Value Type
scoold.oa2_app_id
OAauth 2.0 client app identifier. Alternatives: oa2second_app_id, oa2third_app_id
String
scoold.oa2_secret
OAauth 2.0 client app secret key. Alternatives: oa2second_secret, oa2third_secret
String
scoold.security.oauth.authz_url
OAauth 2.0 client app authorization URL (login page). Alternatives: security.oauthsecond.authz_url, security.oauththird.authz_url
String
scoold.security.oauth.token_url
OAauth 2.0 client app token endpoint URL. Alternatives: security.oauthsecond.token_url, security.oauththird.token_url
String
scoold.security.oauth.profile_url
OAauth 2.0 client app user info endpoint URL. Alternatives: security.oauthsecond.profile_url, security.oauththird.profile_url
String
scoold.security.oauth.scope
OAauth 2.0 client app scope. Alternatives: security.oauthsecond.scope, security.oauththird.scope
openid email profile String
scoold.security.oauth.accept_header
OAauth 2.0 Accept header customization. Alternatives: security.oauthsecond.accept_header, security.oauththird.accept_header
String
scoold.security.oauth.parameters.id
OAauth 2.0 attribute mapping for id. Alternatives: security.oauthsecond.parameters.id, security.oauththird.parameters.id
sub String
scoold.security.oauth.parameters.name
OAauth 2.0 attribute mapping for name. Alternatives: security.oauthsecond.parameters.name, security.oauththird.parameters.name
name String
scoold.security.oauth.parameters.given_name
OAauth 2.0 attribute mapping for given_name. Alternatives: security.oauthsecond.parameters.given_name, security.oauththird.parameters.given_name
given_name String
scoold.security.oauth.parameters.family_name
OAauth 2.0 attribute mapping for family_name. Alternatives: security.oauthsecond.parameters.family_name, security.oauththird.parameters.family_name
family_name String
scoold.security.oauth.parameters.email
OAauth 2.0 attribute mapping for email. Alternatives: security.oauthsecond.parameters.email, security.oauththird.parameters.email
email String
scoold.security.oauth.parameters.picture
OAauth 2.0 attribute mapping for picture. Alternatives: security.oauthsecond.parameters.picture, security.oauththird.parameters.picture
picture String
scoold.security.oauth.download_avatars
Enable/disable OAauth 2.0 avatar downloading to local disk. Used when avatars are large in size. Alternatives: security.oauthsecond.download_avatars, security.oauththird.download_avatars
false Boolean
scoold.security.oauth.token_delegation_enabled Pro
Enable/disable OAauth 2.0 token delegation. The ID and access tokens will be saved and delegated to Scoold from Para. Alternatives: security.oauthsecond.token_delegation_enabled, security.oauththird.token_delegation_enabled
false Boolean
scoold.security.oauth.spaces_attribute_name Pro
OAauth 2.0 attribute mapping for users' spaces. The spaces can be comma-separated. Alternatives: security.oauthsecond.spaces_attribute_name, security.oauththird.spaces_attribute_name
spaces String
scoold.security.oauth.groups_attribute_name Pro
OAauth 2.0 attribute mapping for users' groups. Use this for mapping admin, mod and user roles to Scoold users.Alternatives: security.oauthsecond.groups_attribute_name, security.oauththird.groups_attribute_name
String
scoold.security.oauth.mods_equivalent_claim_value Pro
OAauth 2.0 claim used for mapping OAuth2 users having it, to moderators on Scoold. Alternatives: security.oauthsecond.mods_equivalent_claim_value, security.oauththird.mods_equivalent_claim_value
mod String
scoold.security.oauth.admins_equivalent_claim_value Pro
OAauth 2.0 claim used for mapping OAuth2 users having it, to administrators on Scoold. Alternatives: security.oauthsecond.admins_equivalent_claim_value, security.oauththird.admins_equivalent_claim_value
admin String
scoold.security.oauth.users_equivalent_claim_value Pro
OAauth 2.0 claim used for denying access to OAuth2 users not having it, unlessthey already have the admin or moderator roles assigned. Alternatives: security.oauthsecond.users_equivalent_claim_value, security.oauththird.users_equivalent_claim_value
String
scoold.security.oauth.domain
OAauth 2.0 domain name for constructing user email addresses in case they are missing. Alternatives: security.oauthsecond.domain, security.oauththird.domain
String
scoold.security.oauth.provider
The text on the button for signing in with OAuth2 or OIDC.
Continue with OpenID Connect String
scoold.security.oauth.appid_in_state_param_enabled
Enable/disable the use of the OAauth 2.0 state parameter to designate your Para app id. Some OAauth 2.0 servers throw errors if the length of the state parameter is less than 8 chars.
true Boolean
scoold.security.oauth.send_scope_to_token_endpoint
Enable/disable sending the OAauth 2.0 scope parameter in the token request. Some OAuth 2.0 servers require this to be turned off.
true Boolean

Posts

Property key & Description Default Value Type
scoold.new_users_can_comment
Enable/disable the ability for users with reputation below 100 to comments on posts.
true Boolean
scoold.posts_need_approval
Enable/disable the need for approval of new posts (both questions and answers) by a moderator.
false Boolean
scoold.answers_approved_by
Controls who is able to mark an answer as accepted. Possible values are default (author and moderators), admins (admins only), moderators (moderators and admins).
default String
scoold.answers_need_approval
Enable/disable the need for approval of new answers by a moderator.
false Boolean
scoold.wiki_answers_enabled Pro
Enable/disable the ability for users to create wiki-style answers, editable by everyone.
true Boolean
scoold.media_recording_allowed Pro
Enable/disable support for attaching recorded videos and voice messages to posts.
true Boolean
scoold.delete_protection_enabled
Enable/disable the ability for authors to delete their own question, when it already has answers and activity.
true Boolean
scoold.max_text_length
The maximum text length of each post (question or answer). Longer content will be truncated.
20000 Integer
scoold.max_tags_per_post
The maximum number of tags a question can have. The minimum is 0 - then the default tag is used.
5 Integer
scoold.min_tags_per_post
The minimum number of tags a question must have. The minimum is 0.
0 Integer
scoold.tag_creation_allowed
Enable/disable tag creation by normal users. If disabled, only admins and moderators can create new tags.
true Boolean
scoold.max_replies_per_post
The maximum number of answers a question can have.
500 Integer
scoold.max_comments_per_id
The maximum number of comments a post can have.
1000 Integer
scoold.max_comment_length
The maximum length of each comment.
600 Integer
scoold.max_mentions_in_posts Pro
The maximum number of mentioned users a post can have.
10 Integer
scoold.anonymous_posts_enabled Pro
Enable/disable the ability for unathenticated users to create new questions.
false Boolean
scoold.nearme_feature_enabled
Enable/disable the ability for users to attach geolocation data to questions and location-based filtering of questions.
false Boolean
scoold.merge_question_bodies
Enable/disable the merging of question bodies when two questions are merged into one.
true Boolean
scoold.max_similar_posts
The maximum number of similar posts which will be displayed on the side.
7 Integer
scoold.default_question_tag
The default question tag, used when no other tags are provided by its author.
String
scoold.posts_rep_threshold
The minimum reputation an author needs to create a post without approval by moderators. This is only required if new posts need apporval.
100 Integer

Spaces

Property key & Description Default Value Type
scoold.auto_assign_spaces
A comma-separated list of spaces to assign to all new users.
String
scoold.reset_spaces_on_new_assignment
Spaces delegated from identity providers will overwrite the existing ones for users.
true Boolean
scoold.mods_access_all_spaces
By default, moderators have access to and can edit content in all spaces. When disabled, moderators can only access the spaces they are assigned to by admins.
true Boolean

Reputation and Rewards

Property key & Description Default Value Type
scoold.answer_voteup_reward_author
Reputation points given to author of answer as reward when a user upvotes it.
10 Integer
scoold.question_voteup_reward_author
Reputation points given to author of question as reward when a user upvotes it.
5 Integer
scoold.voteup_reward_author
Reputation points given to author of comment or other post as reward when a user upvotes it.
2 Integer
scoold.answer_approve_reward_author
Reputation points given to author of answer as reward when the question's author accepts it.
10 Integer
scoold.answer_approve_reward_voter
Reputation points given to author of question who accepted an answer.
3 Integer
scoold.answer_create_reward_author
Reputation points given to author who added an answer to a question (awarded once per question).
5 Integer
scoold.post_votedown_penalty_author
Reputation points taken from author of post as penalty when their post was downvoted.
3 Integer
scoold.post_votedown_penalty_voter
Reputation points taken from the user who downvotes any content. Discourages downvoting slightly.
1 Integer
scoold.voter_ifhas
Number of votes (up or down) needed from a user for earning the voter badge.
100 Integer
scoold.commentator_ifhas
Number of comments a user needs to have posted for earning the commentator badge.
100 Integer
scoold.critic_ifhas
Number of cast downvotes needed from a user for earning the critic badge.
10 Integer
scoold.supporter_ifhas
Number of cast upvotes needed from a user for earning the supporter badge.
50 Integer
scoold.goodquestion_ifhas
Votes needed on a question before its author gets to earn the good question badge.
20 Integer
scoold.goodanswer_ifhas
Votes needed on an answer before its author gets to earn the good answer badge.
10 Integer
scoold.enthusiast_ifhas
Reputation points needed for earning the enthusiast badge.
100 Integer
scoold.freshman_ifhas
Reputation points needed for earning the freshman badge.
300 Integer
scoold.scholar_ifhas
Reputation points needed for earning the scholar badge.
500 Boolean
scoold.teacher_ifhas
Reputation points needed for earning the teacher badge.
1000 Integer
scoold.geek_ifhas
Reputation points needed for earning the geek badge.
9000 Integer

File Storage

Property key & Description Default Value Type
scoold.uploads_enabled Pro
Enable/disable file uploads.
true Boolean
scoold.file_uploads_dir Pro
The directory (local or in the cloud) where files will be stored.
uploads String
scoold.uploads_require_auth Pro
Enable/disable the requirement that uploaded files can only be accessed by authenticated users.
false Boolean
scoold.allowed_upload_formats Pro
A comma-separated list of allowed MIME types in the format extension:mime_type, e.g.py:text/plain or just the extensions py,yml
String
scoold.s3_bucket Pro
AWS S3 bucket name as target for storing files.
String
scoold.s3_path Pro
AWS S3 object prefix (directory) inside the bucket.
String
scoold.s3_region Pro
AWS S3 region.
String
scoold.s3_endpoint Pro
AWS S3 endpoint override. The S3 region will be ignored if this is set. Can be used for connecting to S3-compatible storage providers.
String
scoold.s3_access_key Pro
AWS S3 access key.
String
scoold.s3_secret_key Pro
AWS S3 secret key.
String
scoold.blob_storage_account Pro
Azure Blob Storage account ID.
String
scoold.blob_storage_token Pro
Azure Blob Storage token.
String
scoold.blob_storage_container Pro
Azure Blob Storage container.
String
scoold.blob_storage_path Pro
Azure Blob Storage path prefix (subfolder) within a container.
String

Customization

Property key & Description Default Value Type
scoold.default_language_code
The default language code to use for the site. Set this to make the site load a different language from English.
String
scoold.welcome_message
Adds a brief intro text inside a banner at the top of the main page for new visitors to see.Not shown to authenticated users.
String
scoold.welcome_message_onlogin
Adds a brief intro text inside a banner at the top of the page. Shown to authenticated users only.
String
scoold.welcome_message_prelogin
Adds a brief intro text inside a banner at the top of the page. Shown only on the 'Sign in' page.
String
scoold.dark_mode_enabled
Enable/disable the option for users to switch to the dark theme.
true Boolean
scoold.meta_description
The content inside the description <meta> tag.
Scoold is friendly place for knowledge sharing and collaboration... String
scoold.meta_keywords
The content inside the keywords <meta> tag.
knowledge base, knowledge sharing, collaboration, wiki... String
scoold.show_branding
Enable/disable the 'Powered by Scoold' branding in the footer.
true Boolean
scoold.mathjax_enabled Pro
Enable/disable support for MathJax and LaTeX for scientific expressions in Markdown.
false Boolean
scoold.gravatars_enabled
Enable/disable support for Gravatars.
true Boolean
scoold.gravatars_pattern
The pattern to use when displaying empty/anonymous gravatar pictures.
retro String
scoold.avatar_repository preview
The avatar repository - one of imgur, cloudinary.
String
scoold.footer_html
Some custom HTML content to be added to the website footer.
String
scoold.navbar_link1_url
The URL of an extra custom link which will be added to the top navbar.
String
scoold.navbar_link1_text
The title of an extra custom link which will be added to the top navbar.
Link1 String
scoold.navbar_link1_target
The target attribute of an extra custom link which will be added to the top navbar.
String
scoold.navbar_link2_url
The URL of an extra custom link which will be added to the top navbar.
String
scoold.navbar_link2_text
The title of an extra custom link which will be added to the top navbar.
Link2 String
scoold.navbar_link2_target
The target attribute of an extra custom link which will be added to the top navbar.
String
scoold.navbar_menu_link1_url
The URL of an extra custom link which will be added to user's dropdown menu. Only shown to authenticated users.
String
scoold.navbar_menu_link1_text
The title of an extra custom link which will be added to the user's dropdown menu.
Menu Link1 String
scoold.navbar_menu_link1_target
The target attribute of an extra custom link which will be added to user's dropdown menu.
String
scoold.navbar_menu_link2_url
The URL of an extra custom link which will be added to user's dropdown menu. Only shown to authenticated users.
String
scoold.navbar_menu_link2_text
The title of an extra custom link which will be added to the user's dropdown menu.
Menu Link2 String
scoold.navbar_menu_link2_target
The target attribute of an extra custom link which will be added to the user's dropdown menu.
String
scoold.always_hide_comment_forms
Enable/disable a visual tweak which keeps all comment text editors closed at all times.
true Boolean
scoold.footer_links_enabled
Enable/disable all links in the website footer.
true Boolean
scoold.emails_footer_html
The HTML code snippet to embed at the end of each transactional email message.
<a href="{host_url}">{app_name}</a> &bull; <a href="https://scoold.com">Powered by Scoold</a> String
scoold.cookie_consent_required
Enable/disable the cookie consent popup box and blocks all external JS scripts from loading. Used for compliance with GDPR/CCPA.
false Boolean
scoold.fixed_nav
Enable/disable a fixed navigation bar.
false Boolean
scoold.logo_width
The width of the logo image in the nav bar, in pixels. Used for fine adjustments to the logo size.
100 Integer
scoold.code_highlighting_enabled
Enable/disable support for syntax highlighting in code blocks.
true Boolean
scoold.max_pages
Maximum number of pages to return as results.
1000 Integer
scoold.numeric_pagination_enabled
Enable/disable the numeric pagination style (< 1 2 3...N >).
false Boolean
scoold.html_in_markdown_enabled
Enable/disable the ability for users to insert basic HTML tags inside Markdown content.
false Boolean
scoold.max_items_per_page
Maximum number of results to return in a single page of results.
30 Integer
scoold.avatar_edits_enabled
Enable/disable the ability for users to edit their profile pictures.
true Boolean
scoold.name_edits_enabled
Enable/disable the ability for users to edit their name.
true Boolean

Frontend Assets

Property key & Description Default Value Type
scoold.logo_url
The URL of the logo in the nav bar. Use a PNG, SVG, JPG or WebP format.
/images/logo.svg String
scoold.logo_dark_url
The URL of the logo in the nav bar used in dark mode. Use a PNG, SVG, JPG or WebP format.
/images/logo.svg String
scoold.small_logo_url
The URL of a smaller logo (only use PNG/JPG!). Used in transactional emails and the meta og:image.
/images/logowhite.png String
scoold.cdn_url
A CDN URL where all static assets might be stored.
String
scoold.stylesheet_url
A stylesheet URL of a CSS file which will be used as the main stylesheet. This will overwrite all existing CSS styles!
/styles/style.css String
scoold.dark_stylesheet_url
A stylesheet URL of a CSS file which will be used when dark mode is enabled. This will overwrite all existing dark CSS styles!
/styles/dark.css String
scoold.external_styles
A comma-separated list of external CSS files. These will be loaded after the main stylesheet.
String
scoold.external_scripts._id_
A map of external JS scripts. These will be loaded after the main JS script. For example: scoold.external_scripts.script1 = "alert('Hi')"
Map
scoold.inline_css
Some short, custom CSS snippet to embed inside the <head> element.
String
scoold.favicon_url
The URL of the favicon image.
/images/favicon.ico String
scoold.meta_app_icon
The URL of the app icon image in the <meta property='og:image'> tag.
/images/logowhite.png String

Mattermost Integration

Property key & Description Default Value Type
scoold.mattermost.auth_enabled Pro
Enable/disable authentication with Mattermost.
false Boolean
scoold.mattermost.server_url Pro
Mattermost server URL.
String
scoold.mattermost.bot_username Pro
Mattermost bot username.
scoold String
scoold.mattermost.bot_icon_url Pro
Mattermost bot avatar URL.
/images/logowhite.png String
scoold.mattermost.post_to_space Pro
Default space on Scoold where questions created on Mattermost will be published. Set it to workspace for using the team's name.
String
scoold.mattermost.map_channels_to_spaces Pro
Enable/disable mapping of Mattermost channels to Scoold spaces. When enabled, will create a Scoold space for each Mattermost channel.
false Boolean
scoold.mattermost.map_workspaces_to_spaces Pro
Enable/disable mapping of Mattermost teams to Scoold spaces. When enabled, will create a Scoold space for each Mattermost team.
true Boolean
scoold.mattermost.max_notification_webhooks Pro
The maximum number of incoming webhooks which can be created on Scoold. Each webhook links a Mattermost channel to Scoold.
10 Integer
scoold.mattermost.notify_on_new_answer Pro
Enable/disable the ability for Scoold to send notifications to Mattermost for new answers.
true Boolean
scoold.mattermost.notify_on_new_question Pro
Enable/disable the ability for Scoold to send notifications to Mattermost for new questions.
true Boolean
scoold.mattermost.notify_on_new_comment Pro
Enable/disable the ability for Scoold to send notifications to Mattermost for new comments.
true Boolean
scoold.mattermost.dm_on_new_comment Pro
Enable/disable the ability for Scoold to send direct messages to Mattermost users for new comments.
false Boolean
scoold.mattermost.default_question_tags Pro
Default question tags for questions created on Mattermost (comma-separated list).
via-mattermost String

Slack Integration

Property key & Description Default Value Type
scoold.slack.auth_enabled Pro
Enable/disable authentication with Slack.
false Boolean
scoold.slack.app_id Pro
The Slack app ID (first ID from the app's credentials, not the OAuth2 Client ID).
String
scoold.slack.signing_secret Pro
Slack signing secret key for verifying request signatures.
x String
scoold.slack.max_notification_webhooks Pro
The maximum number of incoming webhooks which can be created on Scoold. Each webhook links a Slack channel to Scoold.
10 Integer
scoold.slack.map_channels_to_spaces Pro
Enable/disable mapping of Slack channels to Scoold spaces. When enabled, will create a Scoold space for each Slack channel.
false Boolean
scoold.slack.map_workspaces_to_spaces Pro
Enable/disable mapping of Slack teams to Scoold spaces. When enabled, will create a Scoold space for each Slack team.
true Boolean
scoold.slack.post_to_space Pro
Default space on Scoold where questions created on Slack will be published. Set it to workspace for using the team's name.
String
scoold.slack.default_title Pro
Default question title for questions created on Slack.
A question from Slack String
scoold.slack.notify_on_new_answer Pro
Enable/disable the ability for Scoold to send notifications to Slack for new answers.
true Boolean
scoold.slack.notify_on_new_question Pro
Enable/disable the ability for Scoold to send notifications to Slack for new questions.
true Boolean
scoold.slack.notify_on_new_comment Pro
Enable/disable the ability for Scoold to send notifications to Slack for new comments.
true Boolean
scoold.slack.dm_on_new_comment Pro
Enable/disable the ability for Scoold to send direct messages to Slack users for new comments.
false Boolean
scoold.slack.default_question_tags Pro
Default question tags for questions created on Slack (comma-separated list).
via-slack String

Microsoft Teams Integration

Property key & Description Default Value Type
scoold.teams.auth_enabled
Enable/disable authentication with Microsoft.
false Boolean
scoold.teams.bot_id Pro
Teams bot ID.
String
scoold.teams.bot_secret Pro
Teams bot secret key.
String
scoold.teams.bot_service_url Pro
Teams bot service URL.
https://smba.trafficmanager.net/emea/ String
scoold.teams.notify_on_new_answer Pro
Enable/disable the ability for Scoold to send notifications to Teams for new answers.
true Boolean
scoold.teams.notify_on_new_question Pro
Enable/disable the ability for Scoold to send notifications to Teams for new questions.
true Boolean
scoold.teams.notify_on_new_comment Pro
Enable/disable the ability for Scoold to send notifications to Teams for new comments.
true Boolean
scoold.teams.dm_on_new_comment Pro
Enable/disable the ability for Scoold to send direct messages to Teams users for new comments.
false Boolean
scoold.teams.post_to_space Pro
Default space on Scoold where questions created on Teams will be published. Set it to workspace for using the team's name.
String
scoold.teams.map_channels_to_spaces Pro
Enable/disable mapping of Teams channels to Scoold spaces. When enabled, will create a Scoold space for each Teams channel.
false Boolean
scoold.teams.map_workspaces_to_spaces Pro
Enable/disable mapping of Teams teams to Scoold spaces. When enabled, will create a Scoold space for each Teams team.
true Boolean
scoold.teams.private_teams_listing_allowed Pro
Enable/disable the listing of private teams on the Administration page when configuring notification webhooks for Scoold spaces.
true Boolean
scoold.teams.max_notification_webhooks Pro
The maximum number of incoming webhooks which can be created on Scoold. Each webhook links a Teams channel to Scoold.
10 Integer
scoold.teams.default_title Pro
Default question title for questions created on Teams.
A question from Microsoft Teams String
scoold.teams.default_question_tags Pro
Default question tags for questions created on Teams (comma-separated list).
via-teams String

SCIM

Property key & Description Default Value Type
scoold.scim_enabled Pro preview
Enable/disable support for SCIM user provisioning.
false Boolean
scoold.scim_secret_token Pro preview
SCIM secret token.
String
scoold.scim_allow_provisioned_users_only Pro preview
Enable/disable the restriction that only SCIM-provisioned users can sign in.
false Boolean
scoold.scim_map_groups_to_spaces Pro preview
Enable/disable mapping of SCIM groups to Scoold spaces.
true Boolean
scoold.security.scim.admins_group_equivalent_to Pro preview
SCIM group whose members will be promoted to administrators on Scoold.
admins String
scoold.security.scim.mods_group_equivalent_to Pro preview
SCIM group whose members will be promoted to moderators on Scoold.
mods String

Miscellaneous

Property key & Description Default Value Type
scoold.security.redirect_uri
Publicly accessible, internet-facing URL of the Para endpoint where authenticated users will be redirected to, from the identity provider. Used when Para is hosted behind a proxy.
http://localhost:8080 String
scoold.security.hosturl_aliases
Provides a comma-separated list of alternative host_url public addresses to be used when returning from an authentication request to Para backend. This will override the hostname defined in signin_success and signin_failure and allow Scoold to run on multiple different public URLs while each separate server shares the same configuration. Each must be a valid URL
String
scoold.redirect_signin_to_idp
Enable/disable the redirection of users from the signin page, directly to the IDP login page.
false Boolean
scoold.gmaps_api_key
The Google Maps API key. Used for geolocation functionality, (e.g. 'posts near me', location).
String
scoold.imgur_client_id preview
Imgur API client id. Used for uploading avatars to Imgur. Note: Imgur have some breaking restrictions going on in their API and this might not work.
String
scoold.cloudinary_url preview
Cloudinary URL. Used for uploading avatars to Cloudinary.
String
scoold.max_fav_tags
Maximum number of favorite tags.
50 Integer
scoold.batch_request_size
Maximum batch size for the Para client pagination requests.
0 Integer
scoold.signout_url
The URL which users will be redirected to after they click 'Sign out'. Can be a page hosted externally.
/signin?code=5&success=true String
scoold.vote_expires_after_sec
Vote expiration timeout, in seconds. Users can vote again on the same content after this period has elapsed. Default is 30 days.
2592000 Integer
scoold.vote_locked_after_sec
Vote locking period, in seconds. Vote cannot be changed after this period has elapsed. Default is 30 sec.
30 Integer
scoold.downvotes_enabled
Enable/disable negative votes.
true Boolean
scoold.import_batch_size
Maximum number objects to read and send to Para when importing data from a backup.
100 Integer
scoold.connection_retries_max
Maximum number of connection retries to Para.
10 Integer
scoold.connection_retry_interval_sec
Para connection retry interval, in seconds.
10 Integer
scoold.rewrite_inbound_links_with_fqdn
If set, links to Scoold in emails will be replaced with a public-facing FQDN.
String
scoold.cluster_nodes
Total number of nodes present in the cluster when Scoold is deployed behind a reverse proxy.
1 Integer
scoold.autoinit.root_app_secret_key
If configured, Scoold will try to automatically initialize itself with Para and create its own Para app, called app:scoold. The keys for that new app will be saved in the configuration file.
String
scoold.autoinit.para_config_file
Does the same as scoold.autoinit.root_app_secret_key but tries to read the secret key for the root Para app from the Para configuration file, wherever that may be.
String
scoold.sitemap_enabled
Enable/disable the generation of /sitemap.xml.
true Boolean
scoold.access_log_enabled
Enable/disable the Scoold access log.
false Boolean
scoold.user_autocomplete_details_enabled pro
Enable/disable extra details when displaying user results in autocomplete.
false Boolean
scoold.user_autocomplete_max_results pro
Controls the maximum number of search results in users' autocomplete.
10 Integer
scoold.users_discoverability_enabled
Enable/disable discoverability of users on the site. If disabled, user profiles and the users page will be hidden for all except admins.
true Boolean
scoold.notifications_as_reports_enabled
Enable/disable copies of new content notifications in the form of reports on the site. Instead of checking their email, mods will be able to view and act on those on the reports page.
false Boolean
scoold.akismet_api_key
API Key for Akismet for activating anti-spam protection of all posts.
String
scoold.automatic_spam_protection_enabled
Enable/disable autonomous action taken against spam posts - if detected a spam post will be blocked without notice. By default, spam posts will require action and approval by admins.
true Boolean

On startup, Scoold tries to connect to Para every 10 seconds, 10 times in total. (default). If the connection is unsuccessful, the settings will not be persisted.

scoold.connection_retries_max = 10
scoold.connection_retry_interval_sec = 10

For an infinite number of attempts to connect to Para, set connection_retries_max to -1.

Docker

For tagged Docker images for Scoold, go to erudikaltd/scoold on Docker Hub.

The :latest_stable tag always points to the latest stable release version. The :latest tag can be broken/unstable.

The easiest way to create the Scoold stack is to run docker compose up.

  1. Create a new directory and copy docker-compose.yml (for Scoold Pro docker-compose.yml is here) to it from this repository.
  2. Create the two blank configuration files in the same directory. Both files must be blank in order for the initial auto-configuration to work.:
    $ touch para-application.conf scoold-application.conf
    
    Since the configuration files do not define scoold.app_secret_key and scoold.para_secret_key, these secrets will be populated automatically upon initialization.
  3. $ docker compose up

Finally, open locahost:8000/signin/register and create a new account. If you've configured your email with scoold.admins = "my@email" and you sign up with the same email, you will become admin automatically.

To stop the containers use Ctrl + C.

Important: Scoold will connect to Para on http://para:8080, inside the Docker container environment. That hostname may not be accessible from your local machine or the Internet, which will break authentication redirects. For example, when signing in with Google, you will be redirected to Google and then back to Para, on the address specified in scoold.security.redirect_uri. Para must be a publicly accessible on that address or the authentication requests will fail.

If you prefer, you can run the Scoold container outside of Docker Compose. First, have your Scoold scoold-application.conf configuration file ready in the current directory and run this command:

$ docker run -ti -p 8000:8000 --rm -v $(pwd)/scoold-application.conf:/scoold/application.conf \
  -e JAVA_OPTS="-Dconfig.file=/scoold/application.conf" erudikaltd/scoold:latest_stable

For Scoold Pro the images are located in a private registry. You can get access to it once you purchase a Pro license. The run command for Scoold Pro is similar with the only difference being the uploads volume:

$ docker run -ti -p 8000:8000 --rm -v $(pwd)/scoold-application.conf:/scoold-pro/application.conf \
  -v scoold-uploads:/scoold-pro/uploads -e JAVA_OPTS="-Dconfig.file=/scoold-pro/application.conf" \
  374874639893.dkr.ecr.eu-west-1.amazonaws.com/scoold-pro:latest_stable

Follow the getting started guide after starting the Para and Scoold containers.

Environment variables

JAVA_OPTS - Java system properties, e.g. -Dscoold.port=8000 BOOT_SLEEP - Startup delay, in seconds

Kubernetes

There's a Helm chart inside the helm/ folder. First edit helm/scoold/values.yaml and then you can deploy Scoold to Kubernetes with a single command:

cd helm; helm install ./scoold

For more info, read the README at helm/README.md.

Docker registry for Scoold Pro images

If you purchase Scoold Pro you can get access to the private Docker registry hosted on the AWS Elastic Container Registry. Access to the private registry is not given automatically upon purchase - you have to request it. You will then be issued a special access key and secret for AWS ECR. Then execute the following BASH commands (these require AWS CLI v2.x):

  1. Configure AWS CLI to use the new credentials or instruct AWS CLI to use an existing credentials profile, e.g. export AWS_PROFILE=docker:
    aws configure
    
  2. Authenticate with our ECR registry - a temporary access token will be issued for 12h:
    aws ecr get-login-password --region eu-west-1 | \
    	docker login --username AWS --password-stdin 374874639893.dkr.ecr.eu-west-1.amazonaws.com
    

If the command above doesn't succeed, you won't be able to pull the latest Scoold Pro image or run docker compose.

  1. Pull a Scoold Pro image with a specific tag:
    aws ecr list-images --repository-name scoold-pro
    docker pull 374874639893.dkr.ecr.eu-west-1.amazonaws.com/scoold-pro:{tag}
    

You can also run docker compose up instead - download docker-compose.yml for Scoold Pro here

The :latest tag is not supported but you can use :latest_stable. The command aws get-login-password gives you an access token to the private Docker registry which is valid for 12 hours.

For connecting Kubernetes to AWS ECR, please refer to this article.

In case you don't want to use AWS CLI for logging into the Scoold Pro registry, install the AWS ECR Docker Credentials Helper.

Git repository for the Scoold Pro source

For license holders with access to the Scoold Pro source code, the steps to browse the Git repository are as follows:

git remote add scoold https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/scoold-pro
git fetch scoold master

Then enter your username and password for the Git repository.

You should be able to browse the source code with any of the Git graphic interface tools out there. Keep in mind that the repository is read-only, so you can only work with local branches and merge the latest changes from the main branch to your local branch.

Deploying Scoold to Heroku

One-click deployment

Deploy

Manual deployment - option 1 (code push)

  1. Clone this repository and create a new Heroku app
  2. Add Heroku as a Git remote target and push your changes with git push heroku master
  3. Go to the Heroku admin panel, under "Settings", "Reveal Config Vars" and set all the configuration variables shown above but replace all dots in the variable names with underscores, e.g. scoold.para_endpoint -> scoold_para_endpoint.
  4. Open the app in your browser at https://{appname}.herokuapp.com.

Manual deployment - option 2 (JAR push)

  1. Build the Scoold JAR file or acquire the Scoold Pro JAR package by buying Pro
  2. Download and install the Heroku CLI
  3. Create a Heroku app or use the id of an existing Heroku app where you want Scoold deployed
  4. Add the heroku/jvm and heroku/java buildpacks to your Heroku app from the Settings page
  5. Create a file Procfile containing this line:
    web: java -Dserver.port=$PORT $JAVA_OPTS -jar scoold-*.jar $JAR_OPTS
    
  6. Open a terminal in the directory containing the JAR file and execute:
    $ heroku plugins:install java
    $ heroku deploy:jar scoold-x.y.z.jar --app myscooldapp
    

Pushing JARs to Heroku is useful in cases where you have an existing Heroku app which hosts a free version of Scoold, deployed through the "one-click" Heroku button, and you want to upgrade it to Scoold Pro.

Configuring Scoold on Heroku

On Heroku you don't have a configuration file, instead you use Heroku's environment variables to configure Scoold. You can add each Scoold configuration property as an environment variable on the Settings page of your Heroku admin page. Click "Reveal Config Vars". Configuration variables (config vars) must not contain dots ".", for example scoold.para_endpoint becomes para_endpoint. You must replace every dot with an underscore in order to convert a Scoold configuration property to a Heroku environment variable.

Installing the Heroku CLI tool allows you to watch the Scoold logs with:

$ heroku logs --tail --app myscooldapp

Or you can restart your dyno with:

$ heroku restart --app myscooldapp

Deploying Scoold to DigitalOcean

  1. Create a droplet running Ubuntu and SSH into it
  2. Create a user ubuntu with adduser ubuntu
  3. Execute (as root) wget https://raw.githubusercontent.com/Erudika/scoold/master/installer.sh && bash installer.sh
  4. Copy the configuration file to your droplet: scp scoold-application.conf root@123.234.12.34:/home/ubuntu
  5. Restart Scoold with ssh root@123.234.12.34 "systemctl restart scoold.service"
  6. Go to http://123.234.12.34:8000 and verify that Scoold is running (use the correct IP address of your droplet)
  7. Configure SSL on DigitalOcean or install nginx + letsencrypt on your droplet (see instructions below)

Deploying Scoold to AWS

deploy to aws button

Lightsail

  1. Click the button above
  2. Choose "Linux", "OS only", "Ubuntu 18.04 LTS" (or later version)
  3. Click "+ Add launch script" and copy/paste the contents of installer.sh
  4. Download the default SSH key pair or upload your own
  5. Choose the 512MB instance or larger (1GB recommended)
  6. Wait for the instance to start and open the IP address in your browser at port 8000

Elatic Beanstalk

  1. Clone this repo and change directory to it
  2. Generate a WAR package with mvn -Pwar package