Skip to content

Commit

Permalink
Merge pull request #202 from datagov-cz/checkit-deploy
Browse files Browse the repository at this point in the history
Checkit deploy
  • Loading branch information
bindeali authored Feb 5, 2024
2 parents 14758d1 + 59d894e commit 45b1d91
Show file tree
Hide file tree
Showing 22 changed files with 4,372 additions and 2,614 deletions.
17 changes: 17 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
CONTEXT=${CONTEXT}
REPOSITORY=assembly-line
URL=${URL}
COMPONENTS=${COMPONENTS}

GRAPHDB_ZIP_FILE_NAME=graphdb-free-9.6.0-dist.zip
POSTGRES_DB=
POSTGRES_USER=
POSTGRES_PASSWORD=
KEYCLOAK_USER=
KEYCLOAK_PASSWORD=
KEYCLOAK_API_USER_USERNAME=apiadmincheckit
KEYCLOAK_API_USER_PASSWORD=
SGOV_SERVER_REPOSITORY_GITHUBUSERTOKEN=
CHECKIT_SERVER_REPOSITORY_GITHUBUSERTOKEN=

KEYCLOAK_REALMKEY=
SGOV_SERVER_KEYCLOAK_CREDENTIALS_SECRET=
TERMIT_SERVER_KEYCLOAK_CREDENTIALS_SECRET=
CHECKIT_SERVER_KEYCLOAK_CREDENTIALS_SECRET=
88 changes: 70 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Výrobní linka je sada nástrojů, které slouží k tvorbě [Sémantického sl
1. [Kontrolní panel](https://github.com/opendata-mvcr/mission-control), který používá [SGoV Server](https://github.com/opendata-mvcr/sgov) jako backend. Jedná se o nástroj pro správu pracovních prostorů (transakcí pro editaci Sémantického slovníku pojmů) a jejich publikaci do [Github repozitáře](https://github.com/opendata-mvcr/ssp) odkud jsou vytvořené slovníky publikovány do [SPARQL endpointu](https://xn--slovnk-7va.gov.cz/sparql).
2. [TermIt](https://github.com/opendata-mvcr/termit-ui), který má rovněž vlastní [back-end](https://github.com/opendata-mvcr/termit). Jedná se o nástroj na správu pojmů samotných, jejich názvů, definic, zdrojů a základní strukturování do tezauru. TermIt pracuje s formátem [SKOS](https://www.w3.org/TR/skos-reference/).
3. [OntoGrapher](https://github.com/opendata-mvcr/ontographer) je nástrojem pro tvorbu ontologických konceptuálních modelů na základě pojmů, tedy o jejich vzájemné propojování významovými vazbami (např. `Orgán veřejné moci` je speciálním případem `Organizace`). TermIt pracuje v jazyce [OWL](https://www.w3.org/TR/2012/REC-owl2-overview-20121211/#).
4. [CheckIt]() s [backendem]() je nástroj sloužící pro revizi a schvalování změn provedených na slovnícich pomocí ostatních nástrujů Výrobní linky.

Výrobní linka je rozšiřitelná o další nástroje, které mohou řešit jiné (nebo stejné) dílčí úlohy.

Expand All @@ -24,12 +25,17 @@ Postup:

2. Přidej do `.env.<CONTEXT>` proměnné a nastav je:
Tyto proměnné volíš:
`POSTGRES_DB`
`POSTGRES_USER`
`POSTGRES_PASSWORD`
`KEYCLOAK_USER`
`KEYCLOAK_PASSWORD`
`REPOSITORY_GITHUBUSERTOKEN` (nutné pouze pro publikaci pracovního prostoru na Github)

- `GRAPHDB_ZIP_FILE_NAME` - jméno souboru stažené GraphDB (např. `graphdb-free-9.6.0-dist.zip`)
- `POSTGRES_DB` - název databáze pro keycloak uživatele
- `POSTGRES_USER` - uživatelské jméno pro správu databáze
- `POSTGRES_PASSWORD` - heslo pro správu databáze
- `KEYCLOAK_USER` - uživatelské jméno k přihlášení do admin konzole Keycloaku
- `KEYCLOAK_PASSWORD` - heslo k přihlášení do admin konzole Keycloaku
- `KEYCLOAK_API_USER_USERNAME` - uživatelské jméno pro přístup k API Keycloaku (potřebné pro CheckIt)
- `KEYCLOAK_API_USER_PASSWORD` - heslo pro přístup k API Keycloaku (potřebné pro CheckIt)
- `SGOV_SERVER_REPOSITORY_GITHUBUSERTOKEN` - GitHub token pro vytvoření PR (nutné pouze pro publikaci pracovního prostoru na Github)
- `CHECKIT_SERVER_REPOSITORY_GITHUBUSERTOKEN` - GitHub token pro schvalování PR (nutné pouze pro publikaci pracovního prostoru na Github)

3. Spusť `docker-compose` s příslušným `.env.*` souborem. Příklad:

Expand All @@ -48,29 +54,75 @@ na službu `al-nginx`. V případě lokálního nasazení a webového serevru `a
</VirtualHost>
```

5. V al-db-serveru (`/modelujeme/sluzby/db-server`) importujte do repozitáře všechny soubory v sekci
`Import/RDF/Server files` do kontextu 'http://onto.fel.cvut.cz/ontologies/termit'.
Rovněž spusťe SPARQL dotazy ze složky `al-db-server/lucene`.
nebo v případe `Nginx`:

```
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location /modelujeme {
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:1234/modelujeme;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_read_timeout 600s;
}
}
```

5. Pro inicializace `al-db-serveru` je potřeba spustit SPARQL dotazy ze složky `al-db-server/lucene` na `/modelujeme/sluzby/db-server/` v sekci `SPARQL`.

6. V al-auth-serveru (`/modelujeme/sluzby/auth-server/`, přihlas se do něj pomocí `$KEYCLOAK_USER` a
6. V al-auth-serveru (`/modelujeme/sluzby/auth-server/admin/`, přihlas se do něj pomocí `$KEYCLOAK_USER` a
`$KEYCLOAK_PASSWORD`)
- zkopíruj hodnotu veřejného klíče daného realmu do proměnné `KEYCLOAK_REALMKEY`,
- zkopíruj hodnotu klíče klienta al-sgov-server do proměnné SGOV_SERVER_KEYCLOAK_CREDENTIALS_SECRET (použi `Regenerate Secret`),
- zkopíruj hodnotu klíče klienta al-termit-server do proměnné TERMIT_SERVER_KEYCLOAK_CREDENTIALS_SECRET,
- vytvoř uživatele výrobní linky. Nezapomeň mu nastavit heslo.

7. Restartuj službu `al-sgov-server` a `al-termit-server`
- běž do `Realm Settings/Keys` a klikni na `Public key`
- zkopíruj hodnotu veřejného klíče daného realmu do proměnné `KEYCLOAK_REALMKEY`,
- běž do `Clients` (levé menu)
- klikni na klienta `al-sgov-server` a v `Credentials` zkopíruj hodnotu `Secret` klienta do proměnné SGOV_SERVER_KEYCLOAK_CREDENTIALS_SECRET (pokud vidíš `*****` použij `Regenerate Secret`),
- stejně tak zkopíruj hodnotu `Secret` klienta `al-termit-server` do proměnné TERMIT_SERVER_KEYCLOAK_CREDENTIALS_SECRET,
- stejně tak zkopíruj hodnotu `Secret` klienta `al-checkit-server` do proměnné CHECKIT_SERVER_KEYCLOAK_CREDENTIALS_SECRET,
- vytvoř uživatele výrobní linky v `Users/Add user`
- nastav mu `Username`, `Email`, `First Name` a `Last Name`
- po vytvoření mu nastav heslo v `Credentials`
- vytvoř admina pro přiřazování gestorů ve výrobní lince v `Users/Add user`
- nastav mu `Username`, `Email`, `First Name` a `Last Name`
- po vytvoření mu nastav heslo v `Credentials`
- běž do sekce `Role Mappings` a v `Client Roles` vyhledej `al-checkit-server` -> klikni na `ROLE_ADMIN` a přidej tuto roli mocí tlačítka `Add selected`

7. Restartuj služby `al-sgov-server`, `al-termit-server` a `al-checkit-server`:

```
docker-compose --env-file=.env.local up
```

`docker-compose stop al-sgov-server ; docker-compose --env-file=.env.local up -d al-sgov-server`
`docker-compose stop al-termit-server ; docker-compose --env-file=.env.local up -d al-termit-server`
nebo

```
docker-compose stop al-sgov-server ; docker-compose --env-file=.env.local up -d al-sgov-server
docker-compose stop al-termit-server ; docker-compose --env-file=.env.local up -d al-termit-server
docker-compose stop al-checkit-server ; docker-compose --env-file=.env.local up -d al-checkit-server
```

8. Ověř, že Výrobní linka běží. V případě lokálního nasazení je její URL `http://localhost/modelujeme`.

## Obnova databáze slovníků z publikovaných dat

Služba `al-db-server` představuje RDF úložište obsahující pracovní verze slovníků a uživatele systému. Uživatele systému lze kdykoli smazat a přegenerovat pomocí služby `al-auth-server`, která ukláda zdrojové data o uživatelích pomocí služby `al-auth-server-db`. Pracovní verze slovníků lze publikovat do [Sémantického slovníku pojmů](https://xn--slovnk-7va.gov.cz/) (SSP).

V případě, že jsou všechny slovníky publikované, je možné RDF úložistě smazat a obnovenit počáteční stav úložište (viz. body týkající se `al-db-serveru` v sekci [Nasazení výrobní linky](https://github.com/opendata-mvcr/sgov-assembly-line/edit/main/README.md#nasazen%C3%AD-v%C3%BDrobn%C3%AD-linky)). Po obnovení počátečního stavu uložiště je potřeba naimportovat slovníky z SSP a obnovit i RDF reprezentaci uživatelů systému v tomto úložišti. Záznam uživatele se v RDF úložišti vytvoří automaticky při libovolné aktualizaci uživatele pomocí uživatelského rozhraní na adrese `/modelujeme/sluzby/auth-server/`. Po aktualizaci všech uživatelů je obnova databáze slovníku hotova.
V případě, že jsou všechny slovníky publikované, je možné RDF úložistě smazat a obnovit počáteční stav úložište (viz. body týkající se `al-db-serveru` v sekci [Nasazení výrobní linky](https://github.com/opendata-mvcr/sgov-assembly-line/edit/main/README.md#nasazen%C3%AD-v%C3%BDrobn%C3%AD-linky)) a importu všech základních dat na `/modelujeme/sluzby/db-server/import#server`. Po obnovení počátečního stavu uložiště je potřeba naimportovat slovníky z SSP a obnovit i RDF reprezentaci uživatelů systému v tomto úložišti. Záznam uživatele se v RDF úložišti vytvoří automaticky při libovolné aktualizaci uživatele pomocí uživatelského rozhraní na adrese `/modelujeme/sluzby/auth-server/`. Po aktualizaci všech uživatelů je obnova databáze slovníku hotova.

Alternativně lze RDF reprezentaci uživatelů systému nahrát ze zálohy, protože je obsažena v separatním kontextu RDF úložiště (např. `https://slovník.gov.cz/uživatel`).

Expand Down
1 change: 1 addition & 0 deletions al-auth-server/api-roles.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"realm-management" : [ "manage-users", "view-clients", "view-users" ], "al-checkit-server" : [], "al-sgov-server" : [], "al-termit-server" : []
139 changes: 139 additions & 0 deletions al-auth-server/keycloak-realm.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,27 @@
}
],
"client": {
"al-checkit-ui": [],
"al-checkit-server": [
{
"id": "d128b5bd-1e02-45a4-9bee-e15375a518d0",
"name": "ROLE_ADMIN",
"description": "Administrátor gestorů",
"composite": false,
"clientRole": true,
"containerId": "6060fbf8-1399-4bc8-8c6a-507671748c73",
"attributes": {}
},
{
"id": "a9be9ea4-dda2-484f-a6cb-4a3a10bea899",
"name": "ROLE_USER",
"description": "Uživatel výrobní linky",
"composite": false,
"clientRole": true,
"containerId": "6060fbf8-1399-4bc8-8c6a-507671748c73",
"attributes": {}
}
],
"al-sgov-server": [
{
"id": "2d78d3fe-0607-45a9-ad0e-b8398263f569",
Expand Down Expand Up @@ -1151,6 +1172,124 @@
"offline_access",
"microprofile-jwt"
]
},
{
"id": "1ae05399-e362-43df-a877-1b624c134ce5",
"clientId": "al-checkit-ui",
"name": "CheckIt UI",
"rootUrl": "",
"adminUrl": "",
"baseUrl": "",
"surrogateAuthRequired": false,
"enabled": true,
"alwaysDisplayInConsole": false,
"clientAuthenticatorType": "client-secret",
"secret": "**********",
"redirectUris": ["*"],
"webOrigins": ["*"],
"notBefore": 0,
"bearerOnly": false,
"consentRequired": false,
"standardFlowEnabled": true,
"implicitFlowEnabled": false,
"directAccessGrantsEnabled": true,
"serviceAccountsEnabled": false,
"publicClient": true,
"frontchannelLogout": false,
"protocol": "openid-connect",
"attributes": {
"saml.assertion.signature": "false",
"saml.force.post.binding": "false",
"saml.multivalued.roles": "false",
"saml.encrypt": "false",
"backchannel.logout.revoke.offline.tokens": "false",
"saml.server.signature": "false",
"saml.server.signature.keyinfo.ext": "false",
"exclude.session.state.from.auth.response": "false",
"backchannel.logout.session.required": "true",
"client_credentials.use_refresh_token": "false",
"saml_force_name_id_format": "false",
"saml.client.signature": "false",
"tls.client.certificate.bound.access.tokens": "false",
"saml.authnstatement": "false",
"display.on.consent.screen": "false",
"saml.onetimeuse.condition": "false"
},
"authenticationFlowBindingOverrides": {},
"fullScopeAllowed": true,
"nodeReRegistrationTimeout": -1,
"defaultClientScopes": [
"web-origins",
"role_list",
"roles",
"profile",
"email"
],
"optionalClientScopes": [
"address",
"phone",
"offline_access",
"microprofile-jwt"
]
},
{
"id": "6060fbf8-1399-4bc8-8c6a-507671748c73",
"clientId": "al-checkit-server",
"name": "CheckIt server",
"rootUrl": "",
"adminUrl": "",
"surrogateAuthRequired": false,
"enabled": true,
"alwaysDisplayInConsole": false,
"clientAuthenticatorType": "client-secret",
"secret": "**********",
"defaultRoles": ["ROLE_USER"],
"redirectUris": ["*"],
"webOrigins": ["*"],
"notBefore": 0,
"bearerOnly": false,
"consentRequired": false,
"standardFlowEnabled": true,
"implicitFlowEnabled": false,
"directAccessGrantsEnabled": true,
"serviceAccountsEnabled": false,
"publicClient": false,
"frontchannelLogout": false,
"protocol": "openid-connect",
"attributes": {
"saml.assertion.signature": "false",
"saml.force.post.binding": "false",
"saml.multivalued.roles": "false",
"saml.encrypt": "false",
"backchannel.logout.revoke.offline.tokens": "false",
"saml.server.signature": "false",
"saml.server.signature.keyinfo.ext": "false",
"exclude.session.state.from.auth.response": "false",
"backchannel.logout.session.required": "true",
"client_credentials.use_refresh_token": "false",
"saml_force_name_id_format": "false",
"saml.client.signature": "false",
"tls.client.certificate.bound.access.tokens": "false",
"saml.authnstatement": "false",
"display.on.consent.screen": "false",
"saml.onetimeuse.condition": "false"
},
"authenticationFlowBindingOverrides": {},
"fullScopeAllowed": true,
"nodeReRegistrationTimeout": -1,
"defaultClientScopes": [
"web-origins",
"role_list",
"roles",
"profile",
"email"
],
"optionalClientScopes": [
"address",
"phone",
"offline_access",
"microprofile-jwt"
]
}
],
"clientScopes": [
Expand Down
30 changes: 30 additions & 0 deletions al-auth-server/startup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/bin/bash

# This shell script is used to create a user that can be used to access Keycloak's Admin API for the CheckIt Server application and start Keycloak afterwards.

/opt/jboss/keycloak/bin/add-user-keycloak.sh -r $REALM_ID -u $KEYCLOAK_API_USER_USERNAME -p $KEYCLOAK_API_USER_PASSWORD

# Set roles to allow API access

echo "Configuring roles for Admin API user: $KEYCLOAK_API_USER_USERNAME"

changelog_filepath="/tmp/changelog.txt"
keycloak_add_user_filepath="/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json"
search_roles="\"realm-management\".*\s*"
replace_roles=$(cat /al-auth-server/api-roles.txt)

sed -i "s/$search_roles/$replace_roles/w $changelog_filepath" $keycloak_add_user_filepath

echo -n "Configuring roles for Admin API user: $KEYCLOAK_API_USER_USERNAME"
if [ -s $changelog_filepath ]; then
echo " - Done"
rm $changelog_filepath
else
echo " - Failed"
exit 1
fi

# Start Keycloak

/opt/jboss/tools/docker-entrypoint.sh

2 changes: 2 additions & 0 deletions al-db-server/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ RUN rm -rf ${GRAPHDB_HOME}/data
COPY ./data ${GRAPHDB_HOME}/data
COPY ./conf ${GRAPHDB_HOME}/conf

RUN GDB_JAVA_OPTS='-Dgraphdb.home=/graphdb/home' /graphdb/dist/bin/loadrdf -m parallel -i assembly-line /root/graphdb-import/* -f -s

CMD ["-Dgraphdb.home=/graphdb/home","-Dgraphdb.logback=conf/logback.xml"]
ENTRYPOINT ["/graphdb/dist/bin/graphdb"]
EXPOSE 7200
Loading

0 comments on commit 45b1d91

Please sign in to comment.