#!/bin/bash set -e GITLAB_CLONE_URL=https://gitlab.com/gitlab-org/gitlab-foss.git GITLAB_SHELL_URL=https://gitlab.com/gitlab-org/gitlab-shell/-/archive/v${GITLAB_SHELL_VERSION}/gitlab-shell-v${GITLAB_SHELL_VERSION}.tar.bz2 GITLAB_PAGES_URL=https://gitlab.com/gitlab-org/gitlab-pages.git GITLAB_GITALY_URL=https://gitlab.com/gitlab-org/gitaly.git GITLAB_WORKHORSE_BUILD_DIR=${GITLAB_INSTALL_DIR}/workhorse GITLAB_PAGES_BUILD_DIR=/tmp/gitlab-pages GITLAB_GITALY_BUILD_DIR=/tmp/gitaly RUBY_SRC_URL=https://cache.ruby-lang.org/pub/ruby/${RUBY_VERSION%.*}/ruby-${RUBY_VERSION}.tar.gz GEM_CACHE_DIR="${GITLAB_BUILD_DIR}/cache" GOROOT=/tmp/go PATH=${GOROOT}/bin:$PATH export GOROOT PATH BUILD_DEPENDENCIES="gcc g++ make patch pkg-config cmake paxctl \ libc6-dev \ libpq-dev zlib1g-dev libyaml-dev libssl-dev \ libgdbm-dev libreadline-dev libncurses5-dev libffi-dev \ libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev \ gettext libkrb5-dev \ libexpat1-dev libz-dev libpcre2-dev build-essential git" ## Execute a command as GITLAB_USER exec_as_git() { if [[ $(whoami) == "${GITLAB_USER}" ]]; then "$@" else sudo -HEu ${GITLAB_USER} "$@" fi } # install build dependencies for gem installation apt-get update DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y ${BUILD_DEPENDENCIES} # build ruby from source echo "Building ruby v${RUBY_VERSION} from source..." PWD_ORG="$PWD" mkdir /tmp/ruby && cd /tmp/ruby curl --remote-name -Ss "${RUBY_SRC_URL}" printf '%s ruby-%s.tar.gz' "${RUBY_SOURCE_SHA256SUM}" "${RUBY_VERSION}" | sha256sum -c - tar xzf ruby-"${RUBY_VERSION}".tar.gz && cd ruby-"${RUBY_VERSION}" ./configure --disable-install-rdoc --enable-shared make -j"$(nproc)" make install cd "$PWD_ORG" && rm -rf /tmp/ruby # PaX-mark ruby # Applying the mark late here does make the build usable on PaX kernels, but # still the build itself must be executed on a non-PaX kernel. It's done here # only for simplicity. paxctl -cvm "$(command -v ruby)" # https://en.wikibooks.org/wiki/Grsecurity/Application-specific_Settings#Node.js paxctl -cvm "$(command -v node)" # remove the host keys generated during openssh-server installation rm -rf /etc/ssh/ssh_host_*_key /etc/ssh/ssh_host_*_key.pub # add ${GITLAB_USER} user adduser --disabled-login --gecos 'GitLab' ${GITLAB_USER} passwd -d ${GITLAB_USER} # set PATH (fixes cron job PATH issues) cat >> ${GITLAB_HOME}/.profile < and # there seems to # be some attempts to remove ruby from gitaly. # # cp -a ${GITLAB_GITALY_BUILD_DIR}/ruby ${GITLAB_GITALY_INSTALL_DIR}/ cp -a ${GITLAB_GITALY_BUILD_DIR}/config.toml.example ${GITLAB_GITALY_INSTALL_DIR}/config.toml rm -rf ${GITLAB_GITALY_INSTALL_DIR}/ruby/vendor/bundle/ruby/**/cache chown -R ${GITLAB_USER}: ${GITLAB_GITALY_INSTALL_DIR} # install git bundled with gitaly. make -C ${GITLAB_GITALY_BUILD_DIR} git GIT_PREFIX=/usr/local # clean up rm -rf ${GITLAB_GITALY_BUILD_DIR} # remove go go clean --modcache rm -rf ${GITLAB_BUILD_DIR}/go${GOLANG_VERSION}.linux-amd64.tar.gz ${GOROOT} # remove HSTS config from the default headers, we configure it in nginx exec_as_git sed -i "/headers\['Strict-Transport-Security'\]/d" ${GITLAB_INSTALL_DIR}/app/controllers/application_controller.rb # revert `rake gitlab:setup` changes from gitlabhq/gitlabhq@a54af831bae023770bf9b2633cc45ec0d5f5a66a exec_as_git sed -i 's/db:reset/db:setup/' ${GITLAB_INSTALL_DIR}/lib/tasks/gitlab/setup.rake # change SSH_ALGORITHM_PATH - we have moved host keys in ${GITLAB_DATA_DIR}/ssh/ to persist them exec_as_git sed -i "s:/etc/ssh/:/${GITLAB_DATA_DIR}/ssh/:g" ${GITLAB_INSTALL_DIR}/app/models/instance_configuration.rb cd ${GITLAB_INSTALL_DIR} # install gems, use local cache if available if [[ -d ${GEM_CACHE_DIR} ]]; then echo "Found local npm package cache..." mv ${GEM_CACHE_DIR} ${GITLAB_INSTALL_DIR}/vendor/cache chown -R ${GITLAB_USER}: ${GITLAB_INSTALL_DIR}/vendor/cache fi exec_as_git bundle config set --local deployment 'true' exec_as_git bundle config set --local without 'development test mysql aws' exec_as_git bundle install -j"$(nproc)" # make sure everything in ${GITLAB_HOME} is owned by ${GITLAB_USER} user chown -R ${GITLAB_USER}: ${GITLAB_HOME} # gitlab.yml and database.yml are required for `assets:precompile` exec_as_git cp ${GITLAB_INSTALL_DIR}/config/resque.yml.example ${GITLAB_INSTALL_DIR}/config/resque.yml exec_as_git cp ${GITLAB_INSTALL_DIR}/config/gitlab.yml.example ${GITLAB_INSTALL_DIR}/config/gitlab.yml # # Temporary workaround, see # # exec_as_git cp ${GITLAB_INSTALL_DIR}/config/database.yml.postgresql ${GITLAB_INSTALL_DIR}/config/database.yml cp ${GITLAB_BUILD_DIR}/config/database.yml.postgresql ${GITLAB_INSTALL_DIR}/config/database.yml chown ${GITLAB_USER}: ${GITLAB_INSTALL_DIR}/config/database.yml # Installs nodejs packages required to compile webpack exec_as_git yarn install --production --pure-lockfile exec_as_git yarn add ajv@^4.0.0 echo "Compiling assets. Please be patient, this could take a while..." exec_as_git bundle exec rake gitlab:assets:compile USE_DB=false SKIP_STORAGE_VALIDATION=true NODE_OPTIONS="--max-old-space-size=4096" # remove auto generated ${GITLAB_DATA_DIR}/config/secrets.yml rm -rf ${GITLAB_DATA_DIR}/config/secrets.yml # remove gitlab shell and workhorse secrets rm -f ${GITLAB_INSTALL_DIR}/.gitlab_shell_secret ${GITLAB_INSTALL_DIR}/.gitlab_workhorse_secret exec_as_git mkdir -p ${GITLAB_INSTALL_DIR}/tmp/pids/ ${GITLAB_INSTALL_DIR}/tmp/sockets/ chmod -R u+rwX ${GITLAB_INSTALL_DIR}/tmp # symlink ${GITLAB_HOME}/.ssh -> ${GITLAB_LOG_DIR}/gitlab rm -rf ${GITLAB_HOME}/.ssh exec_as_git ln -sf ${GITLAB_DATA_DIR}/.ssh ${GITLAB_HOME}/.ssh # symlink ${GITLAB_INSTALL_DIR}/log -> ${GITLAB_LOG_DIR}/gitlab rm -rf ${GITLAB_INSTALL_DIR}/log ln -sf ${GITLAB_LOG_DIR}/gitlab ${GITLAB_INSTALL_DIR}/log # symlink ${GITLAB_INSTALL_DIR}/public/uploads -> ${GITLAB_DATA_DIR}/uploads rm -rf ${GITLAB_INSTALL_DIR}/public/uploads exec_as_git ln -sf ${GITLAB_DATA_DIR}/uploads ${GITLAB_INSTALL_DIR}/public/uploads # symlink ${GITLAB_INSTALL_DIR}/.secret -> ${GITLAB_DATA_DIR}/.secret rm -rf ${GITLAB_INSTALL_DIR}/.secret exec_as_git ln -sf ${GITLAB_DATA_DIR}/.secret ${GITLAB_INSTALL_DIR}/.secret # WORKAROUND for https://github.com/sameersbn/docker-gitlab/issues/509 rm -rf ${GITLAB_INSTALL_DIR}/builds rm -rf ${GITLAB_INSTALL_DIR}/shared # install gitlab bootscript, to silence gitlab:check warnings cp ${GITLAB_INSTALL_DIR}/lib/support/init.d/gitlab /etc/init.d/gitlab chmod +x /etc/init.d/gitlab # disable default nginx configuration and enable gitlab's nginx configuration rm -rf /etc/nginx/sites-enabled/default # configure sshd sed -i \ -e "s|^[#]*UsePAM yes|UsePAM no|" \ -e "s|^[#]*UsePrivilegeSeparation yes|UsePrivilegeSeparation no|" \ -e "s|^[#]*PasswordAuthentication yes|PasswordAuthentication no|" \ -e "s|^[#]*LogLevel INFO|LogLevel VERBOSE|" \ -e "s|^[#]*AuthorizedKeysFile.*|AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_proxy|" \ /etc/ssh/sshd_config echo "AcceptEnv GIT_PROTOCOL" >> /etc/ssh/sshd_config # Allow clients to explicitly set the Git transfer protocol, e.g. to enable version 2. echo "UseDNS no" >> /etc/ssh/sshd_config # move supervisord.log file to ${GITLAB_LOG_DIR}/supervisor/ sed -i "s|^[#]*logfile=.*|logfile=${GITLAB_LOG_DIR}/supervisor/supervisord.log ;|" /etc/supervisor/supervisord.conf # silence "CRIT Server 'unix_http_server' running without any HTTP authentication checking" message # https://github.com/Supervisor/supervisor/issues/717 sed -i '/\.sock/a password=dummy' /etc/supervisor/supervisord.conf sed -i '/\.sock/a username=dummy' /etc/supervisor/supervisord.conf # prevent confusing warning "CRIT Supervisor running as root" by clarify run as root # user not defined in supervisord.conf by default, so just append it after [supervisord] block sed -i "/\[supervisord\]/a user=root" /etc/supervisor/supervisord.conf # move nginx logs to ${GITLAB_LOG_DIR}/nginx sed -i \ -e "s|access_log /var/log/nginx/access.log;|access_log ${GITLAB_LOG_DIR}/nginx/access.log;|" \ -e "s|error_log /var/log/nginx/error.log;|error_log ${GITLAB_LOG_DIR}/nginx/error.log;|" \ /etc/nginx/nginx.conf # fix "unknown group 'syslog'" error preventing logrotate from functioning sed -i "s|^su root syslog$|su root root|" /etc/logrotate.conf # configure supervisord log rotation cat > /etc/logrotate.d/supervisord < /etc/logrotate.d/gitlab < /etc/logrotate.d/gitlab-shell < /etc/logrotate.d/gitaly < /etc/logrotate.d/gitlab-nginx < /etc/supervisor/conf.d/puma.conf < /etc/supervisor/conf.d/sidekiq.conf < /etc/supervisor/conf.d/gitlab-workhorse.conf < /etc/supervisor/conf.d/gitaly.conf < /etc/supervisor/conf.d/mail_room.conf < /etc/supervisor/conf.d/sshd.conf < /etc/supervisor/conf.d/nginx.conf < /etc/supervisor/conf.d/cron.conf < /etc/supervisor/conf.d/groups.conf <