<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>linux - Hard Wired</title>
	<atom:link href="https://www.hardwired.dev/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hardwired.dev</link>
	<description></description>
	<lastBuildDate>Sat, 11 Oct 2025 04:47:46 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://www.hardwired.dev/wp-content/uploads/2022/10/android-chrome-256x256-1-150x150.png</url>
	<title>linux - Hard Wired</title>
	<link>https://www.hardwired.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Outline &#8211; selfhostovaná znalostní báze</title>
		<link>https://www.hardwired.dev/2025/09/27/outline-selfhostovana-znalostni-baze/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Sat, 27 Sep 2025 19:59:00 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Různé]]></category>
		<category><![CDATA[.env]]></category>
		<category><![CDATA[autentizace]]></category>
		<category><![CDATA[databáze]]></category>
		<category><![CDATA[dex]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[in-memory databáze]]></category>
		<category><![CDATA[konfigurace]]></category>
		<category><![CDATA[kontejnerizace]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[linxu]]></category>
		<category><![CDATA[návod]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[Nginx konfigurace]]></category>
		<category><![CDATA[notion]]></category>
		<category><![CDATA[oidc]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[OpenID Connect]]></category>
		<category><![CDATA[outline]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[přihlašování]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[reverse-proxy]]></category>
		<category><![CDATA[reverzní proxy]]></category>
		<category><![CDATA[self-hosting]]></category>
		<category><![CDATA[selfhosted]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[YAML]]></category>
		<category><![CDATA[znalostní báze]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=2836</guid>

					<description><![CDATA[<p>Takovej selfhosting Notionu bez fancy tabulek. Outline je open-source nástroj pro tvorbu a správu interní dokumentace a znalostních bází. Použité &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2025/09/27/outline-selfhostovana-znalostni-baze/">Outline – selfhostovaná znalostní báze</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Takovej selfhosting Notionu bez fancy tabulek.<br />
<a href="https://www.getoutline.com">Outline</a> je open-source nástroj pro tvorbu a správu interní dokumentace a znalostních bází.</p>
<p><span id="more-2836"></span></p>
<h2>Použité technologie</h2>
<h3>Nginx</h3>
<p>Nginx je výkonný webový server a reverzní proxy, který se používá pro obsluhu statického obsahu, směrování požadavků na backend služby a vyvažování zátěže. Je známý svou rychlostí, nízkou spotřebou paměti a spolehlivostí při vysoké zátěži.</p>
<h3>Outline</h3>
<p><a href="https://www.getoutline.com">Outline</a> je open-source nástroj pro tvorbu a správu interní dokumentace a znalostních bází. Poskytuje jednoduché a přehledné uživatelské rozhraní pro týmovou spolupráci, verzování a rychlé vyhledávání obsahu.</p>
<h3>Dex</h3>
<p><a href="https://dexidp.io">Dex</a> je open-source identitní služba, která funguje jako „OpenID Connect“ provider. Slouží k centralizovanému ověřování uživatelů a umožňuje propojit různé aplikace s externími identity providery (např. Google, GitHub nebo LDAP).</p>
<h3>Postgres</h3>
<p>PostgreSQL (Postgres) je pokročilý open-source relační databázový systém. Nabízí podporu pro komplexní dotazy, transakce, indexy, JSON data a rozšiřitelnost pomocí vlastních funkcí, čímž se hodí pro širokou škálu aplikací od menších po enterprise řešení.</p>
<h3>Redis</h3>
<p>Redis je in-memory databáze a cache systém, který umožňuje velmi rychlý přístup k datům. Často se používá pro ukládání relací, front, výsledků výpočtů nebo jako prostředník pro komunikaci mezi službami díky podpoře publikace a odběru zpráv (pub/sub).</p>
<h3>Docker / Docker Compose</h3>
<p>Docker je platforma pro kontejnerizaci aplikací, která umožňuje spouštět software izolovaně s veškerými závislostmi. Docker Compose pak usnadňuje definování a správu vícekontejnerových aplikací pomocí jednoduchého konfiguračního souboru.</p>
<h2>Diagram</h2>
<p><img decoding="async" src="https://www.hardwired.dev/wp-content/uploads/2025/09/diagram.avif" alt="" /></p>
<h2>Postřehy</h2>
<h3>Outline</h3>
<p>Outline neumožňuje přihlašování pomocí uživatelského jména a hesla, což je poněkud nepříjemné. Musí se nakonfigurovat jedna z podporovaných služeb. Aplikace umí pracovat se Slack identitami, Google identitami a dalšími poskytovateli. Pokud nemůžete použít žádnou z těchto služeb, je tam naštěstí možnost Magic Link via Email. Je to sice nepříjemné, ale funkční řešení. Pokaždé, když se chcete přihlásit, pošle vám aplikace email s přihlašovacím odkazem. V mém setupu jsem se rozhodl použít Dex jako OIDC službu, přes kterou se mohu přihlašovat pomocí emailu a hesla.</p>
<h3>Dex</h3>
<p><a href="https://dexidp.io">Dex</a> je velmi minimalistický, takže nemá webové rozhraní. Navíc jeho dokumentace je hodně nekvalitní. Nejjednodušším způsobem, jak vše rozchodit, je přidat statického klienta a uživatele přímo do konfiguračního souboru. Musíte si ale vytvořit bcrypt hashovaná hesla. Vycházel jsem z tohoto <a href="https://mrkaran.dev/posts/setting-outline/">návodu</a>.</p>
<h3>SMTP</h3>
<p>Aby fungovalo odesílání emailů, je potřeba nakonfigurovat SMTP server. Pokud žádný po ruce nemáte, můžete použít váš Gmail účet. V nastavení Gmailu se musí vytvořit aplikační klíč, který se pak vloží do .env souboru do SMTP sekce.</p>
<h2>Setup</h2>
<h3>.env</h3>
<pre><code class="language-ini">URL=https://outline.&lt;domain.com&gt;
PORT=3050
WEB_CONCURRENCY=1
SECRET_KEY=&lt;secret key&gt;
UTILS_SECRET=&lt;utils secret&gt;
DATABASE_URL=postgres://outline:&lt;db password&gt;@outline-postgres:5432/outline
PGSSLMODE=disable

POSTGRES_USER=outline
POSTGRES_PASSWORD=&lt;db password&gt;
POSTGRES_DB=outline

REDIS_URL=redis://outline-redis:6379

FILE_STORAGE=local

FORCE_HTTPS=true

OIDC_CLIENT_ID=outline
OIDC_CLIENT_SECRET=&lt;oidc client secret&gt;
OIDC_AUTH_URI=https://auth.&lt;domain.com&gt;/dex/auth
OIDC_TOKEN_URI=http://dex:5556/dex/token
OIDC_USERINFO_URI=http://dex:5556/dex/userinfo
OIDC_USERNAME_CLAIM=email
OIDC_DISPLAY_NAME=OIDC Provider
OIDC_SCOPES=openid profile email

SMTP_SERVICE=gmail
SMTP_USERNAME=&lt;you&gt;@gmail.com
SMTP_PASSWORD=&quot;&lt;app code&gt;&quot;
SMTP_FROM_EMAIL=&lt;you&gt;@gmail.com

RATE_LIMITER_ENABLED=true
RATE_LIMITER_REQUESTS=1000
RATE_LIMITER_DURATION_WINDOW=60

ENABLE_UPDATES=true
DEBUG=http
LOG_LEVEL=info</code></pre>
<h3>DEX Config (config.yaml)</h3>
<pre><code class="language-yaml">issuer: https://auth.&lt;domain.com&gt;/dex

storage:
  type: sqlite3
  config:
    file: /var/dex/dex.db

web:
  http: 0.0.0.0:5556

staticClients:
  - id: outline
    redirectURIs:
      - &quot;https://outline.&lt;domain.com&gt;/auth/oidc.callback&quot;
    name: &quot;Knowledge Base&quot;
    secret: &lt;oidc client secret&gt;

oauth2:
  skipApprovalScreen: true

enablePasswordDB: true

staticPasswords:
  # Admin
  - email: &quot;&lt;admin&gt;@gmail.com&quot;
    hash: &quot;&lt;bcrypt password hash&gt;&quot;
    username: &quot;admin&quot;
    userID: &quot;admin-001&quot;

  - email: &quot;&lt;user&gt;@gmail.com&quot;
    hash: &quot;&lt;bcript password hash&gt;&quot;
    username: &quot;user&quot;
    userID: &quot;user-001&quot;

# Pro debug
logger:
  level: &quot;info&quot;
  format: &quot;text&quot;</code></pre>
<h3>Docker Compose</h3>
<pre><code class="language-yaml">services:
  outline:
    image: docker.getoutline.com/outlinewiki/outline:latest
    env_file: ./.env
    ports:
      - &quot;3050:3050&quot;
    expose:
      - &quot;3050&quot;
    volumes:
      - storage-data:/var/lib/outline/data
    depends_on:
      - outline-postgres
      - outline-redis

  outline-redis:
    image: redis
    env_file: ./.env
    expose:
      - &quot;6379&quot;
    volumes:
      - ./redis.conf:/redis.conf
    command: [&quot;redis-server&quot;, &quot;/redis.conf&quot;]
    healthcheck:
      test: [&quot;CMD&quot;, &quot;redis-cli&quot;, &quot;ping&quot;]
      interval: 10s
      timeout: 30s
      retries: 3

  outline-postgres:
    image: postgres
    env_file: ./.env
    expose:
      - &quot;5432&quot;
    volumes:
      - database-data:/var/lib/postgresql/data
    healthcheck:
      test: [&quot;CMD&quot;, &quot;pg_isready&quot;, &quot;-d&quot;, &quot;outline&quot;, &quot;-U&quot;, &quot;user&quot;]
      interval: 30s
      timeout: 20s
      retries: 3

  dex:
    image: dexidp/dex:v2.37.0
    ports:
      - &quot;5556:5556&quot;  # Vystaveno pro nginx proxy
    expose:
      - &quot;5556&quot;
    volumes:
      - ./dex-config:/etc/dex:ro  # Read-only mount konfigurace
      - dex-data:/var/dex         # Persistentni SQLite databáze
    command: [&quot;dex&quot;, &quot;serve&quot;, &quot;/etc/dex/config.yaml&quot;]
    healthcheck:
      test: [&quot;CMD&quot;, &quot;wget&quot;, &quot;--no-verbose&quot;, &quot;--tries=1&quot;, &quot;--spider&quot;, &quot;http://localhost:5556/dex/healthz&quot;]
      interval: 30s
      timeout: 10s
      retries: 3
    restart: unless-stopped

volumes:
  storage-data:
  database-data:
  dex-data:</code></pre>
<h3>Nginx</h3>
<h4>auth.<domain.com></h4>
<pre><code class="language-nginx">server {
    listen 80;
    server_name auth.&lt;domain.com&gt;;

    # P┼Öesm─Ťrov├ín├ş HTTP na HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name auth.&lt;domain.com&gt;;

    # SSL certifik├íty (upravte cestu podle va┼í├ş konfigurace)
    ssl_certificate /etc/nginx/ssl/&lt;domain.com&gt;/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/&lt;domain.com&gt;/privkey.pem;

    # SSL konfigurace
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    # Proxy nastaven├ş pro Home Assistant
    location / {
        proxy_pass http://&lt;service ip&gt;:5556;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;

        # Timeout nastaven├ş
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # Buffering nastaven├ş
        proxy_buffering off;
        proxy_request_buffering off;
    }

    # Logov├ín├ş
    access_log /var/log/nginx/auth.&lt;domain.com&gt;.access.log;
    error_log /var/log/nginx/auth.&lt;domain.com&gt;.error.log;
}</code></pre>
<h4>outline.<domain.com></h4>
<pre><code class="language-nginx">server {
    listen 80;
    server_name outline.&lt;domain.com&gt;;

    # P┼Öesm─Ťrov├ín├ş HTTP na HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name outline.&lt;domain.com&gt;;

    # SSL certifik├íty (upravte cestu podle va┼í├ş konfigurace)
    ssl_certificate /etc/nginx/ssl/&lt;domain.com&gt;/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/&lt;domain.com&gt;/privkey.pem;

    # SSL konfigurace
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    # Proxy nastaven├ş pro Home Assistant
    location / {
        proxy_pass http://&lt;service ip&gt;:3050;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;

        # Timeout nastaven├ş
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # Buffering nastaven├ş
        proxy_buffering off;
        proxy_request_buffering off;
    }

    # Logov├ín├ş
    access_log /var/log/nginx/outline.&lt;domain.com&gt;.access.log;
    error_log /var/log/nginx/outline.&lt;domain.com&gt;.error.log;
}</code></pre>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2025%2F09%2F27%2Foutline-selfhostovana-znalostni-baze%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2025/09/27/outline-selfhostovana-znalostni-baze/">Outline – selfhostovaná znalostní báze</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Nushell</title>
		<link>https://www.hardwired.dev/2025/06/12/2771/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Thu, 12 Jun 2025 21:20:19 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[macOS]]></category>
		<category><![CDATA[nushell]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[windows]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=2771</guid>

					<description><![CDATA[<p>Nushell je zajímavou alternativou k asi nejrozšířenější variantě shellu Bash. Nepatří do top pětky, ten kromě Bashe okupují Tcsh/Csh, Ksh, &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2025/06/12/2771/">Nushell</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p><a href="https://www.nushell.sh">Nushell</a> je zajímavou alternativou k asi nejrozšířenější variantě <a href="https://en.wikipedia.org/wiki/Shell_(computing)">shellu</a> <a href="https://www.gnu.org/software/bash/">Bash</a>. Nepatří do top pětky, ten kromě Bashe okupují <a href="Tcsh/Cs">Tcsh/Cs</a>h, <a href="http://kornshell.com/">Ksh</a>, <a href="https://www.zsh.org/">Zsh</a> a <a href="https://fishshell.com/">Fish</a>. </p>
<p>Dle autorů je Nushell nový typ shellu a už v <a href="https://www.nushell.sh/book/">úvodu dokumentace</a> se dozvíte hlavní rozdíl. Programy v tradičních shellech spolu komunikují pomocí textových řetězců. Program zapíše text na standardní výstup a druhý program tento text přečte a zpracuje ze standardního vstupu.</p>
<p>To mohlo stačit v dobách kdy byly tyto shelly vytvořeny, ale doba se posunula. Dnes je v mnoha aplikacích defacto standard JSON. Například Bash v základu práci s JSON formátem nepodporuje a je potřeba použít nějaký JSON processor. Například  <a href="https://jqlang.org/">jq</a>.</p>
<p>Nushell tuto filozofii neboří, naopak rozšiřuje a umožňuje posílat i jiné <a href="https://www.nushell.sh/book/types_of_data.html#types-at-a-glance">datové typy</a>. </p>
<pre><code class="language-shell">Integers            -65535
Floats (decimals)   9.9999, Infinity
Strings             "hole 18", 'hole 18', <code>hole 18</code>, hole18, r#'hole18'#
Booleans            true
Dates               2000-01-01
Durations           2min + 12sec
File-sizes          64mb
Ranges              0..4, 0..<5, 0.., ..4
Binary              0x[FE FF]
Lists               [0 1 'two' 3]
Records             {name:"Nushell", lang: "Rust"}
Tables              [{x:12, y:15}, {x:8, y:9}], [[x, y]; [12, 15], [8, 9]]
Closures            {|e| $e + 1 | into string }, { $in.name.0 | path exists }
Cell-paths          $.name.0
Blocks              if true { print "hello!" }, loop { print "press ctrl-c to exit" }
Null (Nothing)      null
Any                 let p: any = 5</code></pre>
<p>Jednou z výhod tohoto přístupu je, že výstupem může být tabulka, kterou další programy mohou zpracovat. Pokud chcete v Bashi například seřadit a filtrovat výstup příkazu ls, tak to bude kombinace příkazů ls, sort, grep, cut a možná i dalších. Největší obtíž bude kontext. Výstupy mezi program budou jen textové řetězce bez kontextu. <a href="https://www.youtube.com/results?search_query=ba%C5%99inka+bash">Ale zkušený Linux admin to určitě zvládne s přehledem</a>.</p>
<p>V Nushelu další program ví, že je to tabulka, která má nějaké sloupce co se nějak jmenují a hodnoty ve sloupcích mají nějaký typ. Tím výsledná sekvence příkazů vypadá mnohem přirozeněji a intuitivněji.</p>
<p>Příklad 1: Proces co zabírá nejvíc paměti</p>
<pre><code class="language-shell">~/bin> ps
╭───┬──────┬──────┬──────┬──────────┬──────┬──────────┬──────────╮
│ # │ pid  │ ppid │ name │  status  │ cpu  │   mem    │ virtual  │
├───┼──────┼──────┼──────┼──────────┼──────┼──────────┼──────────┤
│ 0 │    1 │    0 │ init │ Sleeping │ 0.00 │ 339.9 kB │ 997.3 GB │
│ 1 │ 1724 │    1 │ init │ Sleeping │ 0.00 │ 249.8 kB │ 997.3 GB │
│ 2 │ 1725 │ 1724 │ bash │ Sleeping │ 0.00 │   3.5 MB │ 222.2 GB │
│ 3 │ 1762 │ 1725 │ sudo │ Sleeping │ 0.00 │   2.5 MB │ 309.2 GB │
│ 4 │ 1763 │ 1762 │ nu   │ Running  │ 0.00 │  18.4 MB │ 150.1 GB │
╰───┴──────┴──────┴──────┴──────────┴──────┴──────────┴──────────╯</code></pre>
<p>Výstupem je tabulka, co má sloupce. V našem případě nás zajímá sloupec mem. Ten má jako řádky hodnoty typu file-size podle kterých lze sortovat.</p>
<pre><code class="language-shell">~/bin> ps | sort-by mem
╭───┬──────┬──────┬──────┬──────────┬──────┬──────────┬──────────╮
│ # │ pid  │ ppid │ name │  status  │ cpu  │   mem    │ virtual  │
├───┼──────┼──────┼──────┼──────────┼──────┼──────────┼──────────┤
│ 0 │ 1724 │    1 │ init │ Sleeping │ 0.00 │ 249.8 kB │ 997.3 GB │
│ 1 │    1 │    0 │ init │ Sleeping │ 0.00 │ 339.9 kB │ 997.3 GB │
│ 2 │ 1762 │ 1725 │ sudo │ Sleeping │ 0.00 │   2.5 MB │ 309.2 GB │
│ 3 │ 1725 │ 1724 │ bash │ Sleeping │ 0.00 │   3.5 MB │ 222.2 GB │
│ 4 │ 1763 │ 1762 │ nu   │ Running  │ 0.00 │  18.4 MB │ 150.1 GB │
╰───┴──────┴──────┴──────┴──────────┴──────┴──────────┴──────────╯</code></pre>
<p>Sort řadí od nejmenšího, takže je ještě potřeba výstup obrátit.</p>
<pre><code class="language-shell">~/bin> ps | sort-by mem | reverse
╭───┬──────┬──────┬──────┬──────────┬──────┬──────────┬──────────╮
│ # │ pid  │ ppid │ name │  status  │ cpu  │   mem    │ virtual  │
├───┼──────┼──────┼──────┼──────────┼──────┼──────────┼──────────┤
│ 0 │ 1763 │ 1762 │ nu   │ Running  │ 0.00 │  18.4 MB │ 150.1 GB │
│ 1 │ 1725 │ 1724 │ bash │ Sleeping │ 0.00 │   3.5 MB │ 222.2 GB │
│ 2 │ 1762 │ 1725 │ sudo │ Sleeping │ 0.00 │   2.5 MB │ 309.2 GB │
│ 3 │    1 │    0 │ init │ Sleeping │ 0.00 │ 339.9 kB │ 997.3 GB │
│ 4 │ 1724 │    1 │ init │ Sleeping │ 0.00 │ 249.8 kB │ 997.3 GB │
╰───┴──────┴──────┴──────┴──────────┴──────┴──────────┴──────────╯</code></pre>
<p>Zajímají jen Running procesy, takže můžeme využít sloupce status.</p>
<pre><code class="language-shell">~/bin> ps | sort-by mem | reverse | where status == Running
╭───┬──────┬──────┬──────┬─────────┬──────┬─────────┬──────────╮
│ # │ pid  │ ppid │ name │ status  │ cpu  │   mem   │ virtual  │
├───┼──────┼──────┼──────┼─────────┼──────┼─────────┼──────────┤
│ 0 │ 1763 │ 1762 │ nu   │ Running │ 0.00 │ 18.7 MB │ 150.1 GB │
╰───┴──────┴──────┴──────┴─────────┴──────┴─────────┴──────────╯</code></pre>
<p>Můžeme si tabulku zjednodušit tím, že nás zajímají jen sloupce pid, name a mem.</p>
<pre><code class="language-shell">~/bin> ps | sort-by mem | reverse | where status == Running | select pid name mem
╭───┬──────┬──────┬─────────╮
│ # │ pid  │ name │   mem   │
├───┼──────┼──────┼─────────┤
│ 0 │ 1763 │ nu   │ 18.7 MB │
╰───┴──────┴──────┴─────────╯</code></pre>
<p>Nakonec si pomocí příkazu get vytáhneme jen PID procesu.</p>
<pre><code class="language-shell">~/bin> ps | sort-by mem | reverse | where status == Running | select pid name mem | get pid
╭───┬──────╮
│ 0 │ 1763 │
╰───┴──────╯</code></pre>
<p>A tohle je jen takové škrabkání po povrchu. Nu disponuje škálou <a href="https://www.nushell.sh/book/working_with_tables.html">příkazů na práci s tabulkami</a>. Také na <a href="https://www.nushell.sh/book/working_with_records.html#updating-records">práci se záznamy</a> což je JSON, <a href="https://www.nushell.sh/book/working_with_lists.html">seznamy</a> a <a href="https://www.nushell.sh/book/working_with_strings.html">řetězci</a>. Vše je pěkně popsáno v dokumentaci v sekci <a href="https://www.nushell.sh/book/nu_fundamentals.html">Nu Fundamentals</a>.</p>
<p>Nushell jede na Windows, macOS a Linux operačních systémech. Metody instalace jsou popsány v <a href="https://www.nushell.sh/book/installation.html">dokumentaci</a>. Pro Debian/Ubuntu systém stačí přidat zdroj.</p>
<pre><code class="language-shell">curl -fsSL https://apt.fury.io/nushell/gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/fury-nushell.gpg
echo "deb https://apt.fury.io/nushell/ /" | sudo tee /etc/apt/sources.list.d/fury.list
sudo apt update
sudo apt install nushell</code></pre>
<p>Nushell není kompatibilní s Bashem a jinými tradičními shelly. Takže není kompletní náhrada za standardní systémový shell. Ale dokáži si představit Nu jako &quot;every day&quot; shell na takovou běžnou uživatelskou Linuxařinu. Ale ještě víc pokud z mého programu potřebuji zpracovat strukturovaný výstup nebo naopak do mého programu dostat strukturovaný vstup. To může být velice silný nástroj. Nushell tvrdí že dokáže pracovat s JSON, YAML, Excel a dokonce i s SQLite. To může některé aplikace velice zjednodušit. Seznam všech podporovaných formátů najdete v <a href="https://www.nushell.sh/book/loading_data.html#opening-files">dokumentaci</a>.</p>
<p>Happy coding!</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2025%2F06%2F12%2F2771%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2025/06/12/2771/">Nushell</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Špatné zabezpečení NFC docházkových systémů UID-only autentizace</title>
		<link>https://www.hardwired.dev/2024/12/20/spatne-zabezpeceni-nfc-dochazkovych-systemu-uid-only-autentizace/</link>
		
		<dc:creator><![CDATA[Valentino Hesse OK2HSS]]></dc:creator>
		<pubDate>Fri, 20 Dec 2024 15:45:02 +0000</pubDate>
				<category><![CDATA[Cyber Security]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[3DES autentizace]]></category>
		<category><![CDATA[ATQA]]></category>
		<category><![CDATA[bezkontaktní technologie]]></category>
		<category><![CDATA[bezpečnost]]></category>
		<category><![CDATA[bezpečnostní analýza]]></category>
		<category><![CDATA[bezpečnostní doporučení]]></category>
		<category><![CDATA[bezpečnostní rizika]]></category>
		<category><![CDATA[čipové karty]]></category>
		<category><![CDATA[emulace karet]]></category>
		<category><![CDATA[identifikační systémy]]></category>
		<category><![CDATA[Kali Linux]]></category>
		<category><![CDATA[kryptografie]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Magic Cards]]></category>
		<category><![CDATA[Magic UID]]></category>
		<category><![CDATA[Mifare Ultralight C]]></category>
		<category><![CDATA[nfc]]></category>
		<category><![CDATA[NFC bezpečnost]]></category>
		<category><![CDATA[NFC čtečky]]></category>
		<category><![CDATA[NFC karty]]></category>
		<category><![CDATA[NFC zabezpečení]]></category>
		<category><![CDATA[paměťové karty]]></category>
		<category><![CDATA[přístupové karty]]></category>
		<category><![CDATA[přístupové systémy]]></category>
		<category><![CDATA[proxmark]]></category>
		<category><![CDATA[Proxmark3]]></category>
		<category><![CDATA[rfid]]></category>
		<category><![CDATA[SAK]]></category>
		<category><![CDATA[systém]]></category>
		<category><![CDATA[UID klonování]]></category>
		<category><![CDATA[zabezpečení]]></category>
		<category><![CDATA[zabezpečení karet]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=2513</guid>

					<description><![CDATA[<p>Bezpečnostní analýza NFC karet se zaměřením na Mifare Ultralight C 1. Úvod V současné době se technologie NFC (Near Field &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2024/12/20/spatne-zabezpeceni-nfc-dochazkovych-systemu-uid-only-autentizace/">Špatné zabezpečení NFC docházkových systémů UID-only autentizace</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><h1>Bezpečnostní analýza NFC karet se zaměřením na Mifare Ultralight C</h1>
<h2>1. Úvod</h2>
<p>V současné době se technologie NFC (Near Field Communication) stala nedílnou součástí našeho každodenního života. Od přístupových systémů přes platební karty až po městskou hromadnou dopravu se s NFC setkáváme prakticky denně. Tato práce se zaměřuje na specifický typ NFC karet - Mifare Ultralight C, s důrazem na bezpečnostní aspekty jejich implementace v přístupových systémech.</p>
<h3>1.1 Praktické využití Mifare Ultralight C</h3>
<p>Karta Mifare Ultralight C nachází široké uplatnění v různých odvětvích:</p>
<ul>
<li>Vstupenky na kulturní a sportovní akce</li>
<li>Přístupové karty v hotelech</li>
<li>Věrnostní karty v maloobchodě</li>
<li>Identifikační karty na festivalech</li>
</ul>
<h3>1.2 Bezpečnostní incidenty</h3>
<p>V posledních letech bylo zaznamenáno několik významných bezpečnostních incidentů:</p>
<ul>
<li>2022: Prolomení systému vstupného na sportovní události v ČR (únik &gt;50 000 Kč)</li>
<li>2023: Zneužití přístupových karet v hotelovém řetězci</li>
<li>2024: Duplikace jízdenek MHD v několika evropských městech</li>
</ul>
<p>Tyto incidenty vedly k finančním ztrátám v řádu milionů korun a zdůraznily potřebu robustního zabezpečení.</p>
<h2>2. Co je NFC (Near Field Communication)</h2>
<p>NFC je bezkontaktní komunikační technologie pracující na frekvenci 13.56 MHz s dosahem několika centimetrů. Technologie vychází ze standardů RFID a je zpětně kompatibilní s existujícími RFID strukturami. </p>
<h3>2.1 Základní charakteristiky NFC</h3>
<ul>
<li>Pracovní frekvence: 13.56 MHz</li>
<li>Dosah: typicky 4-10 cm</li>
<li>Rychlost přenosu: 106-424 kbit/s</li>
<li>Režimy komunikace:
<ul>
<li>Peer-to-peer</li>
<li>Read/Write</li>
<li>Card Emulation</li>
</ul>
</li>
</ul>
<h3>2.2 Standardizace</h3>
<p>NFC technologie je standardizována prostřednictvím ISO/IEC 14443 Type A, což zajišťuje kompatibilitu mezi různými výrobci a implementacemi.</p>
<h2>3. Mifare Ultralight C</h2>
<h3>3.1 Technické specifikace</h3>
<ul>
<li>Paměť: 192 bytů uživatelské paměti</li>
<li>Organizace paměti: 48 stránek po 4 bytech</li>
<li>Unikátní 7bajtové sériové číslo (UID)</li>
<li>Podpora 3DES autentizace</li>
<li>Rychlost komunikace: 106 kbit/s</li>
</ul>
<p><a href="https://www.nxp.com/docs/en/data-sheet/MF0ICU2.pdf">https://www.nxp.com/docs/en/data-sheet/MF0ICU2.pdf</a></p>
<h4>3.1.1 Paměťová struktura</h4>
<ul>
<li>Celková velikost: 192 bytů</li>
<li>Organizace: 48 stránek po 4 bytech</li>
<li>Struktura paměti:
<ul>
<li>Stránky 0-3: Sériové číslo, interní data</li>
<li>Stránky 4-39: Uživatelská paměť</li>
<li>Stránky 40-43: Konfigurační data</li>
<li>Stránky 44-47: 3DES autentizační data</li>
</ul>
</li>
</ul>
<h4>3.1.2 Fyzické parametry</h4>
<ul>
<li>Rozměry: 85.6 × 54.0 × 0.76 mm (ISO/IEC 7810 ID-1)</li>
<li>Provozní teplota: -25°C až 70°C</li>
<li>Životnost dat: 5 let</li>
<li>Počet zápisů: &gt;10,000 cyklů</li>
<li>Počet čtení: Neomezený</li>
</ul>
<h3>3.2 Bezpečnostní prvky</h3>
<ul>
<li>3DES autentizační mechanismus</li>
<li>32-bitové počítadlo</li>
<li>Lock bity pro permanentní uzamčení částí paměti</li>
<li>Přístupové bity pro jednotlivé paměťové stránky</li>
</ul>
<h3>3.3 Srovnání s jinými Mifare kartami</h3>
<table>
<thead>
<tr>
<th>Vlastnost</th>
<th>Ultralight C</th>
<th>Classic 1K</th>
<th>DESFire EV1</th>
</tr>
</thead>
<tbody>
<tr>
<td>Paměť</td>
<td>192 B</td>
<td>1 KB</td>
<td>2-8 KB</td>
</tr>
<tr>
<td>Šifrování</td>
<td>3DES</td>
<td>CRYPTO1</td>
<td>AES, 3DES</td>
</tr>
<tr>
<td>Cena/kus*</td>
<td>0.3-0.5€</td>
<td>0.5-0.8€</td>
<td>1-2€</td>
</tr>
<tr>
<td>Rychlost</td>
<td>106 kbit/s</td>
<td>106 kbit/s</td>
<td>až 848 kbit/s</td>
</tr>
</tbody>
</table>
<p>*Ceny jsou orientační pro rok 2024 při odběru 1000+ ks</p>
<h3>3.4 Známé útoky a zranitelnosti</h3>
<ol>
<li>
<p>Klonování UID (2020-2024)</p>
<ul>
<li>Složitost: Nízká</li>
<li>Potřebné vybavení: Proxmark3, prázdná karta</li>
<li>Úspěšnost: &gt;95%</li>
<li>Náklady: ~100€</li>
</ul>
</li>
<li>
<p>Replay útok (2021)</p>
<ul>
<li>Složitost: Střední</li>
<li>Potřebné vybavení: Specializovaný hardware</li>
<li>Úspěšnost: 60-70%</li>
<li>Náklady: ~500€</li>
</ul>
</li>
<li>
<p>3DES klíč bruteforce (2023)</p>
<ul>
<li>Složitost: Vysoká</li>
<li>Potřebné vybavení: Výpočetní cluster</li>
<li>Úspěšnost: &lt;10%</li>
<li>Náklady: &gt;1000€<br />
[Přidání nové sekce po 3.4 Známé útoky a zranitelnosti]</li>
</ul>
</li>
</ol>
<h3>3.5 Karty s modifikovatelným UID (Magic Cards)</h3>
<h4>3.5.1 Základní charakteristika Magic Cards</h4>
<p>Magic Cards jsou speciální typ NFC karet, které umožňují modifikaci běžně neměnných parametrů včetně UID. Tyto karty jsou primárně určeny pro vývojáře a testování bezpečnosti, ale mohou být zneužity k obcházení jednoduchých přístupových systémů.</p>
<h4>3.5.2 Generace Magic Cards</h4>
<ol>
<li>
<p><strong>Gen1 (První generace)</strong></p>
<ul>
<li>Základní možnost změny UID</li>
<li>Omezená kompatibilita se čtečkami</li>
<li>Často detekovatelná pokročilými bezpečnostními systémy</li>
<li>Nižší úspěšnost emulace</li>
</ul>
</li>
<li>
<p><strong>Gen2 (Druhá generace)</strong></p>
<ul>
<li>Vylepšená emulace originálních karet</li>
<li>Lepší kompatibilita se čtečkami</li>
<li>Možnost změny ATQA a SAK</li>
<li>Stabilnější při použití</li>
</ul>
</li>
<li>
<p><strong>Gen3 (Třetí generace)</strong></p>
<ul>
<li>Nejpokročilejší emulace</li>
<li>Téměř nerozlišitelné od originálních karet</li>
<li>Plná podpora všech parametrů (UID, ATQA, SAK)</li>
<li>Vysoká úspěšnost při emulaci</li>
</ul>
</li>
</ol>
<h4>3.5.3 Typy modifikovatelných karet</h4>
<ol>
<li>
<p><strong>CUID (Changeable UID)</strong></p>
<ul>
<li>Základní varianta</li>
<li>Umožňuje pouze změnu UID</li>
<li>Nejnižší cena</li>
</ul>
</li>
<li>
<p><strong>FUID (Fully Changeable UID)</strong></p>
<ul>
<li>Pokročilá varianta</li>
<li>Možnost změny více parametrů</li>
<li>Lepší emulace</li>
</ul>
</li>
<li>
<p><strong>UFUID (Ultimate Fully Changeable UID)</strong></p>
<ul>
<li>Nejpokročilejší varianta</li>
<li>Plná kontrola nad všemi parametry</li>
<li>Nejvyšší cena</li>
</ul>
</li>
</ol>
<h4>3.5.4 Detekce Magic Cards</h4>
<p>Pokročilé bezpečnostní systémy mohou detekovat použití Magic Cards pomocí:</p>
<ul>
<li>Analýzy časování odpovědí</li>
<li>Kontroly specifických vlastností čipu</li>
<li>Ověření výrobních konstant</li>
<li>Detekce nestandardního chování</li>
</ul>
<h4>3.5.5 Bezpečnostní implikace</h4>
<p>Existence Magic Cards zdůrazňuje důležitost:</p>
<ul>
<li>Nepoužívat pouze UID pro autentizaci</li>
<li>Implementovat více vrstev zabezpečení</li>
<li>Používat kryptografické metody autentizace</li>
<li>Pravidelně aktualizovat bezpečnostní systémy</li>
</ul>
<h2>4. Bezpečnostní analýza</h2>
<h3>4.1 Problematika UID-only autentizace</h3>
<p>Mnoho přístupových systémů implementuje pouze základní ověření UID karty, což představuje závažné bezpečnostní riziko. Tento přístup je obdobný kontrole pouhého čísla občanského průkazu bez ověření jeho pravosti či identity držitele.</p>
<p><a href="https://www.hardwired.dev/2024/12/20/spatne-zabezpeceni-nfc-dochazkovych-systemu-uid-only-autentizace/pm3-easy/"><img decoding="async" src="https://www.hardwired.dev/wp-content/uploads/2024/12/PM3-Easy.webp" alt="" /></a></p>
<h3>4.2 Demonstrace zranitelnosti</h3>
<h4>4.2.1 Instalace a konfigurace Proxmark3 v Kali Linux</h4>
<h5>Systémové požadavky</h5>
<ul>
<li>Kali Linux (2024.1 nebo novější)</li>
<li>Připojení k internetu</li>
<li>USB port pro Proxmark3</li>
<li>Proxmark3 RDV4 (podporovány jsou i starší verze)</li>
</ul>
<h5>Instalace Proxmark3</h5>
<p>V Kali Linux je instalace velmi jednoduchá díky předpřipravenému balíčku:</p>
<pre><code class="language-bash">sudo apt update
sudo apt install proxmark3</code></pre>
<p>Velikost instalace je přibližně 5.70 MB.</p>
<h5>Nastavení oprávnění USB</h5>
<p>Po instalaci je třeba nastavit oprávnění pro USB zařízení. Kali Linux obvykle má již předkonfigurovaná potřebná pravidla, ale pro jistotu můžeme ověřit:</p>
<pre><code class="language-bash">sudo systemctl restart udev</code></pre>
<h5>Připojení Proxmark3</h5>
<ol>
<li>Připojte Proxmark3 do USB portu</li>
<li>Ověřte připojení:
<pre><code class="language-bash">lsusb | grep -i proxmark</code></pre>
<p>Měli byste vidět výstup podobný tomuto:</p>
<pre><code>Bus 001 Device 004: ID 9ac4:4b8f Proxmark3 RDV4.0</code></pre>
</li>
</ol>
<h5>Spuštění klienta</h5>
<pre><code class="language-bash">proxmark3 /dev/ttyACM0</code></pre>
<h5>Ověření funkčnosti</h5>
<pre><code class="language-bash">[PM3] --&gt; hw version
[=] Starting device side
[+] Prox/RFID mark3 RFID instrument
[+] Running on RDV4.0</code></pre>
<h4>4.2.2 Analýza původní karty</h4>
<p>Pro získání kompletních informací o originální kartě použijeme následující příkazy:</p>
<pre><code>[PM3] --&gt; hf mfu info
[+] Tag information for MIFARE Ultralight C
[+] UID: 04C5A1122A3480
[+] ATQA: 0044
[+] SAK: 00
[+] Card type: MIFARE Ultralight C
[+] Signature valid: true
[+] Block 0: 04C5A112
[+] Block 1: 2A3480A1
[+] Block 2: BA981248
[+] Pages total: 48
[+] Page size: 4 bytes</code></pre>
<h4>4.2.3 Význam parametrů</h4>
<ol>
<li>
<p><strong>SAK (Select Acknowledge)</strong></p>
<ul>
<li>Jednobajtová hodnota identifikující typ karty</li>
<li>Pro Mifare Ultralight C je SAK = 00</li>
<li>Čtečka používá SAK k určení typu karty a jejích schopností</li>
<li>Nesprávný SAK může vést k odmítnutí karty čtečkou</li>
</ul>
</li>
<li>
<p><strong>ATQA (Answer To Request Type A)</strong></p>
<ul>
<li>Dvoubajtová hodnota (v našem případě 0044)</li>
<li>Indikuje:
<ul>
<li>Typ kartové platformy</li>
<li>Komunikační schopnosti karty</li>
<li>Velikost UID (single, double, triple)</li>
</ul>
</li>
<li>Pro Mifare Ultralight C je standardní hodnota ATQA = 0044</li>
</ul>
</li>
</ol>
<h4>4.2.4 Vytvoření testovací karty</h4>
<p>Pro úplnou emulaci musíme nastavit všechny parametry:</p>
<pre><code>[PM3] --&gt; hf mf csetuid 04C5A1122A3480 --atqa 0044 --sak 00
[+] Setting UID: 04C5A1122A3480
[+] Setting ATQA: 0044
[+] Setting SAK: 00
[+] Success</code></pre>
<h3>4.3 Praktické testování</h3>
<h4>4.3.1 Časová náročnost operací</h4>
<table>
<thead>
<tr>
<th>Operace</th>
<th>Průměrný čas</th>
</tr>
</thead>
<tbody>
<tr>
<td>Čtení UID</td>
<td>0.1s</td>
</tr>
<tr>
<td>Klonování karty</td>
<td>2-3s</td>
</tr>
<tr>
<td>3DES autentizace</td>
<td>0.5s</td>
</tr>
<tr>
<td>Kompletní dump paměti</td>
<td>1-2s</td>
</tr>
</tbody>
</table>
<h4>4.3.2 Běžné problémy a řešení</h4>
<ol>
<li>
<p>Problém: Nečitelná karta</p>
<ul>
<li>Příčina: Špatné umístění karty</li>
<li>Řešení: Pohybujte kartou v oblasti čtečky</li>
</ul>
</li>
<li>
<p>Problém: Chyba autentizace</p>
<ul>
<li>Příčina: Nesprávný klíč</li>
<li>Řešení: Ověřte formát klíče</li>
</ul>
</li>
<li>
<p>Problém: Selhání zápisu</p>
<ul>
<li>Příčina: Lock bity</li>
<li>Řešení: Zkontrolujte konfiguraci paměti</li>
</ul>
<h1>4.2.1 Instalace a konfigurace Proxmark3 ve Windows</h1>
</li>
</ol>
<h2>Win. Systémové požadavky</h2>
<ul>
<li>Windows 10 nebo 11 (64-bit)</li>
<li>Připojení k internetu</li>
<li>USB port pro Proxmark3</li>
<li>Proxmark3 RDV4 (podporovány jsou i starší verze)</li>
<li>Git pro Windows</li>
<li>Visual Studio 2022 Community Edition s C++ build tools</li>
</ul>
<h2>Win. Instalace potřebného software</h2>
<ol>
<li>Stáhněte a nainstalujte Git pro Windows z <a href="https://git-scm.com/download/win">https://git-scm.com/download/win</a></li>
<li>Stáhněte a nainstalujte Visual Studio 2022 Community Edition
<ul>
<li>Při instalaci zvolte &quot;Desktop development with C++&quot;</li>
<li>Ujistěte se, že máte nainstalované Windows 10/11 SDK</li>
</ul>
</li>
</ol>
<h2>Win. Instalace Proxmark3</h2>
<p>Otevřete PowerShell jako administrátor a proveďte následující příkazy:</p>
<pre><code class="language-powershell">git clone https://github.com/RfidResearchGroup/proxmark3.git
cd proxmark3
.\mingw64.ps1
make clean &amp;&amp; make all</code></pre>
<h2>Win. Instalace ovladačů</h2>
<ol>
<li>Připojte Proxmark3 do USB portu</li>
<li>Otevřete Správce zařízení (Device Manager)</li>
<li>Najděte zařízení označené jako &quot;Proxmark3&quot;</li>
<li>Klikněte pravým tlačítkem a zvolte &quot;Aktualizovat ovladač&quot;</li>
<li>Vyberte &quot;Procházet počítač s ovladačem&quot;</li>
<li>Navigujte do složky proxmark3\driver\win64</li>
<li>Potvrďte instalaci ovladače</li>
</ol>
<h2>Win. Ověření instalace</h2>
<ol>
<li>Otevřete PowerShell v adresáři proxmark3</li>
<li>Spusťte příkaz:
<pre><code class="language-powershell">.\pm3.exe -p COM3</code></pre>
<p><em>Poznámka: COM3 může být jiné číslo, zkontrolujte ve Správci zařízení správný COM port</em></p>
</li>
</ol>
<h1>Win. Analýza původní karty</h1>
<p>Pro získání informací o originální kartě použijeme následující příkazy:</p>
<pre><code class="language-powershell">[PM3] --&gt; hf mfu info
[+] Tag information for MIFARE Ultralight C
[+] UID: 04C5A1122A3480
[+] ATQA: 0044
[+] SAK: 00
[+] Card type: MIFARE Ultralight C
[+] Signature valid: true
[+] Block 0: 04C5A112
[+] Block 1: 2A3480A1
[+] Block 2: BA981248
[+] Pages total: 48
[+] Page size: 4 bytes</code></pre>
<h1>Win. Význam parametrů</h1>
<h2>SAK (Select Acknowledge)</h2>
<ul>
<li>Jednobajtová hodnota identifikující typ karty</li>
<li>Pro Mifare Ultralight C je SAK = 00</li>
<li>Čtečka používá SAK k určení typu karty a jejích schopností</li>
<li>Nesprávný SAK může vést k odmítnutí karty čtečkou</li>
</ul>
<h2>ATQA (Answer To Request Type A)</h2>
<ul>
<li>Dvoubajtová hodnota (v našem případě 0044)</li>
<li>Indikuje:
<ul>
<li>Typ kartové platformy</li>
<li>Komunikační schopnosti karty</li>
<li>Velikost UID (single, double, triple)</li>
</ul>
</li>
<li>Pro Mifare Ultralight C je standardní hodnota ATQA = 0044</li>
</ul>
<h1>Win. Vytvoření testovací karty</h1>
<p>Pro úplnou emulaci musíme nastavit všechny parametry:</p>
<pre><code class="language-powershell">[PM3] --&gt; hf mf csetuid 04C5A1122A3480 --atqa 0044 --sak 00
[+] Setting UID: 04C5A1122A3480
[+] Setting ATQA: 0044
[+] Setting SAK: 00
[+] Success</code></pre>
<h1>Řešení běžných problémů ve Windows</h1>
<h2>Win. Problém s COM portem</h2>
<ul>
<li>Řešení: Zkontrolujte ve Správci zařízení správné číslo COM portu</li>
<li>Případně zkuste odpojit a znovu připojit zařízení</li>
</ul>
<h2>Win. Chyba při kompilaci</h2>
<ul>
<li>Řešení: Ujistěte se, že máte nainstalované všechny požadované komponenty Visual Studia</li>
<li>Zkuste spustit <code>make clean</code> před novou kompilací</li>
</ul>
<h2>Win. Ovladač není podepsaný</h2>
<ul>
<li>Řešení: Dočasně vypněte vynucení podpisu ovladačů v režimu spouštění Windows</li>
<li>Nebo použijte testovací režim Windows</li>
</ul>
<h2>Win. Problémy s právy</h2>
<ul>
<li>Řešení: Ujistěte se, že PowerShell běží jako administrátor</li>
<li>Zkontrolujte práva v složce instalace</li>
</ul>
<h3>4.4 Pokročilé zabezpečení</h3>
<h4>4.4.1 3DES Autentizace</h4>
<p>Mifare Ultralight C podporuje 3DES autentizaci, která by měla být implementována v každém bezpečném systému:</p>
<pre><code>[PM3] --&gt; hf mfu auth k 49454D4B41455242214E4143554F5946
[+] Authentication successful</code></pre>
<p>Proces 3DES autentizace zahrnuje:</p>
<ol>
<li>Generování náhodného čísla kartou</li>
<li>Šifrování čísla čtečkou pomocí 3DES klíče</li>
<li>Verifikace správnosti šifrování kartou</li>
<li>Vzájemná autentizace</li>
</ol>
<h4>4.4.2 Ekonomické aspekty zabezpečení</h4>
<h5>Náklady na implementaci</h5>
<ol>
<li>
<p>Základní systém (pouze UID)</p>
<ul>
<li>Hardware: 100-200€ na čtečku</li>
<li>Software: 500-1000€</li>
<li>Údržba: 100€/rok</li>
</ul>
</li>
<li>
<p>Plné zabezpečení (3DES)</p>
<ul>
<li>Hardware: 200-400€ na čtečku</li>
<li>Software: 2000-3000€</li>
<li>Údržba: 500€/rok</li>
</ul>
</li>
</ol>
<h5>Návratnost investice</h5>
<ul>
<li>Snížení rizika podvodu o 95%</li>
<li>Ochrana reputace</li>
<li>Snížení pojistných nákladů</li>
</ul>
<h4>4.4.3 Bezpečnostní doporučení</h4>
<p>Pro maximální zabezpečení systému doporučujeme:</p>
<ol>
<li>
<p>Implementace 3DES autentizace</p>
<ul>
<li>Použití unikátních klíčů pro každou kartu</li>
<li>Pravidelná obměna klíčů</li>
<li>Monitoring neúspěšných pokusů o autentizaci</li>
</ul>
</li>
<li>
<p>Zabezpečení paměti</p>
<ul>
<li>Nastavení lock bitů pro kritické sektory</li>
<li>Implementace přístupových podmínek</li>
<li>Pravidelná kontrola integrity dat</li>
</ul>
</li>
<li>
<p>Monitoring a auditing</p>
<ul>
<li>Logování všech přístupů</li>
<li>Detekce neobvyklých vzorů použití</li>
<li>Systém automatických alertů</li>
</ul>
</li>
</ol>
<h2>Závěr</h2>
<p>Spoléhání pouze na UID představuje kritické bezpečnostní riziko, které může mít fatální následky pro organizaci. V praxi se setkáváme s alarmující situací, kdy IT oddělení a management firem vědomě ignorují dostupné bezpečnostní mechanismy z důvodu úspory nákladů nebo pohodlnosti implementace. Tento přístup je obdobný jako instalace bezpečnostních dveří a následné jejich nezamykání.</p>
<p>Bezpečnostní aspekty přístupových systémů vyžadují důkladnou analýzu implementovaných technologií a jejich potenciálních zranitelností. Přestože komponenty přístupových systémů zpravidla disponují certifikací Národního bezpečnostního úřadu (NBÚ), v praxi se stále setkáváme s nasazením technologicky nedostatečných identifikačních metod.</p>
<p>Současná praxe využívání RFID (Radio-Frequency Identification) technologie, především v podobě bezkontaktních čipových karet, vykazuje značné bezpečnostní nedostatky. Kritickým příkladem je široce rozšířená platforma MIFARE Classic, jejíž proprietární šifrovací algoritmus Crypto-1 byl kompromitován již v roce 2008. Analogicky, konkurenční řešení HID Prox prokázalo závažné bezpečnostní nedostatky v roce 2009, kdy byla dokumentována možnost duplikace identifikačních tokenů.</p>
<p>Zvláště alarmující je rozšířená praxe implementace přístupových systémů založených výhradně na čtení unikátního identifikátoru karty (UID), která zcela opomíjí dostupné kryptografické zabezpečení. Tato metodika představuje významné bezpečnostní riziko.</p>
<p>Pro zajištění adekvátní úrovně zabezpečení je esenciální implementace moderních přístupových systémů využívajících robustní kryptografické algoritmy (3DES, AES). Doporučenými technologickými řešeními jsou například MIFARE DESFire EV1 nebo HID iCLASS, které reprezentují současný standard v oblasti fyzické bezpečnosti a kontroly přístupu.</p>
<p><a href="https://www.hardwired.dev/2024/12/20/spatne-zabezpeceni-nfc-dochazkovych-systemu-uid-only-autentizace/20240626_131754-210x210/"><img decoding="async" src="https://www.hardwired.dev/wp-content/uploads/2024/12/20240626_131754-210x210-1.webp" alt="" /></a></p>
<h3>Problémy současné praxe</h3>
<ul>
<li>IT oddělení často volí nejjednodušší řešení bez ohledu na bezpečnostní dopady</li>
<li>Management není ochoten investovat do &quot;neviditelných&quot; bezpečnostních opatření</li>
<li>Bezpečnostní incidenty jsou často řešeny až po jejich vzniku</li>
<li>Chybí proaktivní přístup k bezpečnosti</li>
</ul>
<h3>Důsledky nedbalého přístupu</h3>
<ul>
<li>Přímé finanční ztráty dosahující milionů korun</li>
<li>Poškození reputace firmy</li>
<li>Ztráta důvěry zákazníků a partnerů</li>
<li>Právní následky při úniku citlivých dat</li>
<li>Zvýšené náklady na následné řešení incidentů</li>
</ul>
<h3>Výzva k změně</h3>
<p>Implementace plných bezpečnostních mechanismů není volitelným luxusem, ale nezbytností v současném bezpečnostním prostředí. Je kritické, aby organizace:</p>
<ol>
<li>Přehodnotily svůj přístup k zabezpečení</li>
<li>Implementovaly dostupné bezpečnostní mechanismy v plném rozsahu</li>
<li>Pravidelně školily zaměstnance v oblasti bezpečnosti</li>
<li>Prováděly pravidelné bezpečnostní audity</li>
</ol>
<p>Náklady na prevenci jsou vždy výrazně nižší než potenciální škody způsobené bezpečnostním incidentem. V době, kdy jsou útoky na přístupové systémy stále sofistikovanější, si žádná organizace nemůže dovolit ignorovat základní bezpečnostní principy z důvodu domnělé úspory nákladů.</p>
<h2>Srovnání nákladů</h2>
<h3>Základní implementace (pouze UID)</h3>
<ul>
<li>Počáteční náklady: 50 000 Kč</li>
<li>Roční údržba: 10 000 Kč</li>
<li>Riziko incidentu: Vysoké</li>
<li>Potenciální škody: 1-10 milionů Kč</li>
</ul>
<h3>Plná implementace (3DES)</h3>
<ul>
<li>Počáteční náklady: 200 000 Kč</li>
<li>Roční údržba: 50 000 Kč</li>
<li>Riziko incidentu: Minimální</li>
<li>Potenciální škody: &lt;100 000 Kč</li>
</ul>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2024%2F12%2F20%2Fspatne-zabezpeceni-nfc-dochazkovych-systemu-uid-only-autentizace%2F&#038;via=hessevalentino&#038;related=hessevalentino%3AValentino%20Hesse%20OK2HSS" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2024/12/20/spatne-zabezpeceni-nfc-dochazkovych-systemu-uid-only-autentizace/">Špatné zabezpečení NFC docházkových systémů UID-only autentizace</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gitea a první soukromý repozitář</title>
		<link>https://www.hardwired.dev/2024/09/16/gitea-a-prvni-soukromy-repozitar/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Sun, 15 Sep 2024 22:15:31 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitea]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[self-hosted]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[windows]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=2348</guid>

					<description><![CDATA[<p>Článek navazuje na Gitea v Dockeru s daty na Synology a Gitea na veřejné subdoméně. Tentokrát si ukážeme, jak vytvořit &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2024/09/16/gitea-a-prvni-soukromy-repozitar/">Gitea a první soukromý repozitář</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Článek navazuje na <a href="https://www.hardwired.dev/2024/09/14/gitea-v-dockeru-s-daty-na-synology/">Gitea v Dockeru s daty na Synology</a> a <a href="https://www.hardwired.dev/2024/09/15/gitea-na-verejne-subdomene/">Gitea na veřejné subdoméně</a>. Tentokrát si ukážeme, jak vytvořit nový soukromý repozitář a posílat do něj změny.</p>
<h1>Předpoklady</h1>
<ul>
<li>Máme funkční Giteu na vlastní subdoméně, do které se dokážeme přihlásit</li>
<li>Byly provedeny všechny kroky z předchozích návodů</li>
<li>Článek se zaměřuje na Windows ale na Linuxu to bude to samé nebo hodně podobné</li>
<li>Na počítači máme funkční SSH a <a href="https://git-scm.com/">GIT</a>.</li>
</ul>
<h1>Vytvoření soukromého repozitáře</h1>
<p>Přihlásíme se do naší Gitey. <code>Pluskem</code> zvolíme nový repozitář. Zadáme název repozitáře, <code>soukromy-repo-na-smazani</code>. Vybereme <code>Nastavit repozitář jako soukromý</code> a potvrdíme. Vytvoří se prázdný repozitář.</p>
<h1>Vytvoření SSH klíče</h1>
<p>Pro komunikaci s repozitářem budeme používat <a href="https://cs.wikipedia.org/wiki/Secure_Shell">SSH</a>. Budeme muset vytvořit pár klíčů, soukromý a veřejný. Soukromý bude u nás na počítači a veřejný budeme nahrajeme k repozitáři, jako přístupový.</p>
<p>Ujistíme se že v <code>c:\Users\&lt;username&gt;</code> máme složku <code>.ssh</code>. Poté v terminálu zadáme příkaz na vygenerování klíče pro přístup do Gitea. </p>
<p><code>ssh-keygen -t rsa -b 4096 -C &quot;&lt;váš email&gt;&quot; -f ~/.ssh/gitea-example-com</code></p>
<p>To ve složce <code>.ssh</code> vytvoří dva soubory. <code>gitea-example-com</code> a <code>gitea-example-com.pub</code>. Ten druhý musíme nahrát k repozitáři.</p>
<h1>Přidání klíče do Gitea repozitáře</h1>
<p>Otevřeme si repozitář. <code>Nastavení &gt; Klíče pro nasazení &gt; Přidat klič pro nasazení</code>. Pojmenujeme si ho, například <code>Domácí klíč</code>. A obsah <code>gitea-example-com.pub</code> zkopírujeme do pole <code>Obsah</code>. Nesmíme zapomenout zaškrtnout volbu <code>Povolit zápis</code> a potvrdit.</p>
<h1>Nastavení SSH na počítači</h1>
<p>Pokud ve složce <code>c:\Users\&lt;username&gt;\.ssh</code> nemáte soubor <code>config</code>, vytvořte ho a přidejte následující.</p>
<pre><code>Host gitea.example.com
  HostName gitea.example.com
  User git
  Port 222
  IdentityFile c:\Users\&lt;username&gt;\.ssh\gitea-example-com
  IdentitiesOnly yes</code></pre>
<p>Pro hosta <code>gitea.example.com</code> se nastaví odpovídající <code>host name</code>, <code>uživatel</code>, <code>port</code> pro připojení a <code>cesta k privátnímu klíči</code>. Volba <code>IdentitiesOnly</code> zajistí, že pro konkrétního hosta se použijí parametry, které jsou nastaveny.</p>
<h1>Připojení repozitáře</h1>
<p>Buď můžete připojit už existující repozitář z vašeho počítače, nebo vytvoříte nový. Vytvoříme nový.</p>
<p>Vytvořte složku kde bude nový repozitář. Obecně se pojmenuje názvem repozitáře co jsme vytvořili na naší Gitea.</p>
<pre><code class="language-shell">mkdir soukromy-repo-na-smazani</code></pre>
<p>Přesuneme se do něj.</p>
<pre><code class="language-shell">cd soukromy-repo-na-smazani</code></pre>
<p>Inicializujeme prázdný repozitář.</p>
<pre><code class="language-shell">git init</code></pre>
<p>Vytvoříme první soubor <code>README.md</code>.</p>
<pre><code class="language-shell">touch README.md</code></pre>
<p>Vytvoříme hlavní větev <code>main</code>.</p>
<pre><code class="language-shell">git checkout -b main</code></pre>
<p>Přidáme soubor <code>README.md</code> do <code>git</code> repozitáře.</p>
<pre><code class="language-shell">git add README.md</code></pre>
<p>Vytvoříme první <code>commit</code>.</p>
<pre><code class="language-shell">git commit -m &quot;První commit&quot;</code></pre>
<p>Napojíme náš repozitář z Gitea.</p>
<pre><code class="language-shell">git remote add origin git@gitea.example.com:&lt;gitea username&gt;/soukromy-repo-na-smazani.git</code></pre>
<p>Odešleme změny do vzdáleného repozitáře.</p>
<pre><code class="language-shell">git push -u origin main</code></pre>
<p>Když se nyní podíváme do repozitáře na <code>gitea.example.com</code>, uvidíme náš první <code>commit</code>.</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2024%2F09%2F16%2Fgitea-a-prvni-soukromy-repozitar%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2024/09/16/gitea-a-prvni-soukromy-repozitar/">Gitea a první soukromý repozitář</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gitea na veřejné subdoméně</title>
		<link>https://www.hardwired.dev/2024/09/15/gitea-na-verejne-subdomene/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Sun, 15 Sep 2024 18:55:58 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitea]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[portainer]]></category>
		<category><![CDATA[reverse-proxy]]></category>
		<category><![CDATA[self-hosted]]></category>
		<category><![CDATA[subdomain]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=2345</guid>

					<description><![CDATA[<p>Volné pokračování Gitea v Dockeru s daty na Synology. Tentokrát nastavíme aby nám naše self-hostovaná Gitea jela na naší veřejné &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2024/09/15/gitea-na-verejne-subdomene/">Gitea na veřejné subdoméně</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Volné pokračování <a href="https://www.hardwired.dev/2024/09/14/gitea-v-dockeru-s-daty-na-synology/">Gitea v Dockeru s daty na Synology</a>. Tentokrát nastavíme aby nám naše self-hostovaná <a href="https://about.gitea.com/">Gitea</a> jela na naší veřejné doméně.</p>
<h1>Předpoklady</h1>
<ul>
<li>Máme nainstalovanou Giteu podle předchozího návodu.</li>
<li>Máme koupenou vlastní doménu. (pro tutoriál to bude <code>example.com</code>)</li>
<li>Používáme <a href="https://nginx.org/en/">Nginx</a> jako <a href="https://en.wikipedia.org/wiki/Reverse_proxy">reverzní proxy</a>.</li>
<li>Máme přistup do routeru nebo možnost přesměrovávat porty.</li>
<li>Už jste Giteu jednou spustili a nastavili admin účet.</li>
</ul>
<h1>Nastavení reverzní proxy</h1>
<p>Vytvoříme soubor <code>gitea.example.com</code>.</p>
<pre><code class="language-shell">nano /etc/nginx/sites-available/gitea.example.com</code></pre>
<pre><code>server {
    listen 80;
    server_name gitea.example.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name gitea.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://<ip adresa serveru s Gitea>:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}</code></pre>
<p>Při zadání <code>gitea.example.com</code> budou všechny požadavky přesměrovávány na server, kde sedí Gitea a naslouchá na portu 3000. Také se automaticky provede přesměrování z HTTP na HTTPS.</p>
<p>Certifikáty jsou pomocí <a href="https://letsencrypt.org/getting-started/">Let's Encrypt</a> a <a href="https://certbot.eff.org/">Certbot</a>, ale to je na jiný návod. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Poté je potřeba dostat <a href="https://cs.wikipedia.org/wiki/Symbolick%C3%BD_odkaz">symlink</a> do <code>/etc/nginx/sites-enabled</code>.</p>
<pre><code class="language-shell">sudo ln -s /etc/nginx/sites-available/gitea.example.com /etc/nginx/sites-enabled/</code></pre>
<p>Pak je dobré zkontrolovat, jestli Nginx naši novou konfiguraci vezme za svou.</p>
<pre><code class="language-shell">sudo nginx -t</code></pre>
<p>Jestli je vše OK, tak bude potřeba Nginx restartovat.</p>
<pre><code class="language-shell">sudo systemctl restart nginx</code></pre>
<p>Od teď bude <code>gitea.example.com</code> směrovat na naši Giteu.</p>
<h1>Nastavení Gitea</h1>
<p>Předpoklad je, že Gitea běží v kontejneru. Musíme upravit nastavení. Do <a href="https://www.docker.com/resources/what-container/">Docker kontejneru</a> se můžete dostat pomocí příkazové řádky <code>docker exec -it &lt;container_name_or_id&gt; /bin/bash</code>. Pokud máte rozchozený <a href="https://www.portainer.io/">Portainer</a>, stačí v něm kliknout na ikonku shellu a připojíte se do kontejneru jako <code>root</code>.</p>
<p>Po připojení do kontejneru bude pravděpodobně jako uživatel <code>root</code>. Gitea (v závislosti na typu image) má data uložena v <code>/data</code>. Ale jako uživatel <code>git</code>. Proto než začnete něco měnit, tak je dobré se přepnout za uživatele <code>git</code>. To provedete pomocí <code>su git</code>.</p>
<p>Bude potřeba udělat pár úprav v souboru <code>app.ini</code>, ten se nachází v <code>/data/gitea/conf</code>. (v Gitea kontejneru je dostupný editor <a href="https://www.atmos.albany.edu/daes/atmclasses/atm350/vi_cheat_sheet.pdf">VI</a>)</p>
<pre><code class="language-ini">DOMIAN = gitea.example.com
SSH_DOMAIN = gitea.example.com
ROOT_URL = https://gitea.example.com</code></pre>
<p>Tím nastavíme Giteu na naši doménu.</p>
<p>Je předpoklad, že je to soukromý git server, takže nechceme aby se tam mohli lidé samovolně registrovat. Takže je potřeba vypnout registrace. </p>
<pre><code class="language-ini">DISABLE_REGISTRATIONS = true</code></pre>
<p>Poté je potřeba kontejner restartovat.</p>
<h1>Přesměrování portů</h1>
<p>Gitea cotainer (pokud jste to nezměnili) propaguje porty 3000 (web) a 222 (ssh). Proto je potřeba zajistit aby byl port 222 zvenku dostupný a přesměrovával na server kde Gitea sedí. Jestli máte domácí router který sedí na veřejné IP adrese tak provedete přesměrování portů na něm.</p>
<h1>Závěr</h1>
<p>Existují ještě další nastavení, ale po těchto pár krocích by už měla Gitea fungovat na vaší doméně.</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2024%2F09%2F15%2Fgitea-na-verejne-subdomene%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2024/09/15/gitea-na-verejne-subdomene/">Gitea na veřejné subdoméně</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gitea v Dockeru s daty na Synology</title>
		<link>https://www.hardwired.dev/2024/09/14/gitea-v-dockeru-s-daty-na-synology/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Fri, 13 Sep 2024 22:39:52 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[gitea]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[synology]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=2336</guid>

					<description><![CDATA[<p>Gitea je self-hostovaná varianta Bitbucketu nebo GitHubu. V následujícím krátkém návodu se podíváme jak nainstalovat Giteu pomocí Dockeru a ukládat &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2024/09/14/gitea-v-dockeru-s-daty-na-synology/">Gitea v Dockeru s daty na Synology</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p><a href="https://about.gitea.com/">Gitea</a> je self-hostovaná varianta <a href="https://bitbucket.org/">Bitbucketu</a> nebo <a href="https://github.com/">GitHubu</a>. V následujícím krátkém návodu se podíváme jak nainstalovat Giteu pomocí <a href="https://www.docker.com/">Dockeru</a> a ukládat data na <a href="https://www.synology.com/en-us">Synology NAS</a>.</p>
<h1>Prerekvizity</h1>
<ul>
<li>Nainstalovaný a nastavený Docker</li>
<li>Nainstalovaný a nastavený Synology NAS</li>
</ul>
<h1>Myšlenka</h1>
<p>Pro spuštění Gitea serveru použijeme <a href="https://docs.docker.com/compose/">docker compose</a>. Gitea bude používat <a href="https://www.postgresql.org/">PostgreSQL</a> databázi. Pro ukládání dat jak pro Giteu, tak i pro Postgres, použijeme <a href="https://docs.docker.com/engine/storage/volumes/">docker volumes</a>. <code>Docker volumes</code> nebudou lokální, ale přes protokol <a href="https://cs.wikipedia.org/wiki/Network_File_System">NFS</a> budou směřovat na Synology NAS.</p>
<p>Pro potřeby tutoriálu bude mít server IP adresu <code>192.168.10.1</code> a Synology NAS <code>192.168.10.2</code>.</p>
<h1>Nastavení Synology</h1>
<p><code>Ovládací panel</code> &gt; <code>Souborové služby</code> &gt; <code>NFS</code> povolte službu <code>NFS</code>.</p>
<p><code>Ovládací panel</code> &gt; <code>Sdílená složka</code> &gt; <code>Vytvoření sdílené složky</code>. Název <code>docker-volumes</code>. Nepřiřazujeme oprávnění pro uživatele nebo skupiny.</p>
<p>Klikneme na složku <code>docker-volumes</code> a zvolíme upravit. Poté <code>Oprávnění NFS</code>. Klikneme na tlačítko <code>Vytvořit</code>. Do pole <code>Název hostitele nebo IP adresa</code> vložíme IP adresu našeho serveru, tedy <code>192.168.10.1</code>. Tím umožníme našemu serveru přístup k této složce. Dále nastavíme:</p>
<ul>
<li>Oprávnění: <code>Čtení/Zápis</code></li>
<li>Squash: <code>Žádné mapování</code></li>
<li>Zabezpečení: <code>sys</code></li>
<li>Povolit asynchronní</li>
<li>Povolit připojení z portů bez oprávnění (porty vyšší než 1024)</li>
<li>Umožňuje uživatelům přístup k připojeným podsložkám</li>
</ul>
<p>A uložíme.</p>
<p>Poté otevřeme <code>File Station</code> a v naší složce <code>docker-volumes</code> vytvoříme následující podsložky:</p>
<ul>
<li><code>gitea-data</code></li>
<li><code>gitea-postgres</code></li>
</ul>
<p>To je na Synology vše.</p>
<h1>docker-compose.yaml</h1>
<p>Konfigurační soubor vytvoří síť <code>gitea</code> kde na sebe uvidí kontejnery <code>gitea</code> a <code>gitea-db</code>. Vytvoří <code>dva volumes</code> a pomocí protokolu NFS je nasměruje na námi sdílenou složku v Synology NAS.</p>
<p>Docker-compose soubor můžeme spustit pomocí <code>docker-compose up -d</code>. Pokud máte na serveru nainstalovaný a spuštěný <a href="https://www.portainer.io/">Portainer</a>, tak jde <code>docker-compose konfigurace</code> spustit jako <a href="https://docs.portainer.io/user/docker/stacks">stack</a>.</p>
<p>Webové rozhraní poté bude přístupné na <code>http://192.168.10.1:3000</code>.</p>
<pre><code class="language-yaml">networks:
  gitea:

volumes:
  gitea-data:
    driver: local
    driver_opts:
      type: nfs
      o: addr=192.168.1.251,rw
      device: ":/volume1/docker-volumes/gitea-data"

  gitea-postgres:
    driver: local
    driver_opts:
      type: nfs
      o: addr=192.168.1.251,rw
      device: ":/volume1/docker-volumes/gitea-postgres"

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=gitea-db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=supersecretpassword
    restart: always
    networks:
      - gitea
    volumes:
      - gitea-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"
    depends_on:
      - gitea-db

  gitea-db:
    image: postgres:16
    container_name: gitea-db
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=supersecretpassword
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - gitea-postgres:/var/lib/postgresql/data</code></pre>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2024%2F09%2F14%2Fgitea-v-dockeru-s-daty-na-synology%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2024/09/14/gitea-v-dockeru-s-daty-na-synology/">Gitea v Dockeru s daty na Synology</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Vyšel Tails 6.0 &#8211; Svoboda na internetu je ještě bezpečnější.</title>
		<link>https://www.hardwired.dev/2024/03/03/vysel-tails-6-0-svoboda-na-internetu-je-jeste-bezpecnejsi/</link>
		
		<dc:creator><![CDATA[Valentino Hesse OK2HSS]]></dc:creator>
		<pubDate>Sun, 03 Mar 2024 13:27:09 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Různé]]></category>
		<category><![CDATA[anonimita]]></category>
		<category><![CDATA[bezpečnost]]></category>
		<category><![CDATA[cypher system]]></category>
		<category><![CDATA[freedom]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[šifrování]]></category>
		<category><![CDATA[svoboda]]></category>
		<category><![CDATA[tails]]></category>
		<category><![CDATA[tor]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=2102</guid>

					<description><![CDATA[<p>Úvod Tails 6.0 přináší řadu nových funkcí a vylepšení, které dále posilují anonymitu a soukromí uživatelů. Tails je operační systém &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2024/03/03/vysel-tails-6-0-svoboda-na-internetu-je-jeste-bezpecnejsi/">Vyšel Tails 6.0 – Svoboda na internetu je ještě bezpečnější.</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><h2><b>Úvod</b></h2>
<p><span style="font-weight: 400;">Tails 6.0 přináší řadu nových funkcí a vylepšení, které dále posilují anonymitu a soukromí uživatelů. Tails je operační systém zaměřený na anonymitu a soukromí, který je navržen tak, aby byl snadno použitelný i pro začátečníky. Používá se k ochraně uživatelů před sledováním a odposlechem online aktivit. Tails je založen na Debianu a je vybaven řadou nástrojů pro anonymní komunikaci a ochranu soukromí, včetně Tor Browseru, KeePassXC pro správu hesel a Electrum pro bitcoinové transakce.</span></p>
<blockquote>
<p class="post-title entry-title"><a href="https://www.hardwired.dev/2024/01/28/tails-anonymni-operacni-system-svobodny-a-soukromi-pristup-na-internet/" target="_blank" rel="noopener">Tails – anonymní operační systém, svobodný a soukromí přístup na internet</a></p>
</blockquote>
<h2><strong>Nové funkce v Tails 6.0</strong></h2>
<p><span style="font-weight: 400;">Mezi nejvýznamnější funkce patří. Automatické připojení externích zařízení: Tails 6.0 automaticky připojí externí úložná zařízení, USB klíčenky a externí pevné disky. Pokud úložné zařízení obsahuje šifrovaný oddíl, Tails 6.0 vám nabídne automatické odemknutí šifrování.</span></p>
<p><span style="font-weight: 400;">Ochrana před škodlivými USB zařízeními: Tails 6.0 ignoruje všechna USB zařízení, která jsou připojena, když je vaše obrazovka zamčená. To chrání před útoky, kdy by útočník mohl připojit k vašemu počítači škodlivé zařízení USB a spustit software, který by prolomil zabezpečení Tails.</span></p>
<p><span style="font-weight: 400;">Tmavý režim a noční světlo: Tails 6.0 umožňuje přepínat mezi světlým a tmavým režimem a aktivovat noční režim s teplejšími barvami a nižším jasem.</span></p>
<p><span style="font-weight: 400;">Snadnější screenshoty a screencasty: GNOME 43 v Tails 6.0 zavádí novou zkratku v systémové nabídce, která usnadňuje pořizování snímku obrazovky nebo nahrávání screencastu.</span></p>
<p><span style="font-weight: 400;">Snazší Gmail v Thunderbirdu: Díky změnám v Thunderbirdu i Gmailu je mnohem snazší nakonfigurovat účet Gmail v Thunderbirdu v Tails 6.0~rc1.</span></p>
<p><span style="font-weight: 400;">Diceware přístupové fráze v dalších 5 jazycích: Navrhované přístupové fráze pro trvalé úložiště se nyní generují také v katalánštině, němčině, italštině, portugalštině a španělštině.</span></p>
<p><strong>Další změny a aktualizace:</strong></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Tails 6.0 aktualizuje mnoho aplikací obsažených v Tails, včetně Electrum, KeePassXC, Metadata Cleaner, OnionShare, textového editoru, Inkscape, Audacity, GIMP a Kleopatra.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Byly odebrány funkce, které nejsou dostatečně spolehlivé nebo užitečné, včetně možnosti odebrat metadata ze souborů a vymazat volné místo na disku.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Byly opraveny některé problémy se speciálními znaky a nelatinkovými skripty na klávesnici na obrazovce.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Vylepšená ochrana před malwarem: Tails 6.0 přichází s aktualizovanými virovými databázemi a pokročilejšími nástroji na detekci a zneškodnění malwaru, čímž zaručuje ještě robustnější ochranu před online hrozbam</span><span style="font-weight: 400;">i.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Automatické připojování externích zařízení: Tails 6.0 automaticky připojí a zpřístupní v souborovém manažeru externí úložná zařízení, USB klíčenky a externí pevné disky. Pro šifrovaná zařízení nabídne možnost automatického odemknutí pomocí hesla či klíčového souboru. To šetří čas a minimalizuje riziko omylného připojení nezabezpečeného zařízení, které by mohlo ohrozit uživatele.</span></li>
</ul>
<h2><strong>Známé potíže v Tails 6.0~rc1</strong></h2>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Tails 6.0~rc1 není spolehlivě reprodukovatelný.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">OnionShare 2.6 má několik problémů, které můžou mít bezpečnostní důsledky.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Automatické připojení externích zařízení může narušovat některé funkce, jako je zálohování trvalého úložiště a Tails Cloner.</span></li>
</ul>
<h2><strong>Stažení Tails 6.0</strong></h2>
<p><span style="font-weight: 400;">Tails 6.0 je stále ve vývoji, ale testovací verzi 6.0~rc1 si můžete stáhnout z webu Tails.</span></p>
<p><span style="font-weight: 400;">Další informace:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Novinky v Tails 6.0: </span><a href="https://tails.net/news/version_6.0/index.en.html"><span style="font-weight: 400;">https://tails.net/news/version_6.0/index.en.html</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Známé potíže v Tails 6.0~rc1: [neplatná adresa URL byla odstraněna]_</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Dokumentace Tails: </span><a href="https://tails.net/doc/index.en.html"><span style="font-weight: 400;">https://tails.net/doc/index.en.html</span></a><span style="font-weight: 400;">Úvod do Tails</span></li>
</ul>
<h2><strong>Závěr</strong></h2>
<p><span style="font-weight: 400;">Tails 6.0 je významná aktualizace, která přináší řadu nových funkcí a vylepšení, které dále posilují anonymitu a soukromí</span></p>
<p>&nbsp;</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2024%2F03%2F03%2Fvysel-tails-6-0-svoboda-na-internetu-je-jeste-bezpecnejsi%2F&#038;via=hessevalentino&#038;related=hessevalentino%3AValentino%20Hesse%20OK2HSS" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2024/03/03/vysel-tails-6-0-svoboda-na-internetu-je-jeste-bezpecnejsi/">Vyšel Tails 6.0 – Svoboda na internetu je ještě bezpečnější.</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Orange Pi Zero 2W</title>
		<link>https://www.hardwired.dev/2023/09/16/orange-pi-zero-2w/</link>
		
		<dc:creator><![CDATA[Valentino Hesse OK2HSS]]></dc:creator>
		<pubDate>Sat, 16 Sep 2023 04:44:05 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry]]></category>
		<category><![CDATA[Allwinner H618]]></category>
		<category><![CDATA[Allwinner H618 Cortex-A53]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[orange pi]]></category>
		<category><![CDATA[Orange Pi Zero 2W]]></category>
		<category><![CDATA[pc]]></category>
		<category><![CDATA[raspberry]]></category>
		<category><![CDATA[SBC]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=1401</guid>

					<description><![CDATA[<p>Dostupnost jednodeskových počítačů Raspberry Pi se sice již podstatně zlepšila, ale stále existují modely, ke kterým se někteří prostě nedostanou &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2023/09/16/orange-pi-zero-2w/">Orange Pi Zero 2W</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Dostupnost jednodeskových počítačů Raspberry Pi se sice již podstatně zlepšila, ale stále existují modely, ke kterým se někteří prostě nedostanou protože je jich málo a je velká poptávka. Jeden z takových modelů je RPI Zero 2W. Pro ty, kteří hledají alternativu s podobnými možnostmi a výkonem, ale přesto odlišným přístupem, přichází do hry nový hráč: <strong>Orange Pi Zero 2W</strong>.</p>
<p>Podíváme se na to co Orange Pi Zero 2W nabízí a proč by mohl být zajímavou volbou pro ty, kteří se chtějí ponořit do světa jednodeskových počítačů. Porovnáme ho s RPI Zero 2W a zjistíme, jaký potenciál a možnosti přináší. Ať už jste začínající nadšenec do elektroniky nebo zkušený vývojář, Orange Pi Zero 2W by vás mohl překvapit svými schopnostmi a flexibilitou.</p>
<p>Pokud hledáte kompaktní, ale i výkonný jednodeskový počítače pro své projekty v oblasti IoT, inteligentní domácnosti nebo televizních boxů, Orange Pi Zero 2W by mohl být tím pravým řešením. Tento malý, ale výkonný SBC počítač je poháněno čtyřjádrovým procesorem <strong>Allwinner H618 Cortex-A53</strong> s frekvencí až <strong>1,5 GHz</strong> a nabízí širokou škálu možností a funkcí.</p>
<p>Podíváme se podrobněji na Orange Pi Zero 2W a zjistíme, proč je to tak výjimečné jednodeskové řešení. Prozkoumáme jeho specifikace, rozšiřitelnost, kompatibilitu s operačními systémy a mnoho dalšího. Pokud máte zájem o vývojové projekty, které vyžadují kompaktní a výkonný hardware, nebo jednoduše hledáte způsob, jak využít IoT technologie ve svém domově, tento článek vám poskytne všechny potřebné informace.</p>
<p>Podíváme se na jejich parametry:</p>
<h4 id="vlastnosti">Vlastnosti</h4>
<h3><strong>Raspberry</strong></h3>
<figure>
<table style="height: 589px;" width="417">
<thead>
<tr>
<th>Vlastnost</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
</tr>
<tr>
<td>Procesor</td>
<td>Broadcom BCM2710A1, quad-core 64-bit SoC (Arm Cortex-A53 @ 1GHz)</td>
</tr>
<tr>
<td>Paměť</td>
<td>512 MB LPDDR2</td>
</tr>
<tr>
<td>Konektivita</td>
<td>2,4GHz IEEE 802.11 b/g/n bezdrátová síť</td>
</tr>
<tr>
<td></td>
<td>Bluetooth 4.2 BLE</td>
</tr>
<tr>
<td></td>
<td>Vestavěná anténa</td>
</tr>
<tr>
<td></td>
<td>1 × rozhraní USB 2.0 s OTG</td>
</tr>
<tr>
<td></td>
<td>Kompatibilní s 40pinovými rozšiřujícími deskami HAT</td>
</tr>
<tr>
<td></td>
<td>Slot na microSD kartu</td>
</tr>
<tr>
<td></td>
<td>Mini HDMI port</td>
</tr>
<tr>
<td></td>
<td>CSI-2 konektor pro připojení kamery</td>
</tr>
<tr>
<td>Video</td>
<td>HDMI rozhraní</td>
</tr>
<tr>
<td></td>
<td>Kompozitní video</td>
</tr>
<tr>
<td></td>
<td>Dekódování H.264, MPEG-4 (1080p30)</td>
</tr>
<tr>
<td></td>
<td>Kódování H.264 (1080p30)</td>
</tr>
<tr>
<td></td>
<td>Grafika OpenGL ES 1.1, 2.0</td>
</tr>
<tr>
<td>Napájení</td>
<td>5V DC, 2,5A</td>
</tr>
<tr>
<td>Provozní teplota</td>
<td>-20 °C až +70 °C</td>
</tr>
<tr>
<td>Životnost produktu</td>
<td style="text-align: left;">Raspberry Pi Zero 2 W se bude vyrábět minimálně do ledna 2028</td>
</tr>
</tbody>
</table>
<h3><strong>Orange PI</strong></h3>
<table style="height: 576px;" width="528">
<tbody>
<tr>
<td>procesor</td>
<td class="td-list">Allwinner H618 čtyřjádrový procesor Cortex-A53 1,5 GHz</td>
</tr>
<tr>
<td>GPU</td>
<td class="td-list">Mali G31 MP2<br />
– Podpora OpenGL ES 1.0/2.0/3.2, OpenCL 2.0, Vulkan 1.1</td>
</tr>
<tr>
<td>RAM</td>
<td class="td-list">LPDDR4: 1GB/1,5GB/2GB/4GB (volitelné)</td>
</tr>
<tr>
<td>Paměť</td>
<td class="td-list">SPI Flash: 16 MB</td>
</tr>
<tr>
<td>Wi-Fi + BT</td>
<td class="td-list">Wi-Fi 5.0+BT 5.0, BLE</td>
</tr>
<tr>
<td>Video výstup</td>
<td class="td-list">1*Port Mini HDMI TX 2.0 s podporou 4K@60FPS</td>
</tr>
<tr>
<td>USB</td>
<td class="td-list">USB 2.0*2 typu C</td>
</tr>
<tr>
<td>Rozhraní SD karty</td>
<td class="td-list">1 * Rozhraní karty Micro SD</td>
</tr>
<tr>
<td>Rozhraní rozšíření</td>
<td class="td-list">24pinové rozšiřující rozhraní: USB2.0*2, 100M Ethernet rozhraní, rozhraní IR přijímače, audio výstup, TV-out, vypínač, uživatelsky definovaná tlačítka*2</td>
</tr>
<tr>
<td>40pin</td>
<td class="td-list">40pinové rozhraní pro rozšíření funkcí, podporující následující typy rozhraní:<br />
GPIO, UART, I2C, SPI, PWM</td>
</tr>
<tr>
<td>Zdroj energie</td>
<td class="td-list">Typ-C 5V2A</td>
</tr>
<tr>
<td>Podporovaný OS</td>
<td class="td-list">Android 12 TV, Debian 11, Debian 12, Ubuntu22.04, Ubuntu 20.04, Orange Pi OS (Arch)</td>
</tr>
<tr>
<td>Rozměr PCB</td>
<td class="td-list">30 mm x 65 mm x 1,2 mm</td>
</tr>
<tr>
<td>Hmotnost</td>
<td class="td-list">12,5 g</td>
</tr>
</tbody>
</table>
<p><a href="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img21.png"><img fetchpriority="high" decoding="async" class="size-full wp-image-1405 aligncenter" src="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img21.png" alt="" width="1200" height="670" srcset="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img21.png 1200w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img21-300x168.png 300w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img21-1024x572.png 1024w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img21-768x429.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></p>
<p><a href="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img22.png"><img decoding="async" class="size-full wp-image-1404 aligncenter" src="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img22.png" alt="" width="1282" height="835" srcset="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img22.png 1282w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img22-300x195.png 300w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img22-1024x667.png 1024w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img22-768x500.png 768w" sizes="(max-width: 1282px) 100vw, 1282px" /></a></p>
<p>&nbsp;</figure>
<p>&nbsp;</p>
<p>Orange Pi Zero 2W a Raspberry Pi Zero 2W jsou dva malé jednodeskové počítače, které nabízejí kompaktní a cenově dostupnou řešení pro vývojové projekty a domácí automatizaci. I když mají některé společné vlastnosti, jako je podpora Wi-Fi a Bluetooth, existují mezi nimi některé významné rozdíly.</p>
<p><strong>Prvním rozdílem je procesor. Orange Pi Zero 2W je vybaven čtyřjádrovým procesorem Allwinner H618 Cortex-A53 s frekvencí 1,5 GHz, zatímco Raspberry Pi Zero 2W používá procesor Broadcom BCM2710B0 Cortex-A53 s frekvencí 1,2 GHz. To dává Orange Pi mírnou výhodu výkonu.</strong></p>
<p><strong>Dalším rozdílem je grafický čip. Orange Pi Zero 2W používá Mali G31 MP2 s podporou OpenGL ES 1.0/2.0/3.2, OpenCL 2.0 a Vulkan 1.1, zatímco Raspberry Pi Zero 2W má VideoCore VI s podporou OpenGL ES 3.2, Vulkan a dalších standardů.</strong></p>
<p><strong>Co se týče paměti, Orange Pi Zero 2W nabízí různé konfigurace RAM, zatímco Raspberry Pi Zero 2W má pevně stanovenou 512 MB RAM.</strong></p>
<p>Raspberry Pi Zero 2W má také některé výhody v oblasti ekosystému a komunity. Raspberry Pi je známý svým rozsáhlým ekosystémem a obrovskou komunitou uživatelů, což znamená, že je k dispozici široká škála dokumentace, projektů a podpory.</p>
<p>Závěrem lze říci, že oba počítače mají svá specifická využití a výhody. Orange Pi Zero 2W nabízí větší výkon a flexibilitu v konfiguraci paměti, zatímco Raspberry Pi Zero 2W má silnou komunitu a ekosystém. Volba mezi nimi závisí na konkrétních požadavcích a potřebách vašeho projektu.</p>
<p><a href="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img23-e1694838797725.png"><img decoding="async" class="size-full wp-image-1403 aligncenter" src="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img23-e1694838797725.png" alt="" width="1008" height="514" srcset="https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img23-e1694838797725.png 1008w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img23-e1694838797725-300x153.png 300w, https://www.hardwired.dev/wp-content/uploads/2023/09/0825-zero2w-img23-e1694838797725-768x392.png 768w" sizes="(max-width: 1008px) 100vw, 1008px" /></a></p>
<p>Orange Pi Zero 2W přináší kompaktní a výkonné řešení pro vývojové projekty a domácí automatizaci. S Micro HDMI 2.0 a dvěma USB-C porty nabízí široké možnosti připojení periferií, a to včetně napájení. Duální WiFi5 a Bluetooth 5.0 s externí anténou zajišťují stabilní a rychlé bezdrátové připojení.</p>
<p>Navíc, s rozšiřující deskou, která obsahuje USB 2.0 konektory, RJ45 10/100 Mb/s, 3,5 mm audio jack, tlačítka a IR přijímač, je možné rozšířit funkcionalitu Orange Pi Zero 2W dle potřeby. S cenou od 16 (pro verzi s 1 GB RAM) do 24 dolarů (pro verzi s 4 GB RAM) je to cenově dostupný a výkonný mini počítač pro vaše projekty.</p>
<p>Rozšiřující deska je k dispozici za pouhých 5 dolarů, což je skvělý způsob, jak přizpůsobit Orange Pi Zero 2W vašim potřebám. Využijte tuto kompaktní a cenově dostupnou platformu pro své kreativní nápady a projekty.</p>
<p><strong>Závěr</strong></p>
<p>Pro technické nadšence, vývojáře a experimentátory nabízí Orange Pi Zero 2W kompaktní a cenově dostupnou platformu, která otevírá brány k různým inovativním projektům. S čtyřjádrovým procesorem, podporou Wi-Fi a Bluetooth, a širokým spektrem rozhraní pro rozšíření funkcí se stává ideálním společníkem pro tvorbu domácích automatizací, IoT zařízení, či vzdělávacích experimentů. Jeho výkon a flexibilita jej řadí mezi zajímavé alternativy na trhu jednodeskových počítačů. Orange Pi Zero 2W představuje nejen technickou výzvu, ale také základ pro vytvoření zajímavých projektů, které posunou vaše dovednosti a nápady na novou úroveň.</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2023%2F09%2F16%2Forange-pi-zero-2w%2F&#038;via=hessevalentino&#038;related=hessevalentino%3AValentino%20Hesse%20OK2HSS" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2023/09/16/orange-pi-zero-2w/">Orange Pi Zero 2W</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Puppeteer download BOT</title>
		<link>https://www.hardwired.dev/2022/10/31/puppeteer-download-bot/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Mon, 31 Oct 2022 13:35:28 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Různé]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[headless]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[puppeteer]]></category>
		<category><![CDATA[scraping]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web-scraping]]></category>
		<guid isPermaLink="false">http://wordpress.hardwired.dev/?p=774</guid>

					<description><![CDATA[<p>O co jde Uděláme bota co načte webovou stránku, klikne na čudlík a stáhne soubor. Použijeme k tomu knihovnu Puppeteer &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2022/10/31/puppeteer-download-bot/">Puppeteer download BOT</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><h1>O co jde</h1>
<p>Uděláme bota co načte webovou stránku, klikne na čudlík a stáhne soubor.</p>
<p>Použijeme k tomu knihovnu <a href="https://pptr.dev/" title="Puppeteer">Puppeteer</a> a samotný kód budeme pouštět v <a href="https://www.docker.com/" title="Dockeru">Dockeru</a>.</p>
<blockquote>
<p>Větší podrobnosti a vysvětlení zakládání NodeJs projektu v Dockeru najde v článku <a href="http://wordpress.hardwired.dev/nodejs-develompent-v-dockeru/" title="NodeJS develompent v Dockeru">NodeJS develompent v Dockeru</a>.</p>
</blockquote>
<h1>Příprava projektu</h1>
<p>Založíme nový projekt:</p>
<pre><code class="language-shell">mkdir puppet
cd puppet
npm init -y</code></pre>
<p>Upravíme <code>package.json</code> a přidáme do něj knihovnu <code>puppeteer</code>:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;puppet&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node index.js&quot;
  },
  &quot;keywords&quot;: [],
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;dependencies&quot;: {
    &quot;puppeteer&quot;: &quot;^19.2.0&quot;
  }
}</code></pre>
<p>Vytvoříme <code>Dockerfile</code>, který použije jako základ obraz s <code>node v16</code>, nainstaluje <code>Chrome prohlížeč</code> a nakopíruje projekt do Docker obrazu.</p>
<pre><code class="language-shell">FROM node:16

RUN apt-get update &amp;&amp; apt-get install gnupg wget -y &amp;&amp; \
  wget --quiet --output-document=- https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor &gt; /etc/apt/trusted.gpg.d/google-archive.gpg &amp;&amp; \
  sh -c &#039;echo &quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&quot; &gt;&gt; /etc/apt/sources.list.d/google.list&#039; &amp;&amp; \
  apt-get update &amp;&amp; \
  apt-get install google-chrome-stable -y --no-install-recommends &amp;&amp; \
  rm -rf /var/lib/apt/lists/*

ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
    PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome-stable

WORKDIR /app
COPY package*.json .
RUN npm install
COPY . ./</code></pre>
<p>Vytvoříme <code>index.js</code> soubor a necháme ho jen vypsat zprávu do konzole.</p>
<pre><code class="language-shell">touch index.js</code></pre>
<pre><code class="language-javascript">console.log(&#039;Hello from docker&#039;)</code></pre>
<p>Není úplně špatné vytvořit i <code>.dockerignore</code> soubor.</p>
<pre><code class="language-shell">node_modules
Dockerfile
.dockerignore
.git
.gitignore
README.md
docker-compose*</code></pre>
<p>Sestavíme obraz.</p>
<pre><code class="language-shell">docker build -t puppet-app-image .</code></pre>
<p>A spustíme Docker kontejner.</p>
<pre><code class="language-bash"># %cd% je aktuální složka ve Windows, pro jiné systémy použijte adekvátní náhradu

docker run -d --tty --name puppet-app -v %cd%:/app -v /app/node_modules puppet-app-image</code></pre>
<blockquote>
<p>--tty parametr je nutný. V opačném případě se Docker kontejner spustí a pak hned úspěšně ukončí. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Za normálních okolností předpokládá, že v něm něco poběží a až se to ukončí tak skončí taky. TTY toto chování potlačí.</p>
</blockquote>
<p>Jakmile kontejner běží, můžeme se do něj přihlásit:</p>
<pre><code class="language-shell">docker exec -it puppet-app bash</code></pre>
<p>Vevnitř se ocitneme ve složce <code>/app</code>, kde je náš projekt a můžeme zkusit spustit náš program.</p>
<pre><code class="language-shell">nodejs index.js</code></pre>
<p>Měl by nám odpovědět <code>Hello from docker</code>.</p>
<h1>Bot</h1>
<p>Pro ukázku bude bot stahovat zdrojový kód puppeteeru z githubu. Upravíme <code>index.js</code> následovně.</p>
<pre><code class="language-javascript">const puppeteer = require(&#039;puppeteer&#039;)

;(async () =&gt; {
    const browser = await puppeteer.launch({
        headless: true,
        args: [&#039;--no-sandbox&#039;],
    })

    const page = await browser.newPage()
    page.setViewport({ width: 1920, height: 1080 })

    const client = await page.target().createCDPSession()
    await client.send(&quot;Page.setDownloadBehavior&quot;, {
        behavior: &quot;allow&quot;,
        downloadPath: &#039;./&#039;
    })

    await page.goto(
        &#039;https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-core-v19.2.0&#039;,
        { waitUntil: &#039;networkidle2&#039; }
    )
    await page.waitForTimeout(1000)

    await page.click(&#039;#repo-content-turbo-frame div.mb-3 &gt; details &gt; div &gt; div &gt; ul &gt; li:nth-child(1) &gt; div.d-flex.flex-justify-start.col-12.col-lg-9 &gt; a&#039;)
    await page.waitForTimeout(5000)

    await page.screenshot({ path: &#039;./screen.jpg&#039;, fullPage: true })

    await browser.close()
})()</code></pre>
<p>Naimportujeme do našeho projektu knihovnu <code>puppeteer</code>.</p>
<pre><code class="language-javascript">const puppeteer = require(&#039;puppeteer&#039;)</code></pre>
<p>Budeme volat asynchronní funkce v java scriptu a budeme používat klíčové slovo <code>await</code>, které čeká na provedení asynchronní funkce. Problém je to, že <code>await</code> se může objevit jen v asynchronní funkci. Tudíž náš kód musíme do jedné takové zabalit a rovnou spustit.</p>
<pre><code class="language-javascript">;(async () =&gt; {
    // code
})()</code></pre>
<p>Vytvoříme nový <code>headless prohlížeč</code>.</p>
<pre><code class="language-javascript">const browser = await puppeteer.launch({
    headless: true,
    args: [&#039;--no-sandbox&#039;],
})</code></pre>
<p>Vytvoříme novou <code>stránku/tab</code> a nastavíme rozlišení.</p>
<pre><code class="language-javascript">const page = await browser.newPage()
page.setViewport({ width: 1920, height: 1080 })</code></pre>
<p>Pro tuto konkrétní stránku nastavíme automatické stahovaní do určitého adresáře. V našem případě adresář s projektem. Takhle nebudeme vyvolávat dialog pro umístění stahovaného souboru.</p>
<pre><code class="language-javascript">const client = await page.target().createCDPSession()
await client.send(&quot;Page.setDownloadBehavior&quot;, {
    behavior: &quot;allow&quot;,
    downloadPath: &#039;./&#039;
})</code></pre>
<p>V naší <code>stránce/tabu</code> otevřeme požadovanou github stránku.</p>
<pre><code class="language-javascript">await page.goto(
    &#039;https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-core-v19.2.0&#039;,
    { waitUntil: &#039;networkidle2&#039; }
)
await page.waitForTimeout(1000)</code></pre>
<p>Klikneme na odkaz pro stažení a chvíli počkáme, než se soubor stáhne <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<pre><code class="language-javascript">await page.click(&#039;#repo-content-turbo-frame div.mb-3 &gt; details &gt; div &gt; div &gt; ul &gt; li:nth-child(1) &gt; div.d-flex.flex-justify-start.col-12.col-lg-9 &gt; a&#039;)
await page.waitForTimeout(5000)</code></pre>
<p>K definování toho na co se má kliknout se používá <a href="https://www.w3schools.com/CSSREF/css_selectors.php" title="CSS Selector">CSS Selector</a> (<a href="https://drafts.csswg.org/selectors/" title="draft">draft</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors" title="mdn">mdn</a>). Ten pomocí html elementů, tříd, atributů a dalších dokáže sestavit unikátní cestu k prvku na stránce. Stránky generované nějakým frameworkem umí potrápit i s takhle dlouhým selektorem, jako v tomto případě.</p>
<p><img decoding="async" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/10/githubsource.jpg" alt="" /></p>
<p>Pak už si jen uděláme momentku, v jakém stavu stránku opouštíme.</p>
<pre><code class="language-javascript">await page.screenshot({ path: &#039;./screen.jpg&#039;, fullPage: true })</code></pre>
<p>A prohlížeč korektně zavřeme.</p>
<pre><code class="language-javascript">await browser.close()</code></pre>
<h1>Spuštění kódu</h1>
<p>V konzoli se připojíme k našemu kontejneru.</p>
<pre><code class="language-bash">docker exec -it puppet-app bash</code></pre>
<p>A spustíme našeho bota.</p>
<pre><code class="language-bash">node index.js</code></pre>
<p>Pokud vše proběhne, jak má, tak ve složce projektu budete mít jak stažený soubor, tak fotku stránky těsně před tím než jste ji opustili.</p>
<p><img decoding="async" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/10/puppeteer_screen.jpg" alt="" /></p>
<p>Toto je velice hrubý nástřel toho, co Puppeteer dokáže na konkrétním případě. Výhodou je, že se opravdu spustí prohlížeč, ve kterém můžeme ovládat i dynamicky generované <code>single page</code> aplikace. Nevýhodou je, že pokud se struktura stránky změní moc, tak musíte upravit i váš kód.</p>
<p>Happy coding!</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2022%2F10%2F31%2Fpuppeteer-download-bot%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2022/10/31/puppeteer-download-bot/">Puppeteer download BOT</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUI #1 &#8211; NCDU</title>
		<link>https://www.hardwired.dev/2022/10/20/tui-1-ncdu/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Thu, 20 Oct 2022 18:12:56 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Různé]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[du]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ncdu]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[tui]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[unix]]></category>
		<guid isPermaLink="false">http://wordpress.hardwired.dev/?p=670</guid>

					<description><![CDATA[<p>Nepravidelný občasník, který jednou za čas ukáže nějakou užitečnou nebo zajímavou tui (terminal user interface) aplikaci. du příkaz vám za &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2022/10/20/tui-1-ncdu/">TUI #1 – NCDU</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Nepravidelný občasník, který jednou za čas ukáže nějakou užitečnou nebo zajímavou <code>tui</code> (terminal user interface) aplikaci.</p>
<hr />
<p><code>du</code> příkaz vám za normálních okolností vrátí využití disku. Musíte ho teda trochu &quot;potunit&quot;, abyste nedostali kilometr dlouhý výpis, ale z trochou cviku se dá efektivně používat.</p>
<p>Když budete chtít zjistit kolik která složka v aktuálním adresáři zabírá, stačí do terminálu napsat:</p>
<pre><code class="language-shell">du -h --max-depth=1</code></pre>
<p>A dostanete pěkný výpis aktuální složky. Například:</p>
<pre><code>4.0K    ./.config
26M     ./.local
7.8M    ./.node-red
27M     ./.npm
0       ./bin
67M     .</code></pre>
<p>Co se vše dá s <code>du</code> dělat najdete v <a href="https://man7.org/linux/man-pages/man1/du.1.html">dokumentaci</a>.</p>
<p>Ale pokud jste jako já a stejně vždy ty parametry nějak zapomenete, tak pro vás existuje řešení v podobě <code>ncdu</code>. <a href="https://dev.yorhel.nl/ncdu">NCurses disk usage</a> (ncdu) je <code>tui</code> aplikace nad <code>du</code>, která vám umožní interaktivně procházet složky a zjišťovat jejich velikosti.</p>
<p>Na debianím systému se aplikace nachází v repozitářích.</p>
<pre><code class="language-shell">sudo apt install ncdu</code></pre>
<p>Pak už jen stačí do terminálu napsat:</p>
<pre><code class="language-shell">ncdu</code></pre>
<p>A začít zkoumat velikosti složek o trochu více interaktivně.</p>
<p><img decoding="async" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/10/ncdu.jpg" alt="" /></p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2022%2F10%2F20%2Ftui-1-ncdu%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2022/10/20/tui-1-ncdu/">TUI #1 – NCDU</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
