36 Commits
Author SHA1 Message Date
Corfirean e3fbb2e4b6 Update older versions directly using database migration history (#112) 2026-10-16 16:56:32 +05:00
Corfirean a7b56d6aed Simplify updates to one recovery-backed migration pass (#111)
* Share migration planning and execution across update phases

* Apply updates in one recovery-backed pass without nested server rehearsals

* Preserve applied core SQL and share account migration history across realms
2026-10-16 13:39:43 +05:00
Дмитрий 97c024d95c Install current stable full images and qualify clean installation 2026-10-14 19:22:45 +05:00
Дмитрий be2f252593 Show Overview update failures and cover copied launcher configuration 2026-10-14 08:26:19 +05:00
Дмитрий 24d593d787 Roll back late repair failures and verify signed repair recovery 2026-10-14 07:25:56 +05:00
Дмитрий 4a9760b864 Recover shutdown with damaged templates and MySQL state 2026-10-14 07:07:35 +05:00
Дмитрий 482bbfcdfd Fix repair completion and expose SQUID and rehearsal failures 2026-10-14 06:52:24 +05:00
Fabien F. 0250b61c62 feat: a wrong game data folder is diagnosed, and it can be changed from Settings
The world refusing to start with the standard Data set (no CoA DBC) is now
reported as GameDataMismatch. A Settings card shows the folder in use and
changes it while the server is stopped, using the install checks.
2026-10-11 08:57:43 +02:00
Fabien F. dfd8a50975 fix: sharing with friends and the other screens work on a Docker server
Second part of the audit of every screen for a Docker server. What it found, and
what now happens:

- Play with friends. "Servers open" read the BindIP of the configuration files, which
  the containers force to 0.0.0.0, so it was green on a fresh server while who can
  connect is decided by the address the ports are published on (bindAddress in
  docker.json). Opening and closing now edit bindAddress (and set
  CoA.AllowRemoteClients), the open state is read from it, and enabling a mode no
  longer fails on netsh / PowerShell after it already rewrote the files. There is no
  firewall row on Linux (Docker publishes the ports itself); the Windows reply is
  unchanged.
- The "private services" check (Friends and Diagnostics) could never fail on Linux: it
  reads the Windows listener table. For a Docker server it is computed from how the
  ports are published: the database never, the console only on 127.0.0.1, the game
  servers on bindAddress.
- Console, Database tab: read a mysql log file that does not exist; it shows
  `docker logs` of the database container.
- The Overview showed a service that had stopped by itself as "Stopped"; it now says
  "Stopped unexpectedly".
- Settings: a Docker server that was added but never started had no
  worldserver.conf and the page failed; it is created from its template. A talent
  file path outside the Core folder is refused (the container cannot see it).
- Backups of configuration now include docker.json; verifying the files of an
  imported Docker server looked for worldserver.exe and reported it missing.
- Linux locations: the friend package and the diagnostics go to the desktop folder
  (from the user directories file) instead of /tmp, the problem report names the
  distribution, and the size advice for companions reads /proc/meminfo instead of
  assuming 8 GB.

Every Windows branch is the code that was there; the dispatch is the early return on
docker::is_docker (or the host flavor for the firewall).
2026-10-11 08:57:38 +02:00
Fabien F. a625b065cf feat: start the game client under umu-launcher / Wine on Linux
client::launch started Ascension.exe directly, which cannot work on Linux, and
client::is_running found nothing (it reads the Windows process list). wine.rs is
the Linux counterpart, and both hand over to it on a Linux host.

It runs the command of the project's own launcher script: umu-run with a Proton
build (GAMEID=0, PROTONPATH, WINEPREFIX, started from the client folder), else
plain Wine, with WINEDLLOVERRIDES=divxtac=d (DivxTac.dll deadlocks the world
loading screen under wine-mono). The newest GE-Proton found for Steam is used, or
umu's own choice; COA_PROTONPATH, COA_WINEPREFIX and client-launch.json override
the detection; the prefix defaults to ~/Games/umu/coa-client. The game runs in its
own process group, so closing the Manager does not close it, and prints to
client.log. Whether it runs is read from /proc, where the command line holds the
Windows form of the client path. A clear message says what to install when neither
umu nor Wine is found.

Tests: detection (newest build, no build, Wine only, nothing, overrides), the
command, the /proc match, and a real spawn with a stand-in umu-run that records its
environment. Not run: the real client.
2026-10-08 17:28:59 +02:00
Fabien F. 5c3a9def0c feat: realm profiles (CoA / Wildcard) work on a Docker server
The Realm card showed "io: No such file or directory (os error 2)" on a Docker
server: the Wildcard check read Core/worldserver.exe. The card lets the owner
switch realm, so it is made to work rather than hidden.

What the repack's patched launcher did at each start is done by the Docker
backend: finish an interrupted switch (realms::before_start), name the realms in
the realm list, and give the containers the databases of the selected realm
(acore_world_wildcard, acore_characters_wildcard). The switch itself is the shared
code. prepare_launcher has nothing to patch on a Docker server, and Wildcard
support is read from Core/worldserver as it is from Core/worldserver.exe (the .exe
wins when both exist, so a repack is read as before).

Tests: the support check on both binary names, no launcher to adapt, and the
databases passed to the containers for each realm. Creating the Wildcard realm
itself needs a build and a database with the Wildcard migrations and was not run.
2026-10-08 17:28:59 +02:00
Fabien F. 25098b5a63 fix: a Docker server is never offered or given the repack's updates
Found by installing a server through the new screen: the update check of a Docker
server read the Windows "stable" channel and offered "0.261003.17 (you have
0.261003.1)". Applying it would have put the repack's executables, MySQL and
launcher into a Linux server folder.

Refused in the core (update::preview, apply and rollback), so no caller can do it.
The Settings tab says that updates are not available for Docker servers yet; the
background check stays quiet, as for any failed check.

A test applies the same update package to the same folder with and without
Settings/docker.json: refused and untouched with it, committed without it.
2026-10-08 17:28:59 +02:00
Fabien F. 45a699d2ca feat: install a new Docker server from the install screen (Linux)
The install commands ask coa_core::platform::flavor() once and hand a Docker
install to src-tauri/src/docker_install.rs; the repack arm of each command is
untouched (an early return and an extra optional parameter are all that changed
in lib.rs). New command install_environment tells the screen the kind of server,
the suggested folder (~/CoaServer) and why Docker cannot be used, if it cannot.

On Linux the install screen shows the game data folder (used in place, read-only)
and the server package (a folder or an address; there is no default address until
a signed Linux package is published), and disables Install until both are given
and Docker works. It shows Docker's own message with a "Check again" button when
Docker is missing, stopped or not allowed for the user. The Windows screen is
unchanged (checked side by side in the browser mock).

A debug build (tauri dev) accepts another package key named in
COA_DEV_TRUSTED_KEY, to try the installer on a package signed with a throwaway
key; a release build always uses the embedded key.

New text is English only for now (other languages fall back to it).
2026-10-08 17:28:52 +02:00
Fabien F. 7a3fefaafd feat: validate a release and export its baseline on Linux
The signed base package holds the MySQL data directory of a Windows repack. On a
Linux computer extract-schema-base now turns it into a Docker server folder whose
database container opens that directory (mysqlData in docker.json), so the release
SQL, the schema contract and export-baseline run with the Docker installation code.
Windows is unchanged: it still bootstraps the repack's own database program.
2026-10-07 13:56:00 +02:00
Fabien F. b5e4a38d7d feat: install a new server as a Docker installation (Linux)
docker::install is the Linux counterpart of install::install_base and shares none
of its code (the Windows installer and its folder checks are untouched). Same
order of events: signed manifest, folder / space / game data checks, verified
download, extraction into <dest>.installing, database, one rename. Docker must be
usable; a failure removes the containers, the volume and the staging folder.

The databases start from the package's own dumps, Database/baseline/<kind>.sql.zst,
in the format of the Manager's backups, taken in a state where every migration of
the package is applied. The installer imports them, records the migrations as
applied (baseline) in a few bulk statements, and creates the acore account, the
realm port and the console account. Rebuilding from the repository's SQL does not
work: pending migrations such as rev_20260903_01_live_class_baseline are guards
generated from the maintainers' live database and refuse to run on a database
built from the base scripts, whatever the order.

- coa-release export-baseline --server DIR --out DIR produces the dumps from a
  prepared server (repack or Docker).
- The game data stays where the person has it (dataDir in docker.json, mounted
  read-only), checked at install time.
- ensure_main_configs creates worldserver.conf / authserver.conf from their
  .dist templates when missing, at install and at every start, never overwriting.
- Fix (affects the backend merged in 0.6.0): the database container's health check
  is now a ping over TCP. On a new volume the image first runs a temporary server
  that answers on its socket but takes no network connection, so the container was
  healthy about four seconds (10 s against 14 s measured) before TCP worked.
- docs/ARCHITECTURE.md: D13 (installation, package contract) and D14 (how Windows
  and Linux code are kept apart).

Tested: 12 new tests (folder rules, settings, package checks, bulk ledger SQL,
failure cleanup with an in-memory docker), and real runs of the whole chain
through examples/docker_install: baseline dumps exported from a prepared
server, package signed with a throwaway key, installed in 171 s, started by the
Manager (database healthy, world ready in 8 s, auth up), console reached with the
account the installer created, 1630 migrations recorded as applied.
2026-10-05 10:03:09 +02:00
Дмитрий 7c096a4844 Merge remote-tracking branch 'origin/codex/client-only-mode' into codex/release-all-pending 2026-10-05 03:09:02 +05:00
Дмитрий f4e36f21eb Merge remote-tracking branch 'origin/master' into codex/reliable-server-updates 2026-10-05 02:31:00 +05:00
Дмитрий 65c9945626 Validate release databases and require full schema contracts 2026-10-05 01:56:36 +05:00
Corfirean f13398bbd7 Merge pull request #13 from lostmind84/feat/linux-b2-container-db
feat: database access through the container for Docker installations
2026-10-05 01:45:07 +05:00
Дмитрий f05f94ba01 Document standalone client connections 2026-10-05 01:24:01 +05:00
Дмитрий 3edc600f97 Recover database and file updates together after failures 2026-10-04 23:55:15 +05:00
Дмитрий 146b1c50b9 Release Manager 0.6.1 and preserve Docker lifecycle compatibility 2026-10-04 15:43:29 +05:00
Дмитрий c02c635463 Fix settings input, client launch, server repair and simultaneous realms 2026-10-04 15:40:06 +05:00
Fabien F. 58b5ddeb07 feat: database access through the container for Docker installations
Db runs mysql, mysqldump and mysqladmin inside the database container with
docker exec -i when the server folder is a Docker installation, connecting over
TCP on the container's loopback like the repack's commands do on the host. The
password still travels only in MYSQL_PWD. Every caller keeps using Db unchanged
(accounts, backups, population, migrations, the RA service account), and the
host needs no MySQL client. The repack path is untouched: one line before its
tools are looked up. A stopped container or a missing one is reported as a
database that is not running.

Tested: 4 new tests (commands built for the container, no password on a command
line, repack unchanged, error classification), and a real run against the
Docker folder: SQL queries, a quick backup (156 characters tables), restore with
the previous database kept, a damaged backup refused, the RA service account
created by SQL, the world server console reached through its published
loopback port, an account created through it and listed by the Manager.
2026-10-03 21:21:26 +02:00
Fabien F. 3da9628b79 feat: Docker runtime backend for Linux (start, stop, status)
A server folder with Settings/docker.json is a Docker installation: MySQL, the
auth server and the world server run in containers controlled through the
docker command line. Every other folder is a repack and goes through the
unchanged Windows code. driver::run, process::observe and layout::scan check
for the marker first and hand over to coa_core::docker.

- start: network, runtime image (libraries only, binaries are mounted from
  Core/), database healthy, world listening, then auth. A container that stops
  while starting reports the cause found in its log (DatabaseNotRunning,
  PortInUse, ...). New error code DockerUnavailable (docker missing, stopped,
  or not usable by this user).
- stop: world (180 s to save), auth, database; exit code 0 observed.
- observe: container state, health and port readiness mapped to the existing
  ServiceState. Readiness is a connection that stays open, because Docker's
  proxy accepts connections before the server inside listens.
- passwords go by environment, never on a command line; the remote console is
  published on 127.0.0.1 only; the server's own database updater is turned off
  (it needs a mysql client the image does not have and stops the server).

Tested: 18 new tests with an in-memory Docker, and a real run through
examples/drive: database, world (ready in 11 s) and auth started from a
package-shaped folder, stopped with exit code 0 and restarted.
Not included: installation, database setup, backups and SQL through the
container, updates, firewall/exposure, the client under Wine/Proton.
2026-10-03 12:44:20 +02:00
Corfirean 1bcef5f8c2 Add CoA / Wildcard realm profiles for v0.5.0 (#10)
* Add isolated Wildcard realm profiles and release v0.5.0

* Document realm validation and align npm lock version
2026-10-03 11:12:04 +05:00
ДмитрийandClaude Sonnet 5.5 615b3e938d Game client: download and update through the Manager
PLAY turns into UPDATE CLIENT when a tracked client is outdated; with no client linked
it offers choosing an existing folder or downloading from the community launcher servers
(resumable, hash-verified, free-space checked, progress and stop). Files the player changed
are kept on request or moved aside, never silently replaced. Existing clients can be adopted
from Settings. Fresh downloads get a realmlist for each installed locale.

Fixes zero-length files in the downloader (found by the live probe).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 07:52:58 +05:00
ДмитрийandClaude Sonnet 5.5 7d447b490f README: feature overview and screenshots
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 07:41:22 +05:00
ДмитрийandClaude Sonnet 5.5 0c376fdaf8 Main screen: server update check at start and every 5 minutes, UPDATE button instead of START when an update exists, progress, navigation dot; notes on client download
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 06:40:22 +05:00
ДмитрийandClaude Sonnet 5.5 38b5b86be1 Translations: settings schema overlays (ru/de/fr/es), diagnostics, update steps, companion sizes, friends notes; dev mock for settings pages; docs/TRANSLATIONS.md
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 21:32:15 +05:00
ДмитрийandClaude Sonnet 5.5 a6ae4e78a3 Self-update in the background (install on close), module configs created from .dist, quiet-logging + table fixups in clean-base, backlog notes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 15:36:07 +05:00
ДмитрийandClaude Sonnet 5.5 f620f87432 v0.1.1: language picker on welcome screen, friendly errors for unpublished package / unreachable server, backlog notes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 12:27:21 +05:00
Дмитрий ed986383a2 docs: record the multilingual UI requirement (EN/RU/DE/FR/ES) in the backlog; drift detection ignores repeated keys 2026-09-30 10:42:23 +05:00
Дмитрий 157ba3e743 docs: record fork decision and the audited patch series 2026-09-30 08:51:13 +05:00
ДмитрийandClaude Sonnet 5.5 19024a3162 Signing: Ed25519 detached manifest signatures, release key, keygen/sign/verify tools; record owner decisions
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 07:24:47 +05:00
ДмитрийandClaude Sonnet 5.5 c39ff556a3 Phase 0/1a: architecture audit and coa-core foundation (fsx, registry, manifest, logging, errors)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 06:59:11 +05:00