website: M3 part C - all 18 remaining pages moved into the shell
gates / gates (push) Successful in 8m50s
gates / gates (push) Successful in 8m50s
Staged under /preview/m3/. Nothing live. 19 shell pages in total with the home.
Each page keeps its own <head> byte-for-byte apart from two additions (shell.css
and the no-js/js hook), so title, meta description, canonical, hreflang, Open Graph
and JSON-LD all survive the move untouched. The body loses the website's
<nav>/<footer> and the old hamburger script, and gains the shell.
PROVED, not assumed - a word-level diff of every page's visible text, live vs
shell, with the nav and footer removed from both:
* 18 of 18 pages: visible text IDENTICAL after the one allowed substitution
* adatkezeles and feltetelek: identical with NO substitution permitted at all.
The legal texts are reviewed documents; the frame changed, the words did not.
That check earned itself immediately. The first version of the page-header
transform rebuilt the block from its <h1> and first <p> and SILENTLY DROPPED the
rest: the "Fontos tudnivalok" / "Good to know" disclaimer banner on both apps
pages and the 404's English line - 168 words across three pages. Nothing looked
wrong on the page. The diff found it.
Em dashes: 318 replaced with the Hungarian gondolatjel across 16 pages (gyik and
en/faq 104 each). The FAQ pages' JSON-LD is swept with the SAME substitution, so
gate 17's equality with the visible answers still holds - it does, on both.
scripts/site_gates.py:
* SHELL now holds all 19 pages.
* is_en(): a page is English if it is a TWINS value OR lives under an en/
directory. Without the second half the dash-language, <html lang> and
no-Hungarian gates all judged preview/m3/en/* as Hungarian - 30 false fails.
* norm_block() also drops `is-open` and `aria-expanded`, because the shell
renders the nav group containing the active page open, exactly as the
controller does, and that legitimately differs per page.
The last change LOOSENS a check, so it was red-proofed BOTH ways: a one-character
difference in one menu label still convicts, and a state-only difference (the
active marker moving to another item) correctly does not.
One generator now owns the shell. The home page's content comes from m3.py and its
shell from the same function every other page uses, so the two cannot drift - which
they already had, and gate 3b caught it.
This commit is contained in:
+45
-8
@@ -120,12 +120,43 @@ MOCKUPS = {os.path.join("preview", "m1", "index.html"),
|
||||
# every live page becomes one of these. They keep every other check; what changes for them is
|
||||
# WHICH block has to be identical across the set: the sidebar, not the nav and footer. Gate 3
|
||||
# below does both, so there is one identity gate rather than two.
|
||||
SHELL = {os.path.join("preview", "m3", "index.html")}
|
||||
SHELL = {
|
||||
os.path.join("preview", "m3", 'index.html'),
|
||||
os.path.join("preview", "m3", 'alkalmazasok.html'),
|
||||
os.path.join("preview", "m3", 'technologiak.html'),
|
||||
os.path.join("preview", "m3", 'biztonsagimentes.html'),
|
||||
os.path.join("preview", "m3", 'gyik.html'),
|
||||
os.path.join("preview", "m3", 'teszteles.html'),
|
||||
os.path.join("preview", "m3", 'kapcsolat.html'),
|
||||
os.path.join("preview", "m3", 'letoltes.html'),
|
||||
os.path.join("preview", "m3", 'adatkezeles.html'),
|
||||
os.path.join("preview", "m3", 'feltetelek.html'),
|
||||
os.path.join("preview", "m3", '404.html'),
|
||||
os.path.join("preview", "m3", "en", 'index.html'),
|
||||
os.path.join("preview", "m3", "en", 'apps.html'),
|
||||
os.path.join("preview", "m3", "en", 'technology.html'),
|
||||
os.path.join("preview", "m3", "en", 'backups.html'),
|
||||
os.path.join("preview", "m3", "en", 'faq.html'),
|
||||
os.path.join("preview", "m3", "en", 'testing.html'),
|
||||
os.path.join("preview", "m3", "en", 'contact.html'),
|
||||
os.path.join("preview", "m3", "en", 'download.html'),
|
||||
}
|
||||
|
||||
PAGES = list(TWINS) + list(TWINS.values()) + sorted(NO_TWIN) + sorted(MOCKUPS) + sorted(SHELL)
|
||||
EN_PAGES = set(TWINS.values())
|
||||
HU_PAGES = set(PAGES) - EN_PAGES - MOCKUPS - SHELL
|
||||
ANALYTICS_EXEMPT = {"szolgaltatasok-nonpublic.html"} | MOCKUPS
|
||||
|
||||
|
||||
def is_en(p):
|
||||
"""A page is English if it is a TWINS value OR it lives under an `en/` directory. The second
|
||||
half matters for the shell pages staged at preview/m3/en/*, which are not in TWINS yet: without
|
||||
it the dash-language, <html lang> and no-Hungarian gates all judged them as Hungarian."""
|
||||
return p in EN_PAGES or p.split(os.sep)[0] == "en" or (os.sep + "en" + os.sep) in p
|
||||
|
||||
|
||||
def lang_of(p):
|
||||
return "en" if is_en(p) else "hu"
|
||||
ANALYTICS_MARK = "https://stats.felhom.eu/script.js"
|
||||
SITE = "https://felhom.eu"
|
||||
|
||||
@@ -162,9 +193,19 @@ GLOBE_ITEM_RE = re.compile(r'<a href="([^"]*)" lang="([^"]*)" hreflang="([^"]*)"
|
||||
r'( aria-current="true")?>([^<]*)</a>')
|
||||
|
||||
|
||||
def _drop_state_classes(m):
|
||||
"""Remove the markers that legitimately differ per page from a class list: `active` on the
|
||||
current item, and `is-open` on the nav group containing it (the shell renders that group open,
|
||||
exactly as the controller does). Everything else in the class must match."""
|
||||
keep = [c for c in m.group(1).split() if c not in ("active", "is-open")]
|
||||
return 'class="%s"' % " ".join(keep) if keep else ""
|
||||
|
||||
|
||||
def norm_block(b):
|
||||
b = b.replace(' class="active"', "")
|
||||
b = re.sub(r'\s*aria-current="[^"]*"', "", b)
|
||||
b = re.sub(r'\s*aria-expanded="[^"]*"', "", b) # open/closed state of the same group
|
||||
b = re.sub(r'class="([^"]*)"', _drop_state_classes, b)
|
||||
# the globe is the one nav item whose content differs per page (its targets, its current mark, its label) —
|
||||
# gate 13 checks all of that; here only its presence must match
|
||||
b = GLOBE_RE.sub('<details class="lang-globe"/>', b)
|
||||
@@ -246,7 +287,7 @@ for p in sorted(SHELL):
|
||||
if not m:
|
||||
fail("%s: no <nav class=\"sidebar\"> block — a shell page carries the shell" % p)
|
||||
continue
|
||||
_shell_by_lang.setdefault("en" if p.startswith("en" + os.sep) else "hu", []).append((p, norm_block(m.group(0))))
|
||||
_shell_by_lang.setdefault(lang_of(p), []).append((p, norm_block(m.group(0))))
|
||||
for _lang, _members in sorted(_shell_by_lang.items()):
|
||||
_ref_p, _ref = _members[0]
|
||||
_bad = 0
|
||||
@@ -331,10 +372,6 @@ for p, s in pages.items():
|
||||
# gate 13: twins — both ways, matching alternates, the globe pointing at the twins
|
||||
|
||||
|
||||
def lang_of(p):
|
||||
return "en" if p in EN_PAGES else "hu"
|
||||
|
||||
|
||||
def check_globe(p, lang, urls=None):
|
||||
"""Exactly one globe; its label in the page's language; one item per LANGS entry, in order, lang/hreflang equal to
|
||||
the entry; the page's own language is the only current/aria-current item; with `urls`, each item's target."""
|
||||
@@ -390,7 +427,7 @@ for p, s in pages.items():
|
||||
# gate 14: the lang attribute
|
||||
for p, s in pages.items():
|
||||
m = re.search(r'<html lang="([^"]+)"', s)
|
||||
want = "en" if p in EN_PAGES else "hu"
|
||||
want = "en" if is_en(p) else "hu"
|
||||
if not m or m.group(1) != want:
|
||||
fail("%s: <html lang=%r> — the %s set needs lang=%r" % (p, m and m.group(1), "English" if want == "en" else "Hungarian", want))
|
||||
|
||||
@@ -477,7 +514,7 @@ if not _pos or not _pos2 or _neg:
|
||||
else:
|
||||
print(" no-HU matcher controls OK (positive 'Jelentkezz be'/'Kapcsolat' convict, negative 'Angola…' does not)")
|
||||
|
||||
for p in sorted(EN_PAGES):
|
||||
for p in sorted(x for x in pages if is_en(x)):
|
||||
s = pages.get(p)
|
||||
if s is None:
|
||||
continue
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Az oldal nem található | Felhom.eu</title>
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-404">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="#" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="#" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>Ez az oldal <span>nem található</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">A keresett cím nem létezik, vagy elköltözött. A kezdőlapról mindent elérsz.</p>
|
||||
<p lang="en">This page does not exist. <a href="/en/">Go to the English home page</a>.</p>
|
||||
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="apps-cta">
|
||||
<a href="/" class="cta-button">Vissza a kezdőlapra →</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,452 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Adatkezelési tájékoztató | Felhom.eu</title>
|
||||
<meta name="description" content="Mit kezelünk rólad, miért, meddig, és kik látják még. A Felhom.eu adatkezelési tájékoztatója, egyszerűen leírva.">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/adatkezeles">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/adatkezeles">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/adatkezeles">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/adatkezeles">
|
||||
<meta property="og:title" content="Adatkezelési tájékoztató — Felhom.eu">
|
||||
<meta property="og:description" content="Mit kezelünk rólad, miért, meddig, és kik látják még. A Felhom.eu adatkezelési tájékoztatója, egyszerűen leírva.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="hu_HU">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-adatkezeles">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/adatkezeles" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="#" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main class="content">
|
||||
|
||||
|
||||
<header class="page-header">
|
||||
<div class="container">
|
||||
<h1>Adatkezelési tájékoztató</h1>
|
||||
<p>Mit kezelünk rólad, miért, meddig, és kik látják még. Egyszerűen leírva.</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="section">
|
||||
<div class="container legal">
|
||||
|
||||
<p class="legal-version"><strong>Zárt teszt — 1.0 verzió, hatályos: 2026. október 9.</strong></p>
|
||||
|
||||
<h2>1. Ki kezeli az adataidat?</h2>
|
||||
<!-- source: operator ruling 2026-10-09 (no company exists yet; the operator is named as a private person) -->
|
||||
<ul>
|
||||
<li><strong>Név:</strong> Nagyfenyvesi Viktor — magánszemélyként. A Felhom ma még nem cég.</li>
|
||||
<li><strong>E-mail:</strong> <a href="mailto:info@felhom.eu">info@felhom.eu</a></li>
|
||||
<li><strong>Adatvédelmi tisztviselő:</strong> nincs kijelölve.</li>
|
||||
</ul>
|
||||
<p>Az alábbiakban: <strong>Felhom</strong> vagy <strong>mi</strong>.</p>
|
||||
|
||||
<h2>2. Kétféle szerepünk van</h2>
|
||||
<p>
|
||||
<strong>Az egyik:</strong> a weboldal látogatóinak, a kapcsolatfelvételi űrlap kitöltőinek és
|
||||
a zárt teszt résztvevőinek adatait mi kezeljük. Erről szól ez a tájékoztató.
|
||||
</p>
|
||||
<p>
|
||||
<strong>A másik:</strong> a nálad lévő szerveren tárolt adatok (fényképek, dokumentumok,
|
||||
alkalmazásadatok) <em>a tieid</em>. Azokat mi csak üzemeltetjük, felügyeljük és mentjük.
|
||||
Ahol ez a tájékoztató ezeket érinti (mentés, hozzáférés), azt azért írjuk le, hogy lásd,
|
||||
mi történik velük. Külön adatfeldolgozási megállapodás a zárt teszt alatt még nincs.
|
||||
</p>
|
||||
<!-- source: documentation/backlog/ROADMAP.md:53 (R-809: data-processing agreement not written) -->
|
||||
|
||||
<h2>3. A weboldal (felhom.eu)</h2>
|
||||
|
||||
<h3>3.1 Sütik: egyet sem használunk</h3>
|
||||
<p>
|
||||
A weboldal <strong>egyetlen sütit sem helyez el</strong> a böngésződben, és nem használ
|
||||
helyi tárolót sem. Ezt 2026. október 9-én megmértük: a böngészőben a sütik, a
|
||||
<span class="nowrap">localStorage</span> és a <span class="nowrap">sessionStorage</span>
|
||||
üresek maradtak az oldal betöltése és a látogatottság-mérés lefutása után is, és egyetlen
|
||||
válasz sem küldött sütit.
|
||||
</p>
|
||||
<!-- source: measured 2026-10-09 in the operator's Chrome: document.cookie "", localStorage/sessionStorage empty after the Umami beacon fired, with a positive control (a probe cookie WAS visible to the same method); curl -I on felhom.eu/ and stats.felhom.eu/script.js: 0 Set-Cookie headers -->
|
||||
|
||||
<h3>3.2 Látogatottság-mérés</h3>
|
||||
<p>
|
||||
Azt mérjük, hány oldalmegtekintés történik. Az eszköz az <strong>Umami</strong>, amelyet
|
||||
<strong>mi magunk üzemeltetünk</strong> a saját szerverünkön (a <code>stats.felhom.eu</code>
|
||||
címen). Az adatok nem jutnak külső elemző céghez.
|
||||
</p>
|
||||
<p>A böngésződ ezeket küldi el egy oldalmegtekintéskor (megmérve, 2026. október 9.):</p>
|
||||
<ul>
|
||||
<li>a weboldal saját azonosítója (nem a tiéd),</li>
|
||||
<li>a képernyő mérete,</li>
|
||||
<li>a böngésző nyelve,</li>
|
||||
<li>az oldal címe és webcíme,</li>
|
||||
<li>a hivatkozó oldal, ha máshonnan érkeztél.</li>
|
||||
</ul>
|
||||
<p>
|
||||
Ezen felül a kiszolgálónk — mint minden webkiszolgáló — látja az <strong>IP-címedet</strong>
|
||||
és a böngésződ azonosítóját; a program ezekből országot és böngészőtípust állapít meg.
|
||||
A böngésződ nem küld rólad egyedi azonosítót.
|
||||
</p>
|
||||
<!-- source: measured 2026-10-09, the actual beacon body to stats.felhom.eu/api/send: {"type":"event","payload":{"website":"d419db57-…","screen":"1920x1080","language":"en-US","title":"…","hostname":"felhom.eu","url":"…","referrer":""}} -->
|
||||
<p>
|
||||
<strong>Meddig:</strong> a mérőprogramban ma <strong>nincs beállítva automatikus törlés</strong>,
|
||||
tehát a statisztika határozatlan ideig megmarad. Ezt őszintén leírjuk, mert nem akarunk olyan
|
||||
határidőt ígérni, amit semmi nem tart be.
|
||||
</p>
|
||||
<!-- source: manifests/umami.yaml:194-206 (env: only DATABASE_URL, APP_SECRET, DISABLE_TELEMETRY, TZ — no retention setting) -->
|
||||
<p><strong>Jogalap:</strong> jogos érdek (GDPR 6. cikk (1) f) — hogy lássuk, használják-e az oldalt.</p>
|
||||
|
||||
<h3>3.3 Szervernaplók</h3>
|
||||
<p>
|
||||
A weboldalt kiszolgáló program (nginx) a kéréseket naplózhatja, köztük az IP-címedet. Külön
|
||||
naplózási vagy megőrzési beállítást nem adtunk meg, tehát az alapértelmezés működik, és
|
||||
<strong>megőrzési időt erre sem állítottunk be</strong>.
|
||||
</p>
|
||||
<!-- source: manifests/webpage.yaml (nginx:alpine; no access_log/log_format directive anywhere) -->
|
||||
|
||||
<h3>3.4 Külső tartalom és a DNS</h3>
|
||||
<p>
|
||||
A weboldal nem tölt be külső betűtípust, külső szkriptet, beágyazott videót vagy hirdetést.
|
||||
A saját mérőprogramunkon kívül semmi nem töltődik be máshonnan.
|
||||
</p>
|
||||
<!-- source: measured 2026-10-09 in the browser: the only script sources are felhom.eu/assets/gallery.js and stats.felhom.eu/script.js; no external stylesheet, no iframe -->
|
||||
<p>
|
||||
A <code>felhom.eu</code> névfeloldását (DNS) a <strong>Cloudflare</strong> végzi, de
|
||||
<strong>csak névfeloldást</strong>: a weboldal forgalma nem halad át a Cloudflare-en.
|
||||
Ezt megmértük — a <code>felhom.eu</code> nyilvános címbejegyzése a mi saját kiszolgálónkra
|
||||
mutat, nem a Cloudflare hálózatára.
|
||||
</p>
|
||||
<!-- source: measured 2026-10-09 from DooPlex: dig @1.1.1.1 and @8.8.8.8 felhom.eu A -> 37.191.56.193 (not a Cloudflare address range); NS -> martha/tony.ns.cloudflare.com; curl -I https://felhom.eu/ returns no cf-ray header -->
|
||||
|
||||
<h2>4. Kapcsolatfelvételi űrlap és e-mail</h2>
|
||||
<p>
|
||||
<strong>Mit adsz meg:</strong> a nevedet, az e-mail-címedet, a választott tárgyat, az üzenetet
|
||||
és a csatolt fájlokat (legfeljebb 5 fájl, összesen 20 MB).
|
||||
</p>
|
||||
<!-- source: website/kapcsolat.html:78-111 (fields), :193-196 (maxFiles 5, 20 MB) -->
|
||||
<p><strong>Mire használjuk:</strong> hogy válaszoljunk neked.</p>
|
||||
<p>
|
||||
<strong>Hogyan jut el hozzánk:</strong> a böngésződ elküldi a saját kis programunknak, az
|
||||
e-mailt a <strong>Resend</strong> levélküldő szolgáltatás továbbítja az
|
||||
<code>info@felhom.eu</code> címre, ahová a leveleket a <strong>Cloudflare Email Routing</strong>
|
||||
viszi tovább egy <strong>Gmail</strong>-postafiókba. Ott olvassuk el. Ha közvetlenül írsz az
|
||||
<code>info@felhom.eu</code> címre, ugyanez az út érvényes, a Resend nélkül.
|
||||
</p>
|
||||
<!-- source: manifests/contact-mailer.yaml:1-2, :66-69; README.md:133-135, :146-151 -->
|
||||
<p>
|
||||
<strong>Meddig:</strong> amíg a megkeresésed le nem zárul, és utána is, amíg a levelezésünkben
|
||||
marad. <strong>Automatikus törlés ma nincs beállítva.</strong> Ha szeretnéd, hogy töröljük a
|
||||
leveledet, írj az <a href="mailto:info@felhom.eu">info@felhom.eu</a> címre, és töröljük.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Jogalap:</strong> a hozzájárulásod (GDPR 6. cikk (1) a). Ha árajánlatot kérsz, a
|
||||
szerződéskötést megelőző lépés is lehet a jogalap (6. cikk (1) b).
|
||||
</p>
|
||||
|
||||
<h2>5. A Facebook-oldalunk és a Messenger</h2>
|
||||
<p>
|
||||
Van egy Facebook-oldalunk: <code>facebook.com/felhom.eu</code>. Ha meglátogatod vagy írsz
|
||||
nekünk a Messengeren, a Meta a saját szabályai szerint kezeli az adataidat — ezt mi nem tudjuk
|
||||
megváltoztatni.
|
||||
</p>
|
||||
<p>
|
||||
Az oldal <strong>látogatottsági statisztikájáért</strong> („Oldalelemzések") a Meta és mi
|
||||
<strong>közös adatkezelők</strong> vagyunk a GDPR 26. cikke szerint. Mi csak összesített
|
||||
számokat látunk, azt nem, hogy ki járt az oldalon. A Messengeren küldött üzenetedet
|
||||
elolvassuk, és ugyanúgy kezeljük, mint egy e-mailt.
|
||||
</p>
|
||||
<ul>
|
||||
<li>A Meta kiegészítése az Oldalelemzésekről:
|
||||
<a href="https://www.facebook.com/legal/terms/page_controller_addendum" target="_blank" rel="noopener">facebook.com/legal/terms/page_controller_addendum</a></li>
|
||||
<li>A Meta adatkezelési szabályzata:
|
||||
<a href="https://www.facebook.com/privacy/policy/" target="_blank" rel="noopener">facebook.com/privacy/policy</a></li>
|
||||
</ul>
|
||||
<!-- source: read 2026-10-09 — https://www.facebook.com/legal/terms/page_controller_addendum, title "Tudnivalók az Oldalelemzésekről", section "Az Oldalelemzések funkció adatkezelői függeléke": Meta Platforms Ireland Limited and the Page admin are joint controllers under GDPR Art. 26 for Page Insights; effective 25 April 2023 -->
|
||||
|
||||
<h2>6. A zárt teszt résztvevőinek adatai a központi rendszerünkben</h2>
|
||||
<p>
|
||||
A szervered rendszeresen jelentést küld a központi rendszerünknek
|
||||
(<code>hub.felhom.eu</code>), hogy lássuk, minden rendben van-e. Ezeket tároljuk:
|
||||
</p>
|
||||
<ul>
|
||||
<li><strong>Azonosítód, neved, domained, e-mail-címed, nyelved</strong> — amíg törölünk téged a rendszerből.
|
||||
<!-- source: hub/internal/store/store.go:161-171, :223 --></li>
|
||||
<li><strong>A szerver állapotjelentései</strong> (gépnév, processzor-, memória- és lemezhasználat, hőmérséklet,
|
||||
a telepített alkalmazások neve és állapota, a mentések állapota) — <strong>90 nap</strong>.
|
||||
<!-- source: manifests/hub.yaml:78 (retention.max_days: 90); hub/internal/store/store.go:1528-1540 --></li>
|
||||
<li><strong>Események</strong> (például „a mentés nem sikerült") — <strong>90 nap</strong>.
|
||||
<!-- source: hub/internal/store/store.go:2695-2702 (PruneEvents) --></li>
|
||||
<li><strong>Alkalmazásonkénti erőforrás-statisztika</strong> — <strong>90 nap</strong>.
|
||||
<!-- source: hub/cmd/hub/main.go:1022 --></li>
|
||||
<li><strong>Alkalmazásnaplókból kiszűrt hibaüzenetek</strong>, kitakarva — az utolsó előfordulás után <strong>30 nap</strong>.
|
||||
<!-- source: hub/cmd/hub/main.go:1027 (PruneStaleIssues 30 days); hub/internal/store/telemetry.go:35 --></li>
|
||||
<li><strong>Naplórészlet, csak ha külön kérjük</strong>, kitakarva — alkalmazásonként a legutóbbi kettő, és a törlésedkor törlődik.
|
||||
<!-- source: hub/internal/store/logtail.go:74-82; customer_delete.go:57-58 --></li>
|
||||
<li><strong>Diagnosztikai naplócsomag, csak külön kérésre</strong> — <strong>72 óra</strong>.
|
||||
<!-- source: hub/internal/store/logbundle.go:28-29 (logBundleTTL = 72h) --></li>
|
||||
<li><strong>A kiküldött értesítések naplója</strong> — a törlésed után <strong>1 évig</strong>, aztán törlődik.
|
||||
Amíg aktív vagy, erre nincs megőrzési idő.
|
||||
<!-- source: operator ruling 2026-10-08 09:04, 09 §3 decision 181; hub/internal/store/deleted_customer_audit.go --></li>
|
||||
<li><strong>A visszaállítások és a szervertörlés naplója</strong> — ezt <strong>nem töröljük</strong>, hogy utólag is elszámoltatható legyen, ki mit tett.
|
||||
<!-- source: hub/internal/store/store.go:734 ("NEVER pruned") --></li>
|
||||
<li><strong>A mentésed titkosító kulcsa, a helyreállító kódoddal lezárva</strong> — amíg törölünk téged.
|
||||
<!-- source: hub/internal/store/store.go:400-446 --></li>
|
||||
<li><strong>A szerver vészhelyzeti konzoljelszava, titkosítva</strong> — amíg a szervert töröljük.
|
||||
<!-- source: hub/internal/store/store.go:552-564 --></li>
|
||||
</ul>
|
||||
<p>
|
||||
<strong>A kulcsletétről, egyszerűen:</strong> a mentésed kulcsát csak lezárt formában tároljuk.
|
||||
Kinyitni csak a <strong>helyreállító kódoddal</strong> lehet, ami nálunk nincs meg. Ha elveszíted
|
||||
ezt a kódot, a távoli mentésed nem nyitható ki — mi sem tudjuk kinyitni.
|
||||
</p>
|
||||
<!-- source: documentation/architecture/07-backup-architecture.md:67-75 ("genuinely zero-knowledge… R exists in zero system copies by design") -->
|
||||
<p>
|
||||
A központi rendszer adatbázisáról éjjelente mentés készül, titkosítva, a távoli mentőszerverünkre.
|
||||
Ott <strong>14 napi és 8 heti</strong> példány marad meg, a nálunk tárolt másolatban <strong>8 heti</strong>.
|
||||
Ezért egy törölt résztvevő adatai a mentésekben eddig az ideig még megtalálhatók.
|
||||
</p>
|
||||
<!-- source: documentation/runbooks/RUNBOOK-hub-db-offsite-backup.md:72-73 (--keep-daily 14 --keep-weekly 8); documentation/runbooks/ep0-datastore-copy.md:15-17 (keep-weekly 8) -->
|
||||
<p><strong>Jogalap:</strong> a veled kötött megállapodás teljesítése (GDPR 6. cikk (1) b); a naplók megőrzésére jogos érdek (6. cikk (1) f).</p>
|
||||
|
||||
<h2>7. A szervered adatainak távoli mentése</h2>
|
||||
<p>
|
||||
A szervereden lévő adatokról távoli mentés készül. <strong>A mentés nálad, a szerveren
|
||||
titkosítódik, mielőtt elhagyja az otthonodat.</strong> Sem a tárhely üzemeltetője, sem mi nem
|
||||
tudjuk elolvasni a tartalmát.
|
||||
</p>
|
||||
<!-- source: documentation/architecture/01-topology-and-trust.md:118 ("ciphertext only (operator can't read)"); 07-backup-architecture.md:378-379 -->
|
||||
<ul>
|
||||
<li><strong>Alkalmazásonkénti fájlmentés</strong> — <strong>Hetzner Storage Box</strong>,
|
||||
Falkenstein, Németország. 7 napi, 4 heti és 6 havi példány marad meg. A fiókod
|
||||
visszaállításakor törlődik.
|
||||
<!-- source: manifests/hub.yaml:224-226 (HETZNER_LOCATION "fsn1"); fsn1 = Falkenstein, Germany per https://docs.hetzner.com/cloud/general/locations/ read 2026-10-09; 07-backup-architecture.md:377 (keep-daily 7, weekly 4, monthly 6) --></li>
|
||||
<li><strong>Teljes szervermentés</strong> — a saját távoli mentőszerverünkre, amely a
|
||||
<strong>Hetzner Cloud</strong> nürnbergi (Németország) telephelyén fut. A legutóbbi 2 heti
|
||||
példány marad meg; a törlésedkor törlődik.
|
||||
<!-- source: documentation/runbooks/RUNBOOK-ep0-datastore-volume-2026-07-27.md:6 ("Hetzner CX33 … Nuremberg") --></li>
|
||||
<li><strong>Ennek másolata a saját szerverünkön</strong> — továbbra is titkosítva, 8 heti példány.
|
||||
A törlésed után <strong>legfeljebb 30 napon belül</strong> törlődik; ezt egy naponta futó
|
||||
feladat végzi.
|
||||
<!-- source: operator ruling 2026-10-08 09:04, decision 181; scripts/ep0-copy-gc/; MEASURED 2026-10-09 on DooPlex: felhom-ep0-copy-gc.timer active, last run Fri 2026-10-09 08:00 CEST, Result=success, ExecMainStatus=0 --></li>
|
||||
</ul>
|
||||
|
||||
<h2>8. Hozzáférés a szerveredhez</h2>
|
||||
<p>
|
||||
Őszintén: <strong>rendszergazdai (root) hozzáférésünk van minden szerverhez, amit kezelünk.</strong>
|
||||
Ez kell a frissítésekhez, a mentések ellenőrzéséhez és a hibák javításához. Ezzel a hozzáféréssel
|
||||
a szervereden tárolt adatok elérhetők. Csak üzemeltetésre és hibaelhárításra használjuk.
|
||||
</p>
|
||||
<!-- source: documentation/architecture/07-backup-architecture.md:49-52 ("The operator holds root SSH on every box… 'The operator cannot read customer data' was never the security property") -->
|
||||
<p>
|
||||
A fájljaid és az alkalmazásaid adatai <strong>nem kerülnek át</strong> a központi rendszerbe.
|
||||
Oda csak a 6. pontban felsorolt állapotadatok jutnak el, és — külön kérésre, kitakarva —
|
||||
naplórészletek.
|
||||
</p>
|
||||
<!-- source: felhom-controller/controller/internal/report/types.go:13-56; documentation/architecture/05-hub-architecture.md:206 -->
|
||||
|
||||
<h2>9. Az alkalmazásaid elérése az interneten</h2>
|
||||
<p>
|
||||
A szervereden futó alkalmazásokat a <strong>Cloudflare Tunnel</strong> szolgáltatáson keresztül
|
||||
lehet elérni az internetről. <strong>A titkosított kapcsolat a Cloudflare hálózatán végződik</strong>,
|
||||
vagyis ezeknek az alkalmazásoknak a forgalma áthalad a Cloudflare rendszerén. (Ez más, mint a
|
||||
weboldalunk: a felhom.eu forgalma nem megy át rajta — lásd a 3.4 pontot.)
|
||||
</p>
|
||||
<!-- source: documentation/architecture/05-hub-architecture.md:178-180 ("the edge terminates TLS"); 01-topology-and-trust.md:113-114, :202-224 -->
|
||||
|
||||
<h2>10. Kik látják még az adataidat</h2>
|
||||
<ul>
|
||||
<li><strong>Resend</strong> — e-mail-küldés. Látja: a címzett e-mail-címét és a levél tartalmát.</li>
|
||||
<li><strong>Cloudflare</strong> — a felhom.eu névfeloldása; a @felhom.eu címre érkező levelek
|
||||
továbbítása; az alkalmazásaid internetes elérése. Látja: a továbbított leveleket és az
|
||||
alkalmazások forgalmát.</li>
|
||||
<li><strong>Google (Gmail)</strong> — az <code>info@felhom.eu</code> postafiókja. Látja: a
|
||||
beérkező leveleket, köztük az űrlap üzeneteit.</li>
|
||||
<li><strong>Hetzner</strong> (Németország) — a titkosított mentések tárolása. Csak titkosított
|
||||
adatot lát.</li>
|
||||
<li><strong>Meta</strong> — csak akkor, ha a Facebook-oldalunkat használod (5. pont).</li>
|
||||
</ul>
|
||||
<p>
|
||||
A Resend, a Cloudflare, a Google és a Meta nemzetközi szolgáltatók, amelyek adatot az Európai
|
||||
Gazdasági Térségen kívül is kezelhetnek. Hogy pontosan hol és milyen garanciával, azt a saját
|
||||
adatkezelési tájékoztatójuk írja le.
|
||||
</p>
|
||||
|
||||
<h2>11. A jogaid</h2>
|
||||
<p>Bármikor kérheted tőlünk, hogy:</p>
|
||||
<ul>
|
||||
<li><strong>megmondjuk, milyen adatot kezelünk rólad</strong> (hozzáférés),</li>
|
||||
<li><strong>javítsuk</strong>, ha valami hibás (helyesbítés),</li>
|
||||
<li><strong>töröljük</strong> az adataidat (törlés),</li>
|
||||
<li><strong>korlátozzuk</strong> a kezelését, amíg egy vitát tisztázunk,</li>
|
||||
<li><strong>odaadjuk neked</strong> géppel olvasható formában (adathordozhatóság),</li>
|
||||
<li><strong>tiltakozz</strong> a jogos érdeken alapuló kezelés ellen,</li>
|
||||
<li><strong>visszavond a hozzájárulásodat</strong> — ettől a korábbi kezelés nem lesz jogellenes.</li>
|
||||
</ul>
|
||||
<p>
|
||||
Hogyan kérd: írj az <a href="mailto:info@felhom.eu">info@felhom.eu</a> címre.
|
||||
<strong>Egy hónapon belül válaszolunk</strong> (GDPR 12. cikk (3)).
|
||||
</p>
|
||||
|
||||
<h2>12. Ha panaszod van</h2>
|
||||
<p>Panasszal a felügyeleti hatósághoz fordulhatsz:</p>
|
||||
<ul>
|
||||
<li><strong>Nemzeti Adatvédelmi és Információszabadság Hatóság (NAIH)</strong></li>
|
||||
<li>Cím: 1055 Budapest, Falk Miksa utca 9-11.</li>
|
||||
<li>Postacím: 1363 Budapest, Pf.: 9.</li>
|
||||
<li>Telefon: +36 (1) 391 1400</li>
|
||||
<li>E-mail: <a href="mailto:ugyfelszolgalat@naih.hu">ugyfelszolgalat@naih.hu</a></li>
|
||||
<li>Web: <a href="https://naih.hu" target="_blank" rel="noopener">naih.hu</a></li>
|
||||
</ul>
|
||||
<!-- source: https://www.naih.hu/ugyfelszolgalat-kapcsolat read 2026-10-09 -->
|
||||
<p>Bírósághoz is fordulhatsz.</p>
|
||||
|
||||
<h2>13. A tájékoztató változásai</h2>
|
||||
<p>
|
||||
Ha változik, amit csinálunk, ezt a tájékoztatót is módosítjuk, és a tetején lévő verziószámot
|
||||
megemeljük. A zárt teszt résztvevőinek a lényeges változásról e-mailt küldünk.
|
||||
</p>
|
||||
<p>
|
||||
A szolgáltatás feltételeit a <a href="/feltetelek">Feltételek</a> oldal írja le.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</main>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,370 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Biztonsági mentés — 3-2-1 mentési stratégia otthoni szerverekhez | Felhom.eu</title>
|
||||
<meta name="description" content="Professzionális 3-2-1 biztonsági mentés otthoni szerverhez. Automatikus backup három szinten: a dobozon, egy második meghajtón és titkosítva egy távoli tárhelyen.">
|
||||
<meta name="keywords" content="biztonsági mentés, backup, 3-2-1 mentési szabály, offsite backup, adatmentés, otthoni szerver backup, titkosított mentés, automatikus mentés">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/biztonsagimentes">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/biztonsagimentes">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/backups">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/biztonsagimentes">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/biztonsagimentes">
|
||||
<meta property="og:title" content="3-2-1 biztonsági mentés otthoni szerverhez">
|
||||
<meta property="og:description" content="Professzionális szintű adatbiztonság otthon. Automatikus backup, és egy titkosított másolat távol is.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="hu_HU">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="3-2-1 biztonsági mentés otthoni szerverhez">
|
||||
<meta name="twitter:description" content="Professzionális adatvédelem otthoni szerveredre. Automatikus backup, offsite mentés.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": "3-2-1 biztonsági mentési stratégia otthoni szerverekhez",
|
||||
"description": "Hogyan védd meg az adataidat professzionális mentési stratégiával otthoni környezetben.",
|
||||
"author": {"@type": "Organization", "name": "Felhom.eu"},
|
||||
"publisher": {"@type": "Organization", "name": "Felhom.eu", "logo": {"@type": "ImageObject", "url": "https://felhom.eu/assets/logo.png"}},
|
||||
"mainEntityOfPage": "https://felhom.eu/biztonsagimentes"
|
||||
}
|
||||
</script>
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-biztonsagimentes">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes" class="active"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/biztonsagimentes" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/preview/m3/en/backups" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>Biztonsági <span>Mentés</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">Az adataid biztonsága az első. Professzionális mentési stratégiával gondoskodunk róla, hogy egy hiba vagy baleset után is legyen honnan visszahozni.</p>
|
||||
|
||||
|
||||
<!-- Bevezető -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-circle-help"/></svg> Miért fontos ez?</h3>
|
||||
<p>Amikor valaki felhőszolgáltatást választ – legyen az Google Drive, iCloud, vagy bármilyen más – az egyik legfontosabb szempont az <strong>adatbiztonság</strong>. Nem az a kérdés, hogy valaki hozzáfér-e az adatainkhoz, hanem hogy <strong>megmaradnak-e</strong>.</p>
|
||||
<p>A nagy szolgáltatók ezt milliárd dolláros infrastruktúrával oldják meg: több adatközpont, redundáns tárolás, automatikus mentések. De vajon otthoni szerveren is elérhető ugyanez a biztonság?</p>
|
||||
<div class="highlight-box">
|
||||
<p><strong>A válasz: igen.</strong> A megfelelő mentési stratégiával az otthoni szervered ugyanolyan biztonságos lehet, mint bármely felhőszolgáltató – sőt, te irányítasz mindent.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 3-2-1 szabály -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>A 3-2-1 <span>Mentési Szabály</span></h2>
|
||||
<p>Az iparági szabvány, amit a professzionális rendszergazdák és vállalatok használnak világszerte</p>
|
||||
</div>
|
||||
|
||||
<div class="backup-rule">
|
||||
<div class="rule-number">3</div>
|
||||
<div class="rule-content">
|
||||
<h3>Három másolat az adataidból</h3>
|
||||
<p>Mindig legyen legalább három példány minden fontos adatodból: az eredeti, és két biztonsági másolat. Ha az egyik sérül vagy elvész, még mindig van kettő tartalékban.</p>
|
||||
<div class="example-box">
|
||||
<div class="label">Példa</div>
|
||||
<p>A családi fotóid megvannak a szerveren (1), egy külső merevlemezen (2), és egy távoli helyen (3).</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="backup-rule">
|
||||
<div class="rule-number">2</div>
|
||||
<div class="rule-content">
|
||||
<h3>Két különböző tárolótípus</h3>
|
||||
<p>Az adatokat legalább kétféle tárolóeszközön tartsd. A különböző eszközök különböző meghibásodási módokkal rendelkeznek – ha az egyik típus elromlik, a másik valószínűleg rendben lesz.</p>
|
||||
<div class="example-box">
|
||||
<div class="label">Példa</div>
|
||||
<p>A szerver belső SSD-jén tárolod az adatokat, de a mentés külső HDD-re vagy NAS-ra kerül.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="backup-rule">
|
||||
<div class="rule-number">1</div>
|
||||
<div class="rule-content">
|
||||
<h3>Egy offsite (távoli) másolat</h3>
|
||||
<p>Legalább egy másolat legyen fizikailag más helyen. Ez véd a lokális katasztrófák ellen: tűz, vízkár, betörés, vagy akár egy villámcsapás sem veszélyeztetheti az összes adatodat.</p>
|
||||
<div class="example-box">
|
||||
<div class="label">Példa</div>
|
||||
<p>A mentés automatikusan átmásolódik egy barát/rokon szerverére, vagy titkosítva felhőbe kerül.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="backup-diagram">
|
||||
<h3>Így néz ki a gyakorlatban</h3>
|
||||
<div class="diagram-visual">
|
||||
<div class="diagram-node primary">
|
||||
<div class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></div>
|
||||
<div class="label">Szerver</div>
|
||||
<div class="sublabel">Eredeti adat</div>
|
||||
</div>
|
||||
<div class="diagram-arrow">→</div>
|
||||
<div class="diagram-node">
|
||||
<div class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-hard-drive"/></svg></div>
|
||||
<div class="label">Helyi backup</div>
|
||||
<div class="sublabel">Külső HDD/NAS</div>
|
||||
</div>
|
||||
<div class="diagram-arrow">→</div>
|
||||
<div class="diagram-node">
|
||||
<div class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></div>
|
||||
<div class="label">Offsite backup</div>
|
||||
<div class="sublabel">Távoli hely</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Offsite megoldások -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Offsite <span>Mentési Megoldások</span></h2>
|
||||
<p>Az "1" a 3-2-1 szabályban – a legfontosabb, és sokszor a legelhanyagoltabb</p>
|
||||
</div>
|
||||
|
||||
<div class="methods-grid">
|
||||
<div class="method-card">
|
||||
<div class="method-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-users"/></svg></div>
|
||||
<h3>„Haver rendszer"</h3>
|
||||
<p>A legegyszerűbb és legolcsóbb megoldás: cserélj mentéseket egy megbízható ismerőssel. Te mentesz az ő szerverére, ő ment a tiédre.</p>
|
||||
<ul class="method-pros">
|
||||
<li>Nincs havi díj</li>
|
||||
<li>Teljes kontroll az adatok felett</li>
|
||||
<li>Kölcsönös biztonság</li>
|
||||
<li>End-to-end titkosítás lehetséges</li>
|
||||
</ul>
|
||||
<div class="example-box">
|
||||
<div class="label">Hogyan működik?</div>
|
||||
<p>Titkosított mentések automatikusan szinkronizálódnak VPN kapcsolaton keresztül.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="method-card">
|
||||
<div class="method-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-building-2"/></svg></div>
|
||||
<h3>Otthon ↔ Iroda</h3>
|
||||
<p>Ha van munkahelyed vagy saját irodád, használd ki! A két helyszín természetes földrajzi távolságot biztosít.</p>
|
||||
<ul class="method-pros">
|
||||
<li>Meglévő infrastruktúra használata</li>
|
||||
<li>Biztonságos, ismert környezet</li>
|
||||
<li>Gyors helyreállítás szükség esetén</li>
|
||||
</ul>
|
||||
<div class="example-box">
|
||||
<div class="label">Tipp</div>
|
||||
<p>Egy kis, csendes mini PC az iroda sarkában tökéletes backup célpont lehet.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="method-card">
|
||||
<div class="method-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-cloud"/></svg></div>
|
||||
<h3>Titkosított felhő backup</h3>
|
||||
<p>Ha nincs megbízható ismerős vagy második helyszín, a felhő a megoldás. Fontos: az adatokat a feltöltés előtt titkosítjuk!</p>
|
||||
<ul class="method-pros">
|
||||
<li>Professzionális infrastruktúra</li>
|
||||
<li>Földrajzilag elosztott tárolás</li>
|
||||
<li>Nincs szükség hardverre</li>
|
||||
</ul>
|
||||
<ul class="method-pros method-cons">
|
||||
<li>Havi/éves díj (tárolás méretétől függően)</li>
|
||||
</ul>
|
||||
<div class="example-box">
|
||||
<div class="label">Megjegyzés</div>
|
||||
<p>A tárhely díja a mentett adatmennyiségtől függ. A Felhom dobozon ezt a megoldást használjuk.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Mi hogyan csináljuk -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Mi Hogyan <span>Oldjuk Meg?</span></h2>
|
||||
<p>Minden általunk telepített szerveren alapértelmezetten beállítjuk a mentéseket</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-wrench"/></svg> Automatizált mentési rendszer</h3>
|
||||
<p>A szerver minden éjjel magától készít mentéseket, három szinten: <strong>a dobozon</strong>, egy <strong>második meghajtón</strong> (ha van), és <strong>titkosítva egy távoli tárhelyen</strong>. Nem kell semmire sem emlékezned – a rendszer gondoskodik róla.</p>
|
||||
<p>A mentések inkrementálisak, ami azt jelenti, hogy csak a változások kerülnek mentésre. Ez helyet és időt takarít meg, miközben a teljes visszaállítási lehetőség megmarad.</p>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg> <strong>Nem csak az adatok:</strong> a Proxmox alapnak köszönhetően nem csupán a fájljaid és adatbázisaid menthetők, hanem az <strong>egész rendszered</strong> is – a teljes doboz is biztonsági mentésbe kerül, és ebből visszaállítható. Ha maga a doboz megy tönkre, az újratelepített rendszerre a titkosított távoli mentésből visszahozhatók az alkalmazásaid adatai – a helyreállítási kóddal.</p>
|
||||
</div>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>A távoli mentés helye:</strong> a Felhom dobozon a távoli másolat egy általunk biztosított tárhelyre kerül, titkosítva. A „haver rendszer” és az iroda általános lehetőségek a 3-2-1 szabályhoz – ezeket ma nem állítjuk be.</p>
|
||||
</div>
|
||||
|
||||
<h3 style="margin-top: 24px;"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg> A helyreállítási kód – amit csak te ismersz</h3>
|
||||
<p>A távoli mentésed titkosított, és a titkosítás kulcsa egy <strong>helyreállítási kód</strong>. Ez a kód pontosan egyszer jelenik meg: a te képernyődön, a beállításkor. Nálunk nem marad belőle másolat.</p>
|
||||
<p>Ez tudatos döntés, és két oldala van. Az egyik, hogy a távoli mentésedet rajtad kívül <strong>senki</strong> nem tudja elolvasni – mi sem. A másik, hogy ha a doboz megsemmisül és a kód is elveszett, akkor a távoli mentés <strong>nekünk sem visszaállítható</strong>. Ezért a kód papírra kerül, és jó helyre.</p>
|
||||
|
||||
<h3 style="margin-top: 24px;"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg> Monitoring és értesítések</h3>
|
||||
<p>A mentéseket folyamatosan figyeljük. Ha probléma van – sikertelen mentés, betelő tárhely, kapcsolati hiba – az a felügyeleti rendszerünkben megjelenik, és e-mail értesítés is indul róla. A zárt teszt egyik célja épp az, hogy ezeket az értesítéseket éles körülmények között csiszoljuk.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="cta-section">
|
||||
<div class="container">
|
||||
<h2>Kérdésed van a <span>mentésekről?</span></h2>
|
||||
<p>Beszéljük át, mi a legjobb megoldás a te helyzetedben. Segítünk megtalálni az egyensúlyt a biztonság és a költségek között.</p>
|
||||
<a href="/kapcsolat" class="cta-button">Kapcsolatfelvétel →</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,370 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Backups — a 3-2-1 backup strategy for home servers | Felhom.eu</title>
|
||||
<meta name="description" content="Professional 3-2-1 backups for a home server in Hungary. Automatic backups on three levels: on the box, on a second drive, and encrypted on remote storage.">
|
||||
<meta name="keywords" content="backup, 3-2-1 backup rule, off-site backup, data backup, home server backup, encrypted backup, automatic backup">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/en/backups">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/biztonsagimentes">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/backups">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/biztonsagimentes">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/en/backups">
|
||||
<meta property="og:title" content="3-2-1 backups for a home server">
|
||||
<meta property="og:description" content="Professional-grade data safety at home. Automatic backups, and an encrypted copy far away too.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="3-2-1 backups for a home server">
|
||||
<meta name="twitter:description" content="Professional data protection for your home server. Automatic backups, off-site copies.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": "A 3-2-1 backup strategy for home servers",
|
||||
"description": "How to protect your data at home with a professional backup strategy.",
|
||||
"author": {"@type": "Organization", "name": "Felhom.eu"},
|
||||
"publisher": {"@type": "Organization", "name": "Felhom.eu", "logo": {"@type": "ImageObject", "url": "https://felhom.eu/assets/logo.png"}},
|
||||
"mainEntityOfPage": "https://felhom.eu/en/backups"
|
||||
}
|
||||
</script>
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-biztonsagimentes">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/en/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menu">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/en/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/en/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Home</a></li>
|
||||
<li><a href="/preview/m3/en/#services"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Services</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Applications<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/en/apps">All applications</a></li>
|
||||
<li><a href="/preview/m3/en/apps#files-office">Files & Office</a></li>
|
||||
<li><a href="/preview/m3/en/apps#media-entertainment">Media & Entertainment</a></li>
|
||||
<li><a href="/preview/m3/en/apps#home-lifestyle">Home & Lifestyle</a></li>
|
||||
<li><a href="/preview/m3/en/apps#productivity-knowledge">Productivity & Knowledge</a></li>
|
||||
<li><a href="/preview/m3/en/apps#system-development">System & Development</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/en/technology"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technology</a></li>
|
||||
<li><a href="/preview/m3/en/backups" class="active"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Backups</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/en/testing" class="btn btn-outline sidebar-cta">Apply as a tester →</a>
|
||||
<div class="nav-group-label">About Felhom</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/en/#how-it-works">How it works</a></li>
|
||||
<li><a href="/preview/m3/en/faq">FAQ</a></li>
|
||||
<li><a href="/preview/m3/en/contact">Contact</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/biztonsagimentes" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/preview/m3/en/backups" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1><span>Backups</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">Your data's safety comes first. With a professional backup strategy, we make sure there is something to bring back from after a fault or an accident.</p>
|
||||
|
||||
|
||||
<!-- Bevezető -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-circle-help"/></svg> Why does it matter?</h3>
|
||||
<p>When someone picks a cloud service – Google Drive, iCloud or any other – one of the most important things is <strong>data safety</strong>. The question is not whether someone can get at our data, but whether it <strong>survives</strong>.</p>
|
||||
<p>The big providers solve this with billion-dollar infrastructure: several data centres, redundant storage, automatic backups. But can a home server be just as safe?</p>
|
||||
<div class="highlight-box">
|
||||
<p><strong>The answer: yes.</strong> With the right backup strategy, your home server can be as safe as any cloud provider – and you are in charge of everything.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 3-2-1 szabály -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>The 3-2-1 <span>backup rule</span></h2>
|
||||
<p>The industry standard that professional system administrators and companies use around the world</p>
|
||||
</div>
|
||||
|
||||
<div class="backup-rule">
|
||||
<div class="rule-number">3</div>
|
||||
<div class="rule-content">
|
||||
<h3>Three copies of your data</h3>
|
||||
<p>Always keep at least three copies of everything important: the original and two backups. If one is damaged or lost, there are still two in reserve.</p>
|
||||
<div class="example-box">
|
||||
<div class="label">Example</div>
|
||||
<p>Your family photos are on the server (1), on an external hard drive (2), and in a remote place (3).</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="backup-rule">
|
||||
<div class="rule-number">2</div>
|
||||
<div class="rule-content">
|
||||
<h3>Two different kinds of storage</h3>
|
||||
<p>Keep your data on at least two kinds of storage device. Different devices fail in different ways – if one kind breaks, the other is probably fine.</p>
|
||||
<div class="example-box">
|
||||
<div class="label">Example</div>
|
||||
<p>You keep your data on the server's internal SSD, and the backup goes to an external HDD or a NAS.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="backup-rule">
|
||||
<div class="rule-number">1</div>
|
||||
<div class="rule-content">
|
||||
<h3>One off-site (remote) copy</h3>
|
||||
<p>Keep at least one copy in a different physical place. That protects against local disasters: a fire, a flood, a burglary or even a lightning strike cannot put all your data at risk.</p>
|
||||
<div class="example-box">
|
||||
<div class="label">Example</div>
|
||||
<p>The backup is copied on its own to a friend's or relative's server, or goes encrypted into the cloud.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="backup-diagram">
|
||||
<h3>What it looks like in practice</h3>
|
||||
<div class="diagram-visual">
|
||||
<div class="diagram-node primary">
|
||||
<div class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></div>
|
||||
<div class="label">Server</div>
|
||||
<div class="sublabel">Original data</div>
|
||||
</div>
|
||||
<div class="diagram-arrow">→</div>
|
||||
<div class="diagram-node">
|
||||
<div class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-hard-drive"/></svg></div>
|
||||
<div class="label">Local backup</div>
|
||||
<div class="sublabel">External HDD/NAS</div>
|
||||
</div>
|
||||
<div class="diagram-arrow">→</div>
|
||||
<div class="diagram-node">
|
||||
<div class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></div>
|
||||
<div class="label">Off-site backup</div>
|
||||
<div class="sublabel">Remote place</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Offsite megoldások -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Off-site <span>backup options</span></h2>
|
||||
<p>The "1" in the 3-2-1 rule – the most important, and often the most neglected</p>
|
||||
</div>
|
||||
|
||||
<div class="methods-grid">
|
||||
<div class="method-card">
|
||||
<div class="method-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-users"/></svg></div>
|
||||
<h3>The "buddy system"</h3>
|
||||
<p>The simplest and cheapest option: swap backups with someone you trust. You back up to their server, they back up to yours.</p>
|
||||
<ul class="method-pros">
|
||||
<li>No monthly fee</li>
|
||||
<li>Full control over the data</li>
|
||||
<li>Safety for both of you</li>
|
||||
<li>End-to-end encryption is possible</li>
|
||||
</ul>
|
||||
<div class="example-box">
|
||||
<div class="label">How does it work?</div>
|
||||
<p>Encrypted backups sync on their own over a VPN connection.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="method-card">
|
||||
<div class="method-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-building-2"/></svg></div>
|
||||
<h3>Home ↔ Office</h3>
|
||||
<p>If you have a workplace or your own office, use it! Two sites give you natural distance.</p>
|
||||
<ul class="method-pros">
|
||||
<li>Uses what is already there</li>
|
||||
<li>A safe, familiar place</li>
|
||||
<li>Quick to recover from when needed</li>
|
||||
</ul>
|
||||
<div class="example-box">
|
||||
<div class="label">Tip</div>
|
||||
<p>A small, quiet mini PC in a corner of the office can be a perfect backup target.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="method-card">
|
||||
<div class="method-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-cloud"/></svg></div>
|
||||
<h3>Encrypted cloud backup</h3>
|
||||
<p>If there is no trusted friend or second site, the cloud is the answer. Important: the data is encrypted before it is uploaded!</p>
|
||||
<ul class="method-pros">
|
||||
<li>Professional infrastructure</li>
|
||||
<li>Storage spread across places</li>
|
||||
<li>No hardware needed</li>
|
||||
</ul>
|
||||
<ul class="method-pros method-cons">
|
||||
<li>A monthly or yearly fee (depending on how much is stored)</li>
|
||||
</ul>
|
||||
<div class="example-box">
|
||||
<div class="label">Note</div>
|
||||
<p>The storage fee depends on how much data is backed up. This is the option a Felhom box uses.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Mi hogyan csináljuk -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>How <span>we do it</span></h2>
|
||||
<p>Backups are set up by default on every server we install</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-wrench"/></svg> Automatic backups</h3>
|
||||
<p>Every night the server makes backups by itself, on three levels: <strong>on the box</strong>, on a <strong>second drive</strong> (if there is one), and <strong>encrypted on remote storage</strong>. You do not have to remember anything – the system takes care of it.</p>
|
||||
<p>The backups are incremental: only the changes are saved. That saves space and time, and a full restore is still there when you need it.</p>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg> <strong>Not only the data:</strong> thanks to the Proxmox base, not only your files and databases are backed up but your <strong>whole system</strong> too – the whole box goes into a backup, and it can be restored from it. If the box itself breaks, your apps' data can be brought back from the encrypted remote backup onto the reinstalled system – with the recovery code.</p>
|
||||
</div>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>Where the remote backup goes:</strong> on a Felhom box the remote copy goes, encrypted, to storage we provide. The "buddy system" and the office are general options for the 3-2-1 rule – we do not set them up today.</p>
|
||||
</div>
|
||||
|
||||
<h3 style="margin-top: 24px;"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg> The recovery code – only you know it</h3>
|
||||
<p>Your remote backup is encrypted, and the key to the encryption is a <strong>recovery code</strong>. The code appears exactly once: on your screen, when it is set up. We keep no copy of it.</p>
|
||||
<p>This is a deliberate choice, and it has two sides. One: <strong>nobody</strong> but you can read your remote backup – not even us. The other: if the box is destroyed and the code is lost too, then <strong>we cannot restore</strong> the remote backup either. So the code goes on paper, and somewhere safe.</p>
|
||||
|
||||
<h3 style="margin-top: 24px;"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg> Monitoring and notifications</h3>
|
||||
<p>We watch the backups all the time. If there is a problem – a failed backup, storage filling up, a connection fault – it shows up in our monitoring, and an e-mail goes out about it. One aim of the closed test is to polish these notifications in real use.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="cta-section">
|
||||
<div class="container">
|
||||
<h2>A question about <span>backups?</span></h2>
|
||||
<p>Let's talk about what is best in your situation. We help you find the balance between safety and cost.</p>
|
||||
<a href="/en/contact" class="cta-button">Get in touch →</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Close menu');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Open menu');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,655 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Contact — ask for a personal offer for your home server | Felhom.eu</title>
|
||||
<meta name="description" content="Write to us and we will make a personal offer for your home server in Hungary. A question? We help! E-mail: info@felhom.eu">
|
||||
|
||||
<meta name="keywords" content="contact, request an offer, home server offer, Felhom contact">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/en/contact">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/kapcsolat">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/contact">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/kapcsolat">
|
||||
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://felhom.eu/en/contact">
|
||||
<meta property="og:title" content="Contact — Felhom.eu">
|
||||
<meta property="og:description" content="Write to us and we will make a personal offer for your home server.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Contact — Felhom.eu">
|
||||
<meta name="twitter:description" content="A question? Write to us: info@felhom.eu">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-kapcsolat">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/en/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menu">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/en/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/en/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Home</a></li>
|
||||
<li><a href="/preview/m3/en/#services"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Services</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Applications<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/en/apps">All applications</a></li>
|
||||
<li><a href="/preview/m3/en/apps#files-office">Files & Office</a></li>
|
||||
<li><a href="/preview/m3/en/apps#media-entertainment">Media & Entertainment</a></li>
|
||||
<li><a href="/preview/m3/en/apps#home-lifestyle">Home & Lifestyle</a></li>
|
||||
<li><a href="/preview/m3/en/apps#productivity-knowledge">Productivity & Knowledge</a></li>
|
||||
<li><a href="/preview/m3/en/apps#system-development">System & Development</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/en/technology"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technology</a></li>
|
||||
<li><a href="/preview/m3/en/backups"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Backups</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/en/testing" class="btn btn-outline sidebar-cta">Apply as a tester →</a>
|
||||
<div class="nav-group-label">About Felhom</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/en/#how-it-works">How it works</a></li>
|
||||
<li><a href="/preview/m3/en/faq">FAQ</a></li>
|
||||
<li><a href="/preview/m3/en/contact" class="active">Contact</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/kapcsolat" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/preview/m3/en/contact" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div class="page-header">
|
||||
<h1>Write to <span>us!</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">A question, or want to talk about what you need? Fill in the form and we will answer soon. We answer in English or Hungarian.</p>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<section class="content-section" style="padding-top: 0;">
|
||||
<div class="container">
|
||||
<div class="contact-layout">
|
||||
|
||||
<!-- Form -->
|
||||
<div class="contact-form-card">
|
||||
<div id="formStatus" class="form-status"></div>
|
||||
|
||||
<form id="contactForm" novalidate>
|
||||
<div style="position:absolute;left:-9999px;" aria-hidden="true">
|
||||
<input type="text" name="website" tabindex="-1" autocomplete="off">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="name">Name <span class="required">*</span></label>
|
||||
<input type="text" id="name" name="name" placeholder="Your full name" required>
|
||||
<div class="error-message" id="nameError">Enter your name.</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">E-mail <span class="required">*</span></label>
|
||||
<input type="email" id="email" name="email" placeholder="you@example.com" required>
|
||||
<div class="error-message" id="emailError">Enter a valid e-mail address.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="subject">Subject <span class="required">*</span></label>
|
||||
<select id="subject" name="subject" required>
|
||||
<option value="" disabled selected>Choose a topic...</option>
|
||||
<option value="zart-teszt">Closed test – I want to be a tester</option>
|
||||
<option value="erdeklodes">Interest – I would like to learn about the service</option>
|
||||
<option value="arajanlat">Request a quote – I have specific needs</option>
|
||||
<option value="tamogatas">Support – a question about my existing server</option>
|
||||
<option value="egyeb">Other</option>
|
||||
</select>
|
||||
<div class="error-message" id="subjectError">Choose a topic.</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="message">Message <span class="required">*</span></label>
|
||||
<textarea id="message" name="message" placeholder="Tell us how we can help..." required></textarea>
|
||||
<div class="error-message" id="messageError">Write your message.</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Attach files <span style="color: var(--text-3); font-weight: 400;">(optional)</span></label>
|
||||
<div class="file-upload-zone" id="dropZone">
|
||||
<input type="file" id="fileInput" multiple accept=".pdf,.doc,.docx,.xls,.xlsx,.png,.jpg,.jpeg,.gif,.webp,.txt,.csv,.zip,.7z">
|
||||
<div class="upload-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-paperclip"/></svg></div>
|
||||
<div class="upload-text">
|
||||
<strong>Click here</strong> or drag your files here
|
||||
</div>
|
||||
<div class="upload-hint">PDF, images, documents · max. 20 MB in total</div>
|
||||
</div>
|
||||
<div class="file-list" id="fileList"></div>
|
||||
<div class="file-total-size" id="fileTotalSize"></div>
|
||||
</div>
|
||||
|
||||
<div class="checkbox-group">
|
||||
<input type="checkbox" id="privacy" name="privacy" required>
|
||||
<label for="privacy">
|
||||
I have read the <a href="/adatkezeles" target="_blank" rel="noopener">privacy notice (in Hungarian)</a> and agree that my name, e-mail address, message and attached files are used to answer my enquiry. The message is carried by mail-sending and mailbox providers. I can withdraw this consent at any time at info@felhom.eu.
|
||||
</label>
|
||||
</div>
|
||||
<div class="error-message" id="privacyError" style="margin-top: -16px; margin-bottom: 16px;">Your consent to the use of your details is needed.</div>
|
||||
|
||||
<button type="submit" class="submit-button" id="submitBtn">
|
||||
<span class="btn-text">Send message →</span>
|
||||
<span class="spinner"></span>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<div class="contact-sidebar">
|
||||
<div class="sidebar-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-mail"/></svg></span> E-mail us directly</h3>
|
||||
<p>If you would rather send an e-mail:</p>
|
||||
<a href="mailto:info@felhom.eu" class="direct-email">
|
||||
<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-mail"/></svg> info@felhom.eu
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-clock"/></svg></span> Reply time</h3>
|
||||
<p>We usually answer <strong style="color: var(--blue-bright);">within 24 hours</strong> on working days.</p>
|
||||
<p>If a support question is urgent, say so in the subject.</p>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lightbulb"/></svg></span> How can we help?</h3>
|
||||
<ul class="sidebar-list">
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></span> Advice on a server set-up</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></span> Installing and setting up apps</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg></span> Setting up backups</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></span> Setting up remote access</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-wrench"/></svg></span> Maintaining an existing server</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="content-section alt-bg" id="ki-all-mogotte">
|
||||
<div class="container">
|
||||
<div class="who">
|
||||
<figure class="who-photo">
|
||||
<img src="/assets/operator-portrait.webp" alt="Viktor Nagyfenyvesi, who runs Felhom" width="720" height="900" loading="lazy">
|
||||
</figure>
|
||||
<div class="who-text">
|
||||
<h2>Who is <span>behind it</span></h2>
|
||||
<p><strong>I am Viktor Nagyfenyvesi.</strong> I have designed networks and infrastructure for ten years, I work as a DevOps engineer, and I have run my own server at home for years; the current one has been running for about a year.</p>
|
||||
<p>Felhom started because I could not find this service here. Plenty of people can build their own server, but afterwards someone has to back it up, update it and keep an eye on it. That is the part I take on.</p>
|
||||
<p>If you write, I answer, and I do not promise anything the box cannot do today.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<script>
|
||||
(() => {
|
||||
'use strict';
|
||||
|
||||
// ==============================================
|
||||
// CONFIGURATION
|
||||
// ==============================================
|
||||
const CONFIG = {
|
||||
// TODO: Replace with your actual form backend endpoint.
|
||||
// Options:
|
||||
// 1. Self-hosted: Deploy a small container (e.g. Go/Python) that receives POST and sends via SMTP
|
||||
// 2. Formspree: 'https://formspree.io/f/YOUR_FORM_ID'
|
||||
// 3. Cloudflare Workers: Deploy a worker that forwards to email
|
||||
//
|
||||
// For now, falls back to mailto: if no endpoint is configured.
|
||||
formEndpoint: '/api/contact',
|
||||
|
||||
maxTotalFileSize: 20 * 1024 * 1024, // 20 MB
|
||||
maxSingleFileSize: 10 * 1024 * 1024, // 10 MB per file
|
||||
maxFiles: 5,
|
||||
allowedExtensions: ['pdf','doc','docx','xls','xlsx','png','jpg','jpeg','gif','webp','txt','csv','zip','7z'],
|
||||
};
|
||||
|
||||
// ==============================================
|
||||
// DOM REFS
|
||||
// ==============================================
|
||||
const form = document.getElementById('contactForm');
|
||||
const submitBtn = document.getElementById('submitBtn');
|
||||
const formStatus = document.getElementById('formStatus');
|
||||
const dropZone = document.getElementById('dropZone');
|
||||
const fileInput = document.getElementById('fileInput');
|
||||
const fileListEl = document.getElementById('fileList');
|
||||
const fileTotalSizeEl = document.getElementById('fileTotalSize');
|
||||
|
||||
let attachedFiles = [];
|
||||
|
||||
// Preselect the subject from ?tema= (the closed-test CTA on the landing page
|
||||
// links here as /en/contact?tema=zart-teszt – the same values as the Hungarian page). Unknown values are ignored.
|
||||
(function preselectSubject() {
|
||||
const wanted = new URLSearchParams(window.location.search).get('tema');
|
||||
if (!wanted) return;
|
||||
const select = document.getElementById('subject');
|
||||
if (!select) return;
|
||||
const match = Array.from(select.options).some(o => o.value === wanted);
|
||||
if (match) {
|
||||
select.value = wanted;
|
||||
} else {
|
||||
console.warn('[contact] unknown ?tema= value, ignoring:', wanted);
|
||||
}
|
||||
})();
|
||||
|
||||
// ==============================================
|
||||
// VALIDATION
|
||||
// ==============================================
|
||||
function validateField(field) {
|
||||
const errorEl = document.getElementById(field.id + 'Error');
|
||||
let valid = true;
|
||||
|
||||
if (field.type === 'checkbox') {
|
||||
valid = field.checked;
|
||||
} else if (field.required && !field.value.trim()) {
|
||||
valid = false;
|
||||
} else if (field.type === 'email' && field.value.trim()) {
|
||||
valid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(field.value.trim());
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
field.classList.remove('error');
|
||||
if (errorEl) errorEl.classList.remove('visible');
|
||||
} else {
|
||||
field.classList.add('error');
|
||||
if (errorEl) errorEl.classList.add('visible');
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
function validateForm() {
|
||||
const fields = ['name', 'email', 'subject', 'message', 'privacy'];
|
||||
let allValid = true;
|
||||
|
||||
fields.forEach(id => {
|
||||
const field = document.getElementById(id);
|
||||
if (!validateField(field)) allValid = false;
|
||||
});
|
||||
|
||||
return allValid;
|
||||
}
|
||||
|
||||
// Live validation on blur
|
||||
['name', 'email', 'subject', 'message', 'privacy'].forEach(id => {
|
||||
const el = document.getElementById(id);
|
||||
const event = el.type === 'checkbox' ? 'change' : 'blur';
|
||||
el.addEventListener(event, () => validateField(el));
|
||||
// Clear error on input
|
||||
el.addEventListener('input', () => {
|
||||
if (el.classList.contains('error')) validateField(el);
|
||||
});
|
||||
});
|
||||
|
||||
// ==============================================
|
||||
// FILE HANDLING
|
||||
// ==============================================
|
||||
function formatFileSize(bytes) {
|
||||
if (bytes < 1024) return bytes + ' B';
|
||||
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
|
||||
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
|
||||
}
|
||||
|
||||
function getFileIcon(name) {
|
||||
const ext = name.split('.').pop().toLowerCase();
|
||||
const icons = {
|
||||
pdf: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', doc: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', docx: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', xls: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg>', xlsx: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg>',
|
||||
png: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', jpg: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', jpeg: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', gif: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', webp: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>',
|
||||
txt: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', csv: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg>', zip: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>', '7z': '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>',
|
||||
};
|
||||
return icons[ext] || '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-paperclip"/></svg>';
|
||||
}
|
||||
|
||||
function getTotalFileSize() {
|
||||
return attachedFiles.reduce((sum, f) => sum + f.size, 0);
|
||||
}
|
||||
|
||||
function addFiles(fileArray) {
|
||||
for (const file of fileArray) {
|
||||
// Check extension
|
||||
const ext = file.name.split('.').pop().toLowerCase();
|
||||
if (!CONFIG.allowedExtensions.includes(ext)) {
|
||||
showStatus(`The file type of "${file.name}" is not allowed.`, 'error-state');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check single file size
|
||||
if (file.size > CONFIG.maxSingleFileSize) {
|
||||
showStatus(`"${file.name}" is too large (max. ${formatFileSize(CONFIG.maxSingleFileSize)} per file).`, 'error-state');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check max file count
|
||||
if (attachedFiles.length >= CONFIG.maxFiles) {
|
||||
showStatus(`You can attach at most ${CONFIG.maxFiles} files.`, 'error-state');
|
||||
break;
|
||||
}
|
||||
|
||||
// Check total size
|
||||
if (getTotalFileSize() + file.size > CONFIG.maxTotalFileSize) {
|
||||
showStatus(`The files together are over the ${formatFileSize(CONFIG.maxTotalFileSize)} limit.`, 'error-state');
|
||||
break;
|
||||
}
|
||||
|
||||
// Check duplicate
|
||||
if (attachedFiles.some(f => f.name === file.name && f.size === file.size)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
attachedFiles.push(file);
|
||||
}
|
||||
|
||||
renderFileList();
|
||||
}
|
||||
|
||||
function removeFile(index) {
|
||||
attachedFiles.splice(index, 1);
|
||||
renderFileList();
|
||||
// Reset file input so same file can be re-added
|
||||
fileInput.value = '';
|
||||
}
|
||||
|
||||
function renderFileList() {
|
||||
if (attachedFiles.length === 0) {
|
||||
fileListEl.innerHTML = '';
|
||||
fileTotalSizeEl.textContent = '';
|
||||
return;
|
||||
}
|
||||
|
||||
fileListEl.innerHTML = attachedFiles.map((file, i) => `
|
||||
<div class="file-item">
|
||||
<span class="file-icon">${getFileIcon(file.name)}</span>
|
||||
<div class="file-info">
|
||||
<div class="file-name" title="${file.name}">${file.name}</div>
|
||||
<div class="file-size">${formatFileSize(file.size)}</div>
|
||||
</div>
|
||||
<button type="button" class="file-remove" data-index="${i}" title="Remove">×</button>
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
// Bind remove buttons
|
||||
fileListEl.querySelectorAll('.file-remove').forEach(btn => {
|
||||
btn.addEventListener('click', () => removeFile(parseInt(btn.dataset.index)));
|
||||
});
|
||||
|
||||
// Total size indicator
|
||||
const total = getTotalFileSize();
|
||||
const pct = (total / CONFIG.maxTotalFileSize) * 100;
|
||||
fileTotalSizeEl.textContent = `${formatFileSize(total)} / ${formatFileSize(CONFIG.maxTotalFileSize)}`;
|
||||
fileTotalSizeEl.className = 'file-total-size';
|
||||
if (pct > 90) fileTotalSizeEl.classList.add('error-text');
|
||||
else if (pct > 70) fileTotalSizeEl.classList.add('warning');
|
||||
}
|
||||
|
||||
// File input change
|
||||
fileInput.addEventListener('change', () => {
|
||||
if (fileInput.files.length) {
|
||||
addFiles(Array.from(fileInput.files));
|
||||
fileInput.value = '';
|
||||
}
|
||||
});
|
||||
|
||||
// Drag & drop
|
||||
['dragenter', 'dragover'].forEach(evt => {
|
||||
dropZone.addEventListener(evt, e => {
|
||||
e.preventDefault();
|
||||
dropZone.classList.add('dragover');
|
||||
});
|
||||
});
|
||||
|
||||
['dragleave', 'drop'].forEach(evt => {
|
||||
dropZone.addEventListener(evt, e => {
|
||||
e.preventDefault();
|
||||
dropZone.classList.remove('dragover');
|
||||
});
|
||||
});
|
||||
|
||||
dropZone.addEventListener('drop', e => {
|
||||
if (e.dataTransfer.files.length) {
|
||||
addFiles(Array.from(e.dataTransfer.files));
|
||||
}
|
||||
});
|
||||
|
||||
// ==============================================
|
||||
// STATUS MESSAGES
|
||||
// ==============================================
|
||||
function showStatus(message, type) {
|
||||
formStatus.textContent = message;
|
||||
formStatus.className = 'form-status ' + type;
|
||||
formStatus.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
||||
|
||||
if (type === 'error-state') {
|
||||
setTimeout(() => {
|
||||
formStatus.className = 'form-status';
|
||||
}, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
// ==============================================
|
||||
// FORM SUBMISSION
|
||||
// ==============================================
|
||||
form.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
formStatus.className = 'form-status';
|
||||
|
||||
if (!validateForm()) {
|
||||
// Build specific error message
|
||||
const missing = [];
|
||||
if (!document.getElementById('name').value.trim()) missing.push('name');
|
||||
const emailVal = document.getElementById('email').value.trim();
|
||||
if (!emailVal || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailVal)) missing.push('email');
|
||||
if (!document.getElementById('subject').value) missing.push('subject');
|
||||
if (!document.getElementById('message').value.trim()) missing.push('message');
|
||||
if (!document.getElementById('privacy').checked) missing.push('consent');
|
||||
|
||||
if (missing.length === 1 && missing[0] === 'consent') {
|
||||
showStatus('Tick the consent box to send the form.', 'error-state');
|
||||
} else {
|
||||
showStatus('Fill in every required field.', 'error-state');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
submitBtn.classList.add('loading');
|
||||
submitBtn.disabled = true;
|
||||
|
||||
const formData = {
|
||||
name: document.getElementById('name').value.trim(),
|
||||
email: document.getElementById('email').value.trim(),
|
||||
subject: document.getElementById('subject').value,
|
||||
message: document.getElementById('message').value.trim(),
|
||||
};
|
||||
|
||||
// Subject label mapping
|
||||
const subjectLabels = {
|
||||
'zart-teszt': 'Application – closed test (EN)',
|
||||
erdeklodes: 'Interest (EN)',
|
||||
arajanlat: 'Quote request (EN)',
|
||||
tamogatas: 'Support (EN)',
|
||||
egyeb: 'Other (EN)',
|
||||
};
|
||||
|
||||
try {
|
||||
if (CONFIG.formEndpoint) {
|
||||
// --- Backend submission ---
|
||||
const data = new FormData();
|
||||
data.append('name', formData.name);
|
||||
data.append('email', formData.email);
|
||||
data.append('subject', subjectLabels[formData.subject] || formData.subject);
|
||||
data.append('message', formData.message);
|
||||
|
||||
attachedFiles.forEach(file => {
|
||||
data.append('attachments', file);
|
||||
});
|
||||
|
||||
const response = await fetch(CONFIG.formEndpoint, {
|
||||
method: 'POST',
|
||||
body: data,
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Server error: ${response.status}`);
|
||||
}
|
||||
|
||||
showStatus('Your message has been sent. We will answer soon.', 'success');
|
||||
form.reset();
|
||||
attachedFiles = [];
|
||||
renderFileList();
|
||||
|
||||
} else {
|
||||
// --- Fallback: mailto ---
|
||||
const subjectLine = `[Felhom.eu] ${subjectLabels[formData.subject] || formData.subject}`;
|
||||
const body = [
|
||||
`Name: ${formData.name}`,
|
||||
`Email: ${formData.email}`,
|
||||
``,
|
||||
formData.message,
|
||||
].join('\n');
|
||||
|
||||
const mailtoUrl = `mailto:info@felhom.eu?subject=${encodeURIComponent(subjectLine)}&body=${encodeURIComponent(body)}`;
|
||||
window.location.href = mailtoUrl;
|
||||
|
||||
if (attachedFiles.length > 0) {
|
||||
showStatus('Your e-mail program has opened. Add the attached files to the e-mail by hand: a mailto: link cannot carry attachments.', 'error-state');
|
||||
} else {
|
||||
showStatus('Your e-mail program has opened with your message. Send the e-mail to get in touch.', 'success');
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Form submission error:', err);
|
||||
showStatus(`Something went wrong while sending. Try again, or write to info@felhom.eu directly.`, 'error-state');
|
||||
} finally {
|
||||
submitBtn.classList.remove('loading');
|
||||
submitBtn.disabled = false;
|
||||
}
|
||||
});
|
||||
|
||||
// ==============================================
|
||||
// DEBUG HELPER
|
||||
// ==============================================
|
||||
// Uncomment to test form states:
|
||||
// window.debugForm = {
|
||||
// showSuccess: () => showStatus('Your message has been sent.', 'success'),
|
||||
// showError: () => showStatus('Something went wrong.', 'error-state'),
|
||||
// getFiles: () => console.log(attachedFiles),
|
||||
// getFormData: () => {
|
||||
// const fd = new FormData(form);
|
||||
// for (const [k,v] of fd.entries()) console.log(k, v);
|
||||
// },
|
||||
// };
|
||||
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Close menu');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Open menu');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,203 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Download — the Felhom installer | Felhom.eu</title>
|
||||
<meta name="description" content="The Felhom home server installer: download, checksum, and what to check before you install.">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/en/download">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/letoltes">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/download">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/letoltes">
|
||||
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://felhom.eu/en/download">
|
||||
<meta property="og:title" content="Download the Felhom installer">
|
||||
<meta property="og:description" content="Download, checksum, and what to check before you install.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Download the Felhom installer">
|
||||
<meta name="twitter:description" content="Download, checksum, and what to check before you install.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-letoltes">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/en/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menu">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/en/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/en/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Home</a></li>
|
||||
<li><a href="/preview/m3/en/#services"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Services</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Applications<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/en/apps">All applications</a></li>
|
||||
<li><a href="/preview/m3/en/apps#files-office">Files & Office</a></li>
|
||||
<li><a href="/preview/m3/en/apps#media-entertainment">Media & Entertainment</a></li>
|
||||
<li><a href="/preview/m3/en/apps#home-lifestyle">Home & Lifestyle</a></li>
|
||||
<li><a href="/preview/m3/en/apps#productivity-knowledge">Productivity & Knowledge</a></li>
|
||||
<li><a href="/preview/m3/en/apps#system-development">System & Development</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/en/technology"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technology</a></li>
|
||||
<li><a href="/preview/m3/en/backups"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Backups</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/en/testing" class="btn btn-outline sidebar-cta">Apply as a tester →</a>
|
||||
<div class="nav-group-label">About Felhom</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/en/#how-it-works">How it works</a></li>
|
||||
<li><a href="/preview/m3/en/faq">FAQ</a></li>
|
||||
<li><a href="/preview/m3/en/contact">Contact</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/letoltes" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/preview/m3/en/download" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>The Felhom <span>installer</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">This page is for someone who has received an installation guide from their operator. The installer turns a whole machine into a Felhom server.</p>
|
||||
|
||||
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-triangle-alert"/></svg> Before you download</h3>
|
||||
<p>Installing <strong>erases every piece of data</strong> on the disk you select. The installer never chooses for you: it lists the disks with their size and type, and overwrites the one you pick.</p>
|
||||
<p>Unplug the external drive you use for backups before you start. If you are not certain which disk is the right one, <strong>stop and call your operator</strong>.</p>
|
||||
<p>The guide from your operator describes every step, screen by screen. Do not start without it.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Download</h2>
|
||||
<p>Felhom installer 1.29.0 (based on Proxmox VE 9.2)</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<p><a href="https://iso.felhom.eu/felhom-installer-1.29.0-pve9.2-1.iso"><strong>felhom-installer-1.29.0-pve9.2-1.iso</strong></a> – 1.6 GB (1,705,324,544 bytes)</p>
|
||||
<p>Checksum (SHA-256):</p>
|
||||
<div class="highlight-box">
|
||||
<p><code>dceacae5da247d76cad065bf6c0d3bbefac8d8a5f8e571db2fd8449a97e94829</code></p>
|
||||
</div>
|
||||
<p>The same checksum as a file: <a href="https://iso.felhom.eu/felhom-installer-1.29.0-pve9.2-1.iso.sha256">felhom-installer-1.29.0-pve9.2-1.iso.sha256</a></p>
|
||||
<p>To check it on Linux or macOS: <code>sha256sum felhom-installer-1.29.0-pve9.2-1.iso</code>. On Windows, in PowerShell: <code>Get-FileHash felhom-installer-1.29.0-pve9.2-1.iso</code>. The string it prints must match the one above. If it does not match, do not use the file – download it again.</p>
|
||||
<p>The downloaded file has to be written to a USB stick of at least 4 GB (with Balena Etcher or Rufus, for example). The guide covers that too.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Close menu');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Open menu');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,580 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<meta name="description" content="A home server in your own home in Hungary: photos, documents, media. 58 apps to install, automatic backups on three levels, a dashboard in English or Hungarian. A closed test is starting now.">
|
||||
<title>Felhom.eu — Your own cloud, your own rules | A home server service in Hungary</title>
|
||||
|
||||
<!-- SEO meta -->
|
||||
<meta name="keywords" content="home server, own cloud, self-hosting, Google Drive alternative, iCloud alternative, privacy, open source, server installation, server management, Nextcloud, Immich, Hungary">
|
||||
<meta name="author" content="Felhom.eu">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/en/">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/">
|
||||
|
||||
<!-- Open Graph (Facebook, LinkedIn) -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://felhom.eu/en/">
|
||||
<meta property="og:title" content="Felhom.eu — Your own cloud, your own rules">
|
||||
<meta property="og:description" content="A home server in your own home in Hungary: photos, documents, media — with automatic backups and a recovery code only you know. A closed test is starting now.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="Felhom.eu — Your own cloud, your own rules. Closed test starting.">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<!-- Twitter/X Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Felhom.eu — Your own cloud, your own rules">
|
||||
<meta name="twitter:description" content="A home server in your own home in Hungary: photos, documents, media — with automatic backups and a recovery code only you know.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
|
||||
<!-- Structured Data (JSON-LD) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "LocalBusiness",
|
||||
"name": "Felhom.eu",
|
||||
"description": "Professional home server installation and management in Hungary.",
|
||||
"url": "https://felhom.eu",
|
||||
"logo": "https://felhom.eu/assets/logo.png",
|
||||
"email": "info@felhom.eu",
|
||||
"areaServed": {
|
||||
"@type": "Country",
|
||||
"name": "Hungary"
|
||||
},
|
||||
"serviceType": ["Server installation", "Server management", "Self-hosting"],
|
||||
"knowsLanguage": ["hu", "en"],
|
||||
"sameAs": []
|
||||
}
|
||||
</script>
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="/assets/gallery.js?v=2"></script>
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-index">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/en/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menu">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/en/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/en/" class="active"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Home</a></li>
|
||||
<li><a href="/preview/m3/en/#services"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Services</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Applications<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/en/apps">All applications</a></li>
|
||||
<li><a href="/preview/m3/en/apps#files-office">Files & Office</a></li>
|
||||
<li><a href="/preview/m3/en/apps#media-entertainment">Media & Entertainment</a></li>
|
||||
<li><a href="/preview/m3/en/apps#home-lifestyle">Home & Lifestyle</a></li>
|
||||
<li><a href="/preview/m3/en/apps#productivity-knowledge">Productivity & Knowledge</a></li>
|
||||
<li><a href="/preview/m3/en/apps#system-development">System & Development</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/en/technology"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technology</a></li>
|
||||
<li><a href="/preview/m3/en/backups"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Backups</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/en/testing" class="btn btn-outline sidebar-cta">Apply as a tester →</a>
|
||||
<div class="nav-group-label">About Felhom</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/en/#how-it-works">How it works</a></li>
|
||||
<li><a href="/preview/m3/en/faq">FAQ</a></li>
|
||||
<li><a href="/preview/m3/en/contact">Contact</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/preview/m3/en/" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main class="content">
|
||||
|
||||
|
||||
<section class="hero">
|
||||
<div class="container">
|
||||
<div class="hero-content">
|
||||
<div class="hero-text">
|
||||
<h1>Your own cloud,<br><span>your own rules</span></h1>
|
||||
<p>Professional home server installation and management, for households in Hungary. You are in charge; we help.</p>
|
||||
<a href="/en/testing" class="cta-button">I want to be a tester →</a>
|
||||
</div>
|
||||
<div class="hero-visual">
|
||||
<img src="/assets/logo.png" alt="Felhom.eu - home server service">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section" id="what-it-does">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>What the box <span>does today</span></h2>
|
||||
<p>Not a plan, not a promise – these work today on a live Felhom box</p>
|
||||
</div>
|
||||
<div class="why-grid">
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-camera"/></svg> Photos, documents, media</h3>
|
||||
<p>Your phone's photos upload to your own machine on their own. Your scanned papers are read and made searchable. Your films and music play in the browser and in mobile apps.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-folder"/></svg> Network shares</h3>
|
||||
<p>The box's folders appear in Windows File Explorer and the Mac Finder – you drag files onto them like onto any other folder. Each share can be set to read-only.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg> Automatic backups on three levels</h3>
|
||||
<p>Every night the box makes a backup on the box, a second copy on a second drive (if there is one), and an encrypted copy on remote storage. Your shared folders are in the second-drive copy and in the remote copy too.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg> A recovery code only you know</h3>
|
||||
<p>The key to your remote backup's encryption is a recovery code that appears exactly once – on your screen. We do not know it and cannot recreate it. That also means that without the code, we cannot read the remote backup either: keep it somewhere safe.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg> 58 apps to install</h3>
|
||||
<p>You install them from the Dashboard in a few clicks – no command line. Almost all of them are open source (the exceptions are marked on the apps page), and every one runs on your machine.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-stethoscope"/></svg> Remote monitoring, automatic updates</h3>
|
||||
<p>We watch how the box is doing. The Dashboard updates itself to the latest release, and the box's system gets its security updates too – you do not have to do anything. If something breaks, we see it.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg> Careful app updates</h3>
|
||||
<p>A new version of an app reaches you only after we have tried it. Before the update the box makes a fresh backup, and if the new version does not start properly, the box puts the previous one back by itself, with your data.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg> In English or Hungarian</h3>
|
||||
<p>The Dashboard works in English and in Hungarian. The household picks the language, and the e-mails about the box follow it.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg> Works when the internet is down</h3>
|
||||
<p>The box is in your home. If the internet goes down, you still reach your photos and files on your home network – they do not depend on a faraway provider's permission.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg> Restore when something goes wrong</h3>
|
||||
<p>A deleted file can be brought back from the backup. If the box itself breaks, your apps' data can be brought back from the encrypted remote backup onto the reinstalled system – with the recovery code.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section" id="dashboard">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>What the <span>Dashboard looks like</span></h2>
|
||||
<p>Real pictures from a Felhom box – click one for the full size</p>
|
||||
</div>
|
||||
<div class="dash-grid">
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-start-en.webp" data-gallery="dashboard"><img src="/assets/dashboard-start-en.webp" alt="The Dashboard's Launcher: tiles of the apps installed at home" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>Launcher</strong> – every app you have, one click away.</figcaption>
|
||||
</figure>
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-apps-en.webp" data-gallery="dashboard"><img src="/assets/dashboard-apps-en.webp" alt="The Apps page: cards of installed and installable apps, with their status" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>Apps</strong> – install in a few clicks, and see what runs and what is up to date.</figcaption>
|
||||
</figure>
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-app-en.webp" data-gallery="dashboard"><img src="/assets/dashboard-app-en.webp" alt="An app's own page: what it is for, pictures, and the first steps" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>An app's page</strong> – what it is for, where your files go, and how to start.</figcaption>
|
||||
</figure>
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-backups-en.webp" data-gallery="dashboard"><img src="/assets/dashboard-backups-en.webp" alt="The backups page: each app's database backed up overnight, and checked" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>Backups</strong> – every night each app's database is backed up and checked.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Why not the <span>cloud providers?</span></h2>
|
||||
<p>The big tech companies offer convenient services, but there are some downsides...</p>
|
||||
</div>
|
||||
<div class="problem-grid">
|
||||
<div class="problem-card">
|
||||
<div class="problem-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-coins"/></svg></div>
|
||||
<h3>Costs that never stop</h3>
|
||||
<p>You pay every month for storage and premium features, and the prices only go up.</p>
|
||||
</div>
|
||||
<div class="problem-card">
|
||||
<div class="problem-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-eye"/></svg></div>
|
||||
<h3>Your data, in someone else's hands</h3>
|
||||
<p>Your photos, documents and personal data sit on other people's servers, in other people's hands.</p>
|
||||
</div>
|
||||
<div class="problem-card">
|
||||
<div class="problem-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg></div>
|
||||
<h3>Limited control</h3>
|
||||
<p>You do not decide which services you get, or when they are switched off.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section" id="why">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Why choose <span>your own server?</span></h2>
|
||||
<p>What makes it worth it</p>
|
||||
</div>
|
||||
<div class="why-grid">
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg> Privacy</h3>
|
||||
<p>Your data stays in your home, not on Google's or Microsoft's servers. It goes into the remote backup only encrypted.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-coins"/></svg> A one-off investment</h3>
|
||||
<p>The machine is yours, for good. No storage subscription that gets dearer every year: you pay for the electricity and, if you want it, for the management.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-zap"/></svg> Room to grow</h3>
|
||||
<p>No 15 GB limit. Add space as your needs grow – terabytes, if you need them.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-sliders-horizontal"/></svg> Full control</h3>
|
||||
<p>You decide which services you run. You are the boss, not the provider.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="content-section alt-bg" id="how-it-works">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>How it <span>works</span></h2>
|
||||
<p>Five simple steps from the start to a working system</p>
|
||||
</div>
|
||||
<div class="process-steps">
|
||||
<div class="process-step">
|
||||
<div class="step-number">1</div>
|
||||
<span class="process-connector">→</span>
|
||||
<h3>A first talk</h3>
|
||||
<p>We talk about what you need: which apps, and how much storage.</p>
|
||||
</div>
|
||||
<div class="process-step">
|
||||
<div class="step-number">2</div>
|
||||
<span class="process-connector">→</span>
|
||||
<h3>Choosing the hardware</h3>
|
||||
<p>We help you find the machine with the best value for what you need.</p>
|
||||
</div>
|
||||
<div class="process-step">
|
||||
<div class="step-number">3</div>
|
||||
<span class="process-connector">→</span>
|
||||
<h3>Installation</h3>
|
||||
<p>We install and set up the apps, the backups and the monitoring.</p>
|
||||
</div>
|
||||
<div class="process-step">
|
||||
<div class="step-number">4</div>
|
||||
<span class="process-connector">→</span>
|
||||
<h3>Handover</h3>
|
||||
<p>We show you the system, help you bring over your existing data, and answer all your questions.</p>
|
||||
</div>
|
||||
<div class="process-step">
|
||||
<div class="step-number">5</div>
|
||||
<h3>Running it</h3>
|
||||
<p>We watch the system, update it and check the backups. You just use it.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="content-section" id="services">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>What you get <span>from us</span></h2>
|
||||
<p>Turnkey solutions, done professionally</p>
|
||||
</div>
|
||||
<div class="service-list">
|
||||
<div class="service-item">
|
||||
<span class="service-number">01</span>
|
||||
<div class="service-content">
|
||||
<h3>Buying and setting up the server</h3>
|
||||
<p>We help you choose the right hardware for your needs, and we set everything up.</p>
|
||||
</div>
|
||||
<span class="service-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></span>
|
||||
</div>
|
||||
<div class="service-item">
|
||||
<span class="service-number">02</span>
|
||||
<div class="service-content">
|
||||
<h3>Installing apps</h3>
|
||||
<p>Nextcloud, Plex, Jellyfin, Home Assistant and many more – whatever you want.</p>
|
||||
</div>
|
||||
<span class="service-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></span>
|
||||
</div>
|
||||
<div class="service-item">
|
||||
<span class="service-number">03</span>
|
||||
<div class="service-content">
|
||||
<h3>Safe remote access</h3>
|
||||
<p>Reach your server from anywhere, safely, over an encrypted connection.</p>
|
||||
</div>
|
||||
<span class="service-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></span>
|
||||
</div>
|
||||
<div class="service-item">
|
||||
<span class="service-number">04</span>
|
||||
<div class="service-content">
|
||||
<h3>Automatic backups</h3>
|
||||
<p>Regular, automatic backups on three levels: on the box, on a second drive, and encrypted on remote storage.</p>
|
||||
</div>
|
||||
<span class="service-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-hard-drive"/></svg></span>
|
||||
</div>
|
||||
<div class="service-item">
|
||||
<span class="service-number">05</span>
|
||||
<div class="service-content">
|
||||
<h3>Support and maintenance</h3>
|
||||
<p>If anything goes wrong, we are here. Regular updates, proactive monitoring.</p>
|
||||
</div>
|
||||
<span class="service-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-wrench"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section alt-bg" id="apps">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Apps to <span>install</span></h2>
|
||||
<p>Software you run on your own server, almost all of it open source</p>
|
||||
</div>
|
||||
|
||||
<div class="apps-showcase">
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-folder"/></svg></span>
|
||||
<h3>Files</h3>
|
||||
<p>Nextcloud, FileBrowser, Gokapi, Zipline</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-camera"/></svg></span>
|
||||
<h3>Photos & Media</h3>
|
||||
<p>Immich, Jellyfin, Plex, Audiobookshelf</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-clapperboard"/></svg></span>
|
||||
<h3>Media automation</h3>
|
||||
<p>Sonarr, Radarr, Seerr</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg></span>
|
||||
<h3>Documents</h3>
|
||||
<p>Paperless-ngx, Docmost, BookStack, Outline</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg></span>
|
||||
<h3>Security</h3>
|
||||
<p>Vaultwarden, PrivateBin</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg></span>
|
||||
<h3>Home & Lifestyle</h3>
|
||||
<p>Tandoor, Mealie, Homebox, Actual Budget</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-map"/></svg></span>
|
||||
<h3>Travel & Leisure</h3>
|
||||
<p>AdventureLog, Wanderer, Dawarich, Cal.com</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg></span>
|
||||
<h3>Start pages</h3>
|
||||
<p>Homepage, Glance, Uptime Kuma</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-gamepad-2"/></svg></span>
|
||||
<h3>Games</h3>
|
||||
<p>RoMM, Crafty Controller</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-code"/></svg></span>
|
||||
<h3>For developers</h3>
|
||||
<p>Gitea, Code-Server, OpenGist</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="apps-cta">
|
||||
<p class="apps-count">
|
||||
<strong>58</strong> apps – almost all of them <strong>open source</strong>
|
||||
</p>
|
||||
<a href="/en/apps" class="cta-button-secondary">
|
||||
See all apps →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section" id="technology">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Professional <span>technology</span></h2>
|
||||
<p>Industry-grade tools, at home</p>
|
||||
</div>
|
||||
|
||||
<div class="apps-showcase">
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-container"/></svg></span>
|
||||
<h3>Containers</h3>
|
||||
<p>Each app isolated, on Docker</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-target"/></svg></span>
|
||||
<h3>Dashboard</h3>
|
||||
<p>An interface in English or Hungarian</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg></span>
|
||||
<h3>Proxmox</h3>
|
||||
<p>A stable virtualisation base</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg></span>
|
||||
<h3>Three-level backups</h3>
|
||||
<p>On the box, on a second drive, encrypted far away</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></span>
|
||||
<h3>Network</h3>
|
||||
<p>HTTPS, an encrypted tunnel, no open port</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-hard-drive"/></svg></span>
|
||||
<h3>Storage</h3>
|
||||
<p>SSD + HDD, a second drive for backups</p>
|
||||
</div>
|
||||
<div class="app-category-preview">
|
||||
<span class="cat-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></span>
|
||||
<h3>Hardware</h3>
|
||||
<p>From a mini PC to a rack server</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="apps-cta">
|
||||
<p class="apps-count">
|
||||
Matched to your needs – from the <strong style="color: var(--text-1);">simplest</strong> to the <strong>most serious</strong>
|
||||
</p>
|
||||
<a href="/en/technology" class="cta-button-secondary">
|
||||
More about the technology →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section alt-bg" id="backups">
|
||||
<div class="container">
|
||||
<div class="backup-content">
|
||||
<div class="backup-text">
|
||||
<h2>Your data, <span>kept safe</span></h2>
|
||||
<p>The big cloud providers spend millions so that your data is not lost. Did you know you can get the same from your home server?</p>
|
||||
<p>Following the 3-2-1 backup rule, we build professional-grade data safety – after a disaster there is still an encrypted copy, far from your home.</p>
|
||||
<a href="/en/backups" class="cta-button-secondary">
|
||||
The backup strategy in detail →
|
||||
</a>
|
||||
</div>
|
||||
<div class="backup-visual">
|
||||
<div class="backup-rule-mini">
|
||||
<span class="number">3</span>
|
||||
<div class="rule-text">
|
||||
<h4>Three copies</h4>
|
||||
<p>The original + two backups</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="backup-rule-mini">
|
||||
<span class="number">2</span>
|
||||
<div class="rule-text">
|
||||
<h4>Two kinds of storage</h4>
|
||||
<p>Kept on different devices</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="backup-rule-mini">
|
||||
<span class="number">1</span>
|
||||
<div class="rule-text">
|
||||
<h4>One far away</h4>
|
||||
<p>An off-site backup, to be safe</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section" id="closed-test">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Closed <span>test</span></h2>
|
||||
<p>We are starting to use the system for real with a few households in Hungary</p>
|
||||
</div>
|
||||
<div class="why-grid">
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg> Real use</h3>
|
||||
<p>Not a demo: the box stays with you, and you put your real photos and documents on it. We help with the installation and the move, and then you use it every day.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-message-square"/></svg> Feedback</h3>
|
||||
<p>In return we ask you to tell us what annoys you, what is unclear and what does not work. An "I couldn't find this button" is worth the most to us – it tells us what to fix.</p>
|
||||
</div>
|
||||
<div class="why-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-triangle-alert"/></svg> Known limits</h3>
|
||||
<p>Honestly: the Dashboard has <strong>one shared household password</strong> today; there are no separate accounts for family members yet (each app can have its own users, though). <strong>Streaming to the TV (DLNA)</strong> is not there yet: for now the media library plays in the browser and in mobile apps. And because this is a test, expect to find bugs – that is the point.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="apps-cta">
|
||||
<p class="apps-count">
|
||||
If this interests you, write to us – <strong>it commits you to nothing</strong>, first we just talk
|
||||
</p>
|
||||
<a href="/en/testing" class="cta-button">
|
||||
I want to be a tester →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="contact" id="contact">
|
||||
<div class="container">
|
||||
<div class="contact-box">
|
||||
<h2>Interested? <span>Let's talk!</span></h2>
|
||||
<div class="contact-methods">
|
||||
<a href="/en/contact" class="contact-link"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-message-square"/></svg> Contact form</a>
|
||||
<a href="mailto:info@felhom.eu" class="contact-link"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-mail"/></svg> info@felhom.eu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,549 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Technology — Docker, the Dashboard and Proxmox for a home server | Felhom.eu</title>
|
||||
<meta name="description" content="Industry-grade technology at home, in Hungary: Docker containers, a Dashboard in English or Hungarian, Proxmox virtualisation. HTTPS and an encrypted tunnel — with no open port.">
|
||||
|
||||
<meta name="keywords" content="Docker, dashboard, Proxmox, container, virtualisation, reverse proxy, HTTPS, encrypted tunnel, home server technology">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/en/technology">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/technologiak">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/technology">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/technologiak">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/en/technology">
|
||||
<meta property="og:title" content="Professional technology for a home server">
|
||||
<meta property="og:description" content="Docker, a Dashboard in English or Hungarian, Proxmox — industry-grade tools at home.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Professional technology for a home server">
|
||||
<meta name="twitter:description" content="Docker, a Dashboard in English or Hungarian, Proxmox — industry tools, at home.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image-en.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": "The technology behind a Felhom home server",
|
||||
"description": "Docker containers, a Dashboard in English or Hungarian and Proxmox virtualisation for a home server.",
|
||||
"author": {"@type": "Organization", "name": "Felhom.eu"},
|
||||
"publisher": {"@type": "Organization", "name": "Felhom.eu", "logo": {"@type": "ImageObject", "url": "https://felhom.eu/assets/logo.png"}},
|
||||
"mainEntityOfPage": "https://felhom.eu/en/technology"
|
||||
}
|
||||
</script>
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="/assets/gallery.js?v=2"></script>
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-technologiak">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/en/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menu">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/en/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/en/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Home</a></li>
|
||||
<li><a href="/preview/m3/en/#services"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Services</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Applications<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/en/apps">All applications</a></li>
|
||||
<li><a href="/preview/m3/en/apps#files-office">Files & Office</a></li>
|
||||
<li><a href="/preview/m3/en/apps#media-entertainment">Media & Entertainment</a></li>
|
||||
<li><a href="/preview/m3/en/apps#home-lifestyle">Home & Lifestyle</a></li>
|
||||
<li><a href="/preview/m3/en/apps#productivity-knowledge">Productivity & Knowledge</a></li>
|
||||
<li><a href="/preview/m3/en/apps#system-development">System & Development</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/en/technology" class="active"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technology</a></li>
|
||||
<li><a href="/preview/m3/en/backups"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Backups</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/en/testing" class="btn btn-outline sidebar-cta">Apply as a tester →</a>
|
||||
<div class="nav-group-label">About Felhom</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/en/#how-it-works">How it works</a></li>
|
||||
<li><a href="/preview/m3/en/faq">FAQ</a></li>
|
||||
<li><a href="/preview/m3/en/contact">Contact</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/technologiak" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/preview/m3/en/technology" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>The <span>technology</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">Modern, proven tools for running a home server. This is how we build the system.</p>
|
||||
|
||||
|
||||
<!-- Table of Contents -->
|
||||
<section class="content-section" style="padding-top: 0;">
|
||||
<div class="container">
|
||||
<div class="toc-nav">
|
||||
<h3>Contents</h3>
|
||||
<ul class="toc-links">
|
||||
<li><a href="#containers">Why containers?</a></li>
|
||||
<li><a href="#dashboard">The control layer (Dashboard)</a></li>
|
||||
<li><a href="#proxmox">Virtualisation (Proxmox)</a></li>
|
||||
<li><a href="#network">Network and security</a></li>
|
||||
<li><a href="#storage">Storage</a></li>
|
||||
<li><a href="#hardware">Hardware set-ups</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Miért konténerek? -->
|
||||
<section class="content-section alt-bg" id="containers">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Why <span>containers?</span></h2>
|
||||
<p>The cornerstone of running a modern server</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></span> What is a container?</h3>
|
||||
<p>Imagine that every app runs in its own sealed "box". The box holds the app and everything it depends on – so it works the same way anywhere, on any server.</p>
|
||||
<p>Containers (Docker) changed how servers are run: simpler installs, easier updates, and more reliable operation.</p>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>An analogy:</strong> as if every app lived in its own flat in a block of flats. It has its own front door and its own meters, and it does not bother the neighbours – but they still share one building.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="comparison-grid">
|
||||
<div class="comparison-card">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></div>
|
||||
<h3>Traditional install</h3>
|
||||
<div class="subtitle">"Straight onto the system"</div>
|
||||
<p>The apps are installed straight onto the operating system. They can clash with each other, and they are hard to remove.</p>
|
||||
<ul class="feature-list cons">
|
||||
<li>Dependencies can get tangled</li>
|
||||
<li>Hard to reproduce on another server</li>
|
||||
<li>Update = risk</li>
|
||||
<li>Removing an app leaves "rubbish" behind</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="comparison-card recommended">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-container"/></svg></div>
|
||||
<h3>Container install</h3>
|
||||
<div class="subtitle">Docker</div>
|
||||
<p>Every app runs on its own. A clean, tidy system that is easy to manage.</p>
|
||||
<ul class="feature-list">
|
||||
<li>Fully isolated apps</li>
|
||||
<li>One command = installed</li>
|
||||
<li>Simple updates, and a simple way back</li>
|
||||
<li>Reproducible anywhere</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Single Node - vezérlőpult -->
|
||||
<section class="content-section" id="dashboard">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>The control layer: <span>the Dashboard</span></h2>
|
||||
<p>The interface of every Felhom box, in English or Hungarian</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-target"/></svg></span> What does the Dashboard do?</h3>
|
||||
<p>The Dashboard is on every Felhom box: it is the interface, in English or Hungarian, that runs your system on its Proxmox base. It was designed for home servers: you install apps in a few clicks and never touch a command line – Docker and Proxmox do the work in the background.</p>
|
||||
|
||||
<ul class="feature-list">
|
||||
<li>A web interface in English or Hungarian – the household chooses, and no command-line knowledge is needed</li>
|
||||
<li>App catalog – 58 apps to install in a few clicks</li>
|
||||
<li>Resource view – memory and storage use as it happens</li>
|
||||
<li>Automatic backups – databases and files, with their status watched</li>
|
||||
<li>App updates – only versions we have tried, a fresh backup first, and if the new version does not start, the box goes back to the previous one by itself</li>
|
||||
<li>System monitoring – health watched all the time, with alerts</li>
|
||||
</ul>
|
||||
|
||||
<div class="dash-grid">
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-apps-en.webp" data-gallery="dashboard"><img src="/assets/dashboard-apps-en.webp" alt="The Apps page: cards of installed and installable apps, with their status" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>Apps</strong> – install in a few clicks, and see what runs and what is up to date.</figcaption>
|
||||
</figure>
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-backups-en.webp" data-gallery="dashboard"><img src="/assets/dashboard-backups-en.webp" alt="The backups page: each app's database backed up overnight, and checked" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>Backups</strong> – every night each app's database is backed up and checked.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>Good for:</strong> a home media server, a family cloud, personal projects, a small office.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack-diagram">
|
||||
<h3>How a Felhom box is built</h3>
|
||||
<div class="stack-layers">
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Control + apps</div>
|
||||
<div class="layer-content highlight">
|
||||
<div class="layer-name">Dashboard + Apps</div>
|
||||
<div class="layer-tech">An interface in English or Hungarian · Nextcloud, Jellyfin, Immich…</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Container engine</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">Docker</div>
|
||||
<div class="layer-tech">The apps run in isolated containers</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">System environment</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">Isolated system environment</div>
|
||||
<div class="layer-tech">Your box – a cleanly separated system</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Base layer</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">Proxmox VE</div>
|
||||
<div class="layer-tech">Virtualisation base · backing up the whole box, restoring</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Hardware</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">The server machine</div>
|
||||
<div class="layer-tech">Mini PC, tower or server</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Proxmox -->
|
||||
<section class="content-section alt-bg" id="proxmox">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>The base layer: <span>Proxmox</span></h2>
|
||||
<p>Every Felhom machine is built on this stable base</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg></span> What is Proxmox?</h3>
|
||||
<p>Proxmox VE is a free, professional virtualisation platform – the same kind of technology data centres and companies use. It is the base of every Felhom system: we build every machine on it, and the isolated system environment your apps run in sits on top of it.</p>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg> <strong>The base, not an option:</strong> Proxmox is on every Felhom box. You do not need to know about it or deal with it – it works quietly in the background, and it is what makes your system safe and able to be backed up.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-target"/></svg></span> What does the Proxmox base give you?</h3>
|
||||
|
||||
<ul class="feature-list">
|
||||
<li><strong>A backup before each update</strong> – before an app is updated, a fresh backup is made, and if the new version does not start, the box puts the previous one back by itself</li>
|
||||
<li><strong>The whole system is backed up</strong> – not only your data: the whole box goes into a backup too, and it can be restored from it</li>
|
||||
<li><strong>Clean separation</strong> – the control layer and your apps run well apart, which makes the system more stable and safer</li>
|
||||
<li><strong>A fast, repeatable install</strong> – setting up a new box is quick and predictable, the same way every time</li>
|
||||
</ul>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>One base, one job:</strong> on a Felhom box, Proxmox runs a single isolated system environment – the one your apps work in.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Hálózat -->
|
||||
<section class="content-section alt-bg" id="network">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Network and <span>security</span></h2>
|
||||
<p>How do you reach your server safely, from anywhere?</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg></span> Reverse Proxy</h3>
|
||||
<p>A reverse proxy is a "doorkeeper" that takes incoming requests and passes them to the right app. It also handles the HTTPS encryption.</p>
|
||||
|
||||
<div class="network-flow">
|
||||
<div class="flow-node">
|
||||
<div class="node-icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></div>
|
||||
<div class="node-label">Internet</div>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-node">
|
||||
<div class="node-icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg></div>
|
||||
<div class="node-label">Reverse Proxy</div>
|
||||
<div class="node-tech">Traefik</div>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-node">
|
||||
<div class="node-icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></div>
|
||||
<div class="node-label">App</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ul class="feature-list">
|
||||
<li><strong>Traefik</strong> – every app on its own subdomain, over HTTPS</li>
|
||||
<li><strong>Encrypted tunnel</strong> – the box itself builds the connection outwards, so no port has to be opened at home</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield"/></svg></span> Protection</h3>
|
||||
<ul class="feature-list">
|
||||
<li><strong>No open port</strong> – from outside, the box is reached only through the encrypted tunnel</li>
|
||||
<li><strong>Own sign-in</strong> – every app has its own accounts, and the Dashboard has a password</li>
|
||||
<li><strong>Family gate</strong> – some apps sit behind each family member's own sign-in, so a stranger never even reaches the app</li>
|
||||
<li><strong>Security updates</strong> – the box's system gets them by itself</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Tárolás -->
|
||||
<section class="content-section" id="storage">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Storage and <span>data safety</span></h2>
|
||||
<p>Where and how should you keep your data?</p>
|
||||
</div>
|
||||
|
||||
<div class="comparison-grid">
|
||||
<div class="comparison-card">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-zap"/></svg></div>
|
||||
<h3>SSD (NVMe/SATA)</h3>
|
||||
<div class="subtitle">Fast storage</div>
|
||||
<ul class="feature-list">
|
||||
<li>Operating system</li>
|
||||
<li>Databases</li>
|
||||
<li>Apps</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="comparison-card">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-database"/></svg></div>
|
||||
<h3>HDD</h3>
|
||||
<div class="subtitle">Large capacity</div>
|
||||
<ul class="feature-list">
|
||||
<li>Media library</li>
|
||||
<li>Photo archive</li>
|
||||
<li>Backups</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-card" style="margin-top: 32px;">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg></span> Backups on three levels – how we protect your data</h3>
|
||||
<p>Every night a Felhom box makes a <strong>backup on the box</strong>, a <strong>second copy on a second drive</strong>, and an <strong>encrypted copy on remote storage</strong>. The levels protect together: the local one is fast, and the remote one survives even if the box itself is physically harmed.</p>
|
||||
|
||||
<div class="warning-box">
|
||||
<p><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-triangle-alert"/></svg> <strong>More disks are not a backup on their own!</strong> RAID-like set-ups protect against hardware failure, but not against an accidental delete or ransomware. That is why our backups always sit on a separate level, not in the disks.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Hardver konfigurációk -->
|
||||
<section class="content-section alt-bg" id="hardware">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Hardware <span>set-ups</span></h2>
|
||||
<p>Which machine do you need? A few example set-ups</p>
|
||||
</div>
|
||||
|
||||
<div class="hardware-grid">
|
||||
<div class="hardware-card">
|
||||
<div class="hardware-card-header">
|
||||
<div class="hw-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></div>
|
||||
<h3>Mini PC + NAS</h3>
|
||||
<div class="hw-subtitle">Starter / Home</div>
|
||||
</div>
|
||||
<div class="hardware-card-body">
|
||||
<p>Compact, quiet and energy-saving.</p>
|
||||
<ul class="spec-list">
|
||||
<li><span class="spec-label">CPU</span><span class="spec-value">Intel N100</span></li>
|
||||
<li><span class="spec-label">RAM</span><span class="spec-value">16-32 GB</span></li>
|
||||
<li><span class="spec-label">SSD</span><span class="spec-value">256-512 GB</span></li>
|
||||
<li><span class="spec-label">Power use</span><span class="spec-value">15-35W</span></li>
|
||||
</ul>
|
||||
<div class="price-range">
|
||||
<div class="label">Estimated cost</div>
|
||||
<div class="price">80.000 - 150.000 Ft</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hardware-card">
|
||||
<div class="hardware-card-header">
|
||||
<div class="hw-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-radio-tower"/></svg></div>
|
||||
<h3>Tower server</h3>
|
||||
<div class="hw-subtitle">Advanced / Family</div>
|
||||
</div>
|
||||
<div class="hardware-card-body">
|
||||
<p>More power and more storage.</p>
|
||||
<ul class="spec-list">
|
||||
<li><span class="spec-label">CPU</span><span class="spec-value">Intel i5/i7</span></li>
|
||||
<li><span class="spec-label">RAM</span><span class="spec-value">32-64 GB</span></li>
|
||||
<li><span class="spec-label">Storage</span><span class="spec-value">4-8 TB</span></li>
|
||||
<li><span class="spec-label">Power use</span><span class="spec-value">50-120W</span></li>
|
||||
</ul>
|
||||
<div class="price-range">
|
||||
<div class="label">Estimated cost</div>
|
||||
<div class="price">200.000 - 400.000 Ft</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hardware-card">
|
||||
<div class="hardware-card-header">
|
||||
<div class="hw-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-building-2"/></svg></div>
|
||||
<h3>Rack server</h3>
|
||||
<div class="hw-subtitle">Business / on request</div>
|
||||
</div>
|
||||
<div class="hardware-card-body">
|
||||
<p>Industrial quality, high reliability.</p>
|
||||
<ul class="spec-list">
|
||||
<li><span class="spec-label">CPU</span><span class="spec-value">Xeon / EPYC</span></li>
|
||||
<li><span class="spec-label">RAM</span><span class="spec-value">64-256 GB ECC</span></li>
|
||||
<li><span class="spec-label">Storage</span><span class="spec-value">8-24 bay</span></li>
|
||||
<li><span class="spec-label">Extra</span><span class="spec-value">IPMI, red. PSU</span></li>
|
||||
</ul>
|
||||
<div class="price-range">
|
||||
<div class="label">Estimated cost (used)</div>
|
||||
<div class="price">150.000 - 600.000 Ft</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-card" style="margin-top: 48px;">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lightbulb"/></svg></span> Which one should you choose?</h3>
|
||||
<div class="highlight-box">
|
||||
<p><strong>Our advice:</strong> start small! A good mini PC is enough for most homes, and you can expand it later. A rack server is a business / on-request set-up – a home rarely needs one.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="cta-section">
|
||||
<div class="container">
|
||||
<h2>Not sure which <span>set-up is right for you?</span></h2>
|
||||
<p>Let's talk through what you need, and we will help you find the right set-up.</p>
|
||||
<a href="/en/contact" class="cta-button">Get in touch →</a>
|
||||
<a href="/en/apps" class="cta-button-secondary">Browse the apps →</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Close menu');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Open menu');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,329 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Looking for testers — a home server, free during the test | Felhom.eu</title>
|
||||
<meta name="description" content="We are looking for households in Hungary to try our home server. No fee during the test, we do the setup, and we pay for the domain for two years. Up to 5 households.">
|
||||
<meta name="keywords" content="home server test, tester wanted, own cloud, NAS for home, closed test, self-hosting Hungary">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/en/testing">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/teszteles">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/testing">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/teszteles">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/en/testing">
|
||||
<meta property="og:title" content="Looking for testers — your own cloud at home, free during the test">
|
||||
<meta property="og:description" content="Your photos and documents on your own machine, at home. We do the setup and pay for the domain for two years. Up to 5 households.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Looking for testers — your own cloud at home">
|
||||
<meta name="twitter:description" content="No fee during the test. We do the setup and pay for the domain for two years.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": "Looking for testers for the Felhom closed test",
|
||||
"description": "What you need, what you get, what we ask for, and how to apply to the Felhom closed test.",
|
||||
"author": {"@type": "Organization", "name": "Felhom.eu"},
|
||||
"publisher": {"@type": "Organization", "name": "Felhom.eu", "logo": {"@type": "ImageObject", "url": "https://felhom.eu/assets/logo.png"}},
|
||||
"mainEntityOfPage": "https://felhom.eu/en/testing"
|
||||
}
|
||||
</script>
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-teszteles">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/en/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menu">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/en/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/en/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Home</a></li>
|
||||
<li><a href="/preview/m3/en/#services"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Services</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Applications<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/en/apps">All applications</a></li>
|
||||
<li><a href="/preview/m3/en/apps#files-office">Files & Office</a></li>
|
||||
<li><a href="/preview/m3/en/apps#media-entertainment">Media & Entertainment</a></li>
|
||||
<li><a href="/preview/m3/en/apps#home-lifestyle">Home & Lifestyle</a></li>
|
||||
<li><a href="/preview/m3/en/apps#productivity-knowledge">Productivity & Knowledge</a></li>
|
||||
<li><a href="/preview/m3/en/apps#system-development">System & Development</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/en/technology"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technology</a></li>
|
||||
<li><a href="/preview/m3/en/backups"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Backups</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/en/testing" class="btn btn-outline sidebar-cta">Apply as a tester →</a>
|
||||
<div class="nav-group-label">About Felhom</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/en/#how-it-works">How it works</a></li>
|
||||
<li><a href="/preview/m3/en/faq">FAQ</a></li>
|
||||
<li><a href="/preview/m3/en/contact">Contact</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/teszteles" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/preview/m3/en/testing" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>Become a <span>tester</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">We are starting to run the system for real in a few households. There is no fee during the test, we do the setup, and we pay for the domain. In return we ask you to tell us what does not work.</p>
|
||||
|
||||
|
||||
<!-- Hungary only -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-map"/></svg> The closed test is for households in Hungary</h3>
|
||||
<p>We set the server up in person and support it in Hungarian, so the closed test is open to households in Hungary only. This page describes the same offer as the <a href="/teszteles">Hungarian tester page</a>; the legal texts exist in Hungarian only.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Who it is for -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Who it is <span>for</span></h2>
|
||||
<p>We are not looking for IT people – we are looking for families who will really use it</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg> A household that wants its data back at home</h3>
|
||||
<p>If your photos, your scanned paperwork and your films live with a foreign provider today, and you would rather keep them at home on your own machine – we are looking for you.</p>
|
||||
<p><strong>No IT knowledge is needed.</strong> We set the server up at your home and we operate it. You use it from the browser, like any other site.</p>
|
||||
<div class="highlight-box">
|
||||
<p>What you do need is <strong>patience</strong>. This is a test, not a finished product. You will find faults – that is the point of it.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- What you need -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>What you <span>need</span></h2>
|
||||
<p>Three things – and we pay for the third</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-cpu"/></svg> 1. A machine that can stay on</h3>
|
||||
<!-- source: website/en/faq.html – same answers as the Hungarian FAQ -->
|
||||
<p>The server sits in your home and runs all the time, so it has to be quiet and economical. From the FAQ: most households are well served by a mini PC (for example an Intel N100 with 16-32 GB of RAM) – quiet, economical at 15-35 W, and small enough for the shelf next to the router.</p>
|
||||
<p>An older machine can work too: a former desktop PC can make a good server. During the first conversation we check whether the machine you have is up to the job (enough RAM, storage and reliability). Power draw and noise matter – an old gaming PC works, but it costs considerably more per month than a modern mini PC.</p>
|
||||
<p>If you have no machine, that is not a blocker – we work out what suits you during the first conversation. More detailed configurations are on the <a href="/en/technology">Technology</a> page.</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-radio-tower"/></svg> 2. Home internet</h3>
|
||||
<!-- source: website/en/faq.html – „What internet connection do I need?" -->
|
||||
<p>For use at home, any connection is enough, because the apps run on your own local network rather than over the internet. If you also want to reach your server from elsewhere – from work, or on holiday – then upload speed is what counts: at least 10 Mbps is recommended, and more is better.</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg> 3. A domain – which we pay for</h3>
|
||||
<!-- source: operator ruling D1, 2026-10-10 (CONTEXT.md); documentation/architecture/01-topology-and-trust.md §7 -->
|
||||
<p>Your server and your apps are reached through <strong>your own domain</strong> – never a name under felhom.eu. Your dashboard becomes <code>felhom.your-domain.hu</code>, and every app gets its own subdomain.</p>
|
||||
<div class="highlight-box">
|
||||
<p><strong>The domain is registered in your name, and we pay the fee for two years during the test.</strong> So the domain is yours: when the test ends, or if you leave, <strong>you keep the domain</strong> and carry on paying for it yourself. We do not ask for it back and we do not take it with us.</p>
|
||||
</div>
|
||||
<p>We manage the domain's DNS settings during the test with an access token that <strong>can see that one domain only</strong> – it reaches nothing else.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- What you get -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>What you <span>get</span></h2>
|
||||
<p>The same list as section 3 of the test terms – no more and no less</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<!-- source: documentation/legal/feltetelek-1.0.md §3 (same promises, no new ones) -->
|
||||
<ul>
|
||||
<li>We <strong>set up a home server</strong> at your home and bring it into working order.</li>
|
||||
<li>We <strong>install apps</strong> on it from our catalogue, through the dashboard.</li>
|
||||
<li>The apps are <strong>reachable over the internet</strong> as well.</li>
|
||||
<li>We <strong>watch the server.</strong> If something is wrong, we tell you.</li>
|
||||
<li><strong>Backups are made</strong> at several levels: on the box, and encrypted on remote storage.</li>
|
||||
<li>We <strong>update</strong> the apps and the system, usually at night, in a window you choose.</li>
|
||||
<li>And as above: <strong>we pay for the domain for two years.</strong></li>
|
||||
</ul>
|
||||
<p>What we do <strong>not</strong> promise – we commit to no availability and no response time – is in section 5 of the <a href="/feltetelek">test terms (Hungarian)</a>. It is worth reading before you apply.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- What we ask for -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>What we <span>ask for</span></h2>
|
||||
<p>Not money – neither from you nor to us</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-message-square"/></svg> Tell us what is wrong</h3>
|
||||
<p>This is the only thing we ask in return. What is annoying, what is unclear, what does not work. A "I could not find that button" is worth the most to us – that is how we learn what to fix.</p>
|
||||
|
||||
<h3 style="margin-top: 24px;"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg> Keep a copy of your own</h3>
|
||||
<!-- source: documentation/legal/feltetelek-1.0.md §4 -->
|
||||
<p>From the test terms: <strong>whatever you cannot afford to lose, keep a copy of it yourself as well. Do not let the test be its only home.</strong> Backups are made and we test them, but during a test anything can break.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- How many places -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>How many <span>places</span></h2>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-users"/></svg> Up to 5 households</h3>
|
||||
<!-- source: operator ruling D2, 2026-10-10 (CONTEXT.md) -->
|
||||
<p>The closed test runs with <strong>up to 5 households</strong>. The number is small because one person operates the system, and we want time for every tester. The test is <strong>just starting</strong>, so <strong>all 5 places are open</strong>.</p>
|
||||
<p>If it fills up, we will say so – and tell you when a place opens again.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Apply -->
|
||||
<section class="cta-section">
|
||||
<div class="container">
|
||||
<h2>Interested? <span>Apply</span></h2>
|
||||
<p>Send us a message – it <strong>commits you to nothing</strong>, we just talk first. We go through whether you have a suitable machine, and what you would use it for.</p>
|
||||
<a href="/en/contact?tema=zart-teszt" class="cta-button">Apply as a tester →</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Worth reading -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Worth <span>reading</span></h2>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<ul>
|
||||
<li><a href="/feltetelek">The closed test terms (Hungarian)</a> – what you get, what we do not promise, and how to leave.</li>
|
||||
<li><a href="/adatkezeles">Privacy notice (Hungarian)</a> – what data we handle, for how long, and why.</li>
|
||||
<li><a href="/en/faq">FAQ</a> – the most common questions, from the machine to the backups.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Close menu');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Open menu');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,306 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>A zárt teszt feltételei | Felhom.eu</title>
|
||||
<meta name="description" content="Mit kapsz a Felhom.eu ingyenes zárt tesztjében, mit nem ígérünk, és hogyan tudsz bármikor kiszállni.">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/feltetelek">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/feltetelek">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/feltetelek">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/feltetelek">
|
||||
<meta property="og:title" content="A zárt teszt feltételei — Felhom.eu">
|
||||
<meta property="og:description" content="Mit kapsz a Felhom.eu ingyenes zárt tesztjében, mit nem ígérünk, és hogyan tudsz bármikor kiszállni.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="hu_HU">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-feltetelek">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/feltetelek" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="#" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main class="content">
|
||||
|
||||
|
||||
<header class="page-header">
|
||||
<div class="container">
|
||||
<h1>A zárt teszt feltételei</h1>
|
||||
<p>Rövid és őszinte: mit kapsz, mit nem ígérünk, és hogyan tudsz kiszállni.</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="section">
|
||||
<div class="container legal">
|
||||
|
||||
<p class="legal-version"><strong>Zárt teszt — 1.1 verzió, hatályos: 2026. október 10.</strong></p>
|
||||
|
||||
<h2>1. Ki vagyunk</h2>
|
||||
<!-- source: operator ruling 2026-10-09 (no company yet) -->
|
||||
<p>
|
||||
A Felhomot <strong>Nagyfenyvesi Viktor</strong> magánszemélyként működteti. A Felhom ma még
|
||||
<strong>nem cég</strong>. Elérhetőség: <a href="mailto:info@felhom.eu">info@felhom.eu</a>.
|
||||
</p>
|
||||
|
||||
<h2>2. Mi ez</h2>
|
||||
<p>
|
||||
Ez egy <strong>ingyenes zárt teszt</strong> egy otthoni szerver szolgáltatásról. Néhány magyar
|
||||
háztartással próbáljuk ki, hogy működik-e a gyakorlatban. Nem termék, amit megvettél — egy
|
||||
teszt, amiben részt veszel.
|
||||
</p>
|
||||
|
||||
<h2>3. Mit kapsz a teszt alatt</h2>
|
||||
<!-- source: DRAFT-aszf.md §3, limited to the items the system does today -->
|
||||
<ul>
|
||||
<li>Egy <strong>otthoni szervert beállítunk</strong> nálad, és működőképes állapotba hozzuk.
|
||||
<!-- source: documentation/architecture/01-topology-and-trust.md:182-183 --></li>
|
||||
<li><strong>Alkalmazásokat telepítünk</strong> rá a katalógusunkból, a vezérlőpulton keresztül.
|
||||
<!-- source: documentation/architecture/01-topology-and-trust.md:85 --></li>
|
||||
<li>Az alkalmazások <strong>elérhetők lesznek az interneten</strong> is.
|
||||
<!-- source: documentation/architecture/01-topology-and-trust.md:202-215 --></li>
|
||||
<li><strong>Figyeljük a szervert.</strong> Ha baj van, szólunk.
|
||||
<!-- source: documentation/architecture/05-hub-architecture.md:71-103, :308-318 --></li>
|
||||
<li><strong>Mentés készül</strong> több szinten: a szerveren, és titkosítva egy távoli tárhelyen is.
|
||||
A részleteket az <a href="/adatkezeles">Adatkezelési tájékoztató</a> 7. pontja írja le.
|
||||
<!-- source: documentation/architecture/07-backup-architecture.md:373-379 --></li>
|
||||
<li><strong>Frissítjük</strong> az alkalmazásokat és a rendszert, jellemzően éjszaka, egy általad
|
||||
beállítható időablakban.
|
||||
<!-- source: documentation/architecture/07-backup-architecture.md:420 --></li>
|
||||
</ul>
|
||||
|
||||
<h2>4. A domain</h2>
|
||||
<!-- source: operator ruling D1, 2026-10-10 (CONTEXT.md); documentation/architecture/01-topology-and-trust.md §7 -->
|
||||
<p>
|
||||
A szerveredet és az alkalmazásaidat a <strong>saját domainedről</strong> érjük el, nem egy
|
||||
felhom.eu alatti névről. A vezérlőpultod <code>felhom.a-te-domained.hu</code>, minden alkalmazás
|
||||
pedig egy saját aldomain.
|
||||
</p>
|
||||
<ul>
|
||||
<li><strong>A domain a te nevedre szól.</strong> Nem a mi nevünkre vesszük meg — a tiéd.</li>
|
||||
<li><strong>A díját a teszt alatt mi fizetjük, két évre.</strong></li>
|
||||
<li><strong>Ha a teszt véget ér, vagy ha kiszállsz, a domain nálad marad</strong>, és onnantól
|
||||
te fizeted tovább. Nem kérjük vissza, és nem visszük magunkkal.</li>
|
||||
<li>A domain DNS-beállításait a teszt alatt mi kezeljük, egy olyan hozzáféréssel, ami
|
||||
<strong>kizárólag ezt az egy domaint látja</strong>.</li>
|
||||
</ul>
|
||||
|
||||
<h2>5. Mit nem ígérünk</h2>
|
||||
<p>Ezt fontos elolvasni, mert egy teszt nem ugyanaz, mint egy kész szolgáltatás.</p>
|
||||
<ul>
|
||||
<li><strong>Nincs díj</strong> a teszt alatt — se tőled, se felénk. Árat nem ajánlunk és nem kérünk.</li>
|
||||
<li><strong>Nem ígérünk rendelkezésre állást.</strong> A szerver leállhat, és előfordulhat, hogy nem
|
||||
vesszük észre azonnal.</li>
|
||||
<li><strong>Nem ígérünk válaszidőt.</strong> Igyekszünk gyorsan segíteni, de határidőt nem vállalunk.</li>
|
||||
<li><strong>Nem garantáljuk, hogy minden fájl visszaállítható.</strong> Mentés készül, és teszteljük
|
||||
is, de egy teszt alatt bármi elromolhat.</li>
|
||||
</ul>
|
||||
<p class="legal-callout">
|
||||
<strong>Ezért kérünk valamit:</strong> amit nem veszíthetsz el, abból tarts meg egy saját
|
||||
másolatot magadnál is. Ne a teszt legyen az egyetlen helye.
|
||||
</p>
|
||||
|
||||
<h2>6. Hozzáférünk a szerveredhez</h2>
|
||||
<p>
|
||||
<strong>Rendszergazdai (root) hozzáférésünk van a szerverhez.</strong> Ez kell a frissítésekhez,
|
||||
a mentés ellenőrzéséhez és a hibák javításához. Ezzel a szerveren lévő adatok elérhetők. Csak
|
||||
üzemeltetésre és hibaelhárításra használjuk.
|
||||
</p>
|
||||
<!-- source: documentation/architecture/07-backup-architecture.md:49-52 -->
|
||||
<p>
|
||||
A veszélyes, adatvesztéssel járó műveletekhez a rendszerünk külön aláírást kér, és a szerver
|
||||
maga kezdeményezi a kapcsolatot felénk.
|
||||
</p>
|
||||
<!-- source: documentation/architecture/01-topology-and-trust.md:97-105 (box-initiated control, signed jobs) -->
|
||||
|
||||
<h2>7. A mentésed kulcsa nálad van</h2>
|
||||
<p>
|
||||
A távoli mentésed titkosítva készül. A kulcsát egy <strong>helyreállító kód</strong> zárja, amit
|
||||
csak te ismersz — nálunk nincs meg, és nem tudjuk pótolni. <strong>Ha elveszíted, a távoli
|
||||
mentésed nem nyitható ki.</strong> Tedd el jól.
|
||||
</p>
|
||||
<!-- source: documentation/architecture/07-backup-architecture.md:67-83 -->
|
||||
|
||||
<h2>8. Az alkalmazások nem a mieink</h2>
|
||||
<p>
|
||||
A katalógusunkban mások által írt, nyílt forráskódú programok vannak. Ezeket nem mi adjuk el és
|
||||
nem mi írtuk; mindegyikre a <strong>saját licencfeltételei</strong> vonatkoznak, és azok rád is
|
||||
érvényesek.
|
||||
</p>
|
||||
<!-- source: DRAFT-aszf.md §5.4; documentation/backlog/OPEN-ITEMS.md (R-802 non-OSI licence list) -->
|
||||
|
||||
<h2>9. Az adataid a tieid</h2>
|
||||
<p>
|
||||
A szervereden lévő adatok és alkalmazások a tieid. Nem tartjuk vissza őket: a teszt után is
|
||||
visszaállíthatók a helyreállító kódoddal.
|
||||
</p>
|
||||
<!-- source: documentation/architecture/01-topology-and-trust.md:300-302 ("Never hold data hostage") -->
|
||||
|
||||
<h2>10. Ha ki akarsz szállni</h2>
|
||||
<p>
|
||||
<strong>Bármikor abbahagyhatod</strong>, indoklás nélkül. Írj egy e-mailt az
|
||||
<a href="mailto:info@felhom.eu">info@felhom.eu</a> címre, és leállítjuk.
|
||||
</p>
|
||||
<p>Ami ezután az adataiddal nálunk történik:</p>
|
||||
<ul>
|
||||
<li>a teljes szervermentésed a mentőszerverünkön a törléseddel <strong>törlődik</strong>;</li>
|
||||
<li>ennek nálunk tárolt másolata <strong>legfeljebb 30 napon belül</strong> törlődik — ezt egy
|
||||
naponta futó feladat végzi;
|
||||
<!-- source: MEASURED 2026-10-09 on DooPlex: felhom-ep0-copy-gc.timer active, last run Fri 2026-10-09 08:00 CEST, Result=success, ExecMainStatus=0 --></li>
|
||||
<li>a kiküldött értesítések naplója a törlésed után <strong>1 évig</strong> marad meg, aztán törlődik;</li>
|
||||
<li>a visszaállítások és a szervertörlés naplóját <strong>megőrizzük</strong>, hogy utólag is
|
||||
látható legyen, ki mit tett.</li>
|
||||
</ul>
|
||||
<p>A részletes lista az <a href="/adatkezeles">Adatkezelési tájékoztató</a> 6. és 7. pontjában van.</p>
|
||||
|
||||
<h2>11. Ha változnak a feltételek</h2>
|
||||
<p>
|
||||
Ezek a feltételek változhatnak. Ha lényeges változás lesz, a teszt résztvevőinek
|
||||
<strong>előtte e-mailt küldünk</strong>, és a tetején lévő verziószámot megemeljük.
|
||||
</p>
|
||||
|
||||
<h2>12. Kapcsolat</h2>
|
||||
<p>
|
||||
<a href="mailto:info@felhom.eu">info@felhom.eu</a> — adatkezelés:
|
||||
<a href="/adatkezeles">Adatkezelési tájékoztató</a>.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</main>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,14 +12,14 @@
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/">
|
||||
<link rel="stylesheet" href="/assets/site.css?v=18">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=18">
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-index">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
@@ -27,38 +27,38 @@
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/" class="sidebar-logo-link">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/" class="active"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li><a href="/preview/m3/" class="active"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/gyik">GYIK</a></li>
|
||||
<li><a href="/kapcsolat">Kapcsolat</a></li>
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/preview/m3/en/" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
@@ -294,8 +294,6 @@
|
||||
|
||||
</main>
|
||||
<script>
|
||||
/* The controller's drawer, same behaviour: burger toggles, backdrop and Escape close.
|
||||
The no-js -> js flip in <head> is what arms the off-canvas CSS. */
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
@@ -307,7 +305,6 @@
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
/* collapsible sidebar group, copied from the controller's layout.html */
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
|
||||
@@ -0,0 +1,655 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Kapcsolat — Kérj személyre szabott ajánlatot otthoni szerveredhez | Felhom.eu</title>
|
||||
<meta name="description" content="Írj nekünk és személyre szabott ajánlatot készítünk otthoni szerveredhez. Kérdésed van? Segítünk! Email: info@felhom.eu">
|
||||
|
||||
<meta name="keywords" content="kapcsolat, ajánlatkérés, otthoni szerver ajánlat, Felhom elérhetőség">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/kapcsolat">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/kapcsolat">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/contact">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/kapcsolat">
|
||||
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://felhom.eu/kapcsolat">
|
||||
<meta property="og:title" content="Kapcsolat — Felhom.eu">
|
||||
<meta property="og:description" content="Írj nekünk és személyre szabott ajánlatot készítünk otthoni szerveredhez.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="hu_HU">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Kapcsolat — Felhom.eu">
|
||||
<meta name="twitter:description" content="Kérdésed van? Írj nekünk: info@felhom.eu">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-kapcsolat">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat" class="active">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/kapcsolat" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/preview/m3/en/contact" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div class="page-header">
|
||||
<h1>Írj nekünk <span>bátran!</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">Kérdésed van, vagy szeretnéd megbeszélni az igényeidet? Töltsd ki az űrlapot, és hamarosan válaszolunk.</p>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<section class="content-section" style="padding-top: 0;">
|
||||
<div class="container">
|
||||
<div class="contact-layout">
|
||||
|
||||
<!-- Form -->
|
||||
<div class="contact-form-card">
|
||||
<div id="formStatus" class="form-status"></div>
|
||||
|
||||
<form id="contactForm" novalidate>
|
||||
<div style="position:absolute;left:-9999px;" aria-hidden="true">
|
||||
<input type="text" name="website" tabindex="-1" autocomplete="off">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="name">Név <span class="required">*</span></label>
|
||||
<input type="text" id="name" name="name" placeholder="Teljes neved" required>
|
||||
<div class="error-message" id="nameError">Kérlek, add meg a neved.</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">Email <span class="required">*</span></label>
|
||||
<input type="email" id="email" name="email" placeholder="pelda@email.hu" required>
|
||||
<div class="error-message" id="emailError">Kérlek, adj meg egy érvényes email címet.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="subject">Tárgy <span class="required">*</span></label>
|
||||
<select id="subject" name="subject" required>
|
||||
<option value="" disabled selected>Válassz témát...</option>
|
||||
<option value="zart-teszt">Zárt teszt – jelentkezem tesztelőnek</option>
|
||||
<option value="erdeklodes">Érdeklődés – szeretném megismerni a szolgáltatást</option>
|
||||
<option value="arajanlat">Árajánlat kérés – konkrét igényeim vannak</option>
|
||||
<option value="tamogatas">Támogatás – meglévő szerveremet érintő kérdés</option>
|
||||
<option value="egyeb">Egyéb</option>
|
||||
</select>
|
||||
<div class="error-message" id="subjectError">Kérlek, válassz egy témát.</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="message">Üzenet <span class="required">*</span></label>
|
||||
<textarea id="message" name="message" placeholder="Írd le, miben segíthetünk..." required></textarea>
|
||||
<div class="error-message" id="messageError">Kérlek, írd le az üzeneted.</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Fájl csatolás <span style="color: var(--text-3); font-weight: 400;">(opcionális)</span></label>
|
||||
<div class="file-upload-zone" id="dropZone">
|
||||
<input type="file" id="fileInput" multiple accept=".pdf,.doc,.docx,.xls,.xlsx,.png,.jpg,.jpeg,.gif,.webp,.txt,.csv,.zip,.7z">
|
||||
<div class="upload-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-paperclip"/></svg></div>
|
||||
<div class="upload-text">
|
||||
<strong>Kattints ide</strong> vagy húzd ide a fájlokat
|
||||
</div>
|
||||
<div class="upload-hint">PDF, képek, dokumentumok · Max. 20 MB összesen</div>
|
||||
</div>
|
||||
<div class="file-list" id="fileList"></div>
|
||||
<div class="file-total-size" id="fileTotalSize"></div>
|
||||
</div>
|
||||
|
||||
<div class="checkbox-group">
|
||||
<input type="checkbox" id="privacy" name="privacy" required>
|
||||
<label for="privacy">
|
||||
Elolvastam az <a href="/adatkezeles" target="_blank" rel="noopener">Adatkezelési tájékoztatót</a>, és hozzájárulok, hogy a megadott nevemet, e-mail-címemet, üzenetemet és csatolt fájljaimat a megkeresésem megválaszolására kezeljék. Az üzenetet levélküldő és levelezési szolgáltatók továbbítják. A hozzájárulásomat bármikor visszavonhatom az info@felhom.eu címen.
|
||||
</label>
|
||||
</div>
|
||||
<div class="error-message" id="privacyError" style="margin-top: -16px; margin-bottom: 16px;">Az adatkezelési hozzájárulás szükséges.</div>
|
||||
|
||||
<button type="submit" class="submit-button" id="submitBtn">
|
||||
<span class="btn-text">Üzenet küldése →</span>
|
||||
<span class="spinner"></span>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<div class="contact-sidebar">
|
||||
<div class="sidebar-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-mail"/></svg></span> Közvetlen email</h3>
|
||||
<p>Ha inkább emailben írnál:</p>
|
||||
<a href="mailto:info@felhom.eu" class="direct-email">
|
||||
<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-mail"/></svg> info@felhom.eu
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-clock"/></svg></span> Válaszidő</h3>
|
||||
<p>Általában <strong style="color: var(--blue-bright);">24 órán belül</strong> válaszolunk munkanapokon.</p>
|
||||
<p>Sürgős támogatási kérdés esetén jelezd a tárgyban.</p>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lightbulb"/></svg></span> Miben segíthetünk?</h3>
|
||||
<ul class="sidebar-list">
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></span> Szerver konfiguráció tanácsadás</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></span> Alkalmazás telepítés és beállítás</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg></span> Biztonsági mentés kialakítás</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></span> Távoli elérés beállítása</li>
|
||||
<li><span class="li-icon"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-wrench"/></svg></span> Meglévő szerver karbantartás</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="content-section alt-bg" id="ki-all-mogotte">
|
||||
<div class="container">
|
||||
<div class="who">
|
||||
<figure class="who-photo">
|
||||
<img src="/assets/operator-portrait.webp" alt="Nagyfenyvesi Viktor, a Felhom üzemeltetője" width="720" height="900" loading="lazy">
|
||||
</figure>
|
||||
<div class="who-text">
|
||||
<h2>Ki áll <span>mögötte</span></h2>
|
||||
<p><strong>Nagyfenyvesi Viktor vagyok.</strong> Tíz éve tervezek hálózatokat és infrastruktúrát, ma DevOps mérnökként dolgozom, otthon pedig évek óta megy a saját szerverem; a mostani nagyjából egy éve fut.</p>
|
||||
<p>A Felhom onnan indult, hogy ilyen szolgáltatást itthon nem találtam. Saját szervert sokan meg tudnak építeni, de utána menteni, frissíteni és figyelni is kell valakinek. Ezt a részét vállalom át.</p>
|
||||
<p>Ha írsz, én válaszolok, és nem ígérek olyat, amit a doboz ma nem tud.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<script>
|
||||
(() => {
|
||||
'use strict';
|
||||
|
||||
// ==============================================
|
||||
// CONFIGURATION
|
||||
// ==============================================
|
||||
const CONFIG = {
|
||||
// TODO: Replace with your actual form backend endpoint.
|
||||
// Options:
|
||||
// 1. Self-hosted: Deploy a small container (e.g. Go/Python) that receives POST and sends via SMTP
|
||||
// 2. Formspree: 'https://formspree.io/f/YOUR_FORM_ID'
|
||||
// 3. Cloudflare Workers: Deploy a worker that forwards to email
|
||||
//
|
||||
// For now, falls back to mailto: if no endpoint is configured.
|
||||
formEndpoint: '/api/contact',
|
||||
|
||||
maxTotalFileSize: 20 * 1024 * 1024, // 20 MB
|
||||
maxSingleFileSize: 10 * 1024 * 1024, // 10 MB per file
|
||||
maxFiles: 5,
|
||||
allowedExtensions: ['pdf','doc','docx','xls','xlsx','png','jpg','jpeg','gif','webp','txt','csv','zip','7z'],
|
||||
};
|
||||
|
||||
// ==============================================
|
||||
// DOM REFS
|
||||
// ==============================================
|
||||
const form = document.getElementById('contactForm');
|
||||
const submitBtn = document.getElementById('submitBtn');
|
||||
const formStatus = document.getElementById('formStatus');
|
||||
const dropZone = document.getElementById('dropZone');
|
||||
const fileInput = document.getElementById('fileInput');
|
||||
const fileListEl = document.getElementById('fileList');
|
||||
const fileTotalSizeEl = document.getElementById('fileTotalSize');
|
||||
|
||||
let attachedFiles = [];
|
||||
|
||||
// Preselect the subject from ?tema= (the „Zárt teszt" CTA on the landing page
|
||||
// links here as /kapcsolat?tema=zart-teszt). Unknown values are ignored.
|
||||
(function preselectSubject() {
|
||||
const wanted = new URLSearchParams(window.location.search).get('tema');
|
||||
if (!wanted) return;
|
||||
const select = document.getElementById('subject');
|
||||
if (!select) return;
|
||||
const match = Array.from(select.options).some(o => o.value === wanted);
|
||||
if (match) {
|
||||
select.value = wanted;
|
||||
} else {
|
||||
console.warn('[kapcsolat] unknown ?tema= value, ignoring:', wanted);
|
||||
}
|
||||
})();
|
||||
|
||||
// ==============================================
|
||||
// VALIDATION
|
||||
// ==============================================
|
||||
function validateField(field) {
|
||||
const errorEl = document.getElementById(field.id + 'Error');
|
||||
let valid = true;
|
||||
|
||||
if (field.type === 'checkbox') {
|
||||
valid = field.checked;
|
||||
} else if (field.required && !field.value.trim()) {
|
||||
valid = false;
|
||||
} else if (field.type === 'email' && field.value.trim()) {
|
||||
valid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(field.value.trim());
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
field.classList.remove('error');
|
||||
if (errorEl) errorEl.classList.remove('visible');
|
||||
} else {
|
||||
field.classList.add('error');
|
||||
if (errorEl) errorEl.classList.add('visible');
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
function validateForm() {
|
||||
const fields = ['name', 'email', 'subject', 'message', 'privacy'];
|
||||
let allValid = true;
|
||||
|
||||
fields.forEach(id => {
|
||||
const field = document.getElementById(id);
|
||||
if (!validateField(field)) allValid = false;
|
||||
});
|
||||
|
||||
return allValid;
|
||||
}
|
||||
|
||||
// Live validation on blur
|
||||
['name', 'email', 'subject', 'message', 'privacy'].forEach(id => {
|
||||
const el = document.getElementById(id);
|
||||
const event = el.type === 'checkbox' ? 'change' : 'blur';
|
||||
el.addEventListener(event, () => validateField(el));
|
||||
// Clear error on input
|
||||
el.addEventListener('input', () => {
|
||||
if (el.classList.contains('error')) validateField(el);
|
||||
});
|
||||
});
|
||||
|
||||
// ==============================================
|
||||
// FILE HANDLING
|
||||
// ==============================================
|
||||
function formatFileSize(bytes) {
|
||||
if (bytes < 1024) return bytes + ' B';
|
||||
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
|
||||
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
|
||||
}
|
||||
|
||||
function getFileIcon(name) {
|
||||
const ext = name.split('.').pop().toLowerCase();
|
||||
const icons = {
|
||||
pdf: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', doc: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', docx: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', xls: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg>', xlsx: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg>',
|
||||
png: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', jpg: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', jpeg: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', gif: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>', webp: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-image"/></svg>',
|
||||
txt: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-file-text"/></svg>', csv: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chart-column"/></svg>', zip: '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>', '7z': '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>',
|
||||
};
|
||||
return icons[ext] || '<svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-paperclip"/></svg>';
|
||||
}
|
||||
|
||||
function getTotalFileSize() {
|
||||
return attachedFiles.reduce((sum, f) => sum + f.size, 0);
|
||||
}
|
||||
|
||||
function addFiles(fileArray) {
|
||||
for (const file of fileArray) {
|
||||
// Check extension
|
||||
const ext = file.name.split('.').pop().toLowerCase();
|
||||
if (!CONFIG.allowedExtensions.includes(ext)) {
|
||||
showStatus(`A "${file.name}" fájltípus nem engedélyezett.`, 'error-state');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check single file size
|
||||
if (file.size > CONFIG.maxSingleFileSize) {
|
||||
showStatus(`A "${file.name}" túl nagy (max. ${formatFileSize(CONFIG.maxSingleFileSize)} / fájl).`, 'error-state');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check max file count
|
||||
if (attachedFiles.length >= CONFIG.maxFiles) {
|
||||
showStatus(`Maximum ${CONFIG.maxFiles} fájl csatolható.`, 'error-state');
|
||||
break;
|
||||
}
|
||||
|
||||
// Check total size
|
||||
if (getTotalFileSize() + file.size > CONFIG.maxTotalFileSize) {
|
||||
showStatus(`Összesített fájlméret meghaladja a ${formatFileSize(CONFIG.maxTotalFileSize)} limitet.`, 'error-state');
|
||||
break;
|
||||
}
|
||||
|
||||
// Check duplicate
|
||||
if (attachedFiles.some(f => f.name === file.name && f.size === file.size)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
attachedFiles.push(file);
|
||||
}
|
||||
|
||||
renderFileList();
|
||||
}
|
||||
|
||||
function removeFile(index) {
|
||||
attachedFiles.splice(index, 1);
|
||||
renderFileList();
|
||||
// Reset file input so same file can be re-added
|
||||
fileInput.value = '';
|
||||
}
|
||||
|
||||
function renderFileList() {
|
||||
if (attachedFiles.length === 0) {
|
||||
fileListEl.innerHTML = '';
|
||||
fileTotalSizeEl.textContent = '';
|
||||
return;
|
||||
}
|
||||
|
||||
fileListEl.innerHTML = attachedFiles.map((file, i) => `
|
||||
<div class="file-item">
|
||||
<span class="file-icon">${getFileIcon(file.name)}</span>
|
||||
<div class="file-info">
|
||||
<div class="file-name" title="${file.name}">${file.name}</div>
|
||||
<div class="file-size">${formatFileSize(file.size)}</div>
|
||||
</div>
|
||||
<button type="button" class="file-remove" data-index="${i}" title="Eltávolítás">×</button>
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
// Bind remove buttons
|
||||
fileListEl.querySelectorAll('.file-remove').forEach(btn => {
|
||||
btn.addEventListener('click', () => removeFile(parseInt(btn.dataset.index)));
|
||||
});
|
||||
|
||||
// Total size indicator
|
||||
const total = getTotalFileSize();
|
||||
const pct = (total / CONFIG.maxTotalFileSize) * 100;
|
||||
fileTotalSizeEl.textContent = `${formatFileSize(total)} / ${formatFileSize(CONFIG.maxTotalFileSize)}`;
|
||||
fileTotalSizeEl.className = 'file-total-size';
|
||||
if (pct > 90) fileTotalSizeEl.classList.add('error-text');
|
||||
else if (pct > 70) fileTotalSizeEl.classList.add('warning');
|
||||
}
|
||||
|
||||
// File input change
|
||||
fileInput.addEventListener('change', () => {
|
||||
if (fileInput.files.length) {
|
||||
addFiles(Array.from(fileInput.files));
|
||||
fileInput.value = '';
|
||||
}
|
||||
});
|
||||
|
||||
// Drag & drop
|
||||
['dragenter', 'dragover'].forEach(evt => {
|
||||
dropZone.addEventListener(evt, e => {
|
||||
e.preventDefault();
|
||||
dropZone.classList.add('dragover');
|
||||
});
|
||||
});
|
||||
|
||||
['dragleave', 'drop'].forEach(evt => {
|
||||
dropZone.addEventListener(evt, e => {
|
||||
e.preventDefault();
|
||||
dropZone.classList.remove('dragover');
|
||||
});
|
||||
});
|
||||
|
||||
dropZone.addEventListener('drop', e => {
|
||||
if (e.dataTransfer.files.length) {
|
||||
addFiles(Array.from(e.dataTransfer.files));
|
||||
}
|
||||
});
|
||||
|
||||
// ==============================================
|
||||
// STATUS MESSAGES
|
||||
// ==============================================
|
||||
function showStatus(message, type) {
|
||||
formStatus.textContent = message;
|
||||
formStatus.className = 'form-status ' + type;
|
||||
formStatus.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
||||
|
||||
if (type === 'error-state') {
|
||||
setTimeout(() => {
|
||||
formStatus.className = 'form-status';
|
||||
}, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
// ==============================================
|
||||
// FORM SUBMISSION
|
||||
// ==============================================
|
||||
form.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
formStatus.className = 'form-status';
|
||||
|
||||
if (!validateForm()) {
|
||||
// Build specific error message
|
||||
const missing = [];
|
||||
if (!document.getElementById('name').value.trim()) missing.push('név');
|
||||
const emailVal = document.getElementById('email').value.trim();
|
||||
if (!emailVal || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailVal)) missing.push('email');
|
||||
if (!document.getElementById('subject').value) missing.push('tárgy');
|
||||
if (!document.getElementById('message').value.trim()) missing.push('üzenet');
|
||||
if (!document.getElementById('privacy').checked) missing.push('adatkezelési hozzájárulás');
|
||||
|
||||
if (missing.length === 1 && missing[0] === 'adatkezelési hozzájárulás') {
|
||||
showStatus('Kérlek, fogadd el az adatkezelési hozzájárulást a küldéshez.', 'error-state');
|
||||
} else {
|
||||
showStatus('Kérlek, töltsd ki az összes kötelező mezőt.', 'error-state');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
submitBtn.classList.add('loading');
|
||||
submitBtn.disabled = true;
|
||||
|
||||
const formData = {
|
||||
name: document.getElementById('name').value.trim(),
|
||||
email: document.getElementById('email').value.trim(),
|
||||
subject: document.getElementById('subject').value,
|
||||
message: document.getElementById('message').value.trim(),
|
||||
};
|
||||
|
||||
// Subject label mapping
|
||||
const subjectLabels = {
|
||||
'zart-teszt': 'Jelentkezés – zárt teszt',
|
||||
erdeklodes: 'Érdeklődés',
|
||||
arajanlat: 'Árajánlat kérés',
|
||||
tamogatas: 'Támogatás',
|
||||
egyeb: 'Egyéb',
|
||||
};
|
||||
|
||||
try {
|
||||
if (CONFIG.formEndpoint) {
|
||||
// --- Backend submission ---
|
||||
const data = new FormData();
|
||||
data.append('name', formData.name);
|
||||
data.append('email', formData.email);
|
||||
data.append('subject', subjectLabels[formData.subject] || formData.subject);
|
||||
data.append('message', formData.message);
|
||||
|
||||
attachedFiles.forEach(file => {
|
||||
data.append('attachments', file);
|
||||
});
|
||||
|
||||
const response = await fetch(CONFIG.formEndpoint, {
|
||||
method: 'POST',
|
||||
body: data,
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Szerver hiba: ${response.status}`);
|
||||
}
|
||||
|
||||
showStatus('Üzeneted sikeresen elküldtük! Hamarosan válaszolunk.', 'success');
|
||||
form.reset();
|
||||
attachedFiles = [];
|
||||
renderFileList();
|
||||
|
||||
} else {
|
||||
// --- Fallback: mailto ---
|
||||
const subjectLine = `[Felhom.eu] ${subjectLabels[formData.subject] || formData.subject}`;
|
||||
const body = [
|
||||
`Név: ${formData.name}`,
|
||||
`Email: ${formData.email}`,
|
||||
``,
|
||||
formData.message,
|
||||
].join('\n');
|
||||
|
||||
const mailtoUrl = `mailto:info@felhom.eu?subject=${encodeURIComponent(subjectLine)}&body=${encodeURIComponent(body)}`;
|
||||
window.location.href = mailtoUrl;
|
||||
|
||||
if (attachedFiles.length > 0) {
|
||||
showStatus('Az email kliens megnyílt. A csatolt fájlokat kézzel kell hozzáadnod az emailhez, mert a mailto: link nem támogatja a mellékleteket.', 'error-state');
|
||||
} else {
|
||||
showStatus('Az email kliens megnyílt az üzeneteddel. Küld el az emailt a kapcsolatfelvételhez!', 'success');
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Form submission error:', err);
|
||||
showStatus(`Hiba történt a küldés során. Kérlek, próbáld újra vagy írj közvetlenül az info@felhom.eu címre.`, 'error-state');
|
||||
} finally {
|
||||
submitBtn.classList.remove('loading');
|
||||
submitBtn.disabled = false;
|
||||
}
|
||||
});
|
||||
|
||||
// ==============================================
|
||||
// DEBUG HELPER
|
||||
// ==============================================
|
||||
// Uncomment to test form states:
|
||||
// window.debugForm = {
|
||||
// showSuccess: () => showStatus('Üzeneted sikeresen elküldtük!', 'success'),
|
||||
// showError: () => showStatus('Hiba történt.', 'error-state'),
|
||||
// getFiles: () => console.log(attachedFiles),
|
||||
// getFormData: () => {
|
||||
// const fd = new FormData(form);
|
||||
// for (const [k,v] of fd.entries()) console.log(k, v);
|
||||
// },
|
||||
// };
|
||||
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,203 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Letöltés — a Felhom telepítő | Felhom.eu</title>
|
||||
<meta name="description" content="A Felhom otthoni szerver telepítője: letöltés, ellenőrző összeg, és mire figyelj a telepítés előtt.">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/letoltes">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/letoltes">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/download">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/letoltes">
|
||||
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://felhom.eu/letoltes">
|
||||
<meta property="og:title" content="A Felhom telepítő letöltése">
|
||||
<meta property="og:description" content="Letöltés, ellenőrző összeg, és mire figyelj a telepítés előtt.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="hu_HU">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="A Felhom telepítő letöltése">
|
||||
<meta name="twitter:description" content="Letöltés, ellenőrző összeg, és mire figyelj a telepítés előtt.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-letoltes">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/letoltes" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/preview/m3/en/download" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>A Felhom <span>telepítő</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">Ez az oldal annak szól, aki az üzemeltetőtől telepítési útmutatót kapott. A telepítő egy teljes gépet alakít át Felhom szerverré.</p>
|
||||
|
||||
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-triangle-alert"/></svg> Mielőtt letöltöd</h3>
|
||||
<p>A telepítés <strong>minden adatot töröl</strong> a lemezről, amelyet kiválasztasz. A telepítő soha nem választ helyetted: felsorolja a lemezeket méretükkel és típusukkal, és azt írja felül, amelyiket te kijelölöd.</p>
|
||||
<p>Húzd ki a gépből a mentésre használt külső lemezt, mielőtt elkezded. Ha nem vagy biztos benne, melyik a jó lemez, <strong>állj meg, és hívd az üzemeltetőt</strong>.</p>
|
||||
<p>A lépéseket az üzemeltetőtől kapott útmutató írja le, képernyőről képernyőre. Az útmutató nélkül ne kezdd el.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Letöltés</h2>
|
||||
<p>Felhom telepítő 1.29.0 (Proxmox VE 9.2 alapon)</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<p><a href="https://iso.felhom.eu/felhom-installer-1.29.0-pve9.2-1.iso"><strong>felhom-installer-1.29.0-pve9.2-1.iso</strong></a> – 1,6 GB (1 705 324 544 bájt)</p>
|
||||
<p>Ellenőrző összeg (SHA-256):</p>
|
||||
<div class="highlight-box">
|
||||
<p><code>dceacae5da247d76cad065bf6c0d3bbefac8d8a5f8e571db2fd8449a97e94829</code></p>
|
||||
</div>
|
||||
<p>Ugyanez letölthető fájlként is: <a href="https://iso.felhom.eu/felhom-installer-1.29.0-pve9.2-1.iso.sha256">felhom-installer-1.29.0-pve9.2-1.iso.sha256</a></p>
|
||||
<p>Ellenőrzés Linuxon vagy Macen: <code>sha256sum felhom-installer-1.29.0-pve9.2-1.iso</code>. Windowson PowerShellben: <code>Get-FileHash felhom-installer-1.29.0-pve9.2-1.iso</code>. A kiírt számsornak meg kell egyeznie a fentivel. Ha nem egyezik, ne használd a fájlt, és töltsd le újra.</p>
|
||||
<p>A letöltött fájlt egy legalább 4 GB-os USB kulcsra kell írni (például a Balena Etcher vagy a Rufus programmal). Az útmutató ezt is leírja.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,549 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Technológiák — Docker, vezérlőpult, Proxmox otthoni szerverhez | Felhom.eu</title>
|
||||
<meta name="description" content="Ipari szintű technológiák otthon: Docker konténerek, magyar vagy angol nyelvű vezérlőpult, Proxmox virtualizáció. HTTPS és titkosított alagút — nyitott port nélkül.">
|
||||
|
||||
<meta name="keywords" content="Docker, vezérlőpult, Proxmox, konténer, virtualizáció, reverse proxy, HTTPS, titkosított alagút, otthoni szerver technológia">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/technologiak">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/technologiak">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/technology">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/technologiak">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/technologiak">
|
||||
<meta property="og:title" content="Professzionális technológiák otthoni szerverhez">
|
||||
<meta property="og:description" content="Docker, magyar vagy angol nyelvű vezérlőpult, Proxmox — ipari szintű megoldások otthoni környezetben.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="hu_HU">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Professzionális technológiák otthoni szerverhez">
|
||||
<meta name="twitter:description" content="Docker, magyar vagy angol nyelvű vezérlőpult, Proxmox — ipari megoldások, otthoni környezetben.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": "Alkalmazott technológiák otthoni szerverekhez",
|
||||
"description": "Docker konténerek, magyar vagy angol nyelvű vezérlőpult és Proxmox virtualizáció otthoni szerverre.",
|
||||
"author": {"@type": "Organization", "name": "Felhom.eu"},
|
||||
"publisher": {"@type": "Organization", "name": "Felhom.eu", "logo": {"@type": "ImageObject", "url": "https://felhom.eu/assets/logo.png"}},
|
||||
"mainEntityOfPage": "https://felhom.eu/technologiak"
|
||||
}
|
||||
</script>
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="/assets/gallery.js?v=2"></script>
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-technologiak">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak" class="active"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/technologiak" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/preview/m3/en/technology" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>Alkalmazott <span>Technológiák</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">Modern, bevált megoldások az otthoni szerverek üzemeltetéséhez. Íme, hogyan építjük fel a rendszereket.</p>
|
||||
|
||||
|
||||
<!-- Table of Contents -->
|
||||
<section class="content-section" style="padding-top: 0;">
|
||||
<div class="container">
|
||||
<div class="toc-nav">
|
||||
<h3>Tartalom</h3>
|
||||
<ul class="toc-links">
|
||||
<li><a href="#kontenerek">Miért konténerek?</a></li>
|
||||
<li><a href="#single-node">A kezelőréteg (vezérlőpult)</a></li>
|
||||
<li><a href="#proxmox">Virtualizáció (Proxmox)</a></li>
|
||||
<li><a href="#halozat">Hálózat és biztonság</a></li>
|
||||
<li><a href="#tarolas">Tárolás</a></li>
|
||||
<li><a href="#hardver">Hardver konfigurációk</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Miért konténerek? -->
|
||||
<section class="content-section alt-bg" id="kontenerek">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Miért <span>konténerek?</span></h2>
|
||||
<p>A modern szerverüzemeltetés alapköve</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></span> Mi az a konténer?</h3>
|
||||
<p>Képzeld el, hogy minden alkalmazás egy saját, elszigetelt „dobozban" fut. Ez a doboz tartalmazza az alkalmazást és minden függőségét – így garantáltan ugyanúgy működik bárhol, bármilyen szerveren.</p>
|
||||
<p>A konténerek (Docker) forradalmasították a szerverüzemeltetést: egyszerűbb telepítés, könnyebb frissítés, és megbízhatóbb működés.</p>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>Analógia:</strong> Mintha minden alkalmazás a saját lakásában élne egy társasházban. Van saját bejárata, saját közműórája, és nem zavarja a szomszédokat – de mégis egy épületen osztoznak.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="comparison-grid">
|
||||
<div class="comparison-card">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-monitor"/></svg></div>
|
||||
<h3>Hagyományos telepítés</h3>
|
||||
<div class="subtitle">„Közvetlenül a rendszerre"</div>
|
||||
<p>Az alkalmazások közvetlenül az operációs rendszerre települnek. Ütközhetnek egymással, nehéz eltávolítani őket.</p>
|
||||
<ul class="feature-list cons">
|
||||
<li>Függőségek összeakadhatnak</li>
|
||||
<li>Nehéz reprodukálni más szerveren</li>
|
||||
<li>Frissítés = kockázat</li>
|
||||
<li>Eltávolítás „szemetet" hagy</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="comparison-card recommended">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-container"/></svg></div>
|
||||
<h3>Konténerizált telepítés</h3>
|
||||
<div class="subtitle">Docker</div>
|
||||
<p>Minden alkalmazás elszigetelten fut. Tiszta, rendezett, könnyen kezelhető rendszer.</p>
|
||||
<ul class="feature-list">
|
||||
<li>Teljesen izolált alkalmazások</li>
|
||||
<li>Egy parancs = telepítés</li>
|
||||
<li>Egyszerű frissítés és visszaállás</li>
|
||||
<li>Bárhol reprodukálható</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Single Node - vezérlőpult -->
|
||||
<section class="content-section" id="single-node">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>A kezelőréteg: <span>a vezérlőpult</span></h2>
|
||||
<p>Minden Felhom doboz kezelőfelülete, magyarul vagy angolul</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-target"/></svg></span> Mit csinál a vezérlőpult?</h3>
|
||||
<p>A vezérlőpult minden Felhom dobozon ott van: ez a magyar vagy angol nyelvű kezelőfelület, amely a Proxmox alapra épülő rendszeredet vezérli. Egy kimondottan otthoni szerverekre tervezett felület, ahol pár kattintással telepíthetsz alkalmazásokat, és nem kell parancssorhoz nyúlnod – a háttérben a Docker és a Proxmox dolgozik helyetted.</p>
|
||||
|
||||
<ul class="feature-list">
|
||||
<li>Magyar vagy angol webes felület – a háztartás választ, és nincs szükség parancssor ismeretre</li>
|
||||
<li>Alkalmazás katalógus – 58 app telepíthető pár kattintással</li>
|
||||
<li>Erőforrás figyelés – memória és tárhely használat valós időben</li>
|
||||
<li>Automatikus mentések – adatbázis és fájl backup, állapotfigyeléssel</li>
|
||||
<li>Alkalmazás frissítések – csak kipróbált verzió, előtte friss mentés, és ha az új verzió nem indul, a doboz magától visszaáll az előzőre</li>
|
||||
<li>Rendszer monitoring – folyamatos egészségfigyelés, riasztások</li>
|
||||
</ul>
|
||||
|
||||
<div class="dash-grid">
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-apps-hu.webp" data-gallery="dashboard"><img src="/assets/dashboard-apps-hu.webp" alt="Az Alkalmazások oldal: telepített és telepíthető alkalmazások kártyái, állapottal" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>Alkalmazások</strong> – telepítés pár kattintással, és látod, mi fut és mi naprakész.</figcaption>
|
||||
</figure>
|
||||
<figure class="dash-shot">
|
||||
<a href="/assets/dashboard-backups-hu.webp" data-gallery="dashboard"><img src="/assets/dashboard-backups-hu.webp" alt="A mentések oldala: minden alkalmazás adatbázisának éjszakai mentése, ellenőrizve" width="1440" height="900" loading="lazy"></a>
|
||||
<figcaption><strong>Mentések</strong> – minden éjjel minden alkalmazás adatbázisa mentésre kerül, és ellenőrizzük.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>Tökéletes:</strong> Otthoni média szerver, családi felhő, személyes projektek, kis irodai használat.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack-diagram">
|
||||
<h3>Egy Felhom doboz felépítése</h3>
|
||||
<div class="stack-layers">
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Kezelő + appok</div>
|
||||
<div class="layer-content highlight">
|
||||
<div class="layer-name">Vezérlőpult + Alkalmazások</div>
|
||||
<div class="layer-tech">Magyar vagy angol kezelőfelület · Nextcloud, Jellyfin, Immich…</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Konténer motor</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">Docker</div>
|
||||
<div class="layer-tech">Az appok elszigetelt konténerekben futnak</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Rendszerkörnyezet</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">Izolált rendszerkörnyezet</div>
|
||||
<div class="layer-tech">A te dobozod – tisztán elkülönített rendszer</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Alapréteg</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">Proxmox VE</div>
|
||||
<div class="layer-tech">Virtualizációs alap · a teljes doboz mentése, visszaállítás</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-layer">
|
||||
<div class="layer-label">Hardver</div>
|
||||
<div class="layer-content">
|
||||
<div class="layer-name">A szerver gépe</div>
|
||||
<div class="layer-tech">Mini PC, tower vagy szerver</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Proxmox -->
|
||||
<section class="content-section alt-bg" id="proxmox">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Az alapréteg: <span>Proxmox</span></h2>
|
||||
<p>Erre a stabil alapra építünk minden Felhom gépet</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg></span> Mi az a Proxmox?</h3>
|
||||
<p>A Proxmox VE egy ingyenes, professzionális virtualizációs platform – ugyanaz a fajta technológia, amelyet adatközpontok és cégek használnak. Ez a Felhom rendszerek alapja: erre építünk minden gépet, és erre települ az izolált rendszerkörnyezet, amelyben az alkalmazásaid futnak.</p>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg> <strong>Az alap, nem opció:</strong> A Proxmox minden Felhom dobozon ott van. Nem kell róla tudnod és nem kell vele foglalkoznod – csendben a háttérben dolgozik, és ez teszi a rendszeredet biztonságossá és menthetővé.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-target"/></svg></span> Mit ad neked a Proxmox alap?</h3>
|
||||
|
||||
<ul class="feature-list">
|
||||
<li><strong>Mentés frissítés előtt</strong> – egy alkalmazás frissítése előtt friss mentés készül, és ha az új verzió nem indul el, a doboz magától visszaállítja az előzőt</li>
|
||||
<li><strong>Az egész rendszer menthető</strong> – nem csak az adataid, hanem a teljes dobozod is biztonsági mentésbe kerül, és ebből visszaállítható</li>
|
||||
<li><strong>Tiszta elkülönítés</strong> – a kezelőréteg és az alkalmazásaid erősen elkülönítve futnak, így stabilabb és biztonságosabb a rendszer</li>
|
||||
<li><strong>Gyors, megismételhető telepítés</strong> – egy új doboz beüzemelése gyors és kiszámítható, mindig ugyanúgy</li>
|
||||
</ul>
|
||||
|
||||
<div class="highlight-box">
|
||||
<p><strong>Egy alap, egy feladat:</strong> a Felhom dobozon a Proxmox egyetlen elkülönített rendszerkörnyezetet futtat – azt, amelyben az alkalmazásaid dolgoznak.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Hálózat -->
|
||||
<section class="content-section alt-bg" id="halozat">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Hálózat és <span>biztonság</span></h2>
|
||||
<p>Hogyan éred el a szervered biztonságosan, bárhonnan?</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg></span> Reverse Proxy</h3>
|
||||
<p>A reverse proxy egy „kapus", aki fogadja a beérkező kéréseket és továbbítja a megfelelő alkalmazáshoz. Emellett kezeli a HTTPS titkosítást is.</p>
|
||||
|
||||
<div class="network-flow">
|
||||
<div class="flow-node">
|
||||
<div class="node-icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></div>
|
||||
<div class="node-label">Internet</div>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-node">
|
||||
<div class="node-icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg></div>
|
||||
<div class="node-label">Reverse Proxy</div>
|
||||
<div class="node-tech">Traefik</div>
|
||||
</div>
|
||||
<div class="flow-arrow">→</div>
|
||||
<div class="flow-node">
|
||||
<div class="node-icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></div>
|
||||
<div class="node-label">Alkalmazás</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ul class="feature-list">
|
||||
<li><strong>Traefik</strong> – minden alkalmazás a saját aldomainjén, HTTPS-sel</li>
|
||||
<li><strong>Titkosított alagút</strong> – a doboz maga épít kapcsolatot kifelé, így otthon nem kell portot nyitni</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield"/></svg></span> Védelem</h3>
|
||||
<ul class="feature-list">
|
||||
<li><strong>Nincs nyitott port</strong> – kívülről csak a titkosított alagúton át érhető el a doboz</li>
|
||||
<li><strong>Saját bejelentkezés</strong> – minden alkalmazásnak saját fiókjai vannak, a vezérlőpultnak jelszava</li>
|
||||
<li><strong>Családi kapu</strong> – egyes alkalmazások elé a családtagok saját belépése kerül, idegen el sem jut az alkalmazásig</li>
|
||||
<li><strong>Biztonsági frissítések</strong> – a doboz rendszere magától megkapja őket</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Tárolás -->
|
||||
<section class="content-section" id="tarolas">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Tárolás és <span>adatvédelem</span></h2>
|
||||
<p>Hol és hogyan tárold az adataidat?</p>
|
||||
</div>
|
||||
|
||||
<div class="comparison-grid">
|
||||
<div class="comparison-card">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-zap"/></svg></div>
|
||||
<h3>SSD (NVMe/SATA)</h3>
|
||||
<div class="subtitle">Gyors tárolás</div>
|
||||
<ul class="feature-list">
|
||||
<li>Operációs rendszer</li>
|
||||
<li>Adatbázisok</li>
|
||||
<li>Alkalmazások</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="comparison-card">
|
||||
<div class="card-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-database"/></svg></div>
|
||||
<h3>HDD</h3>
|
||||
<div class="subtitle">Nagy kapacitás</div>
|
||||
<ul class="feature-list">
|
||||
<li>Média könyvtár</li>
|
||||
<li>Fotó archívum</li>
|
||||
<li>Mentések</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-card" style="margin-top: 32px;">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg></span> Háromszintű mentés – így védjük az adataidat</h3>
|
||||
<p>A Felhom dobozon minden éjjel készül egy <strong>mentés a dobozon</strong>, egy <strong>másodpéldány egy második meghajtóra</strong>, és egy <strong>titkosított másolat egy távoli tárhelyre</strong>. A szintek együtt védenek: a helyi gyors, a távoli túléli azt is, ha a doboznak fizikailag baja esik.</p>
|
||||
|
||||
<div class="warning-box">
|
||||
<p><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-triangle-alert"/></svg> <strong>A több lemez önmagában nem mentés!</strong> A RAID-szerű megoldások a hardver meghibásodás ellen védenek, de nem a véletlen törlés vagy a zsarolóvírus ellen. Ezért nálunk a mentés mindig külön szinten van, nem a lemezekben.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Hardver konfigurációk -->
|
||||
<section class="content-section alt-bg" id="hardver">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Hardver <span>konfigurációk</span></h2>
|
||||
<p>Milyen gépre van szükséged? Néhány példa konfiguráció</p>
|
||||
</div>
|
||||
|
||||
<div class="hardware-grid">
|
||||
<div class="hardware-card">
|
||||
<div class="hardware-card-header">
|
||||
<div class="hw-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg></div>
|
||||
<h3>Mini PC + NAS</h3>
|
||||
<div class="hw-subtitle">Kezdő / Otthoni</div>
|
||||
</div>
|
||||
<div class="hardware-card-body">
|
||||
<p>Kompakt, halk, energiatakarékos megoldás.</p>
|
||||
<ul class="spec-list">
|
||||
<li><span class="spec-label">CPU</span><span class="spec-value">Intel N100</span></li>
|
||||
<li><span class="spec-label">RAM</span><span class="spec-value">16-32 GB</span></li>
|
||||
<li><span class="spec-label">SSD</span><span class="spec-value">256-512 GB</span></li>
|
||||
<li><span class="spec-label">Fogyasztás</span><span class="spec-value">15-35W</span></li>
|
||||
</ul>
|
||||
<div class="price-range">
|
||||
<div class="label">Becsült költség</div>
|
||||
<div class="price">80.000 - 150.000 Ft</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hardware-card">
|
||||
<div class="hardware-card-header">
|
||||
<div class="hw-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-radio-tower"/></svg></div>
|
||||
<h3>Tower szerver</h3>
|
||||
<div class="hw-subtitle">Haladó / Családi</div>
|
||||
</div>
|
||||
<div class="hardware-card-body">
|
||||
<p>Nagyobb teljesítmény és tárolókapacitás.</p>
|
||||
<ul class="spec-list">
|
||||
<li><span class="spec-label">CPU</span><span class="spec-value">Intel i5/i7</span></li>
|
||||
<li><span class="spec-label">RAM</span><span class="spec-value">32-64 GB</span></li>
|
||||
<li><span class="spec-label">Tárolás</span><span class="spec-value">4-8 TB</span></li>
|
||||
<li><span class="spec-label">Fogyasztás</span><span class="spec-value">50-120W</span></li>
|
||||
</ul>
|
||||
<div class="price-range">
|
||||
<div class="label">Becsült költség</div>
|
||||
<div class="price">200.000 - 400.000 Ft</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hardware-card">
|
||||
<div class="hardware-card-header">
|
||||
<div class="hw-icon"><svg class="ico-tile" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-building-2"/></svg></div>
|
||||
<h3>Rack szerver</h3>
|
||||
<div class="hw-subtitle">Üzleti / igény szerint</div>
|
||||
</div>
|
||||
<div class="hardware-card-body">
|
||||
<p>Ipari minőség, nagy megbízhatóság.</p>
|
||||
<ul class="spec-list">
|
||||
<li><span class="spec-label">CPU</span><span class="spec-value">Xeon / EPYC</span></li>
|
||||
<li><span class="spec-label">RAM</span><span class="spec-value">64-256 GB ECC</span></li>
|
||||
<li><span class="spec-label">Tárolás</span><span class="spec-value">8-24 bay</span></li>
|
||||
<li><span class="spec-label">Extra</span><span class="spec-value">IPMI, red. PSU</span></li>
|
||||
</ul>
|
||||
<div class="price-range">
|
||||
<div class="label">Becsült költség (használt)</div>
|
||||
<div class="price">150.000 - 600.000 Ft</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-card" style="margin-top: 48px;">
|
||||
<h3><span class="icon"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lightbulb"/></svg></span> Melyiket válaszd?</h3>
|
||||
<div class="highlight-box">
|
||||
<p><strong>Tanácsunk:</strong> Kezdj kicsiben! Egy jó mini PC elegendő a legtöbb otthoni igényhez, és később bővítheted. A rack szerver üzleti / igény szerinti konfiguráció – otthonra ritkán szükséges.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="cta-section">
|
||||
<div class="container">
|
||||
<h2>Nem vagy biztos, melyik <span>megoldás neked való?</span></h2>
|
||||
<p>Beszéljük át az igényeidet, és segítünk megtalálni a tökéletes konfigurációt.</p>
|
||||
<a href="/kapcsolat" class="cta-button">Kapcsolatfelvétel →</a>
|
||||
<a href="/alkalmazasok" class="cta-button-secondary">Alkalmazások böngészése →</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,320 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="hu" class="no-js">
|
||||
<head>
|
||||
<script>document.documentElement.className=document.documentElement.className.replace('no-js','js');</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Tesztelőket keresünk — otthoni szerver, saját felhő ingyen kipróbálva | Felhom.eu</title>
|
||||
<meta name="description" content="Keresünk magyar háztartásokat, akik kipróbálják az otthoni szerverünket. A teszt alatt nincs díj, a beállítást mi végezzük, és a domaint is mi fizetjük két évre. Legfeljebb 5 háztartás.">
|
||||
<meta name="keywords" content="otthoni szerver teszt, tesztelő jelentkezés, saját felhő, NAS otthonra, zárt teszt, otthoni szerver ingyen">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://felhom.eu/teszteles">
|
||||
<link rel="alternate" hreflang="hu" href="https://felhom.eu/teszteles">
|
||||
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/testing">
|
||||
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/teszteles">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://felhom.eu/teszteles">
|
||||
<meta property="og:title" content="Tesztelőket keresünk — saját felhő otthon, a teszt alatt ingyen">
|
||||
<meta property="og:description" content="A fotóid és a dokumentumaid a saját gépeden, nálad. A beállítást mi végezzük, a domaint két évre mi fizetjük. Legfeljebb 5 háztartás.">
|
||||
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
|
||||
<meta property="og:locale" content="hu_HU">
|
||||
<meta property="og:site_name" content="Felhom.eu">
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Tesztelőket keresünk — saját felhő otthon">
|
||||
<meta name="twitter:description" content="A teszt alatt nincs díj. A beállítást mi végezzük, a domaint két évre mi fizetjük.">
|
||||
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": "Tesztelőket keresünk a Felhom zárt tesztjéhez",
|
||||
"description": "Mi kell hozzá, mit kapsz, mit kérünk, és hogyan jelentkezhetsz a Felhom zárt tesztjébe.",
|
||||
"author": {"@type": "Organization", "name": "Felhom.eu"},
|
||||
"publisher": {"@type": "Organization", "name": "Felhom.eu", "logo": {"@type": "ImageObject", "url": "https://felhom.eu/assets/logo.png"}},
|
||||
"mainEntityOfPage": "https://felhom.eu/teszteles"
|
||||
}
|
||||
</script>
|
||||
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
|
||||
<link rel="stylesheet" href="/assets/site.css?v=19">
|
||||
<link rel="stylesheet" href="/assets/shell.css?v=19">
|
||||
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
|
||||
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
|
||||
</head>
|
||||
<body class="shell page-teszteles">
|
||||
<header class="mobile-topbar">
|
||||
<a href="/preview/m3/" class="mobile-topbar-logo"><img src="/assets/logo_notext_white.svg" alt="Felhom.eu"></a>
|
||||
<button type="button" class="nav-burger" id="navBurger" aria-expanded="false" aria-controls="sidebar" aria-label="Menü">
|
||||
<span class="hamburger-box"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></span>
|
||||
</button>
|
||||
</header>
|
||||
<div class="nav-backdrop" id="navBackdrop" hidden></div>
|
||||
<nav class="sidebar" id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<a href="/preview/m3/" class="sidebar-logo-link">
|
||||
<img src="/assets/logo_notext_white.svg" alt="" class="sidebar-logo" aria-hidden="true">
|
||||
<img src="/assets/logo-wordmark.png" alt="felhom.eu" class="sidebar-word">
|
||||
</a>
|
||||
</div>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/preview/m3/"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg>Kezdőlap</a></li>
|
||||
<li><a href="/preview/m3/#szolgaltatasok"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rocket"/></svg>Szolgáltatások</a></li>
|
||||
<li class="nav-group">
|
||||
<button type="button" class="nav-group-toggle" aria-expanded="false" aria-controls="nav-group-apps"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg>Alkalmazások<svg class="ico nav-chevron" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-chevron-down"/></svg></button>
|
||||
<ul id="nav-group-apps" class="nav-links nav-links-sub nav-links-nested">
|
||||
<li><a href="/preview/m3/alkalmazasok">Minden alkalmazás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#fajlkezeles-irodai">Fájlkezelés & Irodai</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#media-szorakozas">Média & Szórakozás</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#otthon-eletmod">Otthon & Életmód</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#produktivitas-tudaskezeles">Produktivitás & Tudáskezelés</a></li>
|
||||
<li><a href="/preview/m3/alkalmazasok#rendszer-fejlesztes">Rendszer & Fejlesztés</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/preview/m3/technologiak"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-layers"/></svg>Technológiák</a></li>
|
||||
<li><a href="/preview/m3/biztonsagimentes"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg>Biztonsági mentés</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-bottom">
|
||||
<a href="/preview/m3/teszteles" class="btn btn-outline sidebar-cta">Jelentkezem tesztelőnek →</a>
|
||||
<div class="nav-group-label">A Felhomról</div>
|
||||
<ul class="nav-links nav-links-sub">
|
||||
<li><a href="/preview/m3/#hogyan-mukodik">Hogyan működik</a></li>
|
||||
<li><a href="/preview/m3/gyik">GYIK</a></li>
|
||||
<li><a href="/preview/m3/kapcsolat">Kapcsolat</a></li>
|
||||
</ul>
|
||||
<div class="sidebar-footer">
|
||||
<details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/preview/m3/teszteles" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/preview/m3/en/testing" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<main class="content">
|
||||
<div class="page-header">
|
||||
<h1>Legyél <span>tesztelő</span></h1>
|
||||
</div>
|
||||
<p class="page-lede">Néhány magyar háztartással most kezdjük el élesben használni a rendszert. A teszt alatt nincs díj, a beállítást mi végezzük, és a domaint is mi fizetjük. Cserébe azt kérjük, mondd el, mi nem jó.</p>
|
||||
|
||||
|
||||
<!-- Kinek szól -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Kinek <span>szól</span></h2>
|
||||
<p>Nem informatikusokat keresünk – családokat, akik tényleg használni fogják</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg> Egy magyar háztartás, aki haza akarja tenni az adatait</h3>
|
||||
<p>Ha a fényképeid, a beszkennelt papírjaid és a filmjeid ma egy külföldi szolgáltatónál vannak, és szeretnéd, hogy inkább nálad, a saját gépeden legyenek – téged keresünk.</p>
|
||||
<p><strong>Informatikai tudás nem kell.</strong> A szervert mi állítjuk be nálad, és mi is üzemeltetjük. Neked a böngészőből kell használnod, úgy, mint bármelyik másik oldalt.</p>
|
||||
<div class="highlight-box">
|
||||
<p>Ami viszont kell: <strong>türelem</strong>. Ez teszt, nem kész termék. Találni fogsz hibát – pont ez a lényege.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Mi kell hozzá -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Mi kell <span>hozzá</span></h2>
|
||||
<p>Három dolog – és a harmadikat mi fizetjük</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-cpu"/></svg> 1. Egy gép, ami bekapcsolva tud maradni</h3>
|
||||
<!-- source: website/gyik.html FAQ „Milyen gépre van szükségem?" (quoted, not invented) -->
|
||||
<p>A szerver a lakásodban áll, és folyamatosan megy – ezért fontos, hogy csendes és takarékos legyen. A GYIK-ből idézve: <em>„A legtöbb otthoni felhasználónak egy mini PC (pl. Intel N100 processzorral, 16-32 GB RAM-mal) tökéletesen megfelel. Ezek csendesek, energiatakarékosak (15-35W fogyasztás), és kompaktak – elfér a polcon a router mellett."</em></p>
|
||||
<!-- source: website/gyik.html FAQ „Használhatom a már meglévő régi gépemet?" (quoted) -->
|
||||
<p>Régi géped is lehet jó: <em>„Sok esetben igen! Egy korábbi asztali PC kiváló szerver lehet. Az egyeztetés során felmérjük, hogy a meglévő géped alkalmas-e a tervezett feladatokra (elég RAM, tároló kapacitás, megbízhatóság). Fontos szempont a fogyasztás és a zajszint – egy régi gamer PC működik ugyan, de havi szinten jóval többet fogyaszt, mint egy modern mini PC."</em></p>
|
||||
<p>Ha nincs géped, az nem kizáró ok – az egyeztetésen átbeszéljük, mi a legjobb a te helyzetedben. Részletesebb konfigurációk a <a href="/technologiak">Technológiák</a> oldalon.</p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-radio-tower"/></svg> 2. Otthoni internet</h3>
|
||||
<!-- source: website/gyik.html FAQ „Milyen internet kapcsolat szükséges?" (quoted) -->
|
||||
<p>A GYIK-ből idézve: <em>„Otthoni használathoz (helyi hálózaton belül) bármilyen internet elég, mert az alkalmazások a helyi hálózatodon futnak – nem az interneten keresztül. […] Ha távolról is el szeretnéd érni a szerveredet (pl. munkahelyről vagy nyaralásból), akkor a feltöltési sebesség (upload) számít: minimum 10 Mbps ajánlott, de minél több, annál jobb."</em></p>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg> 3. Egy domain – amit mi fizetünk</h3>
|
||||
<!-- source: operator ruling D1, 2026-10-10 (CONTEXT.md); documentation/architecture/01-topology-and-trust.md §7 -->
|
||||
<p>A szerveredet és az alkalmazásaidat a <strong>saját domainedről</strong> érjük el – nem egy felhom.eu alatti névről. Így a vezérlőpultod <code>felhom.a-te-domained.hu</code> lesz, és minden alkalmazás egy saját aldomaint kap.</p>
|
||||
<div class="highlight-box">
|
||||
<p><strong>A domain a te nevedre szól, és a díját a teszt alatt mi fizetjük – két évre.</strong> A domain tehát a tiéd: ha a teszt véget ér, vagy ha kiszállsz, <strong>a domain nálad marad</strong>, és onnantól te fizeted tovább. Nem kérjük vissza, és nem visszük magunkkal.</p>
|
||||
</div>
|
||||
<p>A domain DNS-beállításait a teszt alatt mi kezeljük, egy olyan hozzáféréssel, ami <strong>kizárólag ezt az egy domaint látja</strong> – máshoz nem ér hozzá.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Mit kapsz -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Mit <span>kapsz</span></h2>
|
||||
<p>Ugyanaz a lista, ami a teszt feltételeinek 3. pontjában áll – se több, se kevesebb</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<!-- source: documentation/legal/feltetelek-1.0.md §3 (same promises, no new ones) -->
|
||||
<ul>
|
||||
<li>Egy <strong>otthoni szervert beállítunk</strong> nálad, és működőképes állapotba hozzuk.</li>
|
||||
<li><strong>Alkalmazásokat telepítünk</strong> rá a katalógusunkból, a vezérlőpulton keresztül.</li>
|
||||
<li>Az alkalmazások <strong>elérhetők lesznek az interneten</strong> is.</li>
|
||||
<li><strong>Figyeljük a szervert.</strong> Ha baj van, szólunk.</li>
|
||||
<li><strong>Mentés készül</strong> több szinten: a szerveren, és titkosítva egy távoli tárhelyen is.</li>
|
||||
<li><strong>Frissítjük</strong> az alkalmazásokat és a rendszert, jellemzően éjszaka, egy általad beállítható időablakban.</li>
|
||||
<li>És a fentiek szerint: <strong>a domaint két évre mi fizetjük.</strong></li>
|
||||
</ul>
|
||||
<p>Hogy mit <strong>nem</strong> ígérünk – rendelkezésre állást és válaszidőt nem vállalunk –, azt a <a href="/feltetelek">teszt feltételei</a> 5. pontja írja le. Érdemes elolvasni, mielőtt jelentkezel.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Mit kérünk -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Mit <span>kérünk</span></h2>
|
||||
<p>Pénzt nem – se tőled, se felénk</p>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-message-square"/></svg> Mondd el, mi nem jó</h3>
|
||||
<p>Ez az egyetlen, amit cserébe kérünk. Mi zavaró, mi érthetetlen, mi nem működik. Egy „ezt a gombot nem találtam" ér nekünk a legtöbbet – abból tudjuk, mit kell kijavítani.</p>
|
||||
|
||||
<h3 style="margin-top: 24px;"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg> Tarts meg egy saját másolatot</h3>
|
||||
<!-- source: documentation/legal/feltetelek-1.0.md §4 („Ezért kérünk valamit") -->
|
||||
<p>A teszt feltételeiből: <strong>amit nem veszíthetsz el, abból tarts meg egy saját másolatot magadnál is. Ne a teszt legyen az egyetlen helye.</strong> Mentés készül és teszteljük is, de egy teszt alatt bármi elromolhat.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Hány helyünk van -->
|
||||
<section class="content-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Hány <span>helyünk van</span></h2>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<h3><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-users"/></svg> Legfeljebb 5 háztartás</h3>
|
||||
<!-- source: operator ruling D2, 2026-10-10 (CONTEXT.md) -->
|
||||
<p>A zárt tesztben <strong>legfeljebb 5 háztartás</strong> vesz részt. Ez azért ilyen kevés, mert egy ember üzemelteti a rendszert, és minden tesztelőre akarunk időt fordítani. A teszt <strong>most indul</strong>, így jelenleg <strong>mind az 5 hely szabad</strong>.</p>
|
||||
<p>Ha betelik, azt megírjuk – és szólunk, amikor újra szabadul egy hely.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Jelentkezés -->
|
||||
<section class="cta-section">
|
||||
<div class="container">
|
||||
<h2>Érdekel? <span>Jelentkezz</span></h2>
|
||||
<p>Írj egy üzenetet – <strong>nem kötelez semmire</strong>, először csak beszélgetünk. Átbeszéljük, van-e megfelelő géped, és mire használnád.</p>
|
||||
<a href="/kapcsolat?tema=zart-teszt" class="cta-button">Jelentkezem tesztelőnek →</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Mit olvass el -->
|
||||
<section class="content-section alt-bg">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Mit érdemes <span>elolvasni</span></h2>
|
||||
</div>
|
||||
<div class="info-card">
|
||||
<ul>
|
||||
<li><a href="/feltetelek">A zárt teszt feltételei</a> – mit kapsz, mit nem ígérünk, és hogyan tudsz kiszállni.</li>
|
||||
<li><a href="/adatkezeles">Adatkezelési tájékoztató</a> – milyen adatot kezelünk, meddig, és miért.</li>
|
||||
<li><a href="/gyik">GYIK</a> – a géptől a mentésekig a leggyakoribb kérdések.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
(function() {
|
||||
var hamburger = document.getElementById('hamburger');
|
||||
var navLinks = document.querySelector('.nav-links');
|
||||
var overlay = document.getElementById('mobileOverlay');
|
||||
var body = document.body;
|
||||
|
||||
if (!hamburger || !navLinks || !overlay) {
|
||||
console.warn('[mobile-menu] Missing elements:', {
|
||||
hamburger: !!hamburger,
|
||||
navLinks: !!navLinks,
|
||||
overlay: !!overlay
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
hamburger.classList.add('is-active');
|
||||
navLinks.classList.add('is-open');
|
||||
overlay.classList.add('is-visible');
|
||||
body.classList.add('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'true');
|
||||
hamburger.setAttribute('aria-label', 'Menü bezárása');
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
hamburger.classList.remove('is-active');
|
||||
navLinks.classList.remove('is-open');
|
||||
overlay.classList.remove('is-visible');
|
||||
body.classList.remove('menu-open');
|
||||
hamburger.setAttribute('aria-expanded', 'false');
|
||||
hamburger.setAttribute('aria-label', 'Menü megnyitása');
|
||||
}
|
||||
|
||||
hamburger.addEventListener('click', function() {
|
||||
if (navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
|
||||
navLinks.querySelectorAll('a').forEach(function(link) {
|
||||
link.addEventListener('click', closeMenu);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('resize', function() {
|
||||
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function(){
|
||||
var b=document.getElementById('navBurger'),s=document.getElementById('sidebar'),k=document.getElementById('navBackdrop');
|
||||
if(!b||!s||!k)return;
|
||||
function open(){s.classList.add('is-open');k.hidden=false;document.body.classList.add('nav-open');b.setAttribute('aria-expanded','true');}
|
||||
function close(){s.classList.remove('is-open');k.hidden=true;document.body.classList.remove('nav-open');b.setAttribute('aria-expanded','false');}
|
||||
b.addEventListener('click',function(){s.classList.contains('is-open')?close():open();});
|
||||
k.addEventListener('click',close);
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&s.classList.contains('is-open')){close();b.focus();}});
|
||||
s.querySelectorAll('a').forEach(function(l){l.addEventListener('click',close);});
|
||||
window.addEventListener('resize',function(){if(window.innerWidth>768)close();});
|
||||
})();
|
||||
document.addEventListener('click',function(e){
|
||||
var btn=e.target.closest?e.target.closest('.nav-group-toggle'):null;
|
||||
if(!btn)return;
|
||||
var g=btn.closest('.nav-group');if(!g)return;
|
||||
var willOpen=!g.classList.contains('is-open');
|
||||
document.querySelectorAll('.nav-group.is-open').forEach(function(x){
|
||||
x.classList.remove('is-open');
|
||||
var t=x.querySelector('.nav-group-toggle');if(t)t.setAttribute('aria-expanded','false');
|
||||
});
|
||||
if(willOpen){g.classList.add('is-open');btn.setAttribute('aria-expanded','true');}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user