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
- 1Download the package from your purchase email and extract it on your server.
- 2Run ./scripts/install.sh. It loads the prebuilt images (no build) and asks three things: the address, the published ports and your LICENSE KEY.
- 3Address: enter your domain name if you have one. If not, press Enter and the installer uses the server IP address it detected.
- 4Ports: press Enter for the default 80/443. If something else already uses those ports, give a pair such as 8080/8443.
- 5The app starts; database migrations apply automatically.
- 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, startsInstalling 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.shThe 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=passwordEnv 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 -dDue-date warnings (a daily job)
A due date arriving is not an event: nobody does anything, so no request reaches the app and someone has to look at the date. Schedule scripts/due-date-notifications.sh from the installation package to run once a day. Without it, assignment, mention, comment and status notifications work as usual; only due-date reminders are never sent.
# root crontab: her sabah 06:00 / every morning at 06:00
0 6 * * * APP_DIR=/opt/myway ENV_FILE=.env.onprem /opt/myway/scripts/due-date-notifications.sh >> /var/log/myway-due-dates.log 2>&1The script reads PUBLIC_URL and CRON_SECRET from your env file; both must be set. The endpoint it calls is protected by CRON_SECRET in the Authorization header, so it cannot be triggered from outside. APP_DIR and ENV_FILE default to /opt/myway and .env.prod, so pass your own paths as shown above for an on-prem installation.