hihi
  • Home
  • About
  • Blog
  • Portfolio
  • Gallery
  • Contact
hihi

A software engineer's notebook — frontend, backend, databases, ops, and the things I learn between them.

Navigate

  • Home
  • Blog
  • Portfolio
  • About
  • Contact

Resources

  • RSS feed
  • Sitemap

Currently

  • Lead DB Specialist at Geoinfocom DM, Tashkent
  • Open to collaboration & writing

© 2026 Abdurakhmon Abduraimov. All quiet light reserved.

    All posts
    Web

    Linux serverda GitLab'ni Docker konteynerida ishga tushirish

    Docker yordamida Linux serverda GitLab'ni o'rnatish va sozlash bo'yicha bosqichma-bosqich amaliy qo'llanma.

    Abdurakhmon AbduraimovSeptember 9, 2026 9 min read 20 views

    Shaxsiy loyihalaringiz uchun GitHub yoki GitLab.com'ga pul to'lashning o'rniga, o'z serveringizda to'liq GitLab ishga tushirsangiz bo'ladi: cheksiz shaxsiy repozitoriylar, CI/CD, container registry — hammasi sizniki, kodingiz esa o'z diskingizda qoladi.

    Bu qo'llanmada nol holatdagi Linux serverdan boshlab, domenga ulangan, HTTPS bilan ishlaydigan GitLab CE'ni Docker konteynerlarida ko'taramiz.

    Nima quramiz

    KomponentVazifasiQayerda ishlaydi
    GitLab CEasosiy ilova (web, git, CI koordinatori)konteyner, 127.0.0.1:8080
    PostgreSQL 17GitLab bazasikonteyner, port ochilmaydi
    GitLab RunnerCI job'larini bajaradikonteyner (ixtiyoriy)
    nginxdomen, TLS, proksiserverning o'zida, konteynerda emas

    GitLab'ning o'zida ham ichki nginx va ichki postgres bor. Biz ikkalasini ham chetlab o'tamiz: baza alohida konteynerga chiqariladi (versiyani o'zingiz boshqarasiz, backup olish oson), TLS esa serverdagi nginx zimmasida qoladi — chunki odatda bitta serverda bir nechta sayt turadi va 80/443 portlari bitta proksiga tegishli bo'lgani ma'qul.

    Talablar

    MinimalTavsiya etiladi
    RAM4 GB8 GB
    CPU2 yadro4 yadro
    Disk20 GB50 GB+
    OSUbuntu 22.04 / Debian 12—

    Bulardan tashqari kerak bo'ladi:

    • Domen — masalan gitlab.example.com, DNS'da serveringiz IP'siga A yozuvi bilan yo'naltirilgan bo'lishi shart. Sertifikat aynan shu orqali olinadi.
    • 80 va 443 portlari ochiq bo'lishi kerak (sertifikat olish uchun 80 majburiy).
    • root huquqi (sudo).

    ⚠️ 4 GB da ishlaydi, lekin qiynaladi. GitLab bir vaqtning o'zida bir nechta Ruby jarayonini ko'taradi. Quyidagi konfiguratsiyada resurslar ataylab kamaytirilgan, shunga qaramay 4 GB'lik serverda swap yoqib qo'yishni tavsiya qilaman.


    1-qadam. Serverni tayyorlash

    Paketlarni yangilab olamiz:

    bash
    sudo apt update && sudo apt upgrade -y
    

    2-qadam. Docker'ni o'rnatish

    Docker allaqachon bo'lsa, bu bo'limni o'tkazib yuboring:

    bash
    docker --version
    

    2.1. Kerakli paketlar va GPG kaliti

    bash
    sudo apt install -y ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    

    Debian uchun: bu yerda va keyingi buyruqda linux/ubuntu o'rniga linux/debian deb yozing.

    2.2. Repozitoriyni ro'yxatga olish

    bash
    sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
    Types: deb
    URIs: https://download.docker.com/linux/ubuntu
    Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
    Components: stable
    Architectures: $(dpkg --print-architecture)
    Signed-By: /etc/apt/keyrings/docker.asc
    EOF
    

    2.3. Docker Engine'ni o'rnatish

    bash
    sudo apt update
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

    2.4. Ishga tushirish va tekshirish

    bash
    sudo systemctl enable --now docker
    sudo systemctl status docker
    

    enable --now xizmatni darhol ishga tushiradi va server qayta yuklanganda avtomatik ko'tarilishini ta'minlaydi. active (running) ko'rinsa, Docker tayyor.

    2.5. O'zingizni docker guruhiga qo'shish

    bash
    sudo usermod -aG docker $USER
    

    ⚠️ Busiz har bir docker buyrug'iga sudo yozishga majbur bo'lasiz. O'zgarish kuchga kirishi uchun sessiyadan chiqib, qayta kiring (exit va yana ssh), aks holda permission denied xatosi chiqaveradi.

    Bu guruh amalda root huquqiga teng: docker buyrug'i bor odam host'ning istalgan faylini konteyner orqali o'qiy oladi. Shaxsiy serverda muammo emas, lekin bilib qo'ygan ma'qul.


    3-qadam. Katalog tuzilmasini tashkil qilish

    Konteynerlar bilan ishlaganda barcha fayllarni bitta ildiz katalog ostida saqlash uzoq muddatda ancha qulaylik beradi. Men serverdagi hamma narsani /volumes ichiga joylashtiraman.

    Afzalligi ko'chirishda bilinadi: serverni almashtirish kerak bo'lsa, rsync yoki scp bilan butun /volumes ni yangi serverga nusxalash va u yerda docker compose up -d qilish yetarli.

    /volumes
    ├── configs/       # konfiguratsiya fayllari va .env fayllar
    ├── data/          # ilovalarning doimiy ma'lumotlari
    └── server-stack/  # ilovalarning source kodlari va compose fayllari
    
    KatalogNima yotadi
    configskonfiguratsiya va .env fayllar
    databaza, yuklangan fayllar — konteyner o'chsa ham qoladigan hamma narsa
    server-stackdocker-compose.yaml va source kodlar
    bash
    sudo mkdir -p /volumes/{configs,data,server-stack}
    

    Eslatma: server-stack majburiy emas — tayyor image'lar orqali ham deploy qilish mumkin. Ammo kodni shu yerda saqlash deploy jarayonini sezilarli yengillashtiradi.


    4-qadam. GitLab fayllarini yaratish

    Bundan keyingi buyruqlar /volumes ichida ishlaydi, u esa root'niki. Shuning uchun root sessiyasiga o'tib olamiz — aks holda permission denied bilan to'qnashasiz:

    bash
    sudo -i
    

    4.1. Kataloglar

    bash
    mkdir -p /volumes/data/gitlab-ce
    mkdir -p /volumes/server-stack/gitlab-ce/initdb
    

    4.2. Extension'lar uchun SQL fayl

    GitLab ishga tushishidan oldin bazada bir nechta PostgreSQL kengaytmasi mavjud bo'lishi shart. Rasmiy postgres image'i /docker-entrypoint-initdb.d papkasidagi .sql fayllarni baza birinchi marta yaratilayotganda o'zi bajaradi — shu qulaylikdan foydalanamiz:

    bash
    cat > /volumes/server-stack/gitlab-ce/initdb/01-extensions.sql <<'SQL'
    CREATE EXTENSION IF NOT EXISTS plpgsql;
    CREATE EXTENSION IF NOT EXISTS pg_trgm;
    CREATE EXTENSION IF NOT EXISTS btree_gist;
    CREATE EXTENSION IF NOT EXISTS btree_gin;
    SQL
    

    ⚠️ Bu skript faqat baza birinchi marta yaratilayotganda — ya'ni /volumes/data/gitlab-ce/postgres bo'sh bo'lganda — ishlaydi. Postgres konteynerini allaqachon ko'targan bo'lsangiz, fayl e'tiborsiz qoladi va kengaytmalarni qo'lda qo'shish kerak:

    bash
    docker exec -i gitlab-ce-postgres psql -U gitlab -d gitlabhq_production -c "CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE EXTENSION IF NOT EXISTS btree_gist; CREATE EXTENSION IF NOT EXISTS btree_gin;"
    

    4.3. docker-compose.yaml

    bash
    vim /volumes/server-stack/gitlab-ce/docker-compose.yaml
    

    Ichiga quyidagini joylashtiramiz:

    yaml
    # Bu fayl yonida `.env` turishi kerak — pastdagi 4.4-bo'limga qarang.
    # Domen va TLS host'dagi nginx zimmasida (6-qadam): konteyner faqat
    # 127.0.0.1:8080 ga chiqadi.
    
    services:
      gitlab-ce-postgres:
        image: postgres:17.11
        container_name: gitlab-ce-postgres
        hostname: gitlab-ce-postgres
        restart: unless-stopped
        stop_grace_period: 1m
        environment:
          # POSTGRES_USER rasmiy image'da superuser bo'ladi. Bu ataylab:
          # GitLab'ga kerak bo'lgan extension'lar superuser talab qiladi.
          POSTGRES_USER: gitlab
          POSTGRES_PASSWORD: ${GITLAB_DB_PASSWORD}
          POSTGRES_DB: gitlabhq_production
          POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C --data-checksums"
          # ⚠️ postgres:18 da standart PGDATA o'zgargan va bind-mount JIMGINA
          # e'tiborsiz qoladi — baza konteyner ichiga yozilib, keyingi
          # `up -d` da yo'qoladi. Aniq yozib qo'yish kelajakda ham himoya qiladi.
          PGDATA: /var/lib/postgresql/data
          TZ: UTC
          PGTZ: UTC
        volumes:
          - /volumes/data/gitlab-ce/postgres:/var/lib/postgresql/data
          # Extension'lar shu yerdan o'rnatiladi (faqat birinchi startda).
          - /volumes/server-stack/gitlab-ce/initdb:/docker-entrypoint-initdb.d:ro
        networks:
          - gitlab-db
        shm_size: 256mb
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U gitlab -d gitlabhq_production"]
          interval: 10s
          timeout: 5s
          retries: 5
          start_period: 30s
        logging:
          driver: json-file
          options:
            max-size: "10m"
            max-file: "3"
        deploy:
          resources:
            limits:
              memory: 1g
        command:
          - "postgres"
          - "-c"
          - "max_connections=200"
          - "-c"
          - "shared_buffers=256MB"
          - "-c"
          - "effective_cache_size=768MB"
          - "-c"
          - "work_mem=8MB"
          - "-c"
          - "maintenance_work_mem=128MB"
          - "-c"
          - "random_page_cost=1.1"
    
      gitlab-ce:
        image: gitlab/gitlab-ce:19.3.1-ce.0
        container_name: gitlab-ce
        # Bu qiymat email va klon URL'lariga tushadi — haqiqiy domen bo'lsin.
        hostname: ${GITLAB_HOST}
        restart: unless-stopped
        # GitLab sekin o'chadi; kam bersangiz SIGKILL bilan o'ladi va keyingi
        # startda postgres recovery qilishga majbur bo'ladi.
        stop_grace_period: 5m
        shm_size: 256m
        environment:
          TZ: UTC
          # Omnibus bu blokni HAR STARTDA o'qib, gitlab.rb ga qo'llaydi.
          GITLAB_OMNIBUS_CONFIG: |
            external_url 'https://${GITLAB_HOST}'
            gitlab_rails['time_zone'] = 'UTC'
    
            # ⚠️ Kalit nomiga e'tibor: server sozlamalari
            # `gitlab_rails['nginx'][...]` ostida. Yalang'och `nginx['listen_port']`
            # deb yozsangiz JIMGINA e'tiborsiz qoladi.
            # Bu 80 — konteyner ICHIDAGI port.
            gitlab_rails['nginx']['listen_port'] = 80
            gitlab_rails['nginx']['listen_https'] = false
            gitlab_rails['nginx']['redirect_http_to_https'] = false
    
            # Busiz loglarda va "oxirgi kirish IP" da docker shlyuzi ko'rinadi,
            # foydalanuvchining haqiqiy IP'si emas.
            gitlab_rails['nginx']['real_ip_trusted_addresses'] = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']
    
            # TLS'ni nginx uzadi; busiz GitLab o'zi sertifikat olmoqchi bo'ladi.
            letsencrypt['enable'] = false
    
            # ⚠️ Quyidagi `ports:` dagi SSH porti bilan AYNAN bir xil bo'lsin,
            # aks holda GitLab noto'g'ri klon URL'ini ko'rsatadi.
            gitlab_rails['gitlab_shell_ssh_port'] = ${GITLAB_SSH_PORT:-2222}
    
            # ── Tashqi postgres ──────────────────────────────────────────────
            postgresql['enable'] = false          # ichki postgres o'chirilgan
            gitlab_rails['db_adapter'] = 'postgresql'
            gitlab_rails['db_encoding'] = 'unicode'
            gitlab_rails['db_host'] = 'gitlab-ce-postgres'   # konteyner nomi
            gitlab_rails['db_port'] = 5432
            gitlab_rails['db_database'] = 'gitlabhq_production'
            gitlab_rails['db_username'] = 'gitlab'
            gitlab_rails['db_password'] = '${GITLAB_DB_PASSWORD}'
            gitlab_rails['db_sslmode'] = 'disable'
    
            # ── Kichik server uchun resurs kamaytirish ───────────────────────
            puma['worker_processes'] = 2
            puma['min_threads'] = 1
            puma['max_threads'] = 4
            sidekiq['concurrency'] = 9          # ⚠️ 'max_concurrency' EMAS
    
            prometheus_monitoring['enable'] = false   # ~300 MB RAM tejaydi
            gitlab_kas['enable'] = false
            registry['enable'] = false
            gitlab_pages['enable'] = false
    
            gitlab_rails['backup_keep_time'] = 604800   # ichki backup, 7 kun
        volumes:
          # ⚠️ Bu yerdagi gitlab-secrets.json YO'QOLSA — 2FA, CI o'zgaruvchilari
          # va saqlangan tokenlar qaytarib bo'lmas darajada ochilmay qoladi.
          - /volumes/data/gitlab-ce/config:/etc/gitlab
          - /volumes/data/gitlab-ce/logs:/var/log/gitlab
          - /volumes/data/gitlab-ce/data:/var/opt/gitlab
        ports:
          # Web: 127.0.0.1 ga bog'langan, ya'ni internetdan ko'rinmaydi —
          # unga faqat shu serverdagi nginx kira oladi.
          # nginx boshqa mashinada bo'lsa `127.0.0.1:` ni olib tashlang.
          - "127.0.0.1:${GITLAB_HTTP_PORT:-8080}:80"
          # Git-over-SSH. 22 emas — u host'ning o'z sshd'siniki.
          # ⚠️ Docker DNAT ufw'dan oldin ishlaydi, ya'ni bu portni ufw bilan
          # yopa olmaysiz. Kerak bo'lmasa shu qatorni o'chiring (HTTPS orqali
          # klon qilish baribir ishlayveradi).
          - "${GITLAB_SSH_PORT:-2222}:22"
        networks:
          - gitlab-db
        depends_on:
          gitlab-ce-postgres:
            # GitLab startda migratsiyalarni ishga tushiradi — baza tayyor
            # bo'lmasa yiqiladi.
            condition: service_healthy
        healthcheck:
          # ⚠️ Image'ning o'z healthcheck'i YOLG'ON YASHIL beradi: web umuman
          # ko'tarilmagan holatda ham `docker ps` da `healthy` ko'rinadi.
          # Shuning uchun to'g'ridan-to'g'ri HTTP so'raladi.
          test: ["CMD", "/opt/gitlab/embedded/bin/curl", "-fsS", "-o", "/dev/null",
                 "http://127.0.0.1:80/-/health"]
          interval: 60s
          timeout: 30s
          retries: 5
          # ⚠️ Birinchi start 5-10 daqiqa (reconfigure + migratsiyalar).
          start_period: 15m
        logging:
          driver: json-file
          options:
            max-size: "50m"
            max-file: "5"
        deploy:
          resources:
            limits:
              # Rasmiy tavsiya 16 GB; yuqoridagi kamaytirishlar bilan GitLab
              # odatda ~4 GB atrofida turadi. 6g — shift, kafolat emas.
              memory: 6g
    
      gitlab-runner:
        image: gitlab/gitlab-runner:alpine-v19.3.1   # GitLab bilan bir xil major
        container_name: gitlab-ce-runner
        hostname: gitlab-ce-runner
        restart: unless-stopped
        depends_on:
          - gitlab-ce
        environment:
          TZ: UTC
        volumes:
          - /volumes/data/gitlab-ce/runner:/etc/gitlab-runner
          # ⚠️ Bu qator xavfli: docker executor job'larni HOST demoni orqali
          # ishga tushiradi, ya'ni .gitlab-ci.yml ga kod yoza oladigan har kim
          # amalda host'da root. Repolaringiz shaxsiy bo'lsa maqbul; aks holda
          # dind (docker-in-docker) variantini ko'ring.
          # CI kerak bo'lmasa — butun `gitlab-runner` servisini o'chirib
          # tashlang, GitLab busiz ham to'liq ishlaydi.
          - /var/run/docker.sock:/var/run/docker.sock
        networks:
          # Ataylab GitLab bilan bir tarmoqda emas — runner GitLab'ga public
          # https://${GITLAB_HOST} orqali boradi.
          - gitlab-ci
        logging:
          driver: json-file
          options:
            max-size: "10m"
            max-file: "3"
        deploy:
          resources:
            limits:
              # Job konteynerlari bu limitga KIRMAYDI — ular alohida tug'iladi.
              memory: 512m
    
    networks:
      gitlab-ci:
        name: gitlab-ci
        driver: bridge
      gitlab-db:
        name: gitlab-db
        driver: bridge
    

    4.4. .env fayli

    Compose ichidagi ${GITLAB_HOST} kabi qiymatlar .env faylidan olinadi. Docker Compose bu faylni compose fayli turgan papkadan o'zi topib o'qiydi — alohida ko'rsatish shart emas, nomi aynan .env bo'lsa kifoya.

    Avval baza uchun parol generatsiya qilamiz:

    bash
    openssl rand -hex 24
    

    So'ng faylni yaratamiz:

    bash
    vim /volumes/server-stack/gitlab-ce/.env
    
    bash
    GITLAB_HOST=gitlab.example.com
    GITLAB_DB_PASSWORD=yuqorida-generatsiya-qilingan-parol
    GITLAB_HTTP_PORT=8080
    GITLAB_SSH_PORT=2222
    
    O'zgaruvchiMajburiymiNima uchun
    GITLAB_HOSThaGitLab ochiladigan domen. DNS'da serveringiz IP'siga yo'naltirilgan bo'lsin
    GITLAB_DB_PASSWORDhapostgres paroli. Baza birinchi ko'tarilishda aynan shu parol bilan yaratiladi
    GITLAB_HTTP_PORTyo'q (8080)nginx proksi qiladigan port. 8080 band bo'lsa boshqasini yozing
    GITLAB_SSH_PORTyo'q (2222)git clone ssh://... uchun port. 22 ni yozmang — u serverning o'z SSH'iniki

    Faylda parol borligi uchun ruxsatni cheklaymiz:

    bash
    chmod 600 /volumes/server-stack/gitlab-ce/.env
    

    ⚠️ Parolni keyin o'zgartirsangiz. Baza allaqachon eski parol bilan yaratilgan bo'ladi va .env ni tahrirlash unga ta'sir qilmaydi — GitLab ulanolmay qoladi. Parolni bazada ham almashtirish kerak:

    bash
    docker exec -it gitlab-ce-postgres psql -U gitlab -d gitlabhq_production \
      -c "ALTER USER gitlab WITH PASSWORD 'yangi-parol';"
    

    Va albatta: .env ni hech qachon git'ga qo'shmang.


    5-qadam. Ishga tushirish

    bash
    cd /volumes/server-stack/gitlab-ce
    docker compose up -d
    

    Birinchi start 5-10 daqiqa davom etadi: GitLab bu vaqtda reconfigure qiladi va baza migratsiyalarini bajaradi. Kuzatib turish uchun:

    bash
    docker compose logs -f gitlab-ce
    

    Loglarda Configuration complete qatorini kutamiz. Holatni ko'rish:

    bash
    docker ps --format 'table {{.Names}}\t{{.Status}}'
    

    gitlab-ce avvaliga health: starting bo'lib turadi — bu normal. nginx'ga o'tishdan oldin konteynerning o'zini tekshiramiz:

    bash
    curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/-/health
    

    200 qaytsa, GitLab tayyor. 502 yoki bo'sh javob kelsa — hali ko'tarilmagan, kutasiz.


    6-qadam. nginx va HTTPS

    nginx serverning o'zida ishlaydi. O'rnatilmagan bo'lsa:

    bash
    sudo apt install -y nginx certbot python3-certbot-nginx
    

    Faervolda portlarni ochamiz:

    bash
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    

    Konfiguratsiya faylini yaratamiz:

    bash
    sudo vim /etc/nginx/sites-available/gitlab.conf
    

    Boshiga faqat HTTP blokini yozamiz — sertifikatni certbot shu blok orqali oladi:

    nginx
    server {
        listen 80;
        server_name gitlab.example.com;
    
        client_max_body_size 0;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            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;
            proxy_read_timeout 300s;
        }
    }
    

    Faollashtiramiz:

    bash
    sudo ln -s /etc/nginx/sites-available/gitlab.conf /etc/nginx/sites-enabled/
    sudo nginx -t && sudo systemctl reload nginx
    

    Endi sertifikat olamiz — certbot faylni o'zi tahrirlab, 443 blokini va HTTP'dan HTTPS'ga yo'naltirishni qo'shadi:

    bash
    sudo certbot --nginx -d gitlab.example.com
    

    ⚠️ client_max_body_size 0 — eng ko'p vaqt yeydigan xato shu. nginx'ning standarti 1 MB, ya'ni busiz biroz kattaroq git push yoki LFS fayli 413 Request Entity Too Large bilan yiqiladi, sabab esa GitLab loglarida ko'rinmaydi.

    ⚠️ X-Forwarded-Proto — busiz GitLab so'rovni HTTP deb o'ylab, brauzerni cheksiz redirect'ga tushiradi.


    7-qadam. Birinchi kirish va xavfsizlik

    GitLab birinchi startda root uchun tasodifiy parol generatsiya qiladi:

    bash
    docker exec gitlab-ce grep 'Password:' /etc/gitlab/initial_root_password
    

    Brauzerda https://gitlab.example.com ni ochib, root va shu parol bilan kiring.

    ⚠️ initial_root_password fayli 24 soatdan keyin avtomatik o'chiriladi. Kirgan zahotingiz parolni almashtiring: o'ng yuqoridagi avatar → Edit profile → Password.

    Parolni boy bersangiz, uni konteyner ichidan tiklash mumkin:

    bash
    docker exec -it gitlab-ce gitlab-rake "gitlab:password:reset[root]"
    

    Shaxsiy server bo'lsa, birinchi navbatda ochiq ro'yxatdan o'tishni yopib qo'ying — aks holda GitLab'ingizda istalgan odam hisob ochishi mumkin:

    Admin Area → Settings → General → Sign-up restrictions → Sign-up enabled belgisini olib tashlang.

    SSH kalitingizni qo'shgach (Edit profile → SSH Keys), klon qilish quyidagicha bo'ladi:

    bash
    git clone ssh://git@gitlab.example.com:2222/username/loyiha.git
    

    8-qadam. Runner'ni ro'yxatdan o'tkazish (ixtiyoriy)

    CI kerak bo'lmasa, bu qadamni o'tkazib yuboring — compose'dagi gitlab-runner servisini butunlay o'chirib tashlasangiz ham bo'ladi.

    Yangi GitLab versiyalarida runner avval interfeysda yaratiladi: Admin Area → CI/CD → Runners → New instance runner. Yaratgach glrt- bilan boshlanadigan token beriladi:

    bash
    docker exec -it gitlab-ce-runner gitlab-runner register \
      --non-interactive \
      --url https://gitlab.example.com \
      --token glrt-XXXXXXXXXXXXXXXX \
      --executor docker \
      --docker-image alpine:3.20 \
      --docker-volumes /var/run/docker.sock:/var/run/docker.sock
    

    Oxirgi qator job'lar ichida docker build qilish imkonini beradi. config.toml /volumes/data/gitlab-ce/runner ichida saqlanadi, ya'ni konteyner qayta yaratilsa ham yo'qolmaydi.

    ⚠️ Runner GitLab'ga ichki tarmoq orqali emas, https://gitlab.example.com orqali murojaat qiladi — ya'ni domen serverning o'z ichidan ham ochilishi kerak. Tekshirish:

    bash
    docker exec -it gitlab-ce-runner wget -qO- https://gitlab.example.com/-/health
    

    Kundalik ish

    Zaxira olish

    GitLab'ning o'z backup mexanizmi bor, lekin u avtomatik ishlamaydi — buyruqni o'zingiz chaqirasiz:

    bash
    docker exec -t gitlab-ce gitlab-backup create
    

    Natija /volumes/data/gitlab-ce/data/backups/ ichida .tar bo'lib yotadi. Har kuni tunda olish uchun host'da cron yozasiz:

    bash
    0 3 * * * docker exec -t gitlab-ce gitlab-backup create CRON=1
    

    ⚠️ Bu .tar yetarli emas. Undan tashqari /volumes/data/gitlab-ce/config/gitlab-secrets.json faylini ham saqlang: u yo'qolsa, backup'dan tiklaganingizda 2FA, CI o'zgaruvchilari va saqlangan tokenlar ochilmay qoladi.

    ⚠️ Zaxira serverning o'zida yotibdi. Disk yonsa, u ham ketadi — nusxasini boshqa joyga chiqarib qo'ying.

    Yangilash

    docker-compose.yaml dagi image tegini yangisiga almashtiring va:

    bash
    cd /volumes/server-stack/gitlab-ce
    docker compose pull
    docker compose up -d
    

    ⚠️ Major versiyalarni sakrab o'tib bo'lmaydi. GitLab 17'dan 19'ga to'g'ridan-to'g'ri sakrasangiz, migratsiyalar yiqiladi. Rasmiy yangilanish yo'lini (upgrade path) tekshirib, oraliq versiyalardan bosqichma-bosqich o'ting.

    Foydali buyruqlar

    BuyruqNima qiladi
    docker compose logs -f gitlab-celoglarni jonli kuzatish
    docker exec -it gitlab-ce gitlab-ctl statusichki servislar holati
    docker exec -it gitlab-ce gitlab-ctl reconfigurekonfiguratsiyani qayta qo'llash
    docker exec -it gitlab-ce gitlab-rake gitlab:checkumumiy sog'liq tekshiruvi
    docker stats gitlab-cexotira/CPU sarfi

    Tez-tez uchraydigan muammolar

    BelgiSababYechim
    502 Bad GatewayGitLab hali ko'tarilmagan5-10 daqiqa kuting, docker compose logs -f gitlab-ce
    413 Request Entity Too Largenginx'da client_max_body_sizenginx blokiga client_max_body_size 0; qo'shing
    Cheksiz redirectX-Forwarded-Proto yuborilmayaptinginx location blokidagi header'ni tekshiring
    GitLab bazaga ulanmayapti.env dagi parol baza parolidan farq qiladiALTER USER gitlab WITH PASSWORD ...
    docker ps da healthy, sayt esa 502konteyner endigina ko'tarilgancurl http://127.0.0.1:8080/-/health bilan tekshiring
    git clone ssh://... ishlamayaptiSSH porti yopiq yoki noto'g'ri.env dagi GITLAB_SSH_PORT va faervolni tekshiring
    Konteyner OOM bilan o'ladiRAM yetmayaptiswap yoqing yoki puma/sidekiq qiymatlarini kamaytiring

    Yakuniy tekshiruv ro'yxati

    • Docker o'rnatilgan va docker compose version ishlaydi
    • /volumes tuzilmasi yaratilgan
    • docker-compose.yaml va .env joyida, .env ruxsati 600
    • docker ps da uchala konteyner ko'rinadi
    • curl http://127.0.0.1:8080/-/health → 200
    • Domen HTTPS bilan ochiladi, sertifikat amal qiladi
    • root paroli almashtirilgan, ro'yxatdan o'tish yopilgan
    • Birinchi backup olib ko'rilgan va boshqa joyga nusxalangan

    Shu ro'yxatdagi hamma narsa bajarilgan bo'lsa, o'z GitLab'ingiz to'liq ishlayotgan bo'ladi.

    #git#seflhost