60f0a86bd4
gates / gates (push) Successful in 25s
The READ PATH for a second language in `.felhom.yml`. An `i18n: {en: …}` sibling
block inside the same file; `Metadata.For(lang)` merges it FIELD BY FIELD over the
Hungarian, so a missing or blank English field shows the Hungarian one and a
half-translated app is a legal, shippable state.
`For("hu")` is the parsed struct with `I18n` cleared and nothing else — measured
against all 53 real catalog files, copied into `internal/stacks/testdata/catalog/`.
Lists replace whole; every other list is matched by its own key, never by position.
`For` never writes through the receiver: the metadata is the stack manager's, shared
by concurrent requests, and an in-place merge would leak one household's language
into another household's page.
Pages reach catalog copy only through `LocalizeStacks`/`LocalizeStackPtr`/`MetaFor`,
and `TestNoDirectMetaCopyReadOnPages` keeps a named, reasoned allow-list of every
direct `.Meta.<copy>` read in `internal/web` so the NEXT page to read one fails the
suite instead of quietly rendering Hungarian to an English household.
Eight red-proofs. Two of them convicted a hollow TEST rather than the code: a struct
copy shares its slices' backing arrays, so the obvious DeepEqual mutation check
passed a deliberately broken merge; and a one-entry fixture cannot tell key matching
from position matching. Both rewritten, both then seen to fail.
MinAgent: 0.131.0 (unchanged). Older controllers are unaffected — `LoadMetadata`
uses non-strict `yaml.Unmarshal`, so a pre-0.257.0 box drops the whole block.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
87 lines
3.6 KiB
YAML
87 lines
3.6 KiB
YAML
# =============================================================================
|
||
# .felhom.yml - App metadata for felhom-controller
|
||
# =============================================================================
|
||
|
||
# --- Display info (shown on dashboard) ---
|
||
display_name: "Crafty Controller"
|
||
description: "Minecraft szerver kezelő webes felülettel"
|
||
category: "games"
|
||
subdomain: "minecraft"
|
||
slug: "crafty-controller"
|
||
# catalog_since: the date THIS repo last changed this app's pinned images. Any commit that
|
||
# changes an image: line must set this to the same day (see CLAUDE.md).
|
||
catalog_since: "2026-06-26"
|
||
|
||
# --- Resource hints (displayed on deploy screen) ---
|
||
resources:
|
||
mem_request: "256M"
|
||
mem_limit: "2048M"
|
||
pi_compatible: false
|
||
needs_hdd: false
|
||
|
||
# --- Deploy fields (first deployment only) ---
|
||
deploy_fields:
|
||
- env_var: DOMAIN
|
||
label: "Domain"
|
||
type: domain
|
||
description: "A szerver domain neve"
|
||
locked_after_deploy: true
|
||
|
||
- env_var: SUBDOMAIN
|
||
label: "Aldomain"
|
||
type: subdomain
|
||
default: "minecraft"
|
||
required: true
|
||
locked_after_deploy: true
|
||
description: "Az alkalmazás aldomainje"
|
||
|
||
- env_var: CRAFTY_PASSWORD
|
||
label: "Admin jelszó"
|
||
type: password
|
||
generate: password:24
|
||
locked_after_deploy: true
|
||
description: "A Crafty admin felhasználó (admin) kezdeti jelszava — ezzel tudsz belépni a kezelőfelületre"
|
||
|
||
# --- App info (info page content) ---
|
||
app_info:
|
||
tagline: "Minecraft szerver kezelő - hozd létre a saját világodat"
|
||
docs_url: "https://docs.craftycontrol.com/"
|
||
|
||
use_cases:
|
||
- 'Minecraft szerver létrehozása és kezelése webes felületen'
|
||
- 'Több szerver párhuzamos futtatása (Java és Bedrock)'
|
||
- 'Automatikus mentések és ütemezett újraindítás'
|
||
- 'Játékos menedzsment és konzol hozzáférés'
|
||
- 'Szerver fájlok kezelése böngészőből'
|
||
|
||
first_steps:
|
||
- 'Nyisd meg a minecraft.DOMAIN címet a böngészőben'
|
||
- 'A kezdeti belépési adatokat ezen az oldalon (Kezdeti belépési adatok) találod'
|
||
- 'Hozz létre egy új Minecraft szervert a varázslóval'
|
||
- 'Állítsd be a szerver beállításokat (játékmód, nehézség, stb.)'
|
||
- 'Állítsd be a szerver portját a 25565–25575 tartományon belül (server.properties → server-port); az első szerver a 25565-öt használja, a továbbiak 25566–25575-öt'
|
||
- 'Helyi hálózaton csatlakozz a szerver helyi IP-címére és portjára (pl. 192.168.x.x:25565) — a Minecraft kliens „helyi hálózat keresése” nem listázza automatikusan, add meg kézzel a címet'
|
||
- 'Interneten keresztüli eléréshez port-továbbítás szükséges a választott port(ok)ra — egyeztess az üzemeltetővel'
|
||
|
||
prerequisites:
|
||
- 'Legalább 2 GB szabad RAM ajánlott (Minecraft szerver + Crafty)'
|
||
- 'x86 processzor szükséges (nem fut Raspberry Pi-n)'
|
||
- 'A Minecraft szerverek a 25565–25575 porttartományt használhatják (egyszerre legfeljebb 11 szerver)'
|
||
|
||
# --- Controller-side health probe ---
|
||
healthcheck:
|
||
checks:
|
||
- type: tcp
|
||
port: 8443
|
||
|
||
# --- Initial login (felhom-seeded) ---
|
||
# The admin password is seeded into default.json by the compose entrypoint (CRAFTY_PASSWORD deploy
|
||
# field). The controller reads it back from default.json and shows it on the app page under "Kezdeti
|
||
# belépési adatok" — same value the customer set at deploy time.
|
||
initial_credentials:
|
||
file: /crafty/app/config/default.json
|
||
format: json
|
||
username_key: username
|
||
password_key: password
|
||
note: "Kezdeti admin jelszó (a telepítéskor beállított). Az első belépés után változtasd meg a Crafty felületén — ez a kártya továbbra is a kezdeti jelszót mutatja."
|