You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+28-2Lines changed: 28 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,6 +13,7 @@ Open-source web implementation of Steam Desktop Authenticator (SDA) with multi-u
13
13
-**Fastify (instead of Express)**: lower overhead and better throughput for polling/real-time workloads.
14
14
-**TypeScript on backend/frontend**: safer refactoring and better API contracts.
15
15
-**MySQL 8 + Docker internal network**: relational consistency, easy VPS deploy, DB isolated from public access.
16
+
-**Redis-backed rate limiting in Docker**: shared throttling across backend instances and backend restarts, with in-memory fallback outside Redis setups.
16
17
-**React + Vite + Tailwind**: fast DX + responsive UI + simple theming.
17
18
-**Vite PWA plugin**: installable app + service worker caching.
18
19
-**Aiogram bot**: mature async Telegram framework for command and deep-link flows.
@@ -33,7 +34,7 @@ Open-source web implementation of Steam Desktop Authenticator (SDA) with multi-u
33
34
- Password re-confirmation for sensitive actions such as `.maFile` export, recovery code reveal and manual Steam session save.
34
35
- i18n EN/RU + light/dark theme.
35
36
- Admin panel with global registration toggle and user deletion.
36
-
- OpenAPI docs JSON at `/api-docs/openapi.json`.
37
+
- OpenAPI docs JSON at `/api-docs/openapi.json` when `OPENAPI_ENABLED=true`.
37
38
38
39
## Default admin
39
40
@@ -45,6 +46,7 @@ Open-source web implementation of Steam Desktop Authenticator (SDA) with multi-u
45
46
Important:
46
47
- The default admin password is for local bootstrap only.
47
48
- Production startup is blocked if `ADMIN_PASSWORD=admin123`.
49
+
- Production startup is also blocked if `JWT_SECRET`, `COOKIE_SECRET`, or `ENCRYPTION_KEY` still use placeholder-style values such as `change_me...`, are shorter than 32 characters, or reuse the same secret value.
-`VITE_TURNSTILE_SITE_KEY` frontend public site key for invisible Turnstile registration flow. Use the same value as `TURNSTILE_SITE_KEY` because it is the same public Cloudflare site key, just exposed to the Vite frontend build via the `VITE_` prefix.
109
114
115
+
Generate strong secrets before production deploy, for example:
116
+
117
+
```bash
118
+
openssl rand -hex 32
119
+
openssl rand -hex 32
120
+
openssl rand -hex 32
121
+
```
122
+
123
+
Then place the generated values into `.env` as:
124
+
125
+
```env
126
+
JWT_SECRET=<first generated value>
127
+
COOKIE_SECRET=<second generated value>
128
+
ENCRYPTION_KEY=<third generated value>
129
+
```
130
+
110
131
If `TELEGRAM_BOT_TOKEN` is empty or starts with `change_me`, bot service stays in disabled idle mode (no crash, API stays up).
132
+
If you enable `OPENAPI_ENABLED` in production, prefer exposing it only behind admin auth, VPN, or IP allowlisting.
111
133
112
134
## Security model
113
135
@@ -117,9 +139,11 @@ If `TELEGRAM_BOT_TOKEN` is empty or starts with `change_me`, bot service stays i
117
139
-**Sensitive actions**: password re-confirmation required before `.maFile` export, recovery code reveal and manual Steam session updates.
118
140
-**CSRF**: double-submit protection for mutating endpoints.
119
141
-**Brute-force/DoS**: `rate-limiter-flexible` in auth/write paths.
142
+
-**Shared throttling**: Docker deployments use Redis-backed rate limits with in-memory insurance fallback if Redis is temporarily unavailable; current Compose defaults do not persist limiter state across Redis restarts.
120
143
-**Anti-bot registration**: signed registration challenge, honeypot, dedicated registration rate limiter and optional invisible Cloudflare Turnstile.
-**API caching**: `/api/*` responses are served with `Cache-Control: no-store` to reduce leakage of session-bound data.
123
147
-**DB isolation**: MySQL only on internal Docker network (`db_internal`).
124
148
125
149
## Telegram flows
@@ -135,6 +159,8 @@ If `TELEGRAM_BOT_TOKEN` is empty or starts with `change_me`, bot service stays i
135
159
3. Bot confirms code.
136
160
4. Web page polls and creates session automatically.
137
161
162
+
Deploy frontend and backend together when changing Telegram login polling, because the flow now requires the `x-telegram-poll-token` header instead of the legacy query-string token.
0 commit comments