Setup serveru

Návod na nasazení nové instance aplikace (GTO) na server
proměnná  projektu (unikátní pro tuto instanci) proměnná  globálního webu (sdílená) hodnota, kterou je nutné  ručně doplnit (ID, token…)

Obsah

  1. Proměnné — přehled
  2. Připojení na server a klonování repa
  3. Ověření přístupu do PostgreSQL
  4. Google OAuth
  5. Vytvoření .env
  6. Instalace Node (fnm) a pnpm
  7. Inicializace databáze
  8. GitLab CI/CD — pipeline
  9. Příprava a spuštění přes PM2
  10. Vytvoření admin účtu
  11. GitLab Runner

1 Proměnné — přehled

Před začátkem je třeba připravit tyto hodnoty. V návodu jsou všude zvýrazněné stejnou barvou, aby bylo jasné, kam patří.

ProměnnáPopisPříklad
NAMEKrátký název projektu / branduandesbet
DOMAINDoména webuandesbet.pe
PSQL_USERUživatel lokální PostgreSQL databázelh12771300
PSQL_HESLOHeslo k databázi (speciální znaky nutno percent-encodovat v DATABASE_URL)Xt9mQZ@Lp#3rN^Yv=Bs!
PORTPort, na kterém poběží appka3001
GLOBAL_PSQL_USERUživatel globální databázelh12771300
GLOBAL_PSQL_HESLOHeslo globální databáze (stejný formát jako PSQL_HESLO, nutno percent-encodovat)Xt9mQZ@Lp#3rN^Yv=Bs!
WEBHOOK_API_KEYStejný klíč jako na globálním webuBapFkENKljXoUEhmPU0UtisduooUbsok
SOURCE_VIEWER_UPSTREAM_BASIC_AUTHBasic auth globálního webuuzivatel:heslo
⚠️ Ve PSQL_HESLO (i GLOBAL_PSQL_HESLO) je potřeba speciální znaky převést do percent-encoding, aby fungovala connection string. Např. Xt9mQZ@Lp#3rN^Yv=Bs! se zakóduje jako Xt9mQZ%40Lp%233rN%5EYv%3DBs%21.

2 Připojení na server a klonování repa

SSH na server

ssh PSQL_USER@DOMAIN

Přidání SSH klíče

SSH klíč je třeba přidat do:

/domains/DOMAIN/.ssh/

Klonování repozitáře

git clone git@gitlab.com:kleek/gto.git
cd gto

3 Ověření přístupu do PostgreSQL

Ověření přístupu do databáze:

PGPASSWORD='PSQL_HESLO' psql -h localhost -U PSQL_USER -d postgres

4 Google OAuth

Google autentikaci je třeba vytvořit na console.cloud.google.com.

Odtud se získají:

ProměnnáPopis
GOOGLE_CLIENT_IDClient ID OAuth aplikace
GOOGLE_CLIENT_SECRETClient Secret OAuth aplikace

5 Vytvoření .env

V kořeni projektu je třeba vytvořit soubor .env:

NEXT_PUBLIC_IS_SUPER_ADMIN=false

DATABASE_URL=postgres://PSQL_USER:PSQL_HESLO@localhost:5432/PSQL_USERdb
GLOBAL_DATABASE_URL=postgres://GLOBAL_PSQL_USER:GLOBAL_PSQL_HESLO@localhost:5432/GLOBAL_PSQL_USERdb

SITE_PUBLIC_URL=https://DOMAIN
BETTER_AUTH_URL=https://DOMAIN
BETTER_AUTH_SECRET=vygenerovat pomocí openssl rand -base64 32

GOOGLE_CLIENT_ID=GOOGLE_CLIENT_ID
GOOGLE_CLIENT_SECRET=GOOGLE_CLIENT_SECRET

NEXT_PUBLIC_SITE_LANGUAGE=cs  # nastavit jazyk webu

SOURCE_VIEWER_UPSTREAM_BASIC_AUTH=uzivatel:heslo  # basic auth globálního webu

WEBHOOK_API_KEY=WEBHOOK_API_KEY

Generování BETTER_AUTH_SECRET

openssl rand -base64 32

6 Instalace Node (fnm) a pnpm

fnm install 24
fnm use 24
fnm default 24

corepack enable pnpm
pnpm -v

pnpm i

7 Inicializace databáze

pnpm db:push
pnpm db:seed

8 GitLab CI/CD — pipeline

Do .gitlab-ci.yml v masteru je třeba přidat blok:

deploy:NAME:
  extends: .deploy_template
  tags: [deploy-NAME]
  resource_group: deploy-NAME
  rules:
    - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "NAME"

Poté je třeba vytvořit novou protected branch z masteru se jménem NAME a na serveru se na ni přepnout:

git checkout -b NAME origin/master
git push -u origin NAME

9 Příprava a spuštění přes PM2

ecosystem.config.js

module.exports = {
  apps: [
    {
      name: "NAME",
      script: "node_modules/next/dist/bin/next",
      args: "start --port PORT",
      instances: 1,
      exec_mode: "fork",
      env: { NODE_ENV: "production" },
    },
  ],
};

Spuštění

pnpm install --frozen-lockfile
pnpm build

npm i -g pm2
pm2 start ecosystem.config.js
pm2 save

10 Vytvoření admin účtu

Nejprve je třeba otevřít web a přihlásit se do administrace (vytvoří se záznam uživatele). Poté v databázi:

PGPASSWORD='PSQL_HESLO' psql -h localhost -U PSQL_USER -d postgres
\c PSQL_USERdb

SELECT * FROM admin_member;   -- je třeba zkopírovat user_id nově vytvořeného uživatele

UPDATE admin_member
SET role = 'admin',
    approved_at = NOW(),
    updated_at = NOW()
WHERE user_id = 'ID';

Fialově zvýrazněné ID je třeba nahradit hodnotou user_id zkopírovanou z výpisu SELECT.

11 GitLab Runner

Na GitLabu

GitLab → Settings → CI/CD → Runners → Create project runner

Tag: deploy-NAME → Create → je třeba zkopírovat vygenerovaný token glrt-XXXX

Na serveru

cd /domains/DOMAIN/

mkdir -p ~/bin ~/.gitlab-runner-work
curl -L --output ~/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"
chmod +x ~/bin/gitlab-runner

echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

gitlab-runner --version

gitlab-runner register --non-interactive \
  --url "https://gitlab.com/" \
  --token "glrt-XXXX" \
  --executor "shell"

pm2 start ~/bin/gitlab-runner --name ci-runner -- run --working-directory $HOME/.gitlab-runner-work
pm2 save