Upgrading to 3.0
Move from MatchZy Auto Tournament 2.4 to Auto Tournament 3.0.
Version 3.0 is the first release under the name Auto Tournament. Your players, teams, tournaments, matches, ratings, stats, servers, sign-ins and settings all move over. This page shows what changes, how to update a Docker install, and how to go back.
If you run 2.4.x for Counter-Strike 2, the short version is: back up, pull, restart, then move your servers to CS2 Server Manager. Your CS2 tournaments run the same way afterwards.
What changes
- The name. MatchZy Auto Tournament (MAT) is now Auto Tournament. Menus and pages were rebuilt, so the app looks different. The tasks are the same ones.
- CS2 is a module, not the whole app. Counter-Strike 2 now sits in a module next to a second one, manual reporting, which runs tournaments for games the platform cannot watch. A CS2 tournament still does everything it did: servers, veto, live scores, demos and stats.
- The licence changed. 3.0 and everything after it are under the PolyForm Noncommercial License 1.0.0. What that means for you is below.
- Ready Up on CS2 servers. Auto Tournament 3.x does not support MatchZy Enhanced. Servers run Ready Up, the native CS2 plugin. See Your CS2 servers.
- There is a new image name.
sivertio/auto-tournamenton Docker Hub, andghcr.io/auto-tournament/auto-tournamenton GitHub's registry. - The docs moved from
docs.sivert.io/docs/matto docs.autotournament.gg. Old links redirect to the matching new page.
What does not change
Your docker-compose.yml and .env keep working as they are:
- The Compose service is still
matchzy-tournament, and the containers are stillmatchzy-tournament-apiandmatchzy-postgres. - The database is renamed from
matchzy_tournamenttoauto_tournamenton the first start, on the same volume. Your data stays, and you don't have to changeDB_NAME: an.envor compose file that still saysmatchzy_tournamentis read as the new name. - Every environment variable in your
.envkeeps its name and its meaning, and 3.0 adds no required ones. The new things you can turn on, such as game search, are configured in the app's own settings. - The app still listens on port 3069.
You do not have to change the image name
Every release is built once and published under all three names, so sivertio/matchzy-auto-tournament:latest gets 3.0 too. An install you never touch will update itself the next time you pull. Changing the name is tidier, and it is the name that will be documented from now on, but nothing breaks if you leave it.
The licence change
Up to and including 2.4.15, Auto Tournament was MIT-licensed. From 3.0 it is under the PolyForm Noncommercial License 1.0.0. The source is still public, and you can still read it, change it and share your changes.
If nobody earns money from your events, nothing changes for you. Personal and hobby use stays free, and so do tournaments and LAN parties where all entry fees and sponsor money go back into the event and nobody is paid or takes profit. Charities, schools and universities, public research, public safety or health and environmental protection organizations, and government bodies are free too, as the license lists them.
You need a licence if you earn money from it. That covers hosting Auto Tournament for other people for money, events where the organizer makes a profit, use inside a business, and being paid to set up or run servers or tournaments. The full list, and how to ask, is on Licensing and commercial use.
2.4.15 and earlier stay MIT. That does not change retroactively, and the old images stay on Docker Hub.
Fixes you get on the way
Three fixes in 3.0 change how an existing install behaves. Two of them need something from you.
Demos and event logs were being thrown away
In 2.4.x the app worked out the wrong folder for demos and event logs when running from the release image: it wrote them to /data inside the container instead of /app/data, which is the folder your ./data volume is mounted on. Everything written there lived in the container's own writable layer, so every update deleted every demo and event log.
3.0 writes to the right folder, and on the first start it moves anything still lying in the old one across. But a container that is replaced loses its writable layer, so if you want the demos and logs your current container is holding, copy them out before you update. Afterwards they are on your volume and survive updates.
Uploaded map images never appeared
Uploaded map images were written one folder above the one /map-images is served from, so the image was accepted and then never showed up. Worse, both folders were inside the container rather than on a volume, so whatever was there went away with the container anyway.
3.0 stores them under ./data/map-images, on the volume you already mount, and serves /map-images from there. Uploads show up, and they survive updates. Images your current container is still holding are in the container, so copy them out before you update — the map records already point at them, so they start rendering once they land on the volume.
Match configs are no longer public
GET /api/matches/:slug.json is the match config your CS2 servers download, and it used to answer anyone who asked. Match slugs are easy to guess (r1m1, r2m1, …), so anyone who could reach your API could read both rosters, Steam IDs, team names, the map list and the match setup.
In 3.0 the endpoint needs either the X-MatchZy-Token header with your SERVER_TOKEN, or an admin sign-in. Your servers need no change: the app now puts the header on the load command it sends them, and every version of the plugin understands it. Only two things are affected:
- Loading a config URL by hand in a server console now needs
matchzy_loadmatch_url "<url>" "X-MatchZy-Token" "<SERVER_TOKEN>". - Scripts or tools of your own that fetched a config anonymously now need the header or an admin token.
Before you start
- Your install runs 2.4.x with Docker Compose, as in Install. The upgrade is tested from 2.4.15; if you are on an older 2.4.x, update to 2.4.15 first.
- No match is running. The app restarts.
- You have the folder with your
docker-compose.ymland.env. Run every command below in that folder. - Your CS2 servers move to CS2 Server Manager and Ready Up. 3.x does not talk to MatchZy Enhanced; see Your CS2 servers.
Update
Write down your version, and back up
curl -fsS http://localhost:3069/api/settings/versionThe answer looks like {"success":true,"version":"2.4.15"}. Write the version down: it is the one you go back to.
Back up the database:
mkdir -p backups
docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > "backups/autotournament-$(date +%F-%H%M%S).sql"Check that the file in backups/ is not empty.
Then rescue the demos and event logs your current container is holding, which are in the wrong folder and will go away with the container:
mkdir -p data
docker compose cp matchzy-tournament:/data/. ./data/The trailing /. matters: it copies what is inside the old folder, so you end up with data/demos and data/logs rather than data/data. "No such file or directory" means there is nothing to rescue, which is fine. ./data is where 3.0 reads them from, so whatever lands there is picked up after the update.
Do the same for uploaded map images, which 2.4.x kept in a third folder inside the container:
mkdir -p data/map-images
docker compose cp matchzy-tournament:/public/map-images/. ./data/map-images/Again, "No such file or directory" just means you never uploaded any. ./data/map-images is where 3.0 keeps them from now on, so anything you copy across is served straight away — including images 2.4.x accepted but never showed.
Change the image name (optional)
3.0 calls the database auto_tournament. On its first start it renames your matchzy_tournament database to that, in place: same volume, same data. You don't have to touch DB_NAME; setting DB_NAME=auto_tournament in .env is tidier, and it is what the rollback needs.
The image name is optional too: sivertio/matchzy-auto-tournament:latest gets 3.0. To use the new name, open docker-compose.yml, find the image: line of the matchzy-tournament service, and set the new name:
services:
matchzy-tournament:
image: sivertio/auto-tournament:3.0.0Or from the shell, keeping a copy of the old file as docker-compose.yml.bak:
sed -i.bak 's#sivertio/matchzy-auto-tournament:[^ ]*#sivertio/auto-tournament:3.0.0#' docker-compose.ymlA fixed version like 3.0.0 makes going back a one-line change; latest follows every release. See the tags on Docker Hub. ghcr.io/auto-tournament/auto-tournament works too.
Keep the service name, the container names and the volumes as they are.
Pull and start
docker compose pull
docker compose up -dup -d replaces the app container and keeps the database volume.
Watch the first start
docker compose logs -f matchzy-tournamentThe first start on your existing database does three things, in this order, and each one logs a line:
- Moves the stray demos and logs into
/app/data:[data-dir] Migrated N item(s) out of the legacy data directory. - Adds the new tables and columns — accounts, linked accounts, team memberships, match reports, custom stat fields and the game catalogue. Nothing existing is dropped, renamed or rewritten.
- Runs two backfills, which announce themselves as
Applied migration 2026-09-22-linked-accounts-backfilland… team-members-backfill. The first records the Steam and Discord accounts your database already knows in the new accounts table; the second turns every team roster into team memberships. Both only add rows.
Each backfill is recorded in a schema_migrations table, runs once, and is written in the same transaction that records it — so a restart in the middle cannot leave one half-applied, and later starts skip them. If one fails it is logged and retried on the next start.
Press Ctrl+C when the log says the server has started.
Check that it works
curl -fsS http://localhost:3069/api/settings/version
curl -fsS http://localhost:3069/healthThe version must be 3.0 or newer. Then open the app, sign in, and check that your teams, players, ratings and past matches are there.
Your CS2 servers
Auto Tournament 3.x does not support MatchZy Enhanced (it keeps working with 2.x). Move every server to Ready Up, the native CS2 plugin: no Metamod or CounterStrikeSharp, and no RCON or webhook URL between the platform and the server.
If CS2 Server Manager manages your servers: update csm (sudo csm self-update; 1.23 and newer install only Ready Up), run csm update-plugins, then link the machine. From then on the platform creates, starts and updates its servers. The old game/csgo/addons/ folders (Metamod, CounterStrikeSharp, MatchZy) are no longer used and can be deleted.
Servers you set up by hand, with an IP, port and RCON password, can't be added in 3.x: install csm on the machine and link it instead. A game host that doesn't let you run csm can't run Auto Tournament's servers.
Promote captains, if you want manual reporting
Only needed if you are going to run a tournament through manual reporting. 2.x had no idea who captains a team, so the upgrade makes everyone a plain member and no captains. Reporting a result is a captain's job, so pick one per team on the team page before the tournament starts.
Update your links
The docs are at docs.autotournament.gg and the source is at github.com/Auto-Tournament/auto-tournament. Old links to either redirect, but bookmarks and pinned Discord messages are worth fixing.
Go back to 2.4.15
3.0 only adds to the database — no table or column is dropped, renamed or rewritten — so 2.4.15 starts again on a database 3.0 has migrated, shows the same data, and can still be written to. That was tested by upgrading a 2.4.15 install to 3.0 and then booting 2.4.15 back onto the same database.
Anything created only in 3.0, such as a match report or a team captain, is invisible to 2.4.15. It stays in the database, and comes back if you move to 3.0 again.
Set the old image back
services:
matchzy-tournament:
image: sivertio/matchzy-auto-tournament:2.4.15Set DB_NAME=auto_tournament in .env (and in DATABASE_URL, if you set it): 3.0 renamed the database, and 2.4.15 reads whatever name DB_NAME gives it, so with the old name it finds nothing.
grep -q '^DB_NAME=' .env && sed -i.bak 's/^DB_NAME=.*/DB_NAME=auto_tournament/' .env || echo 'DB_NAME=auto_tournament' >> .envIf you used the sed command above, mv docker-compose.yml.bak docker-compose.yml puts the old file back; then pin 2.4.15 in it, so a later pull does not fetch 3.0 again through latest.
Pull and restart
docker compose pull
docker compose up -dCheck the version:
curl -fsS http://localhost:3069/api/settings/versionRestore the backup, if something is wrong
If 2.4.15 does not start, or your data looks wrong, load the backup you made into an empty database:
docker compose stop matchzy-tournament
docker compose exec -T postgres sh -c 'dropdb -U "$POSTGRES_USER" "$POSTGRES_DB" && createdb -U "$POSTGRES_USER" "$POSTGRES_DB"'
docker compose exec -T postgres sh -c 'psql -U "$POSTGRES_USER" "$POSTGRES_DB"' < backups/autotournament-YYYY-MM-DD-HHMMSS.sql
docker compose up -dUse your own backup's file name. dropdb deletes everything, including whatever was written after the backup was taken.
If something goes wrong
- The app will not start.
docker compose logs matchzy-tournamentusually names the cause. A missing value in.envand a database it cannot reach are the two common ones. - It won't start, and the log talks about the database name. The 2.x container is still running and connected to the old database (stop it first), or the database user may not rename it. The log line says which, with the exact command to run in the second case.
- Your data looks empty. Almost always a volume that was recreated, or a database called
auto_tournamentthat already existed next to the old one (the log says both exist). Check thatdocker-compose.ymlstill points at the same volume as before. - Anything else. Troubleshooting, or ask on Discord.