{"id":325,"date":"2026-05-11T17:57:06","date_gmt":"2026-05-11T15:57:06","guid":{"rendered":"https:\/\/blog.ctr24.co.pl\/?p=325"},"modified":"2026-05-11T18:00:10","modified_gmt":"2026-05-11T16:00:10","slug":"automatyzacja-deploy","status":"publish","type":"post","link":"https:\/\/blog.ctr24.co.pl\/?p=325","title":{"rendered":"Automatyzacja DEPLOY &#8211; GITHUB"},"content":{"rendered":"\n<pre class=\"wp-block-preformatted\">name: Deploy to Production<br><br>on:<br>  push:<br>    branches:<br>      - main<br>  workflow_dispatch:  # pozwala na manualne uruchomienie<br><br>jobs:                     # Definicja wszystkich zada\u0144 (jobs) w workflow<br>  deploy:                 # Nazwa joba \u2013 mo\u017cesz j\u0105 dowolnie zmieni\u0107<br>    runs-on: ubuntu-latest   # GitHub Actions uruchomi joba na maszynie Ubuntu<br><br>    steps:                # Lista krok\u00f3w wykonywanych w ramach joba<br>      - name: Checkout repo          # Nazwa kroku \u2013 tylko opis<br>        uses: actions\/checkout@v4    # Akcja GitHubowa, kt\u00f3ra pobiera kod repo do runnera<br><br>      - name: Deploy over SSH        # Drugi krok \u2013 wdro\u017cenie na serwer<br>        uses: appleboy\/ssh-action@v1.0.3   # Akcja umo\u017cliwiaj\u0105ca wykonanie komend przez SSH<br>        with:                        # Parametry przekazywane do akcji<br>          host: ${{ secrets.PROD_HOST }}      # Adres serwera produkcyjnego (z GitHub Secrets)<br>          username: ${{ secrets.PROD_USER }}  # U\u017cytkownik SSH (z Secrets)<br>          key: ${{ secrets.PROD_SSH_KEY }}    # Prywatny klucz SSH (z Secrets)<br>          script: |                  # Blok komend, kt\u00f3re zostan\u0105 wykonane na serwerze<br>            cd \/var\/www\/esp_gunicorn          # Przej\u015bcie do katalogu aplikacji<br>            git pull                           # Pobranie najnowszych zmian z repozytorium<br>            sudo systemctl restart esp_gunicorn.service   # Restart us\u0142ugi Gunicorna<br><br><br><br><br><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83e\udded Jak to przygotowa\u0107 krok po kroku<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1. Wygeneruj klucz SSH na swoim komputerze<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t ed25519 -C \"github-actions\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Powstaj\u0105 dwa pliki:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>id_ed25519<\/strong> \u2192 to wklejasz jako <code>PROD_SSH_KEY<\/code><\/li>\n\n\n\n<li><strong>id_ed25519.pub<\/strong> \u2192 to dodajesz na serwerze<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Dodaj publiczny klucz na serwerze<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Na serwerze:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/.ssh\necho \"TW\u00d3J_PUBLICZNY_KLUCZ\" &gt;&gt; ~\/.ssh\/authorized_keys\nchmod 600 ~\/.ssh\/authorized_keys\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. Dodaj sekrety w GitHub \u2192 Settings \u2192 Secrets \u2192 Actions<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Secret<\/th><th>Warto\u015b\u0107<\/th><\/tr><\/thead><tbody><tr><td><code>PROD_HOST<\/code><\/td><td>IP lub domena serwera<\/td><\/tr><tr><td><code>PROD_USER<\/code><\/td><td>u\u017cytkownik SSH<\/td><\/tr><tr><td><code>PROD_SSH_KEY<\/code><\/td><td>zawarto\u015b\u0107 pliku <code>id_ed25519<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd10 Gdzie s\u0105 sekrety GitHub Actions (2025 UI)<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Wejd\u017a na <strong>swoje repozytorium<\/strong> na GitHubie (np. <code>github.com\/TwojUser\/esp_gunicorn<\/code>)<\/li>\n\n\n\n<li>W g\u00f3rnym menu repo kliknij: <strong>Settings<\/strong> (to jest zak\u0142adka repozytorium, nie ustawienia konta)<\/li>\n\n\n\n<li>W lewym bocznym menu przewi\u0144 do sekcji: <strong>Security<\/strong><\/li>\n\n\n\n<li>Rozwi\u0144 j\u0105 i wybierz: <strong>Secrets and variables<\/strong><\/li>\n\n\n\n<li>Teraz zobaczysz dwie opcje:\n<ul class=\"wp-block-list\">\n<li><strong>Actions<\/strong> \u2190 to jest ta w\u0142a\u015bciwa<\/li>\n\n\n\n<li>Codespaces (ignorujemy)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Kliknij: <strong>Actions<\/strong><\/li>\n\n\n\n<li>Pojawi si\u0119 przycisk: <strong>New repository secret<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">I tutaj dodajesz:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>PROD_HOST<\/code><\/li>\n\n\n\n<li><code>PROD_USER<\/code><\/li>\n\n\n\n<li><code>PROD_SSH_KEY<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142adowy skrypt:<\/p>\n\n\n<div style=\"margin-bottom:50px\" class=\"wp-block-cblocks-coder-block\"><pre class=\"im-coder-block\" data-mode=\"sh\" data-theme=\"twilight\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\">on:\n  push:\n    branches:\n      - main\n  workflow_dispatch:  # pozwala na manualne uruchomienie\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Sprawdzenie nowosci w repozytorium\n        uses: actions\/checkout@v4\n\n      - name: Przes\u0142anie za pomoc\u0105 SSH\n        uses: appleboy\/ssh-action@v1.0.3\n        with:\n          host: host.adres.pl\n          username: ${{ secrets.PROD_USER }}\n          key: ${{ secrets.PROD_SSH_KEY }}\n          port: 5829\n          script: |\n            cd \/var\/www\/apps\/twoja_aplikacja\n            git pull\n          #  sudo systemctl restart twoja_aplikacja.service<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>name: Deploy to Productionon: push: branches: &#8211; main workflow_dispatch: # pozwala na manualne uruchomieniejobs: # Definicja wszystkich zada\u0144 (jobs) w<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,6,19],"tags":[],"class_list":["post-325","post","type-post","status-publish","format-standard","hentry","category-linux","category-python","category-tips"],"_links":{"self":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=325"}],"version-history":[{"count":4,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/325\/revisions"}],"predecessor-version":[{"id":369,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/325\/revisions\/369"}],"wp:attachment":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}