-
Universal Gaming Backend 1.4.0
StableSome checks failedPublish backend container / backend (push) Has been cancelledreleased this
2026-11-04 21:55:38 +01:00 | 6 commits to main since this releaseUniversal Gaming Backend 1.4.0
SMTP TLS fix
- Fixes
error:0A00010B:SSL routines:tls_validate_record_header:wrong version number. - TLS mode is inferred from the port: 465 = implicit TLS; 25/587/2525 = STARTTLS.
SMTP_SECURE=trueon a STARTTLS port is corrected automatically with a warning.- New optional
SMTP_REQUIRE_TLSoverride. - Startup logs the effective SMTP mode without credentials.
Password reset
- New
POST /api/v1/auth/forgot-passwordandPOST /api/v1/auth/reset-password. - Only accounts with an assigned and confirmed e-mail can reset a password.
- Forgot-password always returns HTTP 202 to prevent account enumeration.
- One-time tokens are stored as SHA-256 hashes and expire after 30 minutes by default (
PASSWORD_RESET_TTL_MINUTES). - Resetting a password increments
auth_version, invalidating every existing session. - New
APP_PUBLIC_URLcontrols the app reset link (/account?reset=…).
Database
- PostgreSQL migration version 2 adds
auth_versionand password-reset token columns. - Applied automatically by
./update.shornode src/migrate.js.
Upgrade
- Deploy with
./update.sh; it takes a pre-updatepg_dumpbackup and applies migration 2. - Existing accounts, scores and chess matches are preserved.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Fixes
-
Universal Gaming Backend 1.3.0
StableSome checks failedPublish backend container / backend (push) Has been cancelledreleased this
2026-11-04 20:35:35 +01:00 | 7 commits to main since this releaseVersioned PostgreSQL migrations (
schema_migrations), a migration runner (node src/migrate.js), and anupdate.shthat takes a pre-updatepg_dumpbackup before pulling, rebuilding and migrating.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Universal Gaming Accounts 1.2.2
StableSome checks failedPublish backend container / backend (push) Has been cancelledreleased this
2026-11-04 19:46:50 +01:00 | 10 commits to main since this releaseUniversal Gaming Accounts 1.2.2
Adds request and authentication logging for troubleshooting.
- One
[http]line per request: status, method, path, duration, client IP, peer IP and user agent. - Query strings are omitted, so verification tokens and other query parameters are not logged.
- Request bodies, passwords and bearer tokens are never logged.
- Failed logins emit
[auth] login failed ip=...without logging the username or e-mail. REQUEST_LOGGING=trueby default; set it tofalseto disable.- Docker log retention remains capped at 10 MB × 3 files.
- Tests: 35 passing;
npm audit --omit=devreports 0 vulnerabilities.
Container image
docker pull git.emilyh.de/emily/universal-gaming-backend:1.2.2 docker pull git.emilyh.de/emily/universal-gaming-backend:latestDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- One
-
Universal Gaming Accounts 1.2.1
StableSome checks failedPublish backend container / backend (push) Has been cancelledreleased this
2026-11-04 17:59:48 +01:00 | 11 commits to main since this releaseUniversal Gaming Accounts 1.2.1
Fixes PostgreSQL connection handling when database credentials contain URL-reserved characters.
- The backend now builds
DATABASE_URLfromPOSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_HOSTandPOSTGRES_PORT, percent-encoding the credentials. A password containing@,:,/,?or#no longer producesInvalid URL. DATABASE_URLremains an optional explicit override for external databases.- Compose no longer interpolates the raw password into
DATABASE_URL. - Added a clear hint for PostgreSQL error
28P01(password authentication failed) and a troubleshooting section explaining thatPOSTGRES_PASSWORDonly initializes a new volume. - Tests: 34 passing;
npm audit --omit=devreports 0 vulnerabilities.
Container image
docker pull git.emilyh.de/emily/universal-gaming-backend:1.2.1 docker pull git.emilyh.de/emily/universal-gaming-backend:latestDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The backend now builds
-
Universal Gaming Backend 1.2.0
StableSome checks failedPublish backend container / backend (push) Has been cancelledreleased this
2026-11-04 16:11:44 +01:00 | 13 commits to main since this releaseUniversal Gaming Backend 1.2.0
Added
- E-mail accounts — optional e-mail at registration, login with username or e-mail, change/remove e-mail, and confirmation links. Confirmation is opt-in via SMTP and never blocks account use; accounts remain usable while unverified.
- Online chess — challenge another player by username, accept/decline/cancel, submit moves, resign. Every move is replayed and validated server-side with
chess.js; clients are never trusted for turn order or legality. Optimistic versions reject concurrent/stale moves. - Management panel — read-only Basic-auth HTML at
/managementwith account, verified e-mail, leaderboard and chess statistics. Disabled unlessMANAGEMENT_PASSWORDis set; never exposes hashes, JWTs or e-mail tokens. GET /— returns the backend service name and current version.- Prebuilt image workflow —
.gitea/workflows/publish-image.ymlandpublish-image.shpublishgit.emilyh.de/emily/universal-gaming-backend:1.2.0(and:latest). PUBLIC_BASE_URLfor confirmation links, plusSMTP_*,EMAIL_CONFIRMATION_ENABLED,CHESS_ENABLED,MANAGEMENT_*configuration.
Fixed
- E-mail removal via
PATCH /api/v1/accounts/menow actually clears the address and confirmation token. - Registration validation no longer loses the username when an e-mail is supplied.
Database
Adds e-mail columns to
usersand achess_matchestable. Both PostgreSQL and SQLite migrate automatically on startup (ADD COLUMN IF NOT EXISTS/CREATE TABLE IF NOT EXISTS).Container image
Published and publicly pullable:
docker pull git.emilyh.de/emily/universal-gaming-backend:1.2.0 docker pull git.emilyh.de/emily/universal-gaming-backend:latestVerification
npm test: 32/32 passing.npm audit --omit=dev: 0 vulnerabilities.- Root, health, meta, account, e-mail, chess, leaderboard, management and release-proxy flows covered.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-11-04 15:18:23 +01:00 | 14 commits to main since this releaseCompetitive leaderboard
- New public endpoints:
GET /api/v1/leaderboards,GET /api/v1/leaderboards/:gameId, and authenticatedPOST /api/v1/leaderboards/:gameId/scores. - Keeps one best score per user, game and mode, ranked by time, moves, then submission time.
- Validates games, modes, times, moves and detail text; read and write endpoints are rate-limited.
- Stores scores in PostgreSQL with a SQLite fallback for development. Deleting an account cascades to its scores.
- New
LEADERBOARD_ENABLEDsetting (defaulttrue). When disabled, the app falls back to its local board. /api/v1/metanow reportsleaderboardEnabled.
Easier Git-based upgrades
- Reorganized
docker-compose.ymlwith a stable project name, image tag1.1.0, logging limits, health checks and anACCOUNT_PORToverride. - Added
update.shforgit pull --ff-only, database image pull, rebuild and restart. It refuses to run with local Git changes. .envanddocker-compose.override.ymlstay ignored so pulls remain clean.- README now documents the upgrade flow, backup/restore, leaderboard API examples and privacy notes.
Upgrade
git pull --ff-only docker compose build --pull accounts docker compose up -d --remove-orphansOr run
./update.sh. Theleaderboard_scorestable is created automatically; existing accounts are preserved.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- New public endpoints:
-
released this
2026-11-04 12:57:45 +01:00 | 15 commits to main since this releaseUniversal Gaming Accounts 1.0.4
Security hardening from the November 2026 review:
- Passwords longer than 72 bytes are no longer truncated. New hashes use SHA-256 pre-hashing before bcrypt; legacy bcrypt hashes are verified and upgraded automatically on the next successful sign-in.
- Oversized request bodies return HTTP 413 instead of an internal error.
- JWTs are pinned to HS256 in addition to the existing issuer/audience checks.
TRUSTED_PROXIESremains the recommended way to trust reverse proxies;TRUST_PROXY=trueis still a legacy fallback.- Docker Compose image bumped to
universal-gaming-backend:1.0.4.
No API changes. Existing accounts continue to work.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-11-04 12:20:23 +01:00 | 16 commits to main since this releaseUniversal Gaming Accounts 1.0.3
- New
TRUSTED_PROXIESenvironment variable: a comma-separated list of proxy IPs, CIDR ranges, orloopback/linklocal/uniquelocalpresets that are allowed to setX-Forwarded-For. - When
TRUSTED_PROXIESis set, it takes precedence over the legacyTRUST_PROXYsetting. - Invalid entries are rejected at startup with a clear configuration error instead of silently trusting the wrong peers.
TRUST_PROXY=falseis now the documented default;TRUST_PROXY=trueremains supported as a legacy fallback but trusts every peer.- Docker Compose image bumped to
universal-gaming-backend:1.0.3.
Example:
TRUSTED_PROXIES=127.0.0.1,::1,10.0.0.0/8This makes rate limiting use the real client IP only when the immediate peer is one of the configured proxies.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- New
-
released this
2026-11-04 12:09:43 +01:00 | 17 commits to main since this releaseUniversal Gaming Accounts 1.0.2
- Account data is now stored in PostgreSQL in the Docker Compose deployment.
- Compose starts PostgreSQL 16 with a health check and a persistent
postgres-datavolume. - Every database transaction is logged to stdout as a
[db]line, visible indocker compose logs. GET /healthznow reports the active database backend.- New
DATABASE_URLsetting plusPOSTGRES_DB,POSTGRES_USERandPOSTGRES_PASSWORDCompose variables. - SQLite remains available as a development/test fallback when
DATABASE_URLis empty. - No API changes: app 2.3.0 and earlier clients keep working.
Upgrade notes
Existing SQLite account data is not imported automatically. Back up the old volume, then create accounts again or migrate the
userstable manually. ChangePOSTGRES_PASSWORDin.envand keepDATABASE_URLin sync before starting.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-11-04 11:44:20 +01:00 | 18 commits to main since this releaseChanged
- The account service now defaults to port 6767 (previously 8080).
- Docker Compose, Dockerfile,
.env.example, health check and documentation use 6767. - Service metadata reports version
1.0.1. - Added config tests for the default port and overrides.
Upgrade
docker compose up -d --buildafter pulling. Existing SQLite volumes are unchanged.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads