<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>oPBWeb Manual</title><link>/opbweb/manual/en/</link><description>Recent content on oPBWeb Manual</description><generator>Hugo</generator><language>en</language><atom:link href="/opbweb/manual/en/index.xml" rel="self" type="application/rss+xml"/><item><title>Architecture</title><link>/opbweb/manual/en/technical-admin/architektur/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/technical-admin/architektur/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;oPBWeb runs as a single Docker Compose project named &lt;code&gt;opbweb&lt;/code&gt;. The file &lt;code&gt;docker-compose.yml&lt;/code&gt; describes production operation; &lt;code&gt;docker-compose.dev.yml&lt;/code&gt; extends it for development. This chapter shows which services exist, how they are connected and where each kind of data is stored.&lt;/p&gt;
&lt;h2 id="services"&gt;Services&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Container&lt;/th&gt;
 &lt;th&gt;Image&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;frontend&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-frontend&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-frontend:latest&lt;/code&gt; (nginx:stable-alpine)&lt;/td&gt;
 &lt;td&gt;serves the web interface and the manual, forwards &lt;code&gt;/api&lt;/code&gt; to the API; the only service with published ports&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;api&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-api&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-backend:latest&lt;/code&gt; (python:3.13-slim)&lt;/td&gt;
 &lt;td&gt;REST API and WebSocket (FastAPI/uvicorn on port 8000), sign-in, database migrations at startup, first administrator account&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;worker&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-worker&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-backend:latest&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;runs all jobs (arq on Redis); the only service that talks to the opsi config servers and decrypts their passwords&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;db&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-db&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mariadb:11.4&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;all application data (packages, versions, users, jobs, audit log, settings)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;redis&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-redis&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;redis:7-alpine&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;job queue, worker heartbeat, opsi connection status, revocation list of signed-out tokens, depot locks&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;garage&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-garage&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dxflrs/garage:v2.2.0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;S3-compatible object storage (single node, replication factor 1) for file contents and built packages&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;garage-init&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-garage-init&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-garage-init:1.0.0&lt;/code&gt; (alpine:3.21)&lt;/td&gt;
 &lt;td&gt;sets up the layout, the access key &lt;code&gt;opbweb&lt;/code&gt; and the bucket &lt;code&gt;packages&lt;/code&gt; on every start, then exits&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;API and worker use the same image; the worker just starts with a different command (&lt;code&gt;./start-worker.sh&lt;/code&gt;). The garage-init image carries the &lt;code&gt;:dev&lt;/code&gt; tag in production as well.&lt;/p&gt;</description></item><item><title>Getting Started</title><link>/opbweb/manual/en/user-guide/erste-schritte/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/erste-schritte/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Viewer, Packager, Releaser, Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This chapter shows you how to sign in, how the oPBWeb interface is laid out and how to use the search to jump quickly to packages, files and commands. At the end you find a short overview of the roles and the package lifecycle.&lt;/p&gt;
&lt;h2 id="signing-in"&gt;Signing in&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Open oPBWeb in your browser. Without a valid session, you land on the sign-in page.&lt;/li&gt;
&lt;li&gt;Enter your &lt;strong&gt;User name&lt;/strong&gt; and &lt;strong&gt;Password&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Sign in&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After signing in, the package list opens, or the page you originally wanted to open. On the sign-in page you can already switch the language (DE/EN) and light/dark mode in the top corner.&lt;/p&gt;</description></item><item><title>Requirements</title><link>/opbweb/manual/en/installation/voraussetzungen/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/installation/voraussetzungen/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This chapter lists everything that must be in place before the installation: a Docker host, free ports, a network connection to the opsi configserver and a technical opsi user. Check the items in order before you start the &lt;a href="/opbweb/manual/en/installation/installation/"&gt;Installation&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="host"&gt;Host&lt;/h2&gt;
&lt;p&gt;oPBWeb runs on any Linux host with Docker. You can run the stack directly on the opsi configserver or on a separate host that reaches the configserver via HTTPS.&lt;/p&gt;</description></item><item><title>Users and Roles</title><link>/opbweb/manual/en/functional-admin/benutzer-und-rollen/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/functional-admin/benutzer-und-rollen/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Under &lt;strong&gt;Users and roles&lt;/strong&gt;, you manage all accounts that can sign in to oPBWeb. Each account has exactly one role, which defines what it may do in the UI. Besides local accounts that you create yourself, there are directory accounts from LDAP whose role is derived from their groups in the directory.&lt;/p&gt;
&lt;p&gt;Open the area with the &lt;strong&gt;Users and roles&lt;/strong&gt; icon at the bottom of the activity bar. It has two tabs: &lt;strong&gt;Users&lt;/strong&gt; (with the number of accounts) and &lt;strong&gt;Audit log&lt;/strong&gt;. The audit log is described in the &lt;a href="/opbweb/manual/en/functional-admin/protokoll/"&gt;Audit log&lt;/a&gt;
 chapter.&lt;/p&gt;</description></item><item><title>Audit Log</title><link>/opbweb/manual/en/functional-admin/protokoll/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/functional-admin/protokoll/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The audit log records who triggered which important action in oPBWeb and when: sign-ins and changes to accounts, packages, depots and settings. You find it under &lt;strong&gt;Users and roles&lt;/strong&gt; on the &lt;strong&gt;Audit log&lt;/strong&gt; tab. Only administrators can read it.&lt;/p&gt;
&lt;p&gt;Entries can be neither changed nor deleted in the UI. Even if you delete a user account, its entries are kept with the user name.&lt;/p&gt;
&lt;h2 id="reading-the-audit-log"&gt;Reading the audit log&lt;/h2&gt;
&lt;p&gt;&lt;img src="/opbweb/manual/images/en/functional-admin/protokoll-liste-01.png" alt="“Audit log” tab with filter fields and entries" /&gt;
&lt;/p&gt;</description></item><item><title>Configuration</title><link>/opbweb/manual/en/technical-admin/konfiguration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/technical-admin/konfiguration/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;oPBWeb splits its configuration into three levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt; in the project directory: non-secret settings such as ports, LDAP server, time limits. Docker Compose reads the file and inserts the values into &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;secrets/&lt;/code&gt;&lt;/strong&gt;: all passwords and keys as individual files. They reach the containers as Docker secrets and are never stored in &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User interface&lt;/strong&gt;: the connections to the opsi config servers (URL, technical user, password, stage, CA certificate; in the &lt;strong&gt;Depots&lt;/strong&gt; view) and the defaults for new packages. These settings are stored in the database, see &lt;a href="/opbweb/manual/en/functional-admin/opsi-server/"&gt;Config servers&lt;/a&gt;
 and &lt;a href="/opbweb/manual/en/functional-admin/einstellungen/"&gt;Settings for new packages&lt;/a&gt;
.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;./setup-opbweb.sh&lt;/code&gt; creates &lt;code&gt;.env&lt;/code&gt; and the missing secrets, see &lt;a href="/opbweb/manual/en/installation/installation/"&gt;Installation&lt;/a&gt;
. Afterwards you can edit &lt;code&gt;.env&lt;/code&gt; directly or run the script again; the existing values are then the defaults. Changes to &lt;code&gt;.env&lt;/code&gt; take effect with the next &lt;code&gt;./start.sh&lt;/code&gt;; Docker Compose then recreates the affected containers.&lt;/p&gt;</description></item><item><title>Installation</title><link>/opbweb/manual/en/installation/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/installation/installation/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The installation takes only a few steps: get the sources, run &lt;code&gt;./setup-opbweb.sh&lt;/code&gt; (it writes the configuration file &lt;code&gt;.env&lt;/code&gt; and generates the secrets), optionally add a TLS certificate, and start the stack. You either build the images locally with &lt;code&gt;./start.sh --build&lt;/code&gt; or pull prebuilt images from a registry. Then check that all services are running and continue with the &lt;a href="/opbweb/manual/en/installation/ersteinrichtung/"&gt;Initial Setup&lt;/a&gt;
 in the interface.&lt;/p&gt;
&lt;p&gt;Run all commands in the project directory on the Docker host. Check the &lt;a href="/opbweb/manual/en/installation/voraussetzungen/"&gt;Requirements&lt;/a&gt;
 first.&lt;/p&gt;</description></item><item><title>Packages</title><link>/opbweb/manual/en/user-guide/pakete/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/pakete/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Viewer, Packager, Releaser, Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Packages&lt;/strong&gt; area is the start page of oPBWeb. Here you see all packages with their latest version, check in the package details on which depots they are installed, and create new packages. As a viewer you can see the list and the details; creating, importing and all changing actions require at least the Packager role.&lt;/p&gt;
&lt;h2 id="the-package-list"&gt;The package list&lt;/h2&gt;
&lt;p&gt;&lt;img src="/opbweb/manual/images/en/user-guide/pakete-liste-01.png" alt="Package list with status filters, table and package details on the right" /&gt;
&lt;/p&gt;</description></item><item><title>Config Servers</title><link>/opbweb/manual/en/functional-admin/opsi-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/functional-admin/opsi-server/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;oPBWeb works with any number of opsi config servers, for example a test, a staging and a production system. Through each config server, oPBWeb reads its depots, installs packages and accesses &lt;code&gt;/repository&lt;/code&gt;, &lt;code&gt;/workbench&lt;/code&gt; and &lt;code&gt;/depot&lt;/code&gt;. Each depot belongs to exactly one config server.&lt;/p&gt;
&lt;p&gt;You manage the config servers in the &lt;strong&gt;Depots&lt;/strong&gt; view in the activity bar. As long as no config server is configured, depots, installing and the workbench do not work, and the status bar shows “No config server configured”.&lt;/p&gt;</description></item><item><title>Initial Setup</title><link>/opbweb/manual/en/installation/ersteinrichtung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/installation/ersteinrichtung/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;After the &lt;a href="/opbweb/manual/en/installation/installation/"&gt;Installation&lt;/a&gt;
, oPBWeb is reachable but does not know any opsi server yet and has only one account: the first administrator. During the initial setup you sign in with this account, change its password, connect oPBWeb to one or more opsi configservers, define the depot stages and set up the first users.&lt;/p&gt;
&lt;p&gt;For this you need the admin password from &lt;code&gt;secrets/admin_password.txt&lt;/code&gt;, the credentials of the technical opsi user and shell access to the configserver to verify the fingerprint of the CA certificate.&lt;/p&gt;</description></item><item><title>LDAP Sign-in</title><link>/opbweb/manual/en/technical-admin/ldap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/technical-admin/ldap/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;In addition to local accounts, oPBWeb can sign users in against an LDAP directory or Active Directory. The role in oPBWeb is then derived from the group memberships in the directory. You configure the connection with &lt;code&gt;LDAP_*&lt;/code&gt; variables in &lt;code&gt;.env&lt;/code&gt; and the password of the service account in &lt;code&gt;secrets/ldap_bind_password.txt&lt;/code&gt;. There are no settings for this in the user interface.&lt;/p&gt;
&lt;h2 id="how-sign-in-works"&gt;How sign-in works&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;If oPBWeb has a &lt;strong&gt;local&lt;/strong&gt; account with the entered user name, oPBWeb signs in locally only. The directory is not queried, even if the password is wrong.&lt;/li&gt;
&lt;li&gt;Otherwise, with &lt;code&gt;LDAP_ENABLED=true&lt;/code&gt;, oPBWeb connects with the service account (&lt;code&gt;LDAP_BIND_DN&lt;/code&gt;), or anonymously if no bind DN is set.&lt;/li&gt;
&lt;li&gt;oPBWeb searches with &lt;code&gt;LDAP_USER_FILTER&lt;/code&gt; below &lt;code&gt;LDAP_USER_SEARCH_BASE&lt;/code&gt; (empty: &lt;code&gt;LDAP_BASE_DN&lt;/code&gt;). The search must return exactly one entry.&lt;/li&gt;
&lt;li&gt;oPBWeb binds as the user with the DN it found and the entered password, which verifies the password.&lt;/li&gt;
&lt;li&gt;oPBWeb determines the role from the &lt;code&gt;memberOf&lt;/code&gt; attribute (see below). Without a matching group, there is no access.&lt;/li&gt;
&lt;li&gt;On the first successful sign-in, oPBWeb creates the account with the source &lt;strong&gt;Directory (LDAP)&lt;/strong&gt;. Display name (&lt;code&gt;displayName&lt;/code&gt;), email (&lt;code&gt;mail&lt;/code&gt;) and role are taken from the directory again on &lt;strong&gt;every&lt;/strong&gt; sign-in.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Local accounts therefore always stay local, including the first administrator account. This way you can still get into oPBWeb if the directory is down.&lt;/p&gt;</description></item><item><title>Package Editor</title><link>/opbweb/manual/en/user-guide/paket-editor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/paket-editor/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Viewer, Packager, Releaser, Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;In the package editor you edit a package version: the control data (product information, scripts, dependencies, properties), the changelog and the files of the package. This chapter describes the &lt;strong&gt;control&lt;/strong&gt; tab. Working with files and scripts is described in &lt;a href="/opbweb/manual/en/user-guide/dateien/"&gt;Package Files&lt;/a&gt;
 and &lt;a href="/opbweb/manual/en/user-guide/scripteditor/"&gt;Script Editor&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;You can only edit &lt;strong&gt;drafts&lt;/strong&gt;, and only with at least the Packager role. As a viewer and for released versions, all fields are locked; you can still view everything.&lt;/p&gt;</description></item><item><title>Operation and Updates</title><link>/opbweb/manual/en/technical-admin/betrieb/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/technical-admin/betrieb/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;For day-to-day operation you need two scripts in the project directory: &lt;code&gt;start.sh&lt;/code&gt; and &lt;code&gt;stop.sh&lt;/code&gt;. This chapter also describes where to find logs and service status, how to update oPBWeb and what to keep in mind on the opsi side. Run all commands in the project directory.&lt;/p&gt;
&lt;h2 id="starting-and-stopping-the-stack"&gt;Starting and stopping the stack&lt;/h2&gt;
&lt;h3 id="startsh"&gt;start.sh&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./start.sh &lt;span style="color:#f92672"&gt;[&lt;/span&gt;--build&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;--logs&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;--dev | --test&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;--lang de|en&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Option&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;starts the production stack (&lt;code&gt;docker-compose.yml&lt;/code&gt;) with the existing images&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--build&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;rebuilds your own images before starting&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--logs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;follows the logs of all containers after starting (&lt;code&gt;logs -f --tail=50&lt;/code&gt;); Ctrl+C only ends the output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--dev&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;adds &lt;code&gt;docker-compose.dev.yml&lt;/code&gt; (development stack, see below); only in a clone with the sources&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--test&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;adds &lt;code&gt;docker-compose.test.yml&lt;/code&gt;: two opsi mocks as config servers Test and Production, see &lt;a href="/opbweb/manual/en/installation/testumgebung/"&gt;Test Environment&lt;/a&gt;
&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--lang de&lt;/code&gt; or &lt;code&gt;--lang en&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;language of the messages for this run (otherwise &lt;code&gt;OPBWEB_LANG&lt;/code&gt; from &lt;code&gt;.env&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-h&lt;/code&gt;, &lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;shows the help&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sequence: the script aborts if &lt;code&gt;.env&lt;/code&gt; is missing („.env fehlt – bitte ./setup-opbweb.sh ausführen (im Entwickler-Checkout: ./setup-opbweb.sh &amp;ndash;dev).“ – .env is missing, please run ./setup-opbweb.sh, in a developer checkout ./setup-opbweb.sh &amp;ndash;dev), calls &lt;code&gt;scripts/init-secrets.sh&lt;/code&gt;, runs &lt;code&gt;docker compose up -d&lt;/code&gt; and shows the status with &lt;code&gt;docker compose ps&lt;/code&gt;. Running containers whose configuration has not changed are left untouched. &lt;code&gt;start.sh&lt;/code&gt; does not pull new third-party images; for that, see &lt;a href="#aktualisieren"&gt;Updating&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Package Files</title><link>/opbweb/manual/en/user-guide/dateien/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/dateien/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Packager&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Every package version consists of the three areas &lt;code&gt;OPSI/&lt;/code&gt;, &lt;code&gt;CLIENT_DATA/&lt;/code&gt; and &lt;code&gt;SERVER_DATA/&lt;/code&gt;. In the package editor you see them on the left under the &lt;strong&gt;Files&lt;/strong&gt; tab. There you create files and folders, upload installers, rename, move and delete. The &lt;strong&gt;Structure&lt;/strong&gt; tab next to it shows which scripts include which other scripts.&lt;/p&gt;
&lt;p&gt;You can only change files in a version with the status &lt;em&gt;Draft&lt;/em&gt; and with at least the Packager role. In released versions and with the Viewer role, the file tree is read-only: opening and downloading still work, all changing entries in the context menu are grayed out.&lt;/p&gt;</description></item><item><title>Settings for New Packages</title><link>/opbweb/manual/en/functional-admin/einstellungen/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/functional-admin/einstellungen/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, you define the values new packages and meta packages start with, and which mail address changelog entries get when the user has no email. The values apply to all users. Only administrators may change them.&lt;/p&gt;
&lt;p&gt;The defaults only take effect when a package is created. Existing packages and imported packages (&lt;code&gt;.opsi&lt;/code&gt; or workbench) keep their own values, and every Packager can override the defaults in the package editor.&lt;/p&gt;</description></item><item><title>Test Environment</title><link>/opbweb/manual/en/installation/testumgebung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/installation/testumgebung/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration, anyone who wants to try oPBWeb&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The test environment starts oPBWeb together with two simulated opsi servers (opsiconfd mocks). With them you try the editor and the whole workflow, from the import from the workbench through building to promoting from Test to Production, without a real opsi server.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Config server in oPBWeb&lt;/th&gt;
 &lt;th&gt;Stage&lt;/th&gt;
 &lt;th&gt;Depots&lt;/th&gt;
 &lt;th&gt;Mock container&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;opsi-test&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Test&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opsi-test.mock&lt;/code&gt; (config server), &lt;code&gt;depot-test.mock&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-opsi-mock-test&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;opsi-prod&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Production&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opsi-prod.mock&lt;/code&gt; (config server), &lt;code&gt;depot-prod.mock&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;opbweb-opsi-mock-prod&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The mocks run with the oPBWeb backend image, their code comes from &lt;code&gt;tools/opsi-mock/opsi_mock.py&lt;/code&gt;. Both are part of the repository clone and of the &lt;a href="/opbweb/manual/en/technical-admin/build-und-auslieferung/#stack-zip"&gt;stack ZIP&lt;/a&gt;
. The short version of this guide is next to them as &lt;code&gt;START-TEST-ENVIRONMENT_en.md&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Backup and Restore</title><link>/opbweb/manual/en/technical-admin/sicherung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/technical-admin/sicherung/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;oPBWeb&amp;rsquo;s data lives in two places that belong together: the database holds all metadata, the object storage holds the file contents. The database refers to objects in the storage via SHA-256 checksums and keys (&lt;code&gt;blobs/…&lt;/code&gt;, &lt;code&gt;artifacts/…&lt;/code&gt;). A backup is only usable if both parts come &lt;strong&gt;from the same point in time&lt;/strong&gt; and the &lt;strong&gt;matching secrets&lt;/strong&gt; are included.&lt;/p&gt;
&lt;div class="alert alert-info" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Note&lt;/div&gt;
&lt;p&gt;The commands in this chapter are examples. Backing up the database with &lt;code&gt;mariadb-dump&lt;/code&gt; and backing up the Garage volumes while the stack is stopped is the intended approach; the specific commands for volumes and restore are derived from it. Adapt paths and names to your environment and test the restore before you rely on it.&lt;/p&gt;</description></item><item><title>Depot Management</title><link>/opbweb/manual/en/functional-admin/depot-verwaltung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/functional-admin/depot-verwaltung/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;oPBWeb reads the list of depots from the configured opsi config servers. Each depot belongs to exactly one config server. As an administrator, you define for each depot which &lt;strong&gt;Stage&lt;/strong&gt; it runs in, which &lt;strong&gt;Service URL&lt;/strong&gt; oPBWeb uses to reach it and whether it is used at all (&lt;strong&gt;Enabled&lt;/strong&gt;). The stage determines which role may install on the depot.&lt;/p&gt;
&lt;p&gt;You find these settings under &lt;strong&gt;Depots&lt;/strong&gt;. The list on the left is grouped by config server: each config server is shown as a bold row, with its depots indented below it, each with a stage badge and the number of products; for the config server&amp;rsquo;s own depot, for example, “config server · 120 products”. Additions such as “disabled” or “no longer present” also appear in the second line. How to add and maintain config servers is described in &lt;a href="/opbweb/manual/en/functional-admin/opsi-server/"&gt;Config servers&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Script Editor</title><link>/opbweb/manual/en/user-guide/scripteditor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/scripteditor/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Packager&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;To open a text file of the package, click it in the file tree (see &lt;a href="/opbweb/manual/en/user-guide/dateien/"&gt;Package files&lt;/a&gt;
). It opens as a separate tab next to the &lt;strong&gt;control&lt;/strong&gt; tab in the script editor. For opsi scripts, the editor offers completion, error checking, command help and snippets. All other text formats get syntax highlighting. You set the highlighting colors per file type under &lt;a href="/opbweb/manual/en/user-guide/konto-und-sprache/#syntax-colors-in-the-editor"&gt;My account&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;You can only edit files in a version with the status &lt;em&gt;Draft&lt;/em&gt; and with at least the Packager role. Otherwise the editor is read-only; reading, searching, help and copying text still work.&lt;/p&gt;</description></item><item><title>Build and Deploy</title><link>/opbweb/manual/en/user-guide/bauen-und-verteilen/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/bauen-und-verteilen/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Packager, Releaser&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This chapter describes the path of a package version from draft to the depots: &lt;strong&gt;Build&lt;/strong&gt; creates the &lt;code&gt;.opsi&lt;/code&gt; file, &lt;strong&gt;Install …&lt;/strong&gt; transfers it to one or more depots and releases the version in the process, &lt;strong&gt;Promote …&lt;/strong&gt; takes a tested version unchanged to the depots of the next stage. You find all actions in the toolbar of the &lt;strong&gt;control&lt;/strong&gt; tab in the &lt;a href="/opbweb/manual/en/user-guide/paket-editor/"&gt;package editor&lt;/a&gt;
 and in the &lt;strong&gt;⋯&lt;/strong&gt; menu (More actions).&lt;/p&gt;</description></item><item><title>System Status</title><link>/opbweb/manual/en/functional-admin/systemstatus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/functional-admin/systemstatus/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;System status&lt;/strong&gt; area shows whether all oPBWeb services are running and gives administrators insight into how the database and object storage are used. Open it with the &lt;strong&gt;System status&lt;/strong&gt; icon at the bottom of the activity bar.&lt;/p&gt;
&lt;p&gt;All roles see the services table. Only administrators see the &lt;strong&gt;Database&lt;/strong&gt;, &lt;strong&gt;Object storage&lt;/strong&gt; (with &lt;strong&gt;Clean up …&lt;/strong&gt;) and &lt;strong&gt;Bucket contents&lt;/strong&gt; sections.&lt;/p&gt;
&lt;h2 id="checking-services"&gt;Checking services&lt;/h2&gt;
&lt;p&gt;&lt;img src="/opbweb/manual/images/en/functional-admin/systemstatus-dienste-01.png" alt="System status with the services table" /&gt;
&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>/opbweb/manual/en/technical-admin/fehlersuche/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/technical-admin/fehlersuche/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This chapter sorts typical problems by symptom. For each symptom you find the likely cause and the fix. At the end there is a table of important error messages. Messages of the server follow the interface language; this chapter quotes them as shown in the English interface. Messages of the shell scripts and container logs are German and are quoted with an English translation.&lt;/p&gt;
&lt;h2 id="first-places-to-look"&gt;First places to look&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;th&gt;Content&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;System status&lt;/strong&gt; page&lt;/td&gt;
 &lt;td&gt;status of database, Redis, object storage, worker and opsi server, see &lt;a href="/opbweb/manual/en/functional-admin/systemstatus/"&gt;System status&lt;/a&gt;
&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Jobs&lt;/strong&gt; page&lt;/td&gt;
 &lt;td&gt;complete log of every job with error message, see &lt;a href="/opbweb/manual/en/user-guide/jobs/"&gt;Jobs&lt;/a&gt;
&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;docker compose ps -a&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;which containers are running and which have exited (with exit code)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;docker logs opbweb-api&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;startup, migrations, sign-in, LDAP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;docker logs opbweb-worker&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;jobs, opsi connection&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;docker logs opbweb-garage-init&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;object storage setup&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Status bar of the user interface&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;Backend not connected&amp;rdquo; if the API does not respond; orange notice for problems with the opsi server&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="stack-does-not-start"&gt;Stack does not start&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Symptom&lt;/th&gt;
 &lt;th&gt;Cause&lt;/th&gt;
 &lt;th&gt;Fix&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;start.sh&lt;/code&gt; reports „.env fehlt – bitte ./setup-opbweb.sh ausführen (im Entwickler-Checkout: ./setup-opbweb.sh &amp;ndash;dev).“ (.env is missing, run the setup script)&lt;/td&gt;
 &lt;td&gt;no &lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;./setup-opbweb.sh&lt;/code&gt; (or &lt;code&gt;cp .env.example .env&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API does not start, log: &amp;ldquo;Secret file not found: …&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;secret file missing, for example because the stack was started with &lt;code&gt;docker compose&lt;/code&gt; instead of &lt;code&gt;./start.sh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;use &lt;code&gt;./start.sh&lt;/code&gt; or run &lt;code&gt;./scripts/init-secrets.sh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API exits after about 60 seconds, log: &amp;ldquo;Database not reachable: …&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;MariaDB not ready, or the password does not match the volume&lt;/td&gt;
 &lt;td&gt;check &lt;code&gt;docker logs opbweb-db&lt;/code&gt;; if &lt;code&gt;db_password.txt&lt;/code&gt; was changed, see &lt;a href="/opbweb/manual/en/technical-admin/konfiguration/"&gt;Configuration&lt;/a&gt;
&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;api, worker and frontend do not start, garage-init has a non-zero exit code&lt;/td&gt;
 &lt;td&gt;object storage setup failed&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker logs opbweb-garage-init&lt;/code&gt;; &amp;ldquo;ERROR: No admin token found&amp;rdquo; means &lt;code&gt;secrets/garage_admin_token.txt&lt;/code&gt; is missing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;garage-init keeps reporting &amp;ldquo;Not ready yet, retrying in 2s&amp;hellip;&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Garage does not start or the admin token does not match&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker logs opbweb-garage&lt;/code&gt;; do not change the token in &lt;code&gt;secrets/&lt;/code&gt; afterwards&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API log: &amp;ldquo;No users and no ADMIN_PASSWORD configured - no initial admin created&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;secrets/admin_password.txt&lt;/code&gt; is empty or missing while the user table is empty&lt;/td&gt;
 &lt;td&gt;fill the file or let &lt;code&gt;init-secrets.sh&lt;/code&gt; create it, restart the stack&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="anmeldung"&gt;Sign-in&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;“Wrong user name or password.”&lt;/strong&gt; For local accounts, every failed attempt counts. After 5 failed attempts from the same address the account is locked for that address for 15 minutes: “Account locked until HH:MM.” The user can still sign in from other addresses; the account is locked for everyone only after 50 failed attempts. After 20 failed attempts from one address (across all accounts) oPBWeb answers “Too many failed sign-ins from this address.” An administrator removes the lock under &lt;strong&gt;Users and roles&lt;/strong&gt; with &lt;strong&gt;Unlock&lt;/strong&gt;; &lt;strong&gt;Set password&lt;/strong&gt; also unlocks the account. See &lt;a href="/opbweb/manual/en/functional-admin/benutzer-und-rollen/"&gt;Users and roles&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Build and Delivery</title><link>/opbweb/manual/en/technical-admin/build-und-auslieferung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/technical-admin/build-und-auslieferung/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Technical administration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;oPBWeb consists of three images of its own: backend (for api and worker), frontend (nginx with user interface and manual) and garage-init. You either build them locally with &lt;code&gt;./start.sh --build&lt;/code&gt; or let GitLab CI build them and push them to the project registry. The CI also generates the manual as PDF. This chapter describes the images, the pipeline and how to build the manual locally.&lt;/p&gt;
&lt;h2 id="images"&gt;Images&lt;/h2&gt;
&lt;p&gt;All Dockerfiles use the project directory as build context. Among other things, &lt;code&gt;.dockerignore&lt;/code&gt; keeps &lt;code&gt;secrets/&lt;/code&gt;, &lt;code&gt;certs/&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;node_modules/&lt;/code&gt; as well as the Hugo output and &lt;code&gt;manual/.doc-state/&lt;/code&gt; out of the context.&lt;/p&gt;</description></item><item><title>Snippets</title><link>/opbweb/manual/en/user-guide/snippets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/snippets/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Viewer, Packager, Releaser, Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Snippets are text blocks for opsi-script that you insert in the script editor by double-click, autocompletion or the context menu. The &lt;strong&gt;Snippets&lt;/strong&gt; view in the activity bar is where you manage them: create categories, write and test snippets, import and export files.&lt;/p&gt;
&lt;p&gt;Viewers see all snippets but cannot change anything. From the Packager role on, you create your own snippets and maintain the shared categories.&lt;/p&gt;</description></item><item><title>Depots</title><link>/opbweb/manual/en/user-guide/depots/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/depots/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Viewer, Packager, Releaser, Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Depots&lt;/strong&gt; view shows all opsi config servers set up in oPBWeb and their depots as oPBWeb last read them. You see which products are installed in which version, clean up the repository, edit files directly on the server and compare the depots with each other.&lt;/p&gt;
&lt;p&gt;Viewers see everything but cannot change anything. What Packagers and Releasers may change on a depot depends on its stage (see &lt;a href="#stufen-und-rollen"&gt;Stages and roles&lt;/a&gt;
). Only administrators can add, edit and remove config servers, see &lt;a href="/opbweb/manual/en/functional-admin/opsi-server/"&gt;opsi server&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Jobs</title><link>/opbweb/manual/en/user-guide/jobs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/jobs/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Viewer, Packager, Releaser, Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Everything that takes longer or talks to an opsi server runs in oPBWeb as a background &lt;strong&gt;job&lt;/strong&gt;. You start the action, keep working and follow the progress in the status bar, in the package editor or in the &lt;strong&gt;Jobs&lt;/strong&gt; view.&lt;/p&gt;
&lt;p&gt;All users see all jobs, including those of their colleagues, together with their logs. This lets you trace who built or deployed what and when.&lt;/p&gt;</description></item><item><title>Account and Language</title><link>/opbweb/manual/en/user-guide/konto-und-sprache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/opbweb/manual/en/user-guide/konto-und-sprache/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roles:&lt;/strong&gt; Viewer, Packager, Releaser, Administrator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;You reach the settings of your own account via the avatar icon with your initials at the far right of the top bar. Next to it in the top bar you find the switches for language and light/dark appearance, as well as access to this manual.&lt;/p&gt;
&lt;p&gt;These functions are available to all users, regardless of their role.&lt;/p&gt;
&lt;h2 id="the-user-menu"&gt;The user menu&lt;/h2&gt;
&lt;p&gt;Click the avatar icon to open the user menu.&lt;/p&gt;</description></item></channel></rss>