Zum Hauptinhalt springen

Plus Plugin

What is the Plus Plugin?

The Plus Plugin unlocks additional features for self-hosted Seatsurfing instances that are otherwise only available on the seatsurfing.io Professional plan. It ships as a separate, independently versioned add-on that runs alongside your self-hosted backend, so the open-source core stays lean and these features remain opt-in.

It currently unlocks:

  • Microsoft Exchange integration — one-way sync of bookings into your organization's Exchange room calendars.
  • SCIM 2.0 provisioning — automated user and group lifecycle management from your identity provider (Okta, Microsoft Entra ID, Keycloak, Google Workspace, Workday, OneLogin, PingOne, and others).
  • Microsoft Teams integration — sign in to Seatsurfing from within Microsoft Teams, using your own Azure AD app registration.

How it works

The Plus Plugin is a standalone Docker container that connects to your Seatsurfing backend over gRPC.

The Plus Plugin requires a valid license key in order to work.

Free trial

You can try the Plus Plugin without purchasing a license: it works for instances with up to 10 users across all organizations, no configuration needed. Once your instance grows beyond that, paid features are disabled until you configure a valid license key.

License tiers and usage

A license is purchased for a maximum number of users and is valid for one year. It covers your entire self-hosted instance (i.e. the sum of users across all organizations on that instance), not a single organization. Available tiers (25, 50, 100, 250, 500, or 1000 users) and current pricing are shown on the purchase page.

If the usage is exceeded, paid features are disabled until usage is reduced or the license is upgraded.

Purchasing a license

  1. In your self-hosted instance, open Admin → Settings and copy the Instance ID shown there. Your license will be bound to this ID and won't work on any other instance.
  2. Go to the Plus Plugin purchase page and fill in the number of users, your instance ID, and your billing details.
  3. Complete checkout (handled securely via Stripe). Once payment settles, your license key is generated and:
    • shown directly on the confirmation page, and
    • emailed to the address you provided.
  4. Configure the license key on your self-hosted instance (see below) and restart the plugin.

You will automatically receive an invoice for your purchase.

If you have any questions, don't hesitate to contact us.

Self-hosted setup

1. Add the Plus Plugin container

The Plus Plugin is published as its own Docker image: ghcr.io/seatsurfing/plugin-plus-features. Add it to your docker-compose.yml alongside the existing server and db services described in Docker / Compose:

services:
server:
image: ghcr.io/seatsurfing/backend
restart: always
networks:
sql:
ports:
- 8080:8080
environment:
POSTGRES_URL: "postgres://seatsurfing:DB_PASSWORD@db/seatsurfing?sslmode=disable"
CRYPT_KEY: "some-random-32-bytes-long-string"
PUBLIC_SCHEME: "http"
PUBLIC_PORT: "8080"
# Tell the backend about the Plus Plugin and how to reach it
PLUGINS_CONFIG: >-
[{"name":"plus-features","address":"plus-plugin:50051","token":"some-random-shared-secret","tls":false}]
# The backend's own gRPC endpoint that the plugin calls back into
HOSTAPI_LISTEN_ADDR: "0.0.0.0:50052"
HOSTAPI_TOKEN: "some-other-random-shared-secret"
plus-plugin:
image: ghcr.io/seatsurfing/plugin-plus-features
restart: always
networks:
sql:
environment:
# Must match the entry for this plugin in the backend's PLUGINS_CONFIG
PLUGIN_LISTEN_ADDR: "0.0.0.0:50051"
PLUGIN_TOKEN: "some-random-shared-secret"
# How to reach the backend's HostAPI, and the matching token
HOSTAPI_GRPC_ADDRESS: "server:50052"
HOSTAPI_TOKEN: "some-other-random-shared-secret"
# Your license key from the purchase confirmation email. Leave empty
# to run on the free trial (up to 10 users).
PLUGIN_LICENSE_KEY: "your-license-key"
db:
image: postgres:17
restart: always
networks:
sql:
volumes:
- db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: DB_PASSWORD
POSTGRES_USER: seatsurfing
POSTGRES_DB: seatsurfing

volumes:
db:

networks:
sql:

Start (or restart) your stack: docker compose up -d

2. Environment variables

Backend (server) — in addition to the variables listed in Configuration:

Environment variableTypeDefaultDescription
PLUGINS_CONFIGstringJSON array of plugins to connect to, e.g. [{"name":"plus-features","address":"plus-plugin:50051","token":"...","tls":false}]. Supports multiple plugins at once.
HOSTAPI_LISTEN_ADDRstring0.0.0.0:50052Address the backend's HostAPI gRPC server (used by plugins to call back into the host) binds to.
HOSTAPI_TOKENstringShared secret plugins must present when calling the backend's HostAPI. Must match HOSTAPI_TOKEN on the plugin side.
PLUGIN_CALL_TIMEOUT_SECONDSint30Timeout for gRPC calls from the backend to a plugin.

Plus Plugin (plus-plugin):

Environment variableTypeDefaultDescription
PLUGIN_LISTEN_ADDRstring0.0.0.0:50051Address the plugin's own gRPC server binds to. Must match the address given for it in the backend's PLUGINS_CONFIG.
PLUGIN_TOKENstringShared secret the backend must present when dialing this plugin. Must match the token given for it in PLUGINS_CONFIG.
PLUGIN_TLSbool0Whether the plugin's gRPC server requires TLS.
HOSTAPI_GRPC_ADDRESSstring127.0.0.1:50052Address of the backend's HostAPI gRPC service (HOSTAPI_LISTEN_ADDR above).
HOSTAPI_TOKENstringShared secret this plugin presents when calling the backend. Must match the backend's HOSTAPI_TOKEN.
HOSTAPI_TLSbool0Whether the connection to the backend's HostAPI requires TLS.
PLUGIN_LICENSE_KEYstringYour purchased license key. Leave unset to run on the free trial (up to 10 users).

The plugin does not need its own POSTGRES_URL — it fetches the database connection string from the backend at runtime, so it always uses the same database. It does need network access to both the backend (for the gRPC HostAPI callback) and the database.

Use long, random values for PLUGIN_TOKEN and HOSTAPI_TOKEN — they authenticate the gRPC connection between the backend and the plugin — and never reuse the placeholder values shown above.

3. Enable the features

Once the plugin container is running and connected, an admin will see a new Plus Features entry in the admin UI, where Microsoft Exchange sync, SCIM provisioning, and the Microsoft Teams integration can be configured per organization. Follow Microsoft Exchange and SCIM Provisioning for the feature-specific setup steps. The Microsoft Teams integration additionally requires registering your own Azure AD app — see Microsoft Teams (Self-Hosted) for the full walkthrough.

Renewing or upgrading

Licenses are valid for one year. To renew, or to move to a higher user tier, purchase a new license the same way (step "Purchasing a license" above) using the same instance ID, and update PLUGIN_LICENSE_KEY with the new key. There's no in-place upgrade — a new key simply replaces the old one.

Troubleshooting

  • Plugin doesn't show up in the admin UI: check that the plus-plugin container can reach the backend's HOSTAPI_GRPC_ADDRESS, and that PLUGIN_TOKEN/HOSTAPI_TOKEN match on both sides. Check the plugin container's logs for connection errors.
  • "Plus plugin license is invalid": make sure PLUGIN_LICENSE_KEY was copied in full and without extra whitespace, and that it was issued for this exact instance (the Instance ID under Admin → Settings must match the one used at checkout).
  • Paid features are blocked ("exceeded"): your instance-wide user count is more than 105% of your licensed seats. Reduce the number of users or purchase a higher tier.