Установка Java 8

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer

Проверьте, запущена ли Java:

$ java -version

Вы должны увидеть что-то вроде этого:

java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

Установка Postgres

TeamCity поддерживает Postgres, MySQL, MS SQL, Oracle и внутреннюю БД по умолчанию. Давайте использовать Postgres в продакшене, так как он очень стабильный.

$ sudo apt-get -y install postgresql postgresql-contrib

После установки сервера базы данных PostgreSQL по умолчанию он создает пользователя postgres с ролью postgres. Он также создает системную учетную запись с таким же именем postgres. Итак, чтобы подключиться к серверу postgres, войдите в свою систему как пользователь postgres и подключите базу данных. Для начала нам нужно установить пароль пользователя (роли) PostgreSQL с именем postgres, иначе мы не сможем получить доступ к серверу извне. Как локальный пользователь Linux в postgres, нам разрешено подключаться и управлять сервером с помощью команды psql.

$ sudo -u postgres psql postgres

Теперь измените пароль пользователя postgres:

$ \password postgres

Создаем пользователя и базу данных для TeamCity 2020

Войдите в консоль postgres, используя учетную запись postgres:

$ sudo -u postgres psql

Создаем базу данных и пользователя для TeamCity

CREATE DATABASE teamcity;
CREATE USER teamcity WITH ENCRYPTED PASSWORD 'teamcity';
GRANT ALL PRIVILEGES ON DATABASE teamcity TO teamcity;

Загружаем TeamCity 2020

$ wget https://download.jetbrains.com/teamcity/TeamCity-2020.1.tar.gz

Скачав сжатый файл, распакуйте его:

$ tar -xzf TeamCity-2020.1.tar.gz

Давайте установим TeamCity в папку opt. Мы должны переместить его и установить разрешения для пользователя, запускающего приложение TeamCity:

$ sudo mkdir /opt/JetBrains
$ sudo mv TeamCity /opt/JetBrains/TeamCity
$ cd /opt/JetBrains/TeamCity
$ sudo chown -R <USER_RUNNING_TEAM_CITY> /opt/JetBrains/TeamCity

Теперь настройте TeamCity для автоматического запуска. создать новый скрипт:

$ sudo nano /etc/init.d/teamcity

Теперь добавьте это содержимое:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          TeamCity autostart
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start teamcity daemon at boot time
# Description:       Enable service provided by daemon.
# /etc/init.d/teamcity -  startup script for teamcity
### END INIT INFO
 
 
#  Ensure you enter the  right  user name that  TeamCity will run  under
USER="agentuser"
 
 
export TEAMCITY_DATA_PATH="/opt/JetBrains/TeamCity/.BuildServer"
 
case $1 in
 
start)
  start-stop-daemon --start  -c $USER --exec /opt/JetBrains/TeamCity/bin/runAll.sh start
 ;;
stop)
  start-stop-daemon --start -c $USER  --exec  /opt/JetBrains/TeamCity/bin/runAll.sh stop
 ;;
 esac
 
exit 0

Измените разрешения для скрипта и добавьте его в автозагрузку при каждом запуске / остановке сервера.

$ sudo chmod +x /etc/init.d/teamcity
$ sudo update-rc.d teamcity defaults

Загрузите драйвер Postgres

$ cd /opt/JetBrains/TeamCity/.BuildServer/lib/jdbc # create the folder path if does't exist
$ wget https://jdbc.postgresql.org/download/postgresql-9.4.1212.jar

Теперь запустите TeamCity:

sudo /etc/init.d/teamcity start

Теперь перейдите по адресу http://<DOMAIN_OR_IP_ADDRESS>:8111 и настройте первое соединение TeamCity.

 

Добавляем запись в свой домен

Добавьте запись A в настройки DNS, указывающую ваш собственный домен или субдомен на ваш IP-адрес VPS.

 

Включение NGINX для прослушивания порта 80

Установка nginx

$ sudo apt-get install nginx

Теперь создайте файл конфигурации для TeamCity, доступного через nginx

$ sudo vim /etc/nginx/sites-available/teamcity

Вставьте следующее содержание:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''   '';
}

server {

    listen       80;
    server_name  <DOMAIN.COM> www.<DOMAIN.COM>;

    proxy_read_timeout     1200;
    proxy_connect_timeout  240;
    client_max_body_size   0;

    location / {

        proxy_pass          http://localhost:8111/;
        proxy_http_version  1.1;
        proxy_set_header    X-Forwarded-For $remote_addr;
        proxy_set_header    Host $server_name:$server_port;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection $connection_upgrade;
    }
}

Создайте символическую ссылку для нового сайта (TeamCity) и перезапустите nginx.

 

$ sudo ln -s /etc/nginx/sites-available/teamcity /etc/nginx/sites-enabled/teamcity
$ sudo service nginx restart

Перейдите в свой домен или IP-адрес. Вы должны увидеть, что TeamCity работает на порту 80 (по умолчанию).

 

Активация SSL и использование LetsEncrypt

Сначала, установим Certbot:

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt update
$ sudo apt install python-certbot-nginx

Сгенерируйте сертификат (в моем случае подстановочный знак, поскольку я использую поддомен):

$ certbot certonly --manual -d *.<DOMAIN.COM> --agree-tos --no-bootstrap --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

Теперь скопируйте представленное значение записи TXT, перейдите к инструменту управления доменом и установите запись TXT. В моем случае я использую NameCheap.

Host: _acme-challenge       Value: <KEY_PROVIDED_BY_CERTBOT>

После распространения DNS проверьте записи TXT с помощью инструмента Google Dig. Когда он распространяется, нажмите Enter на certbot из предыдущей команды. Теперь обновите конфигурацию nginx:

$ vim /etc/nginx/sites-available/teamcity

Добавьте следующий контент:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''   '';
}

server {

    server_name  <DOMAIN.COM> www.<DOMAIN.COM>;

    proxy_read_timeout     1200;
    proxy_connect_timeout  240;
    client_max_body_size   0;

    location / {

        proxy_pass          http://localhost:8111/;
        proxy_http_version  1.1;
        proxy_set_header    X-Forwarded-For $remote_addr;
        proxy_set_header    Host $server_name:$server_port;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection $connection_upgrade;
    }

    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/<DOMAIN.COM>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<DOMAIN.COM>/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/<DOMAIN.COM>/chain.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
        if ($host = www.<DOMAIN.COM>) {
                return 301 https://$host$request_uri;
        } # managed by Certbot

        listen 80 default_server;
        listen [::]:80 default_server;

        server_name <DOMAIN.COM> www.<DOMAIN.COM>;
        return 404; # managed by Certbot
}

Настройка LetsEncrypt для автоматического продления сертификата

Отредактируйте еженедельное задание cron, чтобы еженедельно проверять сертификат;

$ vim /etc/cron.weekly/letsencrypt

Добавьте следующий код:

#!/bin/bash
certbot renew  --text --no-self-upgrade > /var/log/letsencrypt_cron.log 2>&1
service nginx restart

Теперь измените разрешения для этого скрипта, чтобы его можно было выполнить

$ chmod 755 /etc/cron.weekly/letsencrypt

P.S. Также TeamCity можно запускать командой:

./TeamCity/bin/runAll.sh start