Installation (self-host)

Set up on PostgreSQL with Docker Compose.

MyWay consists of a Next.js app + a PostgreSQL database. The fastest path is bringing it up with Docker Compose.

Requirements

  • Docker Engine 24+ and Docker Compose v2
  • 2 vCPU / 2 GB RAM (4 GB recommended)
  • 10 GB free disk, plus roughly 1 GB more during an upgrade
  • A domain name (optional: on an internal network the server IP works too)

Steps

  1. 1Download the package from your purchase email and extract it on your server.
  2. 2Run ./scripts/install.sh. It loads the prebuilt images (no build) and asks three things: the address, the published ports and your LICENSE KEY.
  3. 3Address: enter your domain name if you have one. If not, press Enter and the installer uses the server IP address it detected.
  4. 4Ports: press Enter for the default 80/443. If something else already uses those ports, give a pair such as 8080/8443.
  5. 5The app starts; database migrations apply automatically.
  6. 6Open the address in a browser and sign up. The first user to register becomes the administrator (superadmin).
# extract the package, then:
cd myway-onprem
./scripts/install.sh    # asks for domain + LICENSE_KEY, loads images, starts

Installing on an internal network (no domain name)

If the server has no domain name, install it with the server IP address; the script detects and offers it. Let’s Encrypt does not take part here (a certificate authority cannot validate an IP address), so the app is served with a self-signed certificate. Browsers warn once on the first visit; to remove the warning for good, install myway-root-ca.crt (left in the install directory) as a trusted root certificate on the client machines.

Do not use an address like myway.localhost. Such names resolve to the local machine on every computer, so typing it on another machine on the network never reaches the server and the browser reports a connection error. It is only suitable for trying the product on the machine you installed it on.

Changing the published ports

The installation uses ports 80 and 443. If another service already owns them, you can give a different pair during setup; the choice is stored and not asked again on later upgrades. On non-standard ports Let’s Encrypt cannot validate the domain, so the install switches to its own certificate: for a trusted certificate either stay on 80/443 or put MyWay behind your existing TLS-terminating proxy.

# soruları görmeden kurmak / installing without the prompts
DOMAIN=myway.company.com HTTP_PORT=8080 HTTPS_PORT=8443 ./scripts/install.sh

The license key is REQUIRED: without a valid key the app starts locked. A key is valid for 1 year; after it expires the app runs for a short grace period, then locks. Renew to keep using it.

Email sending (optional)

The installation works fully without email; that is the default. Invite links are shown on screen and an administrator resets passwords under Settings → Members. If you do want email, define your own SMTP server in .env.onprem: Exchange, Postfix, Google Workspace, AWS SES all speak SMTP. You are not adding an outbound service, mail leaves from your own server.

MAIL_DRIVER=smtp
MAIL_FROM="MyWay <no-reply@yourcompany.com>"
MAIL_SMTP_HOST=smtp.yourcompany.com
MAIL_SMTP_PORT=587          # 465 = implicit TLS, 587/25 = STARTTLS
MAIL_SMTP_USER=username
MAIL_SMTP_PASSWORD=password

Env changes are not picked up by restart, so you need to recreate the container. Invite emails, password reset, email address verification and notification emails then work on their own. Links are generated from PUBLIC_URL, so make sure that address is reachable by your users.

docker compose -f docker-compose.onprem.yml --env-file .env.onprem up -d

Scheduled jobs

Some work is never triggered by a user request; something has to watch the clock. A due date arriving is not an event: nobody does anything, so no request reaches the app. MyWay runs three such jobs, and since v1.32.6 the INSTALLER sets them up itself. You do not need to write a crontab entry by hand.

Scheduled jobWhat it does
Due-date notificationsFinds open tasks due tomorrow or already overdue and notifies the right people. Custom date fields marked "treat as a deadline" are included.
Review remindersWarns participants who have not commented yet on a review whose deadline is approaching.
Event cleanupDeletes stored webhook payloads after 90 days on installations that use the GitLab integration. Left alone, that table grows without end.

The installer writes the entries, runs one job once at the end of setup and reports the result on screen, and needs no extra configuration: if the required secret is not defined it is derived from your existing installation keys. On an upgrade the entries are refreshed rather than duplicated, and no other scheduled job on the server is touched. To confirm from your monitoring that the setup is healthy, look at the cronConfigured field on the health endpoint.

# zamanlanmış görevler kuruldu mu / are the scheduled jobs configured
curl -s https://myway.company.com/api/health | grep cronConfigured

WHEN UPGRADING, run the installer. If you only run docker compose pull && up -d the app updates but the scheduled jobs are not installed, and notifications silently stop going out with no visible error. See Backup & upgrade for details.