From 4fd4531bf8103c5e0b167f2442022940c3c25411 Mon Sep 17 00:00:00 2001 From: Natnael Getahun Date: Mon, 20 Jul 2026 15:04:38 +0200 Subject: [PATCH 1/4] Add modular RMT documentation with Ansible-based configuration Port the Repository Mirroring Tool (RMT) documentation into the modular topic-based format as three Smart Doc articles: - Installing and configuring an RMT server - Mirroring repositories on an RMT server - Migrating from SMT to RMT Content is migrated from the SLE RMT Guide (doc-sle) and updated for the new ansible-rmt-server playbook workflow, replacing the YaST-based setup (port of SUSE/doc-sle#1945). Cross-references to un-ported chapters point to the online RMT Guide. All three articles pass DAPS 4 + geekodoc validation and render to HTML. Co-Authored-By: Claude Opus 4.8 --- DC-SLES-rmt-installing-configuring | 18 + DC-SLES-rmt-migrating-from-smt | 18 + DC-SLES-rmt-mirroring-repositories | 18 + articles/rmt-installing-configuring.asm.xml | 178 ++++++++++ articles/rmt-migrating-from-smt.asm.xml | 152 +++++++++ articles/rmt-mirroring-repositories.asm.xml | 166 +++++++++ glues/rmt-installing-intro.xml | 42 +++ glues/rmt-installing-more-info.xml | 37 ++ glues/rmt-mirroring-intro.xml | 64 ++++ glues/rmt-mirroring-more-info.xml | 38 +++ glues/rmt-smt-migration-intro.xml | 84 +++++ glues/rmt-smt-migration-more-info.xml | 37 ++ images/rmt_installation.png | Bin 0 -> 74669 bytes images/scc_eye_icon.png | Bin 0 -> 1710 bytes references/rmt-configuration-files.xml | 269 +++++++++++++++ references/rmt-smt-feature-comparison.xml | 299 ++++++++++++++++ references/rmt-storage-requirements.xml | 49 +++ tasks/rmt-accessing-scc-behind-firewall.xml | 83 +++++ tasks/rmt-configuring-with-ansible.xml | 187 ++++++++++ tasks/rmt-deploying-on-kubernetes.xml | 319 ++++++++++++++++++ tasks/rmt-enabling-slp-announcements.xml | 59 ++++ tasks/rmt-installing-during-installation.xml | 51 +++ tasks/rmt-installing-existing-system.xml | 86 +++++ tasks/rmt-mirroring-custom-repositories.xml | 97 ++++++ tasks/rmt-mirroring-deleting-data.xml | 72 ++++ ...roring-enabling-disabling-repositories.xml | 163 +++++++++ tasks/rmt-mirroring-exporting-importing.xml | 149 ++++++++ tasks/rmt-mirroring-obtaining-credentials.xml | 83 +++++ tasks/rmt-mirroring-packages.xml | 57 ++++ .../rmt-mirroring-synchronizing-metadata.xml | 57 ++++ tasks/rmt-regenerating-certificates.xml | 103 ++++++ tasks/rmt-smt-exporting-data.xml | 54 +++ tasks/rmt-smt-importing-data.xml | 137 ++++++++ 33 files changed, 3226 insertions(+) create mode 100644 DC-SLES-rmt-installing-configuring create mode 100644 DC-SLES-rmt-migrating-from-smt create mode 100644 DC-SLES-rmt-mirroring-repositories create mode 100644 articles/rmt-installing-configuring.asm.xml create mode 100644 articles/rmt-migrating-from-smt.asm.xml create mode 100644 articles/rmt-mirroring-repositories.asm.xml create mode 100644 glues/rmt-installing-intro.xml create mode 100644 glues/rmt-installing-more-info.xml create mode 100644 glues/rmt-mirroring-intro.xml create mode 100644 glues/rmt-mirroring-more-info.xml create mode 100644 glues/rmt-smt-migration-intro.xml create mode 100644 glues/rmt-smt-migration-more-info.xml create mode 100644 images/rmt_installation.png create mode 100644 images/scc_eye_icon.png create mode 100644 references/rmt-configuration-files.xml create mode 100644 references/rmt-smt-feature-comparison.xml create mode 100644 references/rmt-storage-requirements.xml create mode 100644 tasks/rmt-accessing-scc-behind-firewall.xml create mode 100644 tasks/rmt-configuring-with-ansible.xml create mode 100644 tasks/rmt-deploying-on-kubernetes.xml create mode 100644 tasks/rmt-enabling-slp-announcements.xml create mode 100644 tasks/rmt-installing-during-installation.xml create mode 100644 tasks/rmt-installing-existing-system.xml create mode 100644 tasks/rmt-mirroring-custom-repositories.xml create mode 100644 tasks/rmt-mirroring-deleting-data.xml create mode 100644 tasks/rmt-mirroring-enabling-disabling-repositories.xml create mode 100644 tasks/rmt-mirroring-exporting-importing.xml create mode 100644 tasks/rmt-mirroring-obtaining-credentials.xml create mode 100644 tasks/rmt-mirroring-packages.xml create mode 100644 tasks/rmt-mirroring-synchronizing-metadata.xml create mode 100644 tasks/rmt-regenerating-certificates.xml create mode 100644 tasks/rmt-smt-exporting-data.xml create mode 100644 tasks/rmt-smt-importing-data.xml diff --git a/DC-SLES-rmt-installing-configuring b/DC-SLES-rmt-installing-configuring new file mode 100644 index 000000000..6ad44573a --- /dev/null +++ b/DC-SLES-rmt-installing-configuring @@ -0,0 +1,18 @@ +# This file originates from the project https://github.com/openSUSE/doc-kit +# This file can be edited downstream. + +## Basics +MAIN="rmt-installing-configuring.asm.xml" +SRC_DIR="articles" +IMG_SRC_DIR="images" + +## Profiling +PROFOS="sles" +#PROFCONDITION="16.0" +#PROFARCH="x86_64;zseries;power;aarch64" + +DOCBOOK5_RNG_URI="urn:x-suse:rng:v2:geekodoc-flat" + +## stylesheet location +STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2022-ns" +FALLBACK_STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2021-ns" diff --git a/DC-SLES-rmt-migrating-from-smt b/DC-SLES-rmt-migrating-from-smt new file mode 100644 index 000000000..dc874ba62 --- /dev/null +++ b/DC-SLES-rmt-migrating-from-smt @@ -0,0 +1,18 @@ +# This file originates from the project https://github.com/openSUSE/doc-kit +# This file can be edited downstream. + +## Basics +MAIN="rmt-migrating-from-smt.asm.xml" +SRC_DIR="articles" +IMG_SRC_DIR="images" + +## Profiling +PROFOS="sles" +#PROFCONDITION="16.0" +#PROFARCH="x86_64;zseries;power;aarch64" + +DOCBOOK5_RNG_URI="urn:x-suse:rng:v2:geekodoc-flat" + +## stylesheet location +STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2022-ns" +FALLBACK_STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2021-ns" diff --git a/DC-SLES-rmt-mirroring-repositories b/DC-SLES-rmt-mirroring-repositories new file mode 100644 index 000000000..f086b7167 --- /dev/null +++ b/DC-SLES-rmt-mirroring-repositories @@ -0,0 +1,18 @@ +# This file originates from the project https://github.com/openSUSE/doc-kit +# This file can be edited downstream. + +## Basics +MAIN="rmt-mirroring-repositories.asm.xml" +SRC_DIR="articles" +IMG_SRC_DIR="images" + +## Profiling +PROFOS="sles" +#PROFCONDITION="16.0" +#PROFARCH="x86_64;zseries;power;aarch64" + +DOCBOOK5_RNG_URI="urn:x-suse:rng:v2:geekodoc-flat" + +## stylesheet location +STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2022-ns" +FALLBACK_STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2021-ns" diff --git a/articles/rmt-installing-configuring.asm.xml b/articles/rmt-installing-configuring.asm.xml new file mode 100644 index 000000000..724274ad0 --- /dev/null +++ b/articles/rmt-installing-configuring.asm.xml @@ -0,0 +1,178 @@ + + + + + %entities; +]> + + + + + + + + Introduction to installing RMT + + + For more information + + + + + + RMT storage requirements + + + RMT configuration files + + + + + + Installing RMT during system installation + + + Installing RMT on an existing system + + + Deploying RMT on Kubernetes + + + Configuring RMT with Ansible + + + Enabling SLP announcements + + + Accessing SCC from behind a firewall + + + Managing TLS/SSL certificates + + + + + + Legal Notice + + + GNU Free Documentation License + + + + + + Installing and configuring an RMT server + + 2026-07-20 + + + Initial version. Migrated from the SLE Repository Mirroring Tool + Guide and updated for the &ansible;-based configuration workflow. + + + + + + + &x86-64; + &power; + + + &productname; + + Install and configure an RMT server + How to install the Repository Mirroring Tool and configure it with the Ansible playbook workflow + Install and configure RMT + + Systems Management + + + Installation + Configuration + + Products & Solutions + + + https://bugzilla.suse.com/enter_bug.cgi + Documentation + SUSE Linux Enterprise Server &productnumber; + MAINTAINER@suse.com + + yes + + + + + WHAT? + + + &rmt; (Repository Mirroring Tool) is a proxy for &scc; that + mirrors software repositories and registers client systems in + your own network. + + + + + WHY? + + + A local &rmt; server saves bandwidth and time by downloading + updates once and serving them to all client systems, and keeps + registration inside your network. + + + + + EFFORT + + + It takes about 30 minutes to install &rmt; and run the + &ansible; configuration playbook on a freshly installed system. + + + + + GOAL + + + A running &rmt; server, configured with &ansible; and ready to + mirror repositories and register clients. + + + + + REQUIREMENTS + + + A newly installed &productname; system or &minvm; image. + &scc; organization credentials for mirroring. + Sufficient storage for the repositories you plan to mirror. + + + + + + + + + + + + + + + + + + + + + diff --git a/articles/rmt-migrating-from-smt.asm.xml b/articles/rmt-migrating-from-smt.asm.xml new file mode 100644 index 000000000..f8137e5fc --- /dev/null +++ b/articles/rmt-migrating-from-smt.asm.xml @@ -0,0 +1,152 @@ + + + + + %entities; +]> + + + + + + + + Introduction and important notes + + + For more information + + + + + + SMT and RMT feature comparison + + + + + + Exporting SMT data + + + Importing SMT data to RMT + + + + + + Legal Notice + + + GNU Free Documentation License + + + + + + Migrating from SMT to RMT + + 2026-07-20 + + + Initial version. Migrated from the SLE Repository Mirroring Tool + Guide and updated for the &ansible;-based configuration workflow. + + + + + + + &x86-64; + &power; + + + &productname; + + Migrate from SMT to RMT + How to migrate from the Subscription Management Tool to the Repository Mirroring Tool + Migrate from SMT to RMT + + Systems Management + + + Migration + + Products & Solutions + + + https://bugzilla.suse.com/enter_bug.cgi + Documentation + SUSE Linux Enterprise Server &productnumber; + MAINTAINER@suse.com + + yes + + + + + WHAT? + + + Migration moves your repository mirroring and client + registration from the legacy ⪪ on &slsa; 11 or 12 to &rmt; + on &slsa; 15. + + + + + WHY? + + + ⪪ is not available on &slsa; 15. &rmt; is its supported + successor, with a modern workflow, offline mirroring, and + &kube; deployment options. + + + + + EFFORT + + + Exporting and importing the data takes about 30 minutes, plus + mirroring time depending on repository size. + + + + + GOAL + + + An &rmt; server on &slsa; 15 that continues to serve the + repositories and registered clients previously managed by ⪪. + + + + + REQUIREMENTS + + + An existing ⪪ server on &slsa; 11 or 12. + A newly installed &slsa; 15 host for &rmt;. + + + + + + + + + + + + + + + diff --git a/articles/rmt-mirroring-repositories.asm.xml b/articles/rmt-mirroring-repositories.asm.xml new file mode 100644 index 000000000..c0696c483 --- /dev/null +++ b/articles/rmt-mirroring-repositories.asm.xml @@ -0,0 +1,166 @@ + + + + + %entities; +]> + + + + + + + + Introduction to mirroring with RMT + + + For more information + + + + + + Obtaining mirroring credentials + + + Synchronizing repository metadata + + + Mirroring packages + + + Enabling and disabling mirroring of repositories + + + Deleting mirrored data + + + Adding custom repositories + + + Exporting and importing repositories + + + + + + Legal Notice + + + GNU Free Documentation License + + + + + + Mirroring repositories on an RMT server + + 2026-07-20 + + + Initial version. Migrated from the SLE Repository Mirroring Tool + Guide and updated for the &ansible;-based configuration workflow. + + + + + + + &x86-64; + &power; + + + &productname; + + Mirror repositories on an RMT server + How to mirror, synchronize, and manage SUSE and custom repositories on a Repository Mirroring Tool server + Mirror repositories with RMT + + Systems Management + + + Configuration + + Products & Solutions + + + https://bugzilla.suse.com/enter_bug.cgi + Documentation + SUSE Linux Enterprise Server &productnumber; + MAINTAINER@suse.com + + yes + + + + + WHAT? + + + Mirroring lets an &rmt; server download &sle; and custom + repositories from &scc; and serve them to client systems in + your own network. + + + + + WHY? + + + Mirroring locally saves bandwidth, speeds up updates, and + enables offline and air-gapped scenarios where clients cannot + reach &scc; directly. + + + + + EFFORT + + + It takes about 20 minutes to enable repositories and start the + first mirroring run, plus download time depending on repository + size. + + + + + GOAL + + + A working mirror of the repositories your clients need, kept up + to date automatically or on demand. + + + + + REQUIREMENTS + + + A running and configured &rmt; server. + &scc; organization credentials. + + + + + + + + + + + + + + + + + + + diff --git a/glues/rmt-installing-intro.xml b/glues/rmt-installing-intro.xml new file mode 100644 index 000000000..90e6bb443 --- /dev/null +++ b/glues/rmt-installing-intro.xml @@ -0,0 +1,42 @@ + + + %entities; +]> + + + + + + Introduction + + + + &rmt; is included in &sls; starting with version 15. Install &rmt; directly + during the installation of &productname; or install it on a running system. + After the packages are installed, use &ansible; to do an initial + configuration. + + + &rmt; server conflicts with installation server + + Configuring a server to be an &rmt; server installs and configures the + NGINX Web server, listening on port 80. + + + However, configuring a machine to be an installation server automatically + installs the Apache Web server and configures it to listen on port 80. + + + Do not try to enable both these functions on the same server. It is not + possible for a single server to host both simultaneously. + + + diff --git a/glues/rmt-installing-more-info.xml b/glues/rmt-installing-more-info.xml new file mode 100644 index 000000000..8d322fb34 --- /dev/null +++ b/glues/rmt-installing-more-info.xml @@ -0,0 +1,37 @@ + + + %entities; +]> + + + For more information + + + + To learn more about &rmt;, refer to the following resources: + + + + + + + Repository Mirroring Tool Guide + — the complete administrator's guide to &rmt;, including client + configuration and the rmt-cli command reference. + + + + + &rmt; source code and issue tracker on GitHub. + + + + diff --git a/glues/rmt-mirroring-intro.xml b/glues/rmt-mirroring-intro.xml new file mode 100644 index 000000000..15a77e8e7 --- /dev/null +++ b/glues/rmt-mirroring-intro.xml @@ -0,0 +1,64 @@ + + + %entities; +]> + + + + + + Introduction + + + + You can mirror the installation and update repositories on the &rmt; + server. This way, you do not need to download updates on each machine, + which saves time and capacity. + + + In its default configuration, &rmt; mirrors enabled product repositories + automatically once every night. + + + By default, the mirrored repositories are stored in + /var/lib/rmt/public/repo. + + + Change the default location of the mirrored repositories + + To change the default location of the mirrored repositories, point the + /usr/share/rmt/public/repo symbolic link to the + desired directory. This can be done using the command: + + + ln -sfn TARGET + /usr/share/rmt/public/repo + + + (Replace TARGET with the desired destination). Make + sure that the target has read and write permissions for the + rmt user and nginx group. + + + + When enabled repositories are fully mirrored, you can register your client + systems against &rmt; by running SUSEConnect --url + https://&rmt;_HOSTNAME on the client + machine. After successful registration, the repositories from the &rmt; + server are used by Zypper on the client machine. + + + &sls; 11 clients + + &rmt; does not support clients with &sls; versions 11 and older. + + + diff --git a/glues/rmt-mirroring-more-info.xml b/glues/rmt-mirroring-more-info.xml new file mode 100644 index 000000000..477dedec2 --- /dev/null +++ b/glues/rmt-mirroring-more-info.xml @@ -0,0 +1,38 @@ + + + %entities; +]> + + + For more information + + + + To learn more about mirroring with &rmt;, refer to the following resources: + + + + + + + The rmt-cli command reference + — the full list of subcommands for managing repositories, + products, and mirroring. + + + + + Repository Mirroring Tool Guide + — the complete administrator's guide to &rmt;. + + + + diff --git a/glues/rmt-smt-migration-intro.xml b/glues/rmt-smt-migration-intro.xml new file mode 100644 index 000000000..5669cc49b --- /dev/null +++ b/glues/rmt-smt-migration-intro.xml @@ -0,0 +1,84 @@ + + + %entities; +]> + + + + + + Introduction and important notes + + + + This article describes the migration from ⪪ on &slsa; 11 or 12 to &rmt; + on &slsa; 15. + + + + Read this section carefully + + Carefully read this section. It contains vital information about the + migration process. + + + + + + Use a new host + + + We recommend that you install &rmt; on a newly installed &slsa; 15 + host. &rmt; is not a complete replacement for ⪪. It has a + different workflow than ⪪ and only supports registering &sls; + 12 systems and newer. + + + + + Repository metadata and settings + + + The settings of staged repositories are not + exported from ⪪. Repositories that have been marked to be + mirrored are exported. + + + + + Custom repositories + + + It is only possible to export repositories that are marked for + mirroring. + + + + + Expired subscriptions + + + Products no longer available on the organization subscriptions will + not be available on &rmt;. + + + + + Client information + + + Systems and their activated products are exported. ⪪ client + jobs and patch status are not exported from ⪪. + + + + + diff --git a/glues/rmt-smt-migration-more-info.xml b/glues/rmt-smt-migration-more-info.xml new file mode 100644 index 000000000..41dae7adb --- /dev/null +++ b/glues/rmt-smt-migration-more-info.xml @@ -0,0 +1,37 @@ + + + %entities; +]> + + + For more information + + + + To learn more about &rmt; and the migration from ⪪, refer to the + following resources: + + + + + + + Repository Mirroring Tool Guide + — the complete administrator's guide to &rmt;. + + + + + &rmt; source code and issue tracker on GitHub. + + + + diff --git a/images/rmt_installation.png b/images/rmt_installation.png new file mode 100644 index 0000000000000000000000000000000000000000..693df13b1f89f25fc8a742005d9452d4c58c63ca GIT binary patch literal 74669 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 I(z8GRKZ^UC2LJ#7 literal 0 HcmV?d00001 diff --git a/images/scc_eye_icon.png b/images/scc_eye_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc00525a7b63ca08aab3aad9215b0f5ffe8a642 GIT binary patch literal 1710 zcmZ`&dokKK@{Cg5)nnXm8K{uN^36T zmg4X4blY+_Tm>d+q&w-`RVeeRdHw zoM?*Nj06Cfl1afd$Zm$V6~YiY1^3LH0f6Q3f`X_#77Ku#<$o>rB`N(;_vvx}Bi1s{?)YX5G?_NVG93GY193xoYE37k@^}Dd5&(L&R=^qff zg}v(5UXU!o9=O)9>$Y3zz3(-tNd*KG95fs0?g2MT`0`8JOOD4gc-L_|w?@qSSrP)c{LJX<0Ui zS%Z@5sT^Be_>>XC*YGPzAN{J~;Q7l>Vq@PRW}X`FZH}wH36FmV3?mAXdz&pUZgR1d zesEuEKn>(>5Z{n=d3;D+0_?_XL#9F@qS(?oTcv$kzBsn(JNRZ6{?S;J(a_b@1GU4B zMWTfPAaMdfng_rV6q3#Wkd6l66$1cl6#&-4bDfbsP|qx>lqkaD!u;aG`wehd?khG zv4&%?ky%&zr{1sKse92^pGo!p6y8rtZPMtV;G5pkXfH_X%e|zT9q%Y$lJNL1S@OPx}JQJhX*#L(u>cdN^1@C^0xreCJyX5QL=Ns018U%-*+t+JBJZMuH-2i;MZ<@oD&tMAmbmOM*3Ewx^5 z${4NHg(YD|Hnv1KH6~0Sg!xRkuc}rsjhm00a_7Ud_r-(P>(%epX-h_qRi7T$vMTeGWZGBZ4a<=9AoK;4FqtRCeIXlW$)pqC2 zje`bSZ9-ZOD-7qID zcbaqycly=-xk=t*BWL%rK(4U&Eg^$>YhyQ=Z;U*7x8pxqEfu0>WO+yEN_fWi!vfaH z73~j*S-;P_kghARp`UCQCOzhip$?akg9D;=K4LL!-bgLf(i4It+9*};rzkGI5qY`C zro8)WM`x>$2i9k(dbqr}SQ{XtFr4vfYZD(IpNKEgQd3<=wa?l9q~pV=q`i5huIH7E z3GS)`t4Fm`5>Wmc7gM&0^25gqi>oz`etx@mzuwqPKXa0bnpHl`ls-PLAFz$aJxHH9 zY$odzD%-oQoB-Q4z|_wRAVM4`Q~t{zx-_dRG&EE>(}b@1dvkDK-X1(uc7yCA`qwG7a= z#h=G*EfQ=B_>JK)bnUcb%7 literal 0 HcmV?d00001 diff --git a/references/rmt-configuration-files.xml b/references/rmt-configuration-files.xml new file mode 100644 index 000000000..f3ba24093 --- /dev/null +++ b/references/rmt-configuration-files.xml @@ -0,0 +1,269 @@ + + + %entities; +]> + + + + + + &rmt; configuration files + + + + Reference of the options in the main &rmt; configuration file + /etc/rmt.conf and of the SSL certificate + locations used by &rmt;. + + + + + The main &rmt; configuration file is /etc/rmt.conf. + Configuration is performed using the &ansible; playbooks provided in the + ansible-rmt-server package. + + +
+ /etc/rmt.conf + + The initial configuration is performed using &ansible; as described in + . Only the + proxy configuration needs to be entered manually. The other configuration + parameters are documented for reference. + + + All available configuration options can be found in the + /etc/rmt.conf file. + + +
+ Mirroring settings + + The mirroring section lets you adjust mirroring + behavior. + + + + mirror_src + + + Decides whether to mirror source RPM packages (architecture is + src). + + + + + dedup_method + + + Creates hard links during mirroring when set to hardlink. + If the file system does not support hard links, it can be set to copy instead. + Possible values: hardlink, + copy. + + + + +
+
+ HTTP client settings + + The http_client section defines the global HTTP + connection settings of &rmt;. + + + + verbose + + + Enables additional debug output to the &systemd; journal. + + + + + proxy + + + The proxy server URL including the protocol and the port number. For + example: http://proxy_url:8080. + + + + + noproxy + + + A list of domains that should not go through the + proxy, separated by commas. For example: + localhost.mylocaldomain. + + + + + proxy_auth + + + This setting determines the + proxy authentication mechanism. Possible values are: + , , + , , + , , + . + + + + + proxy_user + + + The proxy server user name. + + + + + proxy_password + + + The proxy server password. + + + + + low_speed_limit + + + Lower speed limit when a download should be aborted in bytes/sec. + + + + + low_speed_time + + + Time until a download gets aborted, when download speed is below + low_speed_limit. + + + + +
+
+ Settings for accessing &suse; repositories + + The scc section contains your mirroring + credentials for contacting the &scc;. To obtain your mirroring + credentials, see + Mirroring credentials. + + + Valid configuration keys for the section are: + + + + username + + + Mirroring credentials user name. + + + + + password + + + Mirroring credentials password. + + + + +
+
+ Web server settings + + The web_server section lets you tune the performance of your &rmt; server. + + + + min_threads + + + Specifies the minimum number of threads that an &rmt; server worker should spawn. + + + Acceptable values: Integer greater than or equal to 1. + + + + + max_threads + + + Specifies the maximum number of threads that an &rmt; server worker should spawn. + + + Acceptable values: Integer greater than or equal to 1. + + + + + workers + + + Specifies the number of Web workers for &rmt;. + + + Acceptable values: Integer greater than or equal to 1. + + + + +
+
+ +
+ SSL certificates and HTTPS + + By default access to API endpoints consumed by + &suse;Connect is limited to HTTPS only. nginx is + configured to use an SSL certificate and a private key from the following + locations: + + + + Certificate: /etc/rmt/ssl/rmt-server.crt + + + Private key: /etc/rmt/ssl/rmt-server.key + + + + The &ansible; playbook generates a custom certificate authority which + is used to sign HTTPS certificates. This means that to register, + this certificate authority must be trusted by the client machines: + + + + + For registrations during installation from the media or with + &yast; Registration module, a message will appear, prompting to + trust the server certificate. + + + + + For registering a client system on the command line, use the + rmt-client-setup script. For details, see + Configuring clients with rmt-client-setup. + + + +
+
diff --git a/references/rmt-smt-feature-comparison.xml b/references/rmt-smt-feature-comparison.xml new file mode 100644 index 000000000..5e2bc73e2 --- /dev/null +++ b/references/rmt-smt-feature-comparison.xml @@ -0,0 +1,299 @@ + + + %entities; +]> + + + + + + Feature comparison + + + + A side-by-side comparison of the features supported by ⪪ and &rmt; + to help you plan the migration. + + + + + Feature comparison + + + + + + + + + Feature + + + + + ⪪ + + + + + &rmt; + + + + + + + Available on &slsa; 11 + yes + no + + + Available on &slsa; 12 + yes + no + + + Available on &slsa; 15 + no + yes + + + Synchronize products with &scc; + yes + yes + + + Mirror RPMs from repositories + yes + yes + + + Selective mirroring (specifying products to mirror) + yes + yes + + + Serve RPMs via HTTP + yes + yes + + + Registration of &slea; 15 systems + yes + yes + + + Registration of &slea; 12 systems + yes + yes + + + Registration of &slea; 11 systems + yes + no + + + &redhat; 6 and earlier support + yes 1 + no + + + &redhat; 7+ support + yes 1 + yes 1 + + + Support for migrating &slea; 12 to 15 + yes 2 + yes + + + Support for migrating &slea; 15 SPx to 15 SPx+1 + yes 2 + yes + + + Staging repositories + yes + no 3 + + + Offline mirroring + yes + yes + + + NTLM Proxy support + yes + yes + + + Custom repositories + yes + yes + + + &yast; installation wizard + yes + yes + + + &yast; management wizard + yes + no + + + Client management + yes + no + + + Files deduplication + yes + yes + + + Data transfer from ⪪ to &rmt; + n/a + yes + + + Transfer registration data to &scc; + yes + yes + + + Reporting + yes + no + + + Custom TLS certificates for Web server + yes + yes + + + Clean up data from repositories that are not used any longer + yes + yes + + + Bash completion + no + yes + + + + + Available on + openSUSE + Leap 15 + + + no + yes 4 + + + + + Easy development setup + + contribution + guide + + + no + yes + + + + + 100% test + coverage + + + no + yes + + + + + Plugin + functionality + + + no + yes + + + Web server + Apache2 + Nginx + + + Platform + Perl + Ruby + + + Clean up data from repositories that are no longer used + yes + yes + + + Bash completion + no + yes + + + Option to deploy on &kube; + no + yes 5 + + + +
+ + + + + Support via &sliberty;—find more details in . + + + + + ⪪ only partially supports migrating systems to &slea; 15. &slea; + 15 is composed of multiple modules and extensions. Some modules are + not required, as they provide additional functionality. &rmt; fully + supports migrations into and within &slea; 15, therefore it only adds + the minimum of required modules. ⪪ does not fully support these + migrations, and it enables all available modules on the system. + + + + + Functionality is offered by + &smlm;. + + + + + Only available with + self-support. + + + + + Find more details in + Deploying &rmt; on top of the &kube; cluster. + + + +
diff --git a/references/rmt-storage-requirements.xml b/references/rmt-storage-requirements.xml new file mode 100644 index 000000000..b65d2f969 --- /dev/null +++ b/references/rmt-storage-requirements.xml @@ -0,0 +1,49 @@ + + + %entities; +]> + + + + + + Storage requirements + + + + The storage an &rmt; server requires depends on the number of + repositories, architectures, and products you mirror. + + + + + Downloaded packages are stored in + /usr/share/rmt/public/repo, which is a symbolic link + to /var/lib/rmt/public/repo/. + + + + The amount of storage your &rmt; server requires depends on several + variables: the number of repositories and architectures that you mirror, + and the number of products that are enabled. As a general guide, 1.5 + times the total size of all enabled repositories should be sufficient. + This is about 200 GB per &sle; release, including all extensions. + + + &rmt; mirroring fails when <filename>/tmp</filename> runs out of space + + When &rmt; mirrors repositories from &scc;, it writes large temporary files in /tmp. + If /tmp is too small, or is part of the /root files system, and + this file system is small in size, /tmp quickly runs out of space, resulting in a mirroring failure. + For more information, refer to . + + + diff --git a/tasks/rmt-accessing-scc-behind-firewall.xml b/tasks/rmt-accessing-scc-behind-firewall.xml new file mode 100644 index 000000000..65fefaeb1 --- /dev/null +++ b/tasks/rmt-accessing-scc-behind-firewall.xml @@ -0,0 +1,83 @@ + + + %entities; +]> + + + + + + Accessing &scc; from behind a firewall + + + + Allow the &rmt; server to reach &scc; when it is located behind a + firewall that does not support host name allowlisting. + + + + + If the &rmt; server is behind a firewall and cannot access &scc; + directly, you need to allow connections to the following domains for both + 80 and 443 ports on the firewall. + + + + + scc.suse.com + + + + + updates.suse.com + + + + + installer-updates.suse.com + + + + + If the firewall you are using does not support host name + allowlisting—such as &firewalld;—you need to allow connections + to the corresponding IP addresses as described in the following steps. + + + + + Resolve the IP address of the domain, for example, + installer-updates.suse.com. + +&prompt.user;nslookup installer-updates.suse.com +[...] +Address: 152.199.22.115 + + + + Add firewall rules for ports 80 and 443 for each discovered IP + address. + +&prompt.sudo;firewall-cmd --permanent --zone=public \ + --add-rich-rule='rule family="ipv4" source address="152.199.22.115" \ + port protocol="tcp" port="80" accept' +&prompt.sudo;firewall-cmd --permanent --zone=public \ + --add-rich-rule='rule family="ipv4" source address="152.199.22.115" \ + port protocol="tcp" port="443" accept' + + + + Reload the firewall configuration. + +&prompt.sudo;firewall-cmd --reload + + + diff --git a/tasks/rmt-configuring-with-ansible.xml b/tasks/rmt-configuring-with-ansible.xml new file mode 100644 index 000000000..0655efe9f --- /dev/null +++ b/tasks/rmt-configuring-with-ansible.xml @@ -0,0 +1,187 @@ + + + %entities; +]> + + + + + + &rmt; configuration with &ansible; + + + + Configure &rmt; with the playbooks and roles provided by the + ansible-rmt-server package. + + + + + Configure &rmt; with &ansible; as described in the following procedure. + The ansible-rmt-server package provides pre-built + playbooks and roles for automated &rmt; configuration. It is assumed that + this procedure is executed on a newly installed system. + + + + + + Navigate to the &ansible; configuration directory: + +&prompt.root;cd /usr/share/ansible/rmt + + + + + Create the configuration file group_vars/all.yml + based on the provided example: + +&prompt.root;cp group_vars/all.yml.example group_vars/all.yml + + + + + Edit group_vars/all.yml and configure the + following variables: + + + + rmt_db_username + + + Database username for &rmt; (default: rmt) + + + + + rmt_db_password + + + Secure password for the &rmt; database user + + + + + RMT_ORGANIZATION_USERNAME + + + Your &scc; organization credentials. To retrieve your + credentials, refer to + Mirroring credentials. + + + + + RMT_ORGANIZATION_PASSWORD + + + Your &scc; organization password + + + + + + + Example configuration: + +--- +rmt_db_username: rmt +rmt_db_password: "your_secure_password" + +rmt: + RMT_ORGANIZATION_USERNAME: "your_scc_username" + RMT_ORGANIZATION_PASSWORD: "your_scc_password" + + + + + Run the &ansible; playbook to configure &rmt;: + +&prompt.root;ansible-playbook site.yml + + + The playbook will automatically perform the following tasks: + + + + Install required dependencies (MariaDB, nginx, Python modules) + + + Configure and start the MariaDB database service + + + Create the &rmt; database and database user + + + Generate SSL certificates for HTTPS + + + Configure nginx virtual hosts + + + Create /etc/rmt.conf configuration file + + + Run database migrations + + + Start and enable the &rmt; server service + + + + + + + On systems with SELinux in enforcing mode, allow nginx to connect to + the &rmt; backend service: + +&prompt.root;setsebool -P httpd_can_network_connect 1 + + + + + Verify the installation by checking the API health status: + +&prompt.root;curl -s http://localhost/api/health/status +{"state":"online"} + + + + + SSL certificate locations + + The &ansible; playbook generates SSL certificates at the following + locations: + + + + + /etc/rmt/ssl/rmt-ca.crt - CA certificate + + + + + /etc/rmt/ssl/rmt-ca.key - CA private key + + + + + /etc/rmt/ssl/rmt-server.crt - Server certificate + + + + + /etc/rmt/ssl/rmt-server.key - Server private key + + + + + diff --git a/tasks/rmt-deploying-on-kubernetes.xml b/tasks/rmt-deploying-on-kubernetes.xml new file mode 100644 index 000000000..1f6152736 --- /dev/null +++ b/tasks/rmt-deploying-on-kubernetes.xml @@ -0,0 +1,319 @@ + + + %entities; +]> + + + + + + Deploying &rmt; on top of the &kube; cluster + + + + Deploy &rmt; on top of a &kube; cluster using Helm + as the package manager. + + + + + This section describes how to deploy &rmt; on top of the &kube; cluster. + It uses Helm as the package manager to interact with + the &kube; cluster. Find more details about using Helm at + . + + +
+ Prerequisites + + + + Running &kube; cluster + + + + + helm command configured to interact with the + cluster + + + +
+ +
+ Application components + + Each component of the &rmt; application is deployed in its own + container. &rmt; consists of the following components: + + + + &rmt; server + + + Containerized version of the &rmt; application server with the + ability to pass its configuration via Helm values. Storage is + done on a volume that is allocated to the &kube; cluster. You + need to adjust the size of the storage depending on the number of + repositories you need to mirror. + + + + + &mariadb; + + + The database back-end for &rmt;. No post-installation task is + needed since &rmt; creates the required database and tables + at start-up. If passwords are not + specified in the values.yaml file, they are + generated automatically. + + + + + Nginx + + + A Web server configured for &rmt; routes. Having a properly + configured Web server allows you to target your Ingress traffic + (for &rmt;) to this Nginx service directly. You do not need to + configure Ingress for &rmt; specific paths handling, as Nginx is + configured to take care of this itself. + + + + +
+ +
+ The <filename>values.yaml</filename> file + + The &rmt; chart includes the values.yaml file + where all parameters are documented and their default values are + defined. You can override these values by providing your own values + file, for example: + +&prompt.user;cat << EOF > rmt-config.yaml +--- +app: + storage: + class: local-path + scc: + enabled: false + username: "UXXXXXXX" + password: "PASSXXXX" + products_enable: + - SLES/15.3/x86_64 + - sle-module-python2/15.3/x86_64 + products_disable: + - sle-module-legacy/15.3/x86_64 + - sle-module-cap-tools/15.3/x86_64 +db: + storage: + class: local-path +ingress: + enabled: true + hosts: + - host: chart-example.local + paths: + - path: "/" + pathType: Prefix + tls: + - secretName: rmt-cert + hosts: + - chart-example.local +EOF + + + + + The local-path storage class is only available in + Rancher workloads. To make the helm chart succeed, you need to install the + local-path storage provisioner by running the following + command: + +&prompt.user;kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.26/deploy/local-path-storage.yaml + + + + And to install &rmt;, run: + +&prompt.user;helm install rmtsle oci://registry.suse.com/suse/rmt-helm -f rmt-config.yaml + +
+ Required values + + + Key: app.scc.password + + + Type: string + + + Default: + nil + + + Description: &scc; proxy password. The password string needs to be + put inside quotes. If the quote character " is part of the + string, it has to be escaped with \. + + + + + Key: app.scc.username + + + Type: string + + + Default: + nil + + + Description: &scc; proxy user name. The user name string needs to be + put inside quotes. If the quote character " is part of the + string, it has to be escaped with \. + + + + + Key: app.scc.products_enable + + + Type: list + + + Default: + [] + + + Description: list of + products to enable for mirroring + + + + + Key: app.scc.products_disable + + + Type: list + + + Default: + [] + + + Description: list of + products to disable for mirroring + + + + + Key: app.storage.class + + + Type: string + + + Default: + "" + + + Description: Kubernetes + storageclass. + + + + + Key: db.storage.class + + + Type: string + + + Default: + "" + + + Description: Kubernetes + storageclass. + + + + + Key: ingress.enabled + + + Type: bool + + + Default: + false + + + Description: Ingress Enabled + + + + + Key: ingress.hosts[0] + + + Type: object + + + Default: + {"host":"chart-example.local","paths":[{"path":"/","pathType":"Prefix"}]} + + + Description: DNS name at + which the &rmt; service will be accessible from clients + + + + + Key: ingress.tls[0].hosts[0] + + + Type: string + + + Default: + "chart-example.local" + + + Description: DNS name at + which the &rmt; service will be accessible from clients + + + + + Key: ingress.tls[0].secretName + + + Type: string + + + Default: + "rmt-cert" + + + Description: TLS Ingress + Certificate + + + + +
+
+
diff --git a/tasks/rmt-enabling-slp-announcements.xml b/tasks/rmt-enabling-slp-announcements.xml new file mode 100644 index 000000000..bfc1d86c9 --- /dev/null +++ b/tasks/rmt-enabling-slp-announcements.xml @@ -0,0 +1,59 @@ + + + %entities; +]> + + + + + + Enabling SLP announcements + + + + Enable SLP announcements so that clients can discover the &rmt; + service on the network. + + + + + &rmt; includes the SLP service description file + /etc/slp.reg.d/rmt-server.reg. To enable SLP + announcements of the &rmt; service, follow these steps: + + + + + + If &firewalld; is running, open relevant ports and reload the + &firewalld; configuration: + +&prompt.sudo;firewall-cmd --permanent --add-port=427/tcp +success +&prompt.sudo;firewall-cmd --permanent --add-port=427/udp +success +&prompt.sudo;firewall-cmd --reload + + + + Verify that the SLP server is installed and install it if it is not: + +&prompt.sudo;zypper install openslp-server + + + + Enable and start the SLP service: + +&prompt.sudo;systemctl enable slpd.service +&prompt.sudo;systemctl restart slpd.service + + + diff --git a/tasks/rmt-installing-during-installation.xml b/tasks/rmt-installing-during-installation.xml new file mode 100644 index 000000000..162823a20 --- /dev/null +++ b/tasks/rmt-installing-during-installation.xml @@ -0,0 +1,51 @@ + + + %entities; +]> + + + + + + Installation during system installation + + + + Install &rmt; while installing &productname; by selecting the + rmt-server package. + + + + + To install it during installation, select the + rmt-server package. Package selection can be + found in Installation Settings when selecting + Software. + + +
+ &rmt; pattern + + + + + + + + +
+ + + Check for available &rmt; updates immediately after installing &sls; + using the zypper patch command because &suse; + continuously releases maintenance updates for &rmt;. + +
diff --git a/tasks/rmt-installing-existing-system.xml b/tasks/rmt-installing-existing-system.xml new file mode 100644 index 000000000..54666fb16 --- /dev/null +++ b/tasks/rmt-installing-existing-system.xml @@ -0,0 +1,86 @@ + + + %entities; +]> + + + + + + Installation on an existing system + + + + Install &rmt; on a running &productname; system with + zypper. + + + + + To install &rmt; on a running &productname; installation, use + zypper: + + +&prompt.sudo;zypper in rmt-server + +
+ Installation on &minvm; + + &minvm; is a minimal customizable operating system that is + designed for specific usage scenarios, for example, to be run as: + + + + + A container host + + + + + A virtual machine guest + + + + + An appliance base system + + + + + A small server image + + + + + &minvm; image is a good choice for being used as an &rmt; server. You + can download &minvm; images for &kvm;, &xen;, &hyperv;, &vmware;, + and OpenStack from the public &sls; download page at + . Find more + information on &minvm; at + . + + + Installing &rmt; on &minvm; is the same as installing it on an + existing system. To install &rmt; on + &minvm;, run the following command from the &minvm; command line as + &rootuser;: + +&prompt.root;zypper install rmt-server ansible-rmt-server nginx mariadb + + Hardware requirements + + When installing &rmt; on &minvm;, be aware that it requires a minimum + of 100 GB disk space, depending on the products you select to mirror. + Another requirement is a CPU with at least two cores and 2 GB of RAM. + + +
+
diff --git a/tasks/rmt-mirroring-custom-repositories.xml b/tasks/rmt-mirroring-custom-repositories.xml new file mode 100644 index 000000000..a42dec657 --- /dev/null +++ b/tasks/rmt-mirroring-custom-repositories.xml @@ -0,0 +1,97 @@ + + + %entities; +]> + + + + + + Adding custom repositories + + + + Mirror repositories that are not provided by &scc;, such as + third-party or &obs; repositories, with your &rmt; server. + + + + + You can mirror custom repositories with the &rmt; server. These + repositories are not provided by &scc;. Repositories can be provided + by, for example, the &obs;, third-party vendors, or created with + createrepo. + + + + Custom repositories can either be stand-alone, or you can attach them to + products. This allows you to connect multiple repositories with one + command on a client registered to the &rmt; server. + + + + The following example procedure illustrates the mirroring of a + third-party repository. + + + + + + Add the remote repository to the &rmt; server. Replace + URL with the URL to the repository. + Replace NAME with a name of your choice + for the repository. + +&prompt.root;rmt-cli repos custom add URL NAME + + + + List all custom repositories to get the ID of the new repository. + +&prompt.root;rmt-cli repos custom list + + + + Optionally attach the new custom repository to a product. For + example, if the new custom repository is required by all desktop + clients, it can be attached to the &sled; product. + +&prompt.root;rmt-cli repos custom attach REPOSITORY_ID PRODUCT_ID + + Replace REPOSITORY_ID with the ID of the + new custom repository. Replace PRODUCT_ID + with the ID of a product you want the repository to be attached to. + If you need to retrieve the PRODUCT_ID, + use the command rmt-cli products list --all. + + + + When custom repositories are associated with a product, clients + registering with that product see it as disabled. To enable the + repository, find its ID with the command zypper + lr and run: + +&prompt.root;zypper mr -e REPO_ID + + + + + Enable mirroring of the new custom repository. + +&prompt.root;rmt-cli repos custom enable REPOSITORY_ID + + + + + To get a list of all available custom repositories commands, see + the rmt-cli command reference. + + diff --git a/tasks/rmt-mirroring-deleting-data.xml b/tasks/rmt-mirroring-deleting-data.xml new file mode 100644 index 000000000..1aaa1c4b4 --- /dev/null +++ b/tasks/rmt-mirroring-deleting-data.xml @@ -0,0 +1,72 @@ + + + %entities; +]> + + + + + + Deleting mirrored data + + + + Reclaim disk space by removing the mirrored data of repositories that + are no longer enabled. + + + + + After you disable the mirroring of a repository or product as described + in , the mirrored data + remains on your local hard disk. This includes the mirrored RPM + packages. + + + + To delete disabled repository data, use the command rmt-cli + repos clean. With this command, &rmt; verifies that only enabled + repositories are mirrored and provides a way to delete invalid data. + + + + Before removing any data, the command lists the affected repositories and + requires the user to input yes to continue. + + +&prompt.sudo;rmt-cli repos clean +RMT found locally mirrored files from the following repositories which are not marked to be mirrored: + +SLE-Product-SLES15-Updates for sle-15-x86_64 +SLE-Product-SLES15-Pool for sle-15-x86_64 +SLE15-Installer-Updates for sle-15-x86_64 + +Would you like to continue and remove the locally mirrored files of these repositories? +Only 'yes' will be accepted. + +Enter a value: yes + +Deleted locally mirrored files from repository 'SLE-Product-SLES15-Updates for sle-15-x86_64'. +Deleted locally mirrored files from repository 'SLE-Product-SLES15-Pool for sle-15-x86_64'. +Deleted locally mirrored files from repository 'SLE15-Installer-Updates for sle-15-x86_64'. + +Clean finished. An estimated 157 MB were removed. + + + + Manually remove repository data + + To delete disabled repository data, manually remove its corresponding + directory: + +&prompt.sudo;rm -r /usr/share/rmt/public/repo/SUSE/Products/PRODUCT/VERSION/ARCHITECTURE/ + + diff --git a/tasks/rmt-mirroring-enabling-disabling-repositories.xml b/tasks/rmt-mirroring-enabling-disabling-repositories.xml new file mode 100644 index 000000000..fa6cd6770 --- /dev/null +++ b/tasks/rmt-mirroring-enabling-disabling-repositories.xml @@ -0,0 +1,163 @@ + + + %entities; +]> + + + + + + Enabling and disabling mirroring of repositories + + + + Control which repositories &rmt; mirrors, either per product or per + individual repository. + + + + + You can enable or disable the mirroring of repositories individually or + by product. You can specify one or more repositories or products at once. + When repositories are enabled, their packages are downloaded and updated + during the mirroring process. To enable or disable mirroring of + repositories, you either need the product string or ID, or the repository + name or ID. Enabling or disabling a product is desired, because this + automatically enables or disables all repositories associated with the + product. + + +
+ Using products + + To enable or disable all repositories of a product, use the + rmt-cli products enable + ID and rmt-cli products + disable ID commands. To retrieve + an ID for an enabled product, use the rmt-cli products + list command. To get the ID of a disabled + product that is still available, run the rmt-cli products list --all + command. + + + Example: + +&prompt.sudo;rmt-cli products list --all ++------+----------------------+---------+--------+--------------+--------------- +| ID | Product | Version | Arch | Mirror? | Last mirrored ++------+----------------------+---------+--------+--------------+--------------- +[...] +| 1743 | SUSE Package Hub | 15 | x86_64 | Don't Mirror | +| | PackageHub/15/x86_64 | | | | +[...] + +&prompt.sudo;rmt-cli products enable 1743 +Found product by target 1743: SUSE Package Hub 15 x86_64. +Enabling SUSE Package Hub 15 x86_64: + SUSE Package Hub 15 x86_64: + Enabled repository SLE-Module-Packagehub-Subpackages15-Pool. + Enabled repository SLE-Module-Packagehub-Subpackages15-Updates. + Enabled repository SUSE-PackageHub-15-Pool. + Enabled repository SUSE-PackageHub-15-Standard-Pool.. + +&prompt.sudo;rmt-cli products disable 1743 +Found product by target 1743: SUSE Package Hub 15 x86_64. +Disabling SUSE Package Hub 15 x86_64: + SUSE Package Hub 15 x86_64: + Disabled repository SLE-Module-Packagehub-Subpackages15-Pool. + Disabled repository SLE-Module-Packagehub-Subpackages15-Updates. + Disabled repository SUSE-PackageHub-15-Pool. + Disabled repository SUSE-PackageHub-15-Standard-Pool. + + To clean up downloaded files, run 'rmt-cli repos clean' + + Enabling and disabling multiple products at once + + To enable or disable multiple products at once, specify a + space-delimited list of their IDs or product strings, for example: + +&prompt.sudo;rmt-cli products enable 1743 SLES/15/x86_64 SLES/12 +Found product by target 1743: SUSE Package Hub 15 x86_64. +Enabling SUSE Package Hub 15 x86_64: + SUSE Package Hub 15 x86_64: + Enabled repository SLE-Module-Packagehub-Subpackages15-Pool. + Enabled repository SLE-Module-Packagehub-Subpackages15-Updates. + Enabled repository SUSE-PackageHub-15-Pool. + Enabled repository SUSE-PackageHub-15-Standard-Pool. +Found product by target SLES/15/x86_64: SUSE Linux Enterprise Server 15 x86_64. +Enabling SUSE Linux Enterprise Server 15 x86_64: + SUSE Linux Enterprise Server 15 x86_64: + Enabled repository SLE-Product-SLES15-Pool. + Enabled repository SLE-Product-SLES15-Updates. + Enabled repository SLE15-Installer-Updates. + Basesystem Module 15 x86_64: + Enabled repository SLE-Module-Basesystem15-Pool. + Enabled repository SLE-Module-Basesystem15-Updates. + Server Applications Module 15 x86_64: + Enabled repository SLE-Module-Server-Applications15-Pool. + Enabled repository SLE-Module-Server-Applications15-Updates. +Found product by target SLES/12: SUSE Linux Enterprise Server 12 x86_64. +Enabling SUSE Linux Enterprise Server 12 x86_64: + SUSE Linux Enterprise Server 12 x86_64: + Enabled repository SLES12-Pool. + Enabled repository SLES12-Updates. + +
+ +
+ Using repositories + + To enable or disable mirroring of specific repositories, use the + rmt-cli repos enable ID + and rmt-cli repos disable + ID commands. To retrieve an ID for + an enabled repository, use the rmt-cli repos + list command. If you need to get the ID of a disabled + but accessible repository, execute the command + rmt-cli repos list --all. + + + Example: + +&prompt.sudo;rmt-cli repos list --all ++--------+-------------------------+-------------------------------------------+ +| ID | Name | Description | ++--------+-------------------------+-------------------------------------------+ +[...] +| 3061 | SUSE-PackageHub-15-Pool | SUSE-PackageHub-15-Pool for sle-15-x86_64 | +[...] ++--------+-------------------------+-------------------------------------------+ + +&prompt.sudo;rmt-cli repos enable 3061 +Repository by ID 3061 successfully enabled. + +&prompt.sudo;rmt-cli repos disable 3061 +Repository by ID 3061 successfully disabled. + +To clean up downloaded files, please run 'rmt-cli repos clean' + + Enabling and disabling multiple repositories at once + + To enable or disable multiple repositories at once, specify a + space-delimited list of their IDs, for example: + +&prompt.sudo;rmt-cli repos enable 2526 3263 +Repository by ID 2526 successfully enabled. +Repository by ID 3263 successfully enabled. + +&prompt.sudo;rmt-cli repos disable 2526 3263 +Repository by ID 2526 successfully disabled. +Repository by ID 3263 successfully disabled. + +To clean up downloaded files, run 'rmt-cli repos clean' + +
+
diff --git a/tasks/rmt-mirroring-exporting-importing.xml b/tasks/rmt-mirroring-exporting-importing.xml new file mode 100644 index 000000000..4d8d29d81 --- /dev/null +++ b/tasks/rmt-mirroring-exporting-importing.xml @@ -0,0 +1,149 @@ + + + %entities; +]> + + + + + + Exporting and importing repositories + + + + Transfer repository data and mirrored packages between two &rmt; + servers, for example, to feed a disconnected server in an air-gapped + network. + + + + + &rmt; has built-in functions to import and export data about available + repositories and the mirrored packages. For example, this can be used to + speed up the setup of a new &rmt; server by locally copying already + mirrored RPM packages. + + + + Another use case is the offline mode. It allows the + transfer of data to a disconnected &rmt; server, for example, to provide + updates to computers in an air-gapped network. + + + + The following procedure describes the transfer of data and mirrored RPMs + between two &rmt; servers with a USB drive. The server + sun is connected to &scc;, while + sirius is a server in an air-gapped network. + + + + + + Log in on the server sun. + +&prompt.root;rmt-cli sync +&prompt.root;rmt-cli mirror + + + + Connect a USB drive, assumed to be /dev/sdb and + mount it, for example, in /mnt/external. + +&prompt.root;mount /dev/sdb1 /mnt/external + + + + + + Export the data about available repositories and products. + +&prompt.root;rmt-cli export data /mnt/external/ + + + + Export the list of enabled repositories. The exported file is + required for exporting the repositories in the next step. + +&prompt.root;rmt-cli export settings /mnt/external/ + + + + Export mirrored RPM packages. Depending on the size of mirrored + repositories, this can take a long time. + +&prompt.root;rmt-cli export repos /mnt/external/ + + + + + + Unmount and unplug the disk from sun and go to + sirius. + +&prompt.root;umount /mnt/external + + + + If not yet done, set up &rmt; on sirius by configuring + the &ansible; variables. In case of an offline &rmt; setup, leave the + organization credentials empty in + /usr/share/ansible/rmt/group_vars/all.yml and run + the playbook. + + + + + Connect the USB drive to sirius and mount it in + /mnt/external. + +&prompt.root;mount /dev/sdb1 /mnt/external + + + + + + Import the metadata about available repositories and products. + +&prompt.root;rmt-cli import data /mnt/external/ + + + + Import mirrored RPM packages. Depending on the size of mirrored + repositories, this can take a long time. + +&prompt.root;rmt-cli import repos /mnt/external/ + + + + + + Enable repositories as required on the sirius. For + details, see + . + + + + + + Exporting enabled settings from air-gapped server + + If your air-gapped server (sirius) has many enabled + repositories, or if the enabled repositories change frequently, we + recommend exporting the repository settings from this server. + + + The server connected to &scc; (sun) can then + import the exported settings. This ensures that sun + downloads all data required by sirius. + + + diff --git a/tasks/rmt-mirroring-obtaining-credentials.xml b/tasks/rmt-mirroring-obtaining-credentials.xml new file mode 100644 index 000000000..b0b77bc63 --- /dev/null +++ b/tasks/rmt-mirroring-obtaining-credentials.xml @@ -0,0 +1,83 @@ + + + %entities; +]> + + + + + + Mirroring credentials + + + + Obtain the organization credentials from &scc; that &rmt; needs to + create a local mirror of the &sle; repositories. + + + + + You need organization credentials to create a local mirror of + the &sle; repositories. You can obtain the credentials from &scc;. + + + + To get the credentials from &scc;, follow these steps: + + + + + + Visit &scc; at and log in. + + + + + If you are a member of multiple organizations, select the + organization you want to work with from the sidebar on the left. + + + + + Select Proxies in the top menu. + + + + + The credentials are displayed in the top right corner. + + + + + To see the password, click the + Eye icon + + + + + + + + icon. + + + + + + The obtained credentials should be configured in + /usr/share/ansible/rmt/group_vars/all.yml before running + the &ansible; playbook, or added directly to the + /etc/rmt.conf file after installation. + For more information about the + /etc/rmt.conf file, see + /etc/rmt.conf. + + diff --git a/tasks/rmt-mirroring-packages.xml b/tasks/rmt-mirroring-packages.xml new file mode 100644 index 000000000..481905472 --- /dev/null +++ b/tasks/rmt-mirroring-packages.xml @@ -0,0 +1,57 @@ + + + %entities; +]> + + + + + + Mirroring packages + + + + Download the packages of enabled repositories to your &rmt; server, + either on a schedule or manually. + + + + + Packages for enabled repositories are mirrored on your &rmt; server. + Packages are downloaded periodically once a day. But the download can + also be triggered manually at any time. + + + + The periodic mirroring is activated by the &systemd; timer + rmt-server-mirror.timer. To show its status, for + example, the next running time, use systemctl status. + + +&prompt.root;systemctl status rmt-server-mirror.timer +● rmt-server-mirror.timer - RMT Mirror timer + Loaded: loaded (/usr/lib/systemd/system/rmt-server-mirror.timer; enabled; vendor preset: disabled) + Active: active (waiting) since Fri 2018-06-22 04:22:34 EDT; 2h 34min ago + Trigger: Sat 2018-06-23 02:17:57 EDT; 19h left + +Jun 22 04:22:34 d31 systemd[1]: Started RMT Mirror timer. + + + If the timer is not enabled or started, start it manually. + + +&prompt.sudo;systemctl enable --now rmt-server-mirror.timer + + To update the mirrored packages manually, use the rmt-cli + mirror command. For details, see + the rmt-cli command reference. + + diff --git a/tasks/rmt-mirroring-synchronizing-metadata.xml b/tasks/rmt-mirroring-synchronizing-metadata.xml new file mode 100644 index 000000000..59efa1dea --- /dev/null +++ b/tasks/rmt-mirroring-synchronizing-metadata.xml @@ -0,0 +1,57 @@ + + + %entities; +]> + + + + + + Synchronizing repository metadata + + + + Keep the local &rmt; database up to date with product and repository + information from &scc;. + + + + + The local &rmt; database needs to be updated periodically with the + information downloaded from &scc;. This includes information about + available products and repositories. + + + + The synchronization is activated by the &systemd; timer + rmt-server-sync.timer. To view its status, for + example, the next running time, use systemctl status. + + +&prompt.sudo;systemctl status rmt-server-sync.timer +● rmt-server-sync.timer - RMT Sync timer + Loaded: loaded (/usr/lib/systemd/system/rmt-server-sync.timer; enabled; vendor preset: disabled) + Active: active (waiting) since Fri 2018-06-22 04:22:34 EDT; 2h 34min ago + Trigger: Sat 2018-06-23 03:53:00 EDT; 20h left + +Jun 22 04:22:34 d31 systemd[1]: Started RMT Sync timer. + + If the timer is not enabled or started, start it manually. + + +&prompt.sudo;systemctl enable --now rmt-server-sync.timer + + + To update the &rmt; database manually, use the rmt-cli + sync command. For details, see + the rmt-cli command reference. + + diff --git a/tasks/rmt-regenerating-certificates.xml b/tasks/rmt-regenerating-certificates.xml new file mode 100644 index 000000000..2a593dc94 --- /dev/null +++ b/tasks/rmt-regenerating-certificates.xml @@ -0,0 +1,103 @@ + + + %entities; +]> + + + + + + Managing TLS/SSL certificates + + + + Regenerate the TLS/SSL certificates of your &rmt; server using the + &ansible; playbook when they expire or need additional common names. + + + +
+ Regenerating HTTPS certificates + + + HTTPS certificates should be regenerated before they expire or to include + additional common alternative names. No additional actions are required + on the client machines registered to the &rmt; server if only HTTPS + certificates are regenerated. + + + + + + Stop nginx and rmt-server services. + +&prompt.root;systemctl stop nginx +&prompt.root;systemctl stop rmt-server + + + + Remove previously generated certificates. + +&prompt.root;rm /etc/rmt/ssl/rmt-server.* + + + + Regenerate certificates using the &ansible; playbook: + +&prompt.root;cd /usr/share/ansible/rmt +&prompt.root;ansible-playbook site.yml --tags certificates + + +
+
+ Regenerating CA certificates and HTTPS certificates + + + CA certificates can be regenerated after they have expired or in case of + security issues. + + + + Import CA certificate on all clients + + The newly generated CA certificate must be imported on all clients + registered to the &rmt; server. This can be done by running the + rmt-client-setup script on the client machines as + described in + Configuring clients with rmt-client-setup. + + + + + + + Stop nginx and rmt-server services. + +&prompt.root;systemctl stop nginx +&prompt.root;systemctl stop rmt-server + + + + Remove previously generated CA and HTTPS certificates. + +&prompt.root;rm /etc/rmt/ssl/rmt-ca.* +&prompt.root;rm /etc/rmt/ssl/rmt-server.* + + + + Regenerate certificates using the &ansible; playbook: + +&prompt.root;cd /usr/share/ansible/rmt +&prompt.root;ansible-playbook site.yml --tags certificates + + +
+
diff --git a/tasks/rmt-smt-exporting-data.xml b/tasks/rmt-smt-exporting-data.xml new file mode 100644 index 000000000..7b453cfdb --- /dev/null +++ b/tasks/rmt-smt-exporting-data.xml @@ -0,0 +1,54 @@ + + + %entities; +]> + + + + + + Exporting ⪪ data + + + + Export the configuration, SSL certificates, and client data from your + existing ⪪ server for import into &rmt;. + + + + + Export ⪪ data + + + Update your ⪪ server installation by running zypper + up. + + + + + To export your SSL certificates along with the rest of + the data, run smt-data-export. Remember to keep + your certificates in a safe place. + + + If you do not want to export the SSL certificates from ⪪, run + smt-data-export --no-ssl-export. + + + + + The exported configuration is now saved to + smt-data-export.TIMESTAMP.tar.gz. + Copy the file to a location that the new &rmt; server can access. + + + + diff --git a/tasks/rmt-smt-importing-data.xml b/tasks/rmt-smt-importing-data.xml new file mode 100644 index 000000000..b7a2c2609 --- /dev/null +++ b/tasks/rmt-smt-importing-data.xml @@ -0,0 +1,137 @@ + + + %entities; +]> + + + + + + Importing ⪪ data to &rmt; + + + + Import the data exported from ⪪ into a newly configured &rmt; + server and mirror the repositories. + + + + + + + To make sure your &rmt; installation is up to date, run + zypper up. + + + + + Copy the exported .tar.gz file to an empty + directory and unpack it. Then enter the new directory: + +&prompt.user;mkdir EMPTY_DIR +&prompt.user;cd EMPTY_DIR +&prompt.user;tar xf /PATH/TO/smt-data-export.TIMESTAMP.tar.gz +&prompt.user;cd smt-data-export + + + + + If you chose to export the SSL certificates from ⪪, copy the CA + private key and certificate to /etc/rmt/ssl/: + +&prompt.sudo;cp ssl/cacert.key /etc/rmt/ssl/rmt-ca.key +&prompt.sudo;cp ssl/cacert.pem /etc/rmt/ssl/rmt-ca.crt + + + + Configure &rmt; using &ansible; as described in + &rmt; configuration with &ansible;. If + you imported the ⪪ CA certificate, ensure the domain of the ⪪ + server is included in the SSL certificate configuration. + + + + + Run the &rmt; synchronization to get the products and repositories + data from &scc;. + +&prompt.sudo;rmt-cli sync + + + + Import the data from the ⪪ server. + +&prompt.sudo;rmt-data-import -d ./ + + + + Optional: if the URL of the &rmt; server changed, change the URL + parameter of clients in /etc/SUSEConnect to point + to the new &rmt; server. Alternatively, change the DNS records to + re-assign the host name to the &rmt; server. + + + + + Optional: move the mirrored repository data from ⪪ to &rmt;, and + adjust the ownership of the copied data. + +&prompt.sudo;cp -r /var/www/htdocs/repo/* /usr/share/rmt/public/repo/ +&prompt.sudo;chown -R _rmt:nginx /usr/share/rmt/public/repo + + + The path for storing custom repository data on the &rmt; server is + different from that of ⪪. With &rmt;, it replicates the + directory structure of the source server's URL into a top-level + directory structure. For example, for a source repository at + +http://download.opensuse.org/debug/distribution/leap/15.6/repo/oss + + its path on the &rmt; server corresponds to + +/usr/share/rmt/public/repo/debug/distribution/leap/15.6/repo/oss + + + + + Custom repositories on the ⪪ server are disabled by default. If + you want to mirror them to the &rmt;, enable them before mirroring. + + + + + Check for custom repositories by running: + +&prompt.sudo;rmt-cli repos custom list + + The command shows the table of all custom repositories. The first + column contains the ID of each repository and + the Mirror? column shows + false. + + + + + Enable each custom repository you want to mirror by running: + +&prompt.sudo;rmt-cli repos custom enable ID + + + + + + Update the packages in the repositories by starting the mirroring + process: + +&prompt.sudo;rmt-cli mirror + + + From 14fe540a295158cda8242929f29caa77b5d4b711 Mon Sep 17 00:00:00 2001 From: Amrita Date: Fri, 24 Jul 2026 14:27:33 +0530 Subject: [PATCH 2/4] maintainer updated --- articles/rmt-installing-configuring.asm.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/articles/rmt-installing-configuring.asm.xml b/articles/rmt-installing-configuring.asm.xml index 724274ad0..112561f7f 100644 --- a/articles/rmt-installing-configuring.asm.xml +++ b/articles/rmt-installing-configuring.asm.xml @@ -104,7 +104,7 @@ https://bugzilla.suse.com/enter_bug.cgi Documentation SUSE Linux Enterprise Server &productnumber; - MAINTAINER@suse.com + amrita.sakthivel@suse.com yes From 27fd311d42a45e828d43b12bc26d3bd7bda515f5 Mon Sep 17 00:00:00 2001 From: Amrita Date: Fri, 24 Jul 2026 14:28:33 +0530 Subject: [PATCH 3/4] updated maintainer for all 3 articles --- articles/rmt-migrating-from-smt.asm.xml | 2 +- articles/rmt-mirroring-repositories.asm.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/articles/rmt-migrating-from-smt.asm.xml b/articles/rmt-migrating-from-smt.asm.xml index f8137e5fc..2dad840d6 100644 --- a/articles/rmt-migrating-from-smt.asm.xml +++ b/articles/rmt-migrating-from-smt.asm.xml @@ -85,7 +85,7 @@ https://bugzilla.suse.com/enter_bug.cgi Documentation SUSE Linux Enterprise Server &productnumber; - MAINTAINER@suse.com + amrita.sakthivel@suse.com yes diff --git a/articles/rmt-mirroring-repositories.asm.xml b/articles/rmt-mirroring-repositories.asm.xml index c0696c483..05f64ef88 100644 --- a/articles/rmt-mirroring-repositories.asm.xml +++ b/articles/rmt-mirroring-repositories.asm.xml @@ -94,7 +94,7 @@ https://bugzilla.suse.com/enter_bug.cgi Documentation SUSE Linux Enterprise Server &productnumber; - MAINTAINER@suse.com + amrita.sakthivel@suse.com yes From 3a48ebbb215d77431eecd00739a316930f78dc17 Mon Sep 17 00:00:00 2001 From: Amrita Date: Fri, 24 Jul 2026 14:48:29 +0530 Subject: [PATCH 4/4] adds three dc-sap files --- DC-SAP-rmt-installing-configuring | 15 +++++++++++++++ DC-SAP-rmt-migrating-from-smt | 18 ++++++++++++++++++ DC-SAP-rmt-mirroring-repositories | 18 ++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 DC-SAP-rmt-installing-configuring create mode 100644 DC-SAP-rmt-migrating-from-smt create mode 100644 DC-SAP-rmt-mirroring-repositories diff --git a/DC-SAP-rmt-installing-configuring b/DC-SAP-rmt-installing-configuring new file mode 100644 index 000000000..3df52dd8a --- /dev/null +++ b/DC-SAP-rmt-installing-configuring @@ -0,0 +1,15 @@ +# This file originates from the project https://github.com/openSUSE/doc-kit +# This file can be edited downstream. + +## Basics +MAIN="rmt-installing-configuring.asm.xml" +SRC_DIR="articles" +IMG_SRC_DIR="images" + +PROFOS="sles4sap" +#PROFCONDITION="16.0" +#PROFCONDITION="suse-product;beta" +#PROFCONDITION="community-project" + +STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2022-ns" +FALLBACK_STYLEROOT="/usr/share/xml/docbook/stylesheet/suse-ns" \ No newline at end of file diff --git a/DC-SAP-rmt-migrating-from-smt b/DC-SAP-rmt-migrating-from-smt new file mode 100644 index 000000000..2c719960e --- /dev/null +++ b/DC-SAP-rmt-migrating-from-smt @@ -0,0 +1,18 @@ +# This file originates from the project https://github.com/openSUSE/doc-kit +# This file can be edited downstream. + +## Basics +MAIN="rmt-migrating-from-smt.asm.xml" +SRC_DIR="articles" +IMG_SRC_DIR="images" + +## Profiling +PROFOS="sles4sap" +#PROFCONDITION="16.0" +#PROFARCH="x86_64;zseries;power;aarch64" + +## stylesheet location +STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2022-ns" +FALLBACK_STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2021-ns" + +DOCBOOK5_RNG_URI="urn:x-suse:rng:v2:geekodoc-flat" \ No newline at end of file diff --git a/DC-SAP-rmt-mirroring-repositories b/DC-SAP-rmt-mirroring-repositories new file mode 100644 index 000000000..457a675d9 --- /dev/null +++ b/DC-SAP-rmt-mirroring-repositories @@ -0,0 +1,18 @@ +# This file originates from the project https://github.com/openSUSE/doc-kit +# This file can be edited downstream. + +## Basics +MAIN="rmt-mirroring-repositories.asm.xml" +SRC_DIR="articles" +IMG_SRC_DIR="images" + +## Profiling +PROFOS="sles4sap" +#PROFCONDITION="16.0" +#PROFARCH="x86_64;zseries;power;aarch64" + +## stylesheet location +STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2022-ns" +FALLBACK_STYLEROOT="/usr/share/xml/docbook/stylesheet/suse2021-ns" + +DOCBOOK5_RNG_URI="urn:x-suse:rng:v2:geekodoc-flat" \ No newline at end of file