Tylko dla odwiedzających nasz blog: Dodatkowe 3 miesiące gratis + 10% zniżki na plan trzyletni YSBLOG10
Złap okazję

Jak korzystać z CI/CD na serwerze Linux z zachowaniem najlepszych praktyk bezpieczeństwa

CI/CD na serwerze Linux Automatyzuje budowanie, testowanie i wdrażanie kodu przy każdej zmianie. Aby z niego skorzystać: wybierz narzędzie CI/CD (Jenkins, GitHub Actions, GitLab CI), przygotuj bezpieczny host Linux, podłącz repozytorium, napisz potok (plik YAML/Jenkins) i wdróż za pośrednictwem SSH lub Docker z funkcją wycofywania i monitorowania.

Jeśli po raz pierwszy konfigurujesz CI/CD na serwerze Linux, ten przewodnik przeprowadzi Cię przez podstawy, wybór narzędzi, architekturę, bezpieczeństwo i kompleksową konfigurację z wykorzystaniem Jenkinsa lub GitHub Actions. Poznasz sprawdzone w praktyce praktyki z rzeczywistych wdrożeń, a także strategie zerowego przestoju z wykorzystaniem Dockera i… Nginx.

Czym jest CI/CD na serwerze Linux?

CI/CD (Continuous Integration/Continuous Delivery) to proces automatycznego budowania, testowania i wdrażania oprogramowania po zmianach w kodzie. Na serwerze Linux CI/CD zazwyczaj obejmuje proces, który kompiluje aplikację, uruchamia testy, buduje obraz artefaktu lub kontenera, a następnie wdraża ją do środowiska testowego lub produkcyjnego za pośrednictwem… SSH, Docker lub Kubernetes.

Jak korzystać z CI/CD na serwerze Linux z zachowaniem najlepszych praktyk bezpieczeństwa

Dlaczego warto używać CI/CD w systemie Linux?

Linux jest stabilny, bezpieczny i wszechobecny w infrastrukturze produkcyjnej. Bezproblemowo integruje się z Gitem, systemd, Dockerem i innymi systemami. Nginxi zapór sieciowych, co czyni go idealnym rozwiązaniem do niezawodnych, zautomatyzowanych wdrożeń. Dzięki CI/CD zespoły szybciej dostarczają oprogramowanie, zmniejszają liczbę błędów, standaryzują wydania i egzekwują testy – bez ręcznego przesyłania danych i doraźnych skryptów.

Wymagania wstępne i lista kontrolna środowiska

  • Serwer Linux (zalecany Ubuntu 22.04+ lub Debian 12+) z dostępem sudo
  • Repozytorium Git (GitHub, GitLab lub Bitbucket)
  • Domena i SSL/TLS w przypadku obsługi ruchu sieciowego (Let's Encrypt)
  • Skonfigurowano zaporę sieciową (UFW/iptables) i SSH Klawisze
  • Opcjonalnie: Docker i Docker Compose w przypadku wdrożeń kontenerowych
  • Wybrane narzędzie CI/CD: Jenkins, GitHub Actions (samodzielnie hostowany program uruchamiający) lub GitLab CI

Jak działa CI/CD w systemie Linux (architektura)

  • Programista przekazuje kod do głównej gałęzi lub gałęzi wydania.
  • Proces CI wyzwala i uruchamia testy jednostkowe/integracyjne.
  • Pipeline buduje artefakt (binarny, zip) lub obraz Dockera.
  • Krok CD wdraża na serwerze Linux: kopiuje pliki, uruchamia migracje, przeładowuje usługi i aktualizuje odwrotny serwer proxy.
  • Monitorowanie i rejestrowanie stanu urządzenia w celu weryfikacji, z możliwością wycofania zmian w przypadku awarii.

Wybór narzędzia CI/CD

Wybór odpowiedniego narzędzia zależy od hosta repozytorium, umiejętności zespołu i wymagań dotyczących zgodności. Poniżej przedstawiamy najpopularniejsze opcje. CI/CD na serwerach Linux.

Jenkins (samodzielny hosting)

  • Plusy: W pełni konfigurowalny, bogaty w wtyczki, działa wszędzie, świetny do złożonych potoków.
  • Wady: Wymaga konserwacji, stosowania poprawek, tworzenia kopii zapasowych i audytu wtyczek.
  • Najlepszy dla: Przedsiębiorstwa i zespoły potrzebujące kontroli lokalnej i zaawansowanej koordynacji.

GitHub Actions (samodzielnie hostowany Runner)

  • Plusy: Natywny dla GitHub, oparty na YAML, duży rynek, łatwe sekrety management.
  • Wady: Wymaga samodzielnego hostowania modułu uruchamiającego w celu wdrożenia w sieciach prywatnych.
  • Najlepszy dla: Zespoły już korzystające z GitHub, które chcą mieć prostą ścieżkę wdrażania.

GitLab CI / CD

  • Plusy: Wbudowany w GitLab, doskonała wizualizacja potoku, łatwe uruchamianie manage.
  • Wady: Wymaga GitLab; należy wziąć pod uwagę kwestie licencjonowania w dużej skali.
  • Najlepszy dla: Użytkownicy GitLab poszukujący jednej zintegrowanej platformy.

Krok po kroku: konfiguracja CI/CD na serwerze Linux

Utwórz użytkownika usługi, SSH Klucze i hartowanie

Uruchom te polecenia, aby utworzyć użytkownika wdrażania innego niż root, w razie potrzeby dodać dostęp do Dockera i przygotować SSH Klawisze. Aby zwiększyć bezpieczeństwo, wyłącz logowanie za pomocą hasła.

# Create user
sudo adduser ci
sudo usermod -aG sudo ci
# Optional: if using Docker
sudo usermod -aG docker ci

# Generate SSH key for CI (run as ci user)
sudo -u ci ssh-keygen -t ed25519 -C "ci@server"

# Harden SSH (disable password auth)
sudo sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl reload ssh

# Allow only required ports (SSH, HTTP, HTTPS)
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable

Kontenery ujednolicają wdrożenia i zwiększają bezpieczeństwo wycofywania zmian. Nginx zapewnia zakończenie protokołu TLS i routing blue-green/canary.

# Docker (Ubuntu)
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Nginx
sudo apt-get install -y nginx
sudo systemctl enable --now nginx

Opcja A: Jenkins na Linuksie (Freestyle lub Jenkinsfile)

Zainstaluj Jenkinsa, połącz się z repozytorium i zdefiniuj potok. Trzymaj Jenkinsa za TLS i ogranicz dostęp administratora.

# Install Jenkins (Ubuntu LTS)
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc >/dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list >/dev/null
sudo apt-get update && sudo apt-get install -y openjdk-17-jdk jenkins
sudo systemctl enable --now jenkins

Przykładowy plik Jenkinsfile dla aplikacji Dockerized z testami i etapem wdrożenia:

pipeline {
  agent any
  environment {
    REGISTRY = "registry.example.com/myapp"
    IMAGE = "${REGISTRY}:${env.GIT_COMMIT}"
  }
  stages {
    stage('Checkout') { steps { checkout scm } }
    stage('Build') { steps { sh 'docker build -t $IMAGE .' } }
    stage('Test')  { steps { sh 'pytest -q || npm test || true' } }
    stage('Push')  { steps { sh 'docker login -u $REG_USER -p $REG_PASS registry.example.com; docker push $IMAGE' } }
    stage('Deploy') {
      steps {
        sh 'ssh -o StrictHostKeyChecking=no ci@prod.example.com "APP_IMAGE=$IMAGE bash -s" < deploy.sh'
      }
    }
  }
  post { failure { mail to: 'devops@example.com', subject: 'Build Failed', body: "Check Jenkins #${env.BUILD_NUMBER}" } }
}

Opcja B: Akcje GitHub z samodzielnie hostowanym programem uruchamiającym

Zainstaluj program uruchamiający na serwerze Linux lub hoście kompilacji. Użyj sekretów repozytorium do przechowywania danych uwierzytelniających i ograniczenia uprawnień programu uruchamiającego.

# On the server as the ci user:
mkdir -p ~/actions-runner && cd ~/actions-runner
curl -o actions.tar.gz -L https://github.com/actions/runner/releases/latest/download/actions-runner-linux-x64-*.tar.gz
tar xzf actions.tar.gz
./config.sh --url https://github.com/ORG/REPO --token YOUR_TOKEN
./run.sh # or install as a service

Przykładowy przepływ pracy polegający na tworzeniu, testowaniu i wdrażaniu aplikacji Node.js przy użyciu Dockera:

name: CI/CD
on:
  push:
    branches: [ "main" ]
jobs:
  build-test-deploy:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - name: Install deps and test
        run: npm ci && npm test
      - name: Build image
        run: docker build -t myapp:${{ github.sha }} .
      - name: Deploy
        env:
          IMAGE_SHA: ${{ github.sha }}
        run: |
          APP_IMAGE="myapp:${IMAGE_SHA}" bash ./deploy.sh

Wdrożenia bez przestojów dzięki Dockerowi, Nginxi systemd

Niebiesko-zielony utrzymuje dwie wersje aktywne (niebieską i zieloną). Ruch zmienia się, gdy nowy kontener przejdzie kontrolę poprawności. Użyj Nginx bloki upstream i dowiązanie symboliczne lub zmienna wskazująca na aktywny port.

# /etc/nginx/conf.d/app.conf
upstream app_upstream {
    server 127.0.0.1:8081;  # blue
    # server 127.0.0.1:8082;  # green (toggle when ready)
}
server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://app_upstream;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Przykładowy skrypt wdrożenia, który obraca kontenery i je ponownie ładuje Nginx po badaniu kontrolnym:

#!/usr/bin/env bash
set -euo pipefail
IMAGE="${APP_IMAGE:-myapp:latest}"

# Determine target port
CURRENT=$(grep -q "8081" /etc/nginx/conf.d/app.conf && echo "blue" || echo "green")
if [ "$CURRENT" = "blue" ]; then
  NEW_PORT=8082
  OLD_PORT=8081
else
  NEW_PORT=8081
  OLD_PORT=8082
fi

# Run new container
docker rm -f myapp_new || true
docker run -d --name myapp_new -p ${NEW_PORT}:3000 --health-cmd="curl -f http://localhost:3000/health || exit 1" \
  --health-interval=10s --restart=always "$IMAGE"

# Wait for healthy
for i in {1..30}; do
  STATUS=$(docker inspect --format='{{json .State.Health.Status}}' myapp_new | tr -d '"')
  [ "$STATUS" = "healthy" ] && break
  sleep 2
done

# Switch Nginx upstream
sudo sed -i "s/${OLD_PORT}/${NEW_PORT}/" /etc/nginx/conf.d/app.conf
sudo nginx -t && sudo systemctl reload nginx

# Replace old container
docker rm -f myapp_old || true
docker rename myapp_new myapp_old

Najlepsze praktyki w zakresie bezpieczeństwa i zgodności

  • Zastosowanie SSH klucze (ed25519) i wyłącz logowanie hasłem; ogranicz użytkownika CI do najmniejszych uprawnień.
  • Przechowuj sekrety w sejfie narzędzia CI (GitHub Secrets, Jenkins Credentials, GitLab Variables).
  • Przypnij obrazy bazowe i zweryfikuj sumy kontrolne; skanuj obrazy za pomocą Trivy lub Grype.
  • Włącz zaporę sieciową, fail2ban i automatyczne aktualizacje zabezpieczeń.
  • Regularnie przeprowadzaj audyt i łataj narzędzia CI, usuwaj nieużywane wtyczki.
  • Rejestruj i monitoruj za pomocą systemd-journald, Prometheus/Node Exporter i Nginx dzienniki dostępu.
  • Postępuj zgodnie z normami CIS Benchmarks i wytycznymi OWASP ASVS dotyczącymi wzmacniania zabezpieczeń.

Monitorowanie, rejestry i wycofywanie zmian

  • Kontrole stanu zdrowia: Udostępnij punkty końcowe /health; CI czeka na „zdrowie” przed przełączeniem ruchu.
  • Obserwowalność: Użyj Prometheusa + Grafany lub managed APM (np. New Relic).
  • Ustrukturyzowane logi: Wyślij do Loki/ELK w celu przeprowadzenia wyszukiwania i otrzymywania alertów.
  • Cofnij: Zachowaj N-1 obrazów/tagów, poprzednie pliki .env i kopie zapasowe bazy danych; zautomatyzuj wycofywanie jako zadanie w ramach potoku.

Wskazówki dotyczące konkretnego stosu

node.js

  • Użyj pamięci podręcznej npm z kluczami pamięci podręcznej CI, aby przyspieszyć kompilację.
  • Użyj PM2 lub kontenera; unikaj instalacji globalnych w obrazach produkcyjnych.
  • Uruchom npm ci w celu uzyskania powtarzalnych zależności i npm audit w CI.

PHP/Laravel lub WordPress

  • Instalacja Composera –no-dev –optimize-autoloader w CI.
  • Uruchom PHP artisan migruj bezpiecznie z kopiami zapasowymi; w przypadku WordPress, kontrola wersji wp-content (motyw/wtyczki, które posiadasz).
  • Podawać przez Nginx + PHP-FPM; przeładuj PHP-FPM przy wdrażaniu w celu wyczyszczenia pamięci podręcznej kodów operacji.

Pythona/Django

  • Utwórz zablokowany plik requirements.txt za pomocą pip-compile.
  • Uruchom managePliki .py migrate i collectstatic na etapie CD.
  • Użyj Gunicorn za Nginx; wstępnie załaduj aplikację i ustaw łagodny limit czasu, aby ponownie uruchomić się bez przestoju.

Rozwiązywanie problemów i typowe pułapki

  • Przepustki rurociągowe, przerwy w aplikacji: Dodaj testy integracyjne/kontraktowe i kontrole stanu.
  • Problemy z uprawnieniami: Upewnij się, że użytkownik CI jest właścicielem katalogów wdrażania i członkiem grupy Docker.
  • Niestabilne kompilacje: Przypnij zależności, użyj powtarzalnych kompilacji i poprawnie buforuj.
  • Wyciek tajemnic: Nigdy nie ukrywaj sekretów w logach, maskuj dane wyjściowe i regularnie zmieniaj dane uwierzytelniające.
  • Przestój podczas wdrażania: Wprowadź niebiesko-zielony lub kanarkowy; unikaj ponownych uruchomień w miejscu bez sondowania gotowości.

Koszty, hosting i miejsce YouStable Pomaga

Do uruchomienia CI/CD w systemie Linux wymagane są niezawodne zasoby obliczeniowe, szybkie zasoby pamięci masowej i stabilne połączenie sieciowe. YouStableSerwery VPS i dedykowane z dyskami SSD zapewniają ochronę przed atakami DDoS za darmo SSLi pełny dostęp do roota idealny dla Jenkinsa, runnerów, Dockera i NginxNasz zespół wsparcia może udzielić Ci wskazówek dotyczących wzmacniania zabezpieczeń, tworzenia kopii zapasowych i dostrajania wydajności bez konieczności uzależniania się od konkretnego produktu.

FAQ

1. Jaki jest najłatwiejszy sposób skonfigurowania CI/CD na serwerze Linux?

Dla większości użytkowników GitHub najszybszą drogą jest GitHub Actions z samodzielnie hostowanym programem uruchamiającym. Zainstaluj program uruchamiający na serwerze Linux, przechowuj sekrety w GitHub i napisz przepływ pracy w formacie YAML do kompilacji, testowania i wdrażania za pośrednictwem Dockera lub… SSH.

2. Który z narzędzi, Jenkins czy GitHub Actions, jest lepszy w przypadku wdrożeń Linux?

Jenkins oferuje głęboką personalizację i kontrolę lokalną, idealną dla złożonych potoków. GitHub Actions jest prostszy, ściśle zintegrowany z GitHubem i idealny dla większości zespołów. Jeśli potrzebujesz ścisłej izolacji i niestandardowych agentów, wybierz Jenkinsa; jeśli zależy Ci na szybkości i prostocie, wybierz Actions.

3. Jak osiągnąć wdrożenia bez przestojów w systemie Linux?

Stosuj strategie niebiesko-zielone lub kanarkowe z Dockerem i NginxUruchom nową wersję na innym porcie, sprawdź jej stan i przełącz Nginx upstream i wycofaj stary kontener. Zawsze miej pod ręką obraz przywracania i kopię zapasową bazy danych.

4. Jak przechowywać i manage sekrety w CI/CD?

Wykorzystaj sekrety swojego narzędzia CI manager (GitHub Secrets, Jenkins Credentials, GitLab Variables). Nie zapisuj sekretów na stałe w kodzie ani obrazach. Regularnie wymieniaj tokeny, ogranicz zakres uprawnień i maskuj sekrety w logach.

5. Czy mogę używać CI/CD dla WordPressa na serwerze Linux?

TakKontroluj wersje swojego motywu i niestandardowych wtyczek, uruchamiaj automatyczne testy (PHPJednostka, linting), tworzenie zasobów i wdrażanie za pośrednictwem SSH lub Docker. Użyj Nginx + PHP-FPM, przeładuj PHP-FPM po wydaniu oraz wykonaj kopię zapasową bazy danych i przesłanych danych przed uruchomieniem aktualizacji lub migracji.

Przeczytaj także:

Podziel się przez:

Sanjeet Chauhan

Sanjeet Chauhan to bloger i ekspert SEO, który pomaga stronom internetowym rozwijać się organicznie. Dzieli się praktycznymi strategiami, praktycznymi wskazówkami i spostrzeżeniami, jak zwiększyć ruch, poprawić pozycję w wynikach wyszukiwania i zmaksymalizować obecność w sieci.

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewiń do góry