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
| Komponent | Vazifasi | Qayerda ishlaydi |
|---|---|---|
| GitLab CE | asosiy ilova (web, git, CI koordinatori) | konteyner, 127.0.0.1:8080 |
| PostgreSQL 17 | GitLab bazasi | konteyner, port ochilmaydi |
| GitLab Runner | CI job'larini bajaradi | konteyner (ixtiyoriy) |
| nginx | domen, TLS, proksi | serverning 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
| Minimal | Tavsiya etiladi | |
|---|---|---|
| RAM | 4 GB | 8 GB |
| CPU | 2 yadro | 4 yadro |
| Disk | 20 GB | 50 GB+ |
| OS | Ubuntu 22.04 / Debian 12 | — |
Bulardan tashqari kerak bo'ladi:
- Domen — masalan
gitlab.example.com, DNS'da serveringiz IP'sigaAyozuvi 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:
sudo apt update && sudo apt upgrade -y
2-qadam. Docker'ni o'rnatish
Docker allaqachon bo'lsa, bu bo'limni o'tkazib yuboring:
docker --version
2.1. Kerakli paketlar va GPG kaliti
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/ubuntuo'rnigalinux/debiandeb yozing.
2.2. Repozitoriyni ro'yxatga olish
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
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
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
sudo usermod -aG docker $USER
⚠️ Busiz har bir
dockerbuyrug'igasudoyozishga majbur bo'lasiz. O'zgarish kuchga kirishi uchun sessiyadan chiqib, qayta kiring (exitva yanassh), aks holdapermission deniedxatosi chiqaveradi.Bu guruh amalda root huquqiga teng:
dockerbuyrug'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
| Katalog | Nima yotadi |
|---|---|
configs | konfiguratsiya va .env fayllar |
data | baza, yuklangan fayllar — konteyner o'chsa ham qoladigan hamma narsa |
server-stack | docker-compose.yaml va source kodlar |
sudo mkdir -p /volumes/{configs,data,server-stack}
Eslatma:
server-stackmajburiy 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:
sudo -i
4.1. Kataloglar
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:
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/postgresbo'sh bo'lganda — ishlaydi. Postgres konteynerini allaqachon ko'targan bo'lsangiz, fayl e'tiborsiz qoladi va kengaytmalarni qo'lda qo'shish kerak: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
vim /volumes/server-stack/gitlab-ce/docker-compose.yaml
Ichiga quyidagini joylashtiramiz:
# 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:
openssl rand -hex 24
So'ng faylni yaratamiz:
vim /volumes/server-stack/gitlab-ce/.env
GITLAB_HOST=gitlab.example.com
GITLAB_DB_PASSWORD=yuqorida-generatsiya-qilingan-parol
GITLAB_HTTP_PORT=8080
GITLAB_SSH_PORT=2222
| O'zgaruvchi | Majburiymi | Nima uchun |
|---|---|---|
GITLAB_HOST | ha | GitLab ochiladigan domen. DNS'da serveringiz IP'siga yo'naltirilgan bo'lsin |
GITLAB_DB_PASSWORD | ha | postgres paroli. Baza birinchi ko'tarilishda aynan shu parol bilan yaratiladi |
GITLAB_HTTP_PORT | yo'q (8080) | nginx proksi qiladigan port. 8080 band bo'lsa boshqasini yozing |
GITLAB_SSH_PORT | yo'q (2222) | git clone ssh://... uchun port. 22 ni yozmang — u serverning o'z SSH'iniki |
Faylda parol borligi uchun ruxsatni cheklaymiz:
chmod 600 /volumes/server-stack/gitlab-ce/.env
⚠️ Parolni keyin o'zgartirsangiz. Baza allaqachon eski parol bilan yaratilgan bo'ladi va
.envni tahrirlash unga ta'sir qilmaydi — GitLab ulanolmay qoladi. Parolni bazada ham almashtirish kerak:docker exec -it gitlab-ce-postgres psql -U gitlab -d gitlabhq_production \ -c "ALTER USER gitlab WITH PASSWORD 'yangi-parol';"Va albatta:
.envni hech qachon git'ga qo'shmang.
5-qadam. Ishga tushirish
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:
docker compose logs -f gitlab-ce
Loglarda Configuration complete qatorini kutamiz. Holatni ko'rish:
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:
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:
sudo apt install -y nginx certbot python3-certbot-nginx
Faervolda portlarni ochamiz:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Konfiguratsiya faylini yaratamiz:
sudo vim /etc/nginx/sites-available/gitlab.conf
Boshiga faqat HTTP blokini yozamiz — sertifikatni certbot shu blok orqali oladi:
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:
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:
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 kattaroqgit pushyoki LFS fayli413 Request Entity Too Largebilan 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:
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_passwordfayli 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:
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:
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:
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.comorqali murojaat qiladi — ya'ni domen serverning o'z ichidan ham ochilishi kerak. Tekshirish: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:
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:
0 3 * * * docker exec -t gitlab-ce gitlab-backup create CRON=1
⚠️ Bu
.taryetarli emas. Undan tashqari/volumes/data/gitlab-ce/config/gitlab-secrets.jsonfaylini 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:
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
| Buyruq | Nima qiladi |
|---|---|
docker compose logs -f gitlab-ce | loglarni jonli kuzatish |
docker exec -it gitlab-ce gitlab-ctl status | ichki servislar holati |
docker exec -it gitlab-ce gitlab-ctl reconfigure | konfiguratsiyani qayta qo'llash |
docker exec -it gitlab-ce gitlab-rake gitlab:check | umumiy sog'liq tekshiruvi |
docker stats gitlab-ce | xotira/CPU sarfi |
Tez-tez uchraydigan muammolar
| Belgi | Sabab | Yechim |
|---|---|---|
502 Bad Gateway | GitLab hali ko'tarilmagan | 5-10 daqiqa kuting, docker compose logs -f gitlab-ce |
413 Request Entity Too Large | nginx'da client_max_body_size | nginx blokiga client_max_body_size 0; qo'shing |
| Cheksiz redirect | X-Forwarded-Proto yuborilmayapti | nginx location blokidagi header'ni tekshiring |
| GitLab bazaga ulanmayapti | .env dagi parol baza parolidan farq qiladi | ALTER USER gitlab WITH PASSWORD ... |
docker ps da healthy, sayt esa 502 | konteyner endigina ko'tarilgan | curl http://127.0.0.1:8080/-/health bilan tekshiring |
git clone ssh://... ishlamayapti | SSH porti yopiq yoki noto'g'ri | .env dagi GITLAB_SSH_PORT va faervolni tekshiring |
| Konteyner OOM bilan o'ladi | RAM yetmayapti | swap yoqing yoki puma/sidekiq qiymatlarini kamaytiring |
Yakuniy tekshiruv ro'yxati
- Docker o'rnatilgan va
docker compose versionishlaydi -
/volumestuzilmasi yaratilgan -
docker-compose.yamlva.envjoyida,.envruxsati600 -
docker psda uchala konteyner ko'rinadi -
curl http://127.0.0.1:8080/-/health→200 - Domen HTTPS bilan ochiladi, sertifikat amal qiladi
-
rootparoli 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.