Docker Self-Hosting
Deploy Tymeslot with Docker Compose on any VPS or home server. Includes reverse proxy setup, file upload volumes, and WebSocket configuration for LiveView.
Complete reference for all Tymeslot environment variables — required settings, defaults, and examples.
Updated 17 September 2026
SECRET_KEY_BASE
Required
64+ character secret used for session encryption and signing. By default it also
derives the key that encrypts integration credentials at rest — so unless you set
DATA_ENCRYPTION_KEY
(below), rotating this value would make stored credentials undecryptable. Generate
with the command shown in the example.
Default: none ·
Example: openssl rand -base64 64 | tr -d '\n'
DATA_ENCRYPTION_KEY
Optional
Dedicated key for encrypting integration credentials at rest, independent of SECRET_KEY_BASE. Setting it lets you rotate
SECRET_KEY_BASE
without breaking stored credentials. Base64 that decodes to at least 32 bytes; must
stay stable once set. On Cloudron it is generated automatically. See the
Data-at-Rest Encryption
guide for migration steps.
Default: derived from SECRET_KEY_BASE ·
Example: openssl rand -base64 48 | tr -d '\n'
PHX_HOST
Required
Your domain name without the protocol prefix. It sets the host of every
generated link, including the ones in password reset and verification emails,
and the origin allowed to open WebSocket connections. A development server
(mix phx.server) reads it too, falling
back to localhost when it is unset.
Default: none ·
Example: tymeslot.yourdomain.com
PORT
Optional
HTTP port for the application server to listen on.
Default: 4000 ·
Example: 4000
DEPLOYMENT_TYPE
Optional
Deployment variant. Set to docker
or cloudron
to control deployment-specific behaviour.
Default: auto-detected ·
Example: docker
REGISTRATION_ENABLED
Optional
Set to false
to disable new user registration on this instance. Also runtime-toggleable from the
admin UI
without a restart; a UI override takes precedence over this env var.
Default: true ·
Example: false
PASSWORD_AUTH_ENABLED
Optional
Set to false
to disable email/password login entirely. The login form, sign-up page, and password reset flow are hidden; only OAuth login is available. Useful for SSO-only deployments where all users must authenticate through an identity provider. Also runtime-toggleable from the admin UI.
Default: true ·
Example: false
LISTEN_IP
Optional
IP address to bind the HTTP server. Default ::
enables IPv4+IPv6 dual-stack.
Default: :: ·
Example: 0.0.0.0
URL_SCHEME
Optional
Request scheme used in generated URLs. Set to https
for production. A development server defaults to
http
on the listen port instead; setting this to https
there tells it the proxy terminates TLS on the standard port, so generated links
carry no port suffix.
Default: https ·
Example: https
WS_ALLOWED_ORIGINS
Optional
Comma-separated list of origins allowed to open WebSocket connections.
Default: derived from PHX_HOST ·
Example: tymeslot.yourdomain.com,app.example.com
DATABASE_URL
Optional
Full PostgreSQL connection string. Its host, port, database, user and password take precedence over the discrete variables below. When it names a remote host the container skips its bundled database entirely; a URL pointing at localhost means the bundled database.
Default: unset ·
Example: postgres://user:pass@db.example.com:5432/tymeslot
DATABASE_SSL
Optional
TLS for the database connection. Use true (or verify-full) to encrypt and verify the server certificate and hostname, verify-none to encrypt without verifying. Managed providers such as RDS, Neon and Supabase generally require this.
Default: unset ·
Example: true
DATABASE_SSL_CACERT_FILE
Optional
CA bundle used to verify the database certificate, for providers using a private CA. Only read when DATABASE_SSL enables verification; otherwise the system trust store is used. Store it on the /app/data volume so it survives upgrades.
Default: unset ·
Example: /app/data/rds-ca-bundle.pem
DATABASE_HOST
Optional
PostgreSQL server hostname. Any value other than localhost or 127.0.0.1 switches the container to an external database.
Default: localhost ·
Example: db.internal
DATABASE_PORT
Optional
PostgreSQL server port.
Default: 5432 ·
Example: 5432
POSTGRES_DB
Optional
Database name.
Default: tymeslot ·
Example: tymeslot
POSTGRES_USER
Optional
Database user.
Default: tymeslot ·
Example: tymeslot
POSTGRES_PASSWORD
Required
Database password. Not needed when DATABASE_URL is set, since the password rides along inside the connection string.
Default: none ·
Example: a_secure_password
DATABASE_POOL_SIZE
Optional
PostgreSQL connection pool size. Reduce for resource-constrained environments.
Default: 60 ·
Example: 20
EMAIL_ADAPTER
Optional
Email delivery method: smtp, postmark, sendgrid, mailgun, ahasend, or
test
to discard every message. Defaults to smtp,
which works with any provider. An unrecognised value stops the app at startup rather
than silently dropping mail.
Default: smtp ·
Example: smtp
EMAIL_ADAPTER, SMTP_*, or
EMAIL_FROM_*
variables. Set
EMAIL_ADAPTER
explicitly only if you want to use a different provider.
EMAIL_FROM_NAME
Required
Sender display name shown in email clients.
Default: none ·
Example: Your Company
EMAIL_FROM_ADDRESS
Required
Sender email address.
Default: none ·
Example: hello@yourdomain.com
EMAIL_SUPPORT_ADDRESS
Optional
Support contact email. Defaults to
EMAIL_FROM_ADDRESS
if not set.
Default: EMAIL_FROM_ADDRESS ·
Example: support@yourdomain.com
EMAIL_CONTACT_RECIPIENT
Optional
Recipient for contact-form submissions. Defaults to
EMAIL_FROM_ADDRESS
if not set.
Default: EMAIL_FROM_ADDRESS ·
Example: info@yourdomain.com
SMTP_HOST
Optional
Required for SMTP adapter. SMTP server hostname.
Default: none ·
Example: smtp.gmail.com
SMTP_PORT
Optional
SMTP server port. Use 587 for STARTTLS (recommended) or 465 for SMTPS.
Default: 587 ·
Example: 587
SMTP_SSL
Optional
Set to true
for a provider that serves implicit TLS on a port other than 465, such as 2465 or 8465. Without it Tymeslot opens a plain connection there, the relay waits for a TLS handshake that never comes, and the send times out.
false
turns implicit TLS off, including on 465.
Default: decided by port ·
Example: true
SMTP_USERNAME
Optional
SMTP authentication username. Set it together with SMTP_PASSWORD, or leave both unset for a relay that authorises by network rather than by login (a local Postfix, a company relay).
Default: none ·
Example: hello@yourdomain.com
SMTP_PASSWORD
Optional
SMTP authentication password or app password. Set it together with SMTP_USERNAME, or leave both unset for a relay that needs no login.
Default: none ·
Example: your_smtp_password
SMTP_CACERTFILE
Optional
PEM bundle containing the certificate authority that issued your mail server's certificate. Needed when the relay is your own: a self-hosted mail server serves a self-signed certificate until you point it at Let's Encrypt, and no public trust store can validate that. The bundle replaces the public store rather than adding to it.
Default: system trust store ·
Example: /app/data/smtp-ca.pem
SMTP_TLS_VERIFY
Optional
Set to none
to accept whatever certificate the relay presents. Mail is still encrypted, but the server's identity is no longer checked, so an intercepted connection cannot be detected. A last resort for a self-signed relay with no CA to trust — prefer SMTP_CACERTFILE, which is ignored for as long as this is set to none.
Default: peer ·
Example: none
SMTP_TLS_MIDDLEBOX_COMPAT
Optional
Rarely needed. Set to true
to make TLS 1.3 look like TLS 1.2 on the wire, for a firewall or proxy on the path that drops handshakes it does not recognise. Turn it on only if the relay is reachable by other mail clients but times out or closes the connection here; against a relay that does not expect it, it breaks every send instead.
Default: false ·
Example: true
POSTMARK_API_KEY
Optional
Required for Postmark adapter. Server API token from your Postmark dashboard.
Default: none ·
Example: your-server-api-token
SENDGRID_API_KEY
Optional
Required for SendGrid adapter. Needs only the "Mail Send" permission.
Default: none ·
Example: SG.your-api-key
MAILGUN_API_KEY
Optional
Required for Mailgun adapter. Sending API key from Mailgun.
Default: none ·
Example: your-api-key
MAILGUN_DOMAIN
Optional
Required for Mailgun adapter. The sending domain verified with Mailgun.
Default: none ·
Example: mg.yourdomain.com
MAILGUN_BASE_URL
Optional
Mailgun API endpoint. Set this only for EU-hosted Mailgun accounts.
Default: https://api.mailgun.net/v3 ·
Example: https://api.eu.mailgun.net/v3
AHASEND_API_KEY
Optional
Required for AhaSend adapter. API key from the AhaSend dashboard.
Default: none ·
Example: aha-sk-your-api-key
AHASEND_ACCOUNT_ID
Optional
Required for AhaSend adapter. The account the API key belongs to.
Default: none ·
Example: your-account-id
ENABLE_GOOGLE_AUTH
Optional
Set to true
to show a "Sign in with Google" button on the login page.
Default: false ·
Example: true
GOOGLE_CLIENT_ID
Optional
Required to use Google Login, Google Calendar, or Google Meet. OAuth client ID from Google Cloud Console.
Default: none ·
Example: 123456-abc.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET
Optional
Required to use Google features. OAuth client secret from Google Cloud Console.
Default: none ·
Example: GOCSPX-your-secret
GOOGLE_STATE_SECRET
Optional
Required to use Google features. Random secret for OAuth CSRF state verification.
Default: none ·
Example: openssl rand -hex 32
OUTLOOK_CLIENT_ID
Optional
Required to use Outlook Calendar or Microsoft Teams. Azure app Application (client) ID.
Default: none ·
Example: your-azure-app-client-id
OUTLOOK_CLIENT_SECRET
Optional
Required to use Microsoft features. Azure app client secret value.
Default: none ·
Example: your-client-secret-value
OUTLOOK_STATE_SECRET
Optional
Required to use Microsoft features. Random secret for OAuth CSRF state verification.
Default: none ·
Example: openssl rand -hex 32
Tymeslot can attach a Zoom meeting to confirmed bookings. Self-hosters create their own Zoom Marketplace app — see the Zoom integration guide for the full walkthrough.
ZOOM_CLIENT_ID
Optional
Required to use Zoom. Marketplace app Client ID.
Default: none ·
Example: your-zoom-client-id
ZOOM_CLIENT_SECRET
Optional
Required to use Zoom. Marketplace app Client Secret.
Default: none ·
Example: your-zoom-client-secret
ZOOM_STATE_SECRET
Optional
Required to use Zoom. Random secret for OAuth CSRF state verification.
Default: none ·
Example: openssl rand -hex 32
ZOOM_DEAUTH_SECRET
Optional
Required to use Zoom. Marketplace Secret Token used to verify the HMAC-SHA256
signature on Zoom's deauthorization webhook posted to
/auth/zoom/deauthorize
. Find it under Features → Deauthorization Notification in the Marketplace app.
Default: none ·
Example: <marketplace secret token>
ZOOM_UPDATE_SCOPE_ENABLED
Optional
Requests meeting:update:meeting
so a rescheduled booking moves its Zoom meeting. Set to
false
only if your Zoom app lacks that scope; users are then not asked to reconnect
for it, and the Zoom meeting keeps its original time.
Default: true ·
Example: false
VIDEO_ROOM_RETENTION_DAYS
Optional
Days after a meeting ends before Tymeslot deletes its video room, for providers whose rooms otherwise stay on the organiser's server (Nextcloud Talk). A cancelled booking's room is deleted straight away. Must be a whole number of 1 or more, or Tymeslot refuses to start. The daily clean-up looks back 30 days past this period, so lowering it by more than 30 at once leaves the rooms of meetings that ended before the new window in place.
Default: 7 ·
Example: 14
WEBHOOK_BASE_URL
Optional
Public HTTPS base URL that Google and Microsoft call back to for real-time
calendar change notifications (Google push channels and Outlook Graph
subscriptions). Usually the same as your PHX_HOST
with an https://
prefix — scheme and host only, no trailing slash or path.
When unset, calendar sync falls back to polling every 15 minutes — fully functional,
just not instant. Set it only when the host is reachable from the public internet
over HTTPS: providers run a validation handshake against the URL when a subscription
is registered, so localhost, private-network, and NAT deployments should leave it unset.
Existing calendar connections adopt push when their owner reconnects; new connections
register automatically.
Default: none (polling fallback) ·
Example: https://tymeslot.yourdomain.com
MEETING_PAYMENTS_ENABLED
Optional
Opt-in switch for meeting payments. Exposes the payments dashboard and the per-event-type payment toggle. Requires your instance to be registered as a Stripe Connect platform — see the Stripe Payments Setup guide .
Default: false ·
Example: true
STRIPE_SECRET_KEY
Optional
Your platform's Stripe secret key. Required when MEETING_PAYMENTS_ENABLED=true;
the webhook secrets below are only read when this is set.
Default: unset ·
Example: sk_live_51...
STRIPE_CONNECT_WEBHOOK_SECRET
Optional
Signing secret of the Connect webhook endpoint
(/webhooks/stripe/connect) that receives
connected-account events. Required to verify checkout, refund and dispute events
for meeting payments.
Default: unset ·
Example: whsec_...
MEETING_PAYMENTS_APPLICATION_FEE_BP
Optional
Optional platform fee in basis points (100 = 1%), taken from each charge. Defaults to 0, so no platform cut is taken unless you opt in. Range 0 to 10000.
Default: 0 ·
Example: 100
ENABLE_GITHUB_AUTH
Optional
Set to true
to show a "Sign in with GitHub" button on the login page.
Default: false ·
Example: true
GITHUB_CLIENT_ID
Optional
Required for GitHub Login. OAuth app client ID from GitHub Developer settings.
Default: none ·
Example: your_client_id
GITHUB_CLIENT_SECRET
Optional
Required for GitHub Login. OAuth app client secret.
Default: none ·
Example: your_client_secret
ENABLE_OAUTH_AUTH
Optional
Set to true
to show an "SSO" button on the login page.
Default: false ·
Example: true
OAUTH_*
variables. Set
ENABLE_OAUTH_AUTH=false
to disable SSO entirely.
OAUTH_CLIENT_ID
Optional
OAuth 2.0 client ID registered with your identity provider.
Default: none ·
Example: tymeslot
OAUTH_CLIENT_SECRET
Optional
OAuth 2.0 client secret from your identity provider.
Default: none ·
Example: your-client-secret
OAUTH_PROVIDER_URL
Optional
Base URL of your identity provider. Needed only when an endpoint below is
given as a relative path (such as /token), which is resolved against it.
Default: none ·
Example: https://idp.example.com
OAUTH_AUTHORIZE_URL
Optional
Full URL of the authorization endpoint.
Default: none ·
Example: https://idp.example.com/authorize
OAUTH_TOKEN_URL
Optional
Full URL of the token endpoint.
Default: none ·
Example: https://idp.example.com/token
OAUTH_USERINFO_URL
Optional
Full URL of the userinfo endpoint. Must return a JSON object with a
sub
claim (or id/user_id
if OAUTH_ALLOW_ID_FALLBACK
is enabled).
Default: none ·
Example: https://idp.example.com/userinfo
OAUTH_SCOPE
Optional
Space-separated list of OAuth scopes to request.
Default: openid email profile ·
Example: openid email profile groups
OAUTH_ALLOW_ID_FALLBACK
Optional
Set to true
to accept id
or user_id
claims when the IdP does not return a standard sub
claim. Only enable this for non-OIDC providers.
Default: false ·
Example: true
OAUTH_EMAIL_VERIFIED_CLAIM
Optional
How far to trust the IdP's email_verified
claim. trust_absent
trusts an email sent without the claim (many IdPs omit it) but not one marked false.
require
trusts only emails marked true; other users confirm theirs by email.
ignore
trusts every email the IdP returns, for IdPs that mark addresses they manage themselves as unverified.
Default: trust_absent ·
Example: require
RECAPTCHA_SITE_KEY
Optional
Required to enable reCAPTCHA. v3 site key from Google reCAPTCHA admin console.
Default: none ·
Example: 6Le-your-site-key
RECAPTCHA_SECRET_KEY
Optional
Required to enable reCAPTCHA. v3 secret key from Google reCAPTCHA admin console.
Default: none ·
Example: 6Le-your-secret-key
RECAPTCHA_SIGNUP_ENABLED
Optional
Enable reCAPTCHA score verification on the signup form.
Default: false ·
Example: true
RECAPTCHA_SIGNUP_MIN_SCORE
Optional
Minimum reCAPTCHA score (0.0–1.0) required to pass signup. Higher is more strict.
Default: 0.3 ·
Example: 0.5
RECAPTCHA_BOOKING_ENABLED
Optional
Enable reCAPTCHA score verification on booking forms.
Default: false ·
Example: true
RECAPTCHA_BOOKING_MIN_SCORE
Optional
Minimum reCAPTCHA score required to submit a booking.
Default: 0.3 ·
Example: 0.3
RECAPTCHA_EXPECTED_HOSTNAMES
Optional
Comma-separated list of hostnames from which reCAPTCHA tokens are accepted. Prevents token replay attacks.
Default: none ·
Example: tymeslot.yourdomain.com
TELEGRAM_BOT_TOKEN
Optional
Bot token from @BotFather. Setting this variable enables shared bot mode — all three Telegram variables must be set together. The application refuses to start if the token is set but the other two are missing.
Default: none ·
Example: 123456789:ABCdef...
TELEGRAM_BOT_USERNAME
Optional
Username of the bot (without the @
prefix). Required when TELEGRAM_BOT_TOKEN
is set.
Default: none ·
Example: MyTymeslotBot
TELEGRAM_WEBHOOK_SECRET
Optional
Random secret passed to Telegram's setWebhook
API and verified on every incoming webhook call. Required when
TELEGRAM_BOT_TOKEN
is set.
Default: none ·
Example: openssl rand -hex 32
TELEGRAM_ENABLED
Optional
Set to true
to enable Telegram in own-bot mode (each user supplies their own bot token and chat ID). Only effective when
TELEGRAM_BOT_TOKEN
is not
set — setting the token automatically enables shared bot mode regardless of this flag.
Default: false ·
Example: true
SLACK_CLIENT_ID
Optional
Slack App client ID from api.slack.com/apps. Setting this variable enables Slack notifications and unlocks OAuth mode — users see a one-click "Add to Slack" button. Must be paired with SLACK_CLIENT_SECRET.
Default: none ·
Example: 1234567890.1234567890
SLACK_CLIENT_SECRET
Optional
Slack App client secret from the same page. Required alongside
SLACK_CLIENT_ID
to complete the OAuth code-for-token exchange.
Default: none ·
Example: abcdef0123456789abcdef0123456789
SLACK_ENABLED
Optional
Set to true
to enable Slack in webhook-URL-only mode (each user pastes their own Incoming Webhook URL). Ignored when
SLACK_CLIENT_ID
is set — OAuth mode includes webhook-URL support automatically.
Default: false ·
Example: true
ADMIN_ALERTS_ENABLED
Optional
Set to true
to receive operational alert emails for webhook processing failures, integration health issues, and background job errors. Requires
ADMIN_ALERT_EMAIL
to be set.
Default: false ·
Example: true
ADMIN_ALERT_EMAIL
Optional
Recipient address that admin alert emails are delivered to. Required when
ADMIN_ALERTS_ENABLED=true
— without it, alerts are logged but no email is sent.
Default: none ·
Example: admin@yourdomain.com
ERROR_TRACKING_ENABLED
Optional
Every unexpected error, process crash and failed background job is stored in the application database with the user id and the request, LiveView or job it happened in: request path, query, parameters, headers and client IP, or job arguments. Credentials, tokens, cookies and email addresses are redacted before anything is written. An error not seen for 30 days is resolved and deleted 30 days later. Set to
false
to store nothing; errors are then only logged, and no new-error alerts are sent.
Default: true ·
Example: false
HTTPS_PROXY
Optional
Route HTTPS outbound requests through this proxy. Also accepts lowercase https_proxy.
Default: none ·
Example: http://proxy.corp.com:3128
HTTP_PROXY
Optional
Route HTTP outbound requests through this proxy. Also accepts lowercase http_proxy.
Default: none ·
Example: http://proxy.corp.com:3128
NO_PROXY
Optional
Comma-separated list of hosts, IP addresses, or CIDR ranges that bypass the proxy. Also accepts lowercase no_proxy.
Default: none ·
Example: localhost,127.0.0.1,10.0.0.0/8
TRUST_PRIVATE_CLIENT_IPS
Optional
Treat forwarded addresses in private ranges as visitors rather than as proxy hops.
Leave this off unless your visitors genuinely sit on a private network: by default a
forwarded address in 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16,
::1/128
or fc00::/7
is read as a proxy in the chain, which is what keeps a two-tier proxy from collapsing
every visitor onto one address. On an intranet-only deployment that same rule gives the
whole LAN a single rate-limit allowance for bookings, logins and password resets; turning
this on restores per-visitor limits, but only when the reverse proxy directly in front
of the app is the only hop between it and the visitor. With a further private proxy
tier upstream of that one (for example a LAN proxy in front of an inner nginx), the
flag cannot tell that outer hop apart from a visitor, and everyone behind it still
collapses onto the outer proxy's address. On an internet-facing deployment it lets a
visitor forge their own address, so do not enable it there. Carrier-grade NAT
(100.64.0.0/10, so Tailscale and similar) and
link-local addresses are unaffected either way.
Default: false ·
Example: true
In production, outbound requests to hosts that resolve to a private, loopback, or link-local address are blocked to prevent server-side request forgery. If you self-host integrations on a private network, the switches below opt specific subsystems out. All default to blocking; leave them unset unless you genuinely run those services on an internal network.
ALLOW_PRIVATE_IPS_FOR_CALENDAR
Optional
Permit calendar (CalDAV) connections whose hostname resolves to a private address. Does not affect webhooks. For backwards compatibility it also permits private video hosts, but use the video switch below for those.
Default: false ·
Example: true
ALLOW_PRIVATE_IPS_FOR_VIDEO
Optional
Permit video connections whose hostname resolves to a private address, covering self-hosted MiroTalk, Nextcloud Talk and the custom video link's connection test. Separate from the calendar switch.
Default: false ·
Example: true
ALLOW_PRIVATE_IPS_FOR_WEBHOOKS
Optional
Permit outbound webhook deliveries to URLs that resolve to a private address. Separate from the calendar and video switches, so relaxing those does not also open webhooks to internal hosts.
Default: false ·
Example: true
DNS_CLUSTER_QUERY
Optional
DNS query used for Erlang cluster node discovery in multi-node deployments.
Default: none ·
Example: tymeslot.internal
SECRET_KEY_BASE, PHX_HOST, POSTGRES_PASSWORD, and email configuration (EMAIL_FROM_NAME, EMAIL_FROM_ADDRESS, and SMTP or Postmark credentials). All other variables have defaults or are feature-specific.
For a Docker deployment you need five variables to start the application:
SECRET_KEY_BASE
— required for session signing
PHX_HOST
— your public domain name
POSTGRES_PASSWORD
— the only truly required database variable; hostname, name, and user all have defaults
EMAIL_FROM_NAME
and
EMAIL_FROM_ADDRESS
— required for outbound email
Plus credentials for your chosen email adapter — the
SMTP_*
variables if using the default adapter, or the provider's credentials if you set
EMAIL_ADAPTER
to postmark, sendgrid,
mailgun
or ahasend
— an API key,
plus
MAILGUN_DOMAIN
for Mailgun and
AHASEND_ACCOUNT_ID
for AhaSend.
Run either of these commands and paste the output as the variable value:
mix phx.gen.secret
— requires an Elixir installation
openssl rand -base64 64 | tr -d '\n'
— works on any system with OpenSSL
The value must be at least 64 characters long. Never reuse a value across environments and never commit it to version control.
Yes, in three different ways depending on how you deploy:
.env
file next to your
docker-compose.yml
is auto-loaded by Compose and substituted into the file.
$RELEASE_ROOT/.env
at boot. Mount or bake a
.env
into the release directory and any keys not already set in the shell are loaded from it.
/app/data/.env
at boot — the persistent data volume so the file survives upgrades. Place or edit it via
cloudron exec
or
cloudron push
.
In every case, shell-supplied variables (set via the platform's CLI or dashboard) take precedence over
.env
entries — the file is a default that the environment can override per-key. Malformed
.env
files are skipped with a warning rather than crashing the boot.
Never commit a
.env
file containing secrets to a public repository.
The standard PostgreSQL format:
postgres://username:password@hostname:5432/database_name
Paste the string your provider gives you as-is. Its host, port, database, user and password take precedence over the discrete
DATABASE_HOST
and POSTGRES_DB
variables, so there is no need to set both.
A URL naming a remote host switches the container to external mode, leaving its bundled database unused. A URL pointing at
localhost
means the bundled database, so a stale value cannot accidentally take it out of service.
On Cloudron the platform injects its own
CLOUDRON_POSTGRESQL_*
variables automatically, so you do not need to set any database variables manually.
Environment variables are read at startup only. A running container retains the values it was started with regardless of any later changes to your
.env
file or platform configuration.
Restart the container after every environment variable change:
docker-compose restart tymeslot
(or a full
docker-compose up -d
to pick up changes to the Compose file itself).
Deploy Tymeslot with Docker Compose on any VPS or home server. Includes reverse proxy setup, file upload volumes, and WebSocket configuration for LiveView.
Install Tymeslot on Cloudron in minutes. PostgreSQL, SSL certificates, email relay, and automatic updates are all provisioned and managed for you.
Deploy Tymeslot to Railway with one click. PostgreSQL is provisioned and connected automatically — set two environment variables and your instance is live.