This commit is contained in:
Vassiliy Yegorov
2021-05-07 14:04:17 +07:00
commit ea3a47fe20
6 changed files with 355 additions and 0 deletions

86
.env.example Normal file
View File

@@ -0,0 +1,86 @@
# Service name
#
SERVICE_NAME=gitlab
# Container names
# Summary container name in docker-compose.yml will be "${SERVICE_NAME}_${CONTAINER_NAME-*}"
#
CONTAINER_NAME_GITLAB=server
CONTAINER_NAME_PGSQL=pgsql
CONTAINER_NAME_REDIS=redis
CONTAINER_NAME_REGISTRY=registry
CONTAINER_NAME_RUNNER=runner
# Docker images
#
DOCKER_IMAGE_GITLAB=sameersbn/gitlab:latest
DOCKER_IMAGE_PGSQL=sameersbn/postgresql:latest
DOCKER_IMAGE_REDIS=sameersbn/redis:latest
DOCKER_IMAGE_REGISTRY=registry:latest
DOCKER_IMAGE_RUNNER=vasyakrg/gitlab-runner
# SMTP settings
SMTP_ENABLED=true
SMTP_DOMAIN=<you_domain>
SMTP_HOST=smtp.mailgun.org
SMTP_PORT=587
SMTP_USER=
SMTP_PASS=
SMTP_STARTTLS=true
SMTP_AUTHENTICATION=login
GITLAB_EMAIL=noreply@<you_domain>
GITLAB_EMAIL_REPLY_TO=noreply@<you_domain>
GITLAB_INCOMING_EMAIL_ADDRESS=noreply@<you_domain>
# Gitlab domain name
#
GITLAB_HOST=gitlab.<you_domain>
# Gitlab ssh public port
#
GITLAB_SSH_PORT=10022
# Gitlab root user password
# Use only when clear install
#
GITLAB_ROOT_EMAIL=<your_email>
GITLAB_ROOT_PASSWORD=<any_pass>
# Docker registry domain name
#
REGISTRY_HOST=docker.<you_domain>
# DB credentials
#
DB_USER=gitlab
DB_PASS=<any_pass>
DB_NAME=gitlab_production
# Container data path on the host
# Summary container data path will be "${SERVICE_DATA}/${SERVICE_NAME}"
#
SERVICE_DATA=/srv/services/data
# Email for letsencrypt
#
LETSENCRYPT_EMAIL=<you_email>
# Gitlab runner token
#
RUNNER_TOKEN=
GITLAB_TIMEZONE=Asia/Novosibirsk
# Runner on the same host with gitlab
#
CI_SERVER_WITH_RUNNER=true
# Network names
#
#SERVICE_NETWORK=gitlab
WEBPROXY_NETWORK=webproxy
GITLAB_SECRETS_DB_KEY_BASE=<any_pass>
GITLAB_SECRETS_SECRET_KEY_BASE=<any_pass>
GITLAB_SECRETS_OTP_KEY_BASE=<any_pass>

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.env
*.pem
*.crt
*.key
*.csr

26
README.md Normal file
View File

@@ -0,0 +1,26 @@
## Gitlab in docker
Полноценная сборка сервера Gitlab, его базы на psql, 4х раннеров и своего docker-registry, разворачеваемая на докер-хосте
1. переименовываем `.env.example` в `.env`
2. заполняем по максимому внимательно все переменные (кроме `RUNNER_TOKEN=`)
3. распаковываем в папке ssl-certs сертификаты и кладем там же (сертификаты noname и нужны лишь для внутреннего взаимодействия между gitlab и registry компонентами)
4. запускаем сборку `docker-compose up -d`
5. когда сервер запустится, вы войдете в систему под рутом, надо сходить в раздел раннеров (/admin/runners) и подсмотреть там токен, который и нужно будет заполнить в переменной `RUNNER_TOKEN=` и снова запустить `docker-compose up -d`, после чего раннеры перезапустятся и зарегистрируються в системе.
Подразумевается, что у вас есть `домен` и вы уже создали два поддомена `docker` и `gitlab`
Подразумевается, что и гитлаб и регистри будут работать через один порт 443
Подразумевается, что у вас уже есть webproxy или traefik, которые возьмут на себя ингрессы контейнеров и выдачу (обновление) им сертификатов
(сеть webpоxy как раз комментирована по этому - ее надо будет раскоментировать по свои условия)
`labels` у контейнеров подготовлены, если у вас traefik, раскомментите эти поля
`runner` - костомизирован только тем, что в нем встроена система авторегистрации на сервере.
## Автор \ Author
- **Vassiliy Yegorov** [vasyakrg](https://github.com/vasyakrg)
- [youtube](https://youtube.com/realmanual)
- [site](https://vk.com/realmanual)
- [telegram](https://t.me/realmanual)
- [any qiestions for me](https://t.me/realmanual_group)

234
docker-compose.yml Normal file
View File

@@ -0,0 +1,234 @@
version: '3.7'
services:
gitlab:
image: ${DOCKER_IMAGE_GITLAB}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_GITLAB}
restart: always
depends_on:
- postgresql
- redis
ports:
- "${GITLAB_SSH_PORT}:22"
expose:
- 80
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.gitlab-server.entrypoints=https"
# - "traefik.http.routers.gitlab-server.rule=Host(`${GITLAB_HOST}`)"
# - "traefik.http.routers.gitlab-server.tls=true"
# - "traefik.http.routers.gitlab-server.tls.certresolver=letsEncrypt"
# - "traefik.http.services.gitlab-server-service.loadbalancer.server.port=80"
# - "traefik.docker.network=webproxy"
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/gitlab:/home/git/data:Z
- ${SERVICE_DATA}/${SERVICE_NAME}/certs:/certs
environment:
- DEBUG=false
- DB_ADAPTER=postgresql
- DB_HOST=${SERVICE_NAME}_${CONTAINER_NAME_PGSQL}
- DB_PORT=5432
- DB_USER=${DB_USER}
- DB_PASS=${DB_PASS}
- DB_NAME=${DB_NAME}
- REDIS_HOST=${SERVICE_NAME}_${CONTAINER_NAME_REDIS}
- REDIS_PORT=6379
- TZ=UTC
- GITLAB_TIMEZONE=${GITLAB_TIMEZONE}
- GITLAB_HTTPS=false
- SSL_SELF_SIGNED=false
- GITLAB_HOST=${GITLAB_HOST}
- GITLAB_PORT=80
- GITLAB_SSH_PORT=${GITLAB_SSH_PORT}
- GITLAB_SECRETS_DB_KEY_BASE=${GITLAB_SECRETS_DB_KEY_BASE}
- GITLAB_SECRETS_SECRET_KEY_BASE=${GITLAB_SECRETS_SECRET_KEY_BASE}
- GITLAB_SECRETS_OTP_KEY_BASE=${GITLAB_SECRETS_OTP_KEY_BASE}
- GITLAB_ROOT_PASSWORD=${GITLAB_ROOT_PASSWORD}
- GITLAB_ROOT_EMAIL=${GITLAB_ROOT_EMAIL}
- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
- GITLAB_NOTIFY_PUSHER=false
- GITLAB_EMAIL=${GITLAB_EMAIL}
- GITLAB_EMAIL_REPLY_TO=${GITLAB_EMAIL_REPLY_TO}
- GITLAB_INCOMING_EMAIL_ADDRESS=${GITLAB_INCOMING_EMAIL_ADDRESS}
- GITLAB_PAGES_ENABLED=false
- SMTP_ENABLED=true
- SMTP_DOMAIN=${SMTP_DOMAIN}
- SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT}
- SMTP_USER=${SMTP_USER}
- SMTP_PASS=${SMTP_PASS}
- SMTP_STARTTLS=${SMTP_STARTTLS}
- SMTP_AUTHENTICATION=${SMTP_AUTHENTICATION}
- IMAP_ENABLED=false
- LDAP_ENABLED=false
- GITLAB_REGISTRY_ENABLED=true
- GITLAB_REGISTRY_HOST=${REGISTRY_HOST}
- GITLAB_REGISTRY_API_URL=http://registry:5000/
- GITLAB_REGISTRY_KEY_PATH=/certs/registry.key
healthcheck:
test: ["CMD", "/usr/local/sbin/healthcheck"]
interval: 1m
timeout: 5s
retries: 5
start_period: 2m
networks:
# - webproxy
- service
registry:
image: ${DOCKER_IMAGE_REGISTRY}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_REGISTRY}
restart: always
expose:
- 5000
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.gitlab-registry.entrypoints=https"
# - "traefik.http.routers.gitlab-registry.rule=Host(`${REGISTRY_HOST}`)"
# - "traefik.http.routers.gitlab-registry.tls=true"
# - "traefik.http.routers.gitlab-registry.tls.certresolver=letsEncrypt"
# - "traefik.http.services.gitlab-registry-service.loadbalancer.server.port=5000"
# - "traefik.docker.network=webproxy"
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/gitlab/shared/registry:/registry
- ${SERVICE_DATA}/${SERVICE_NAME}/certs:/certs
environment:
- REGISTRY_AUTH_TOKEN_AUTOREDIRECT=false
- REGISTRY_LOG_LEVEL=debug
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry
- REGISTRY_AUTH_TOKEN_REALM=https://${GITLAB_HOST}/jwt/auth
- REGISTRY_AUTH_TOKEN_SERVICE=container_registry
- REGISTRY_AUTH_TOKEN_ISSUER=gitlab-issuer
- REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/registry.crt
- REGISTRY_STORAGE_DELETE_ENABLED=true
networks:
# - webproxy
- service
postgresql:
image: ${DOCKER_IMAGE_PGSQL}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_PGSQL}
restart: always
environment:
- DB_USER=${DB_USER}
- DB_PASS=${DB_PASS}
- DB_NAME=${DB_NAME}
- DB_EXTENSION=pg_trgm
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/postgresql:/var/lib/postgresql:Z
networks:
- service
redis:
restart: always
image: ${DOCKER_IMAGE_REDIS}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_REDIS}
command:
- --loglevel warning
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/redis:/var/lib/redis:Z
networks:
- service
runner_1:
image: ${DOCKER_IMAGE_RUNNER}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_RUNNER}_1
restart: always
depends_on:
- gitlab
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/gitlab-runner_1:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
command: --debug run --user=gitlab-runner --working-directory=/home/gitlab-runner
environment:
- CI_SERVER_URL=https://${GITLAB_HOST}
- CI_SERVER_LOCAL_IP=${CI_SERVER_LOCAL_IP}
- CI_SERVER_WITH_RUNNER=${CI_SERVER_WITH_RUNNER}
- RUNNER_TOKEN=${RUNNER_TOKEN}
- RUNNER_DESCRIPTION=gitab-runner_1
- RUNNER_EXECUTOR=docker
- DOCKER_IMAGE=gitlab/gitlab-runner-helper:x86_64-latest
networks:
- service
runner_2:
image: ${DOCKER_IMAGE_RUNNER}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_RUNNER}_2
restart: always
depends_on:
- gitlab
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/gitlab-runner_2:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
command: --debug run --user=gitlab-runner --working-directory=/home/gitlab-runner
environment:
- CI_SERVER_URL=https://${GITLAB_HOST}
- CI_SERVER_WITH_RUNNER=${CI_SERVER_WITH_RUNNER}
- CI_SERVER_LOCAL_IP=${CI_SERVER_LOCAL_IP}
- RUNNER_TOKEN=${RUNNER_TOKEN}
- RUNNER_DESCRIPTION=gitab-runner_2
- RUNNER_EXECUTOR=docker
- DOCKER_IMAGE=gitlab/gitlab-runner-helper:x86_64-latest
networks:
- service
runner_3:
image: ${DOCKER_IMAGE_RUNNER}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_RUNNER}_3
restart: always
depends_on:
- gitlab
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/gitlab-runner_3:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
command: --debug run --user=gitlab-runner --working-directory=/home/gitlab-runner
environment:
- CI_SERVER_URL=https://${GITLAB_HOST}
- CI_SERVER_WITH_RUNNER=${CI_SERVER_WITH_RUNNER}
- CI_SERVER_LOCAL_IP=${CI_SERVER_LOCAL_IP}
- RUNNER_TOKEN=${RUNNER_TOKEN}
- RUNNER_DESCRIPTION=gitab-runner_3
- RUNNER_EXECUTOR=docker
- DOCKER_IMAGE=gitlab/gitlab-runner-helper:x86_64-latest
networks:
- service
runner_4:
image: ${DOCKER_IMAGE_RUNNER}
container_name: ${SERVICE_NAME}_${CONTAINER_NAME_RUNNER}_4
restart: always
depends_on:
- gitlab
volumes:
- ${SERVICE_DATA}/${SERVICE_NAME}/gitlab-runner_4:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
command: --debug run --user=gitlab-runner --working-directory=/home/gitlab-runner
environment:
- CI_SERVER_URL=https://${GITLAB_HOST}
- CI_SERVER_WITH_RUNNER=${CI_SERVER_WITH_RUNNER}
- CI_SERVER_LOCAL_IP=${CI_SERVER_LOCAL_IP}
- RUNNER_TOKEN=${RUNNER_TOKEN}
- RUNNER_DESCRIPTION=gitab-runner_4
- RUNNER_EXECUTOR=docker
- DOCKER_IMAGE=gitlab/gitlab-runner-helper:x86_64-latest
networks:
- service
networks:
service:
name: ${SERVICE_NAME}
# webproxy:
# external:
# name: ${WEBPROXY_NETWORK}

4
fix-unicorn.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
echo "fix gitlab_server unicorn error"
docker exec -it gitlab_server rm /home/git/gitlab/tmp/pids/unicorn.pid && docker restart gitlab_server

BIN
ssl-certs/ssl-certs.zip Normal file

Binary file not shown.