[PATCH v1 01/11] Use a podman container for forgejo
Claudio Bantaloukas via Sourceware Forge
forge-bot+rdfm@forge-stage.sourceware.org
Thu Mar 19 12:53:33 GMT 2026
From: Claudio Bantaloukas <claudio.bantaloukas@arm.com>
This change moves away from installing forgejo directly on the VM and moves its process in a custom container built when the ansible role is applied.
As a consequence:
- the app.ini file is reinstated and installed using ansible's templating system
- ansible based configuration is simplified and used where it makes sense to have differences between hosts
- secret values are now passed into the container as podman secrets
- jwt tokens are now explicitly recorded and forgejo will not start if it tries to add a secret it needs
- email is managed via the local smtp server rather than by invoking sendmail
- the git user is locked down (no password, no shell)
- forgejo's ssh service is now enabled and has a configurable set of host keys
Additional changes:
- the containerfile extracts translation resources and renames Pull Request into Merge Request. This mechanism can be used to make further changes to the UI if needed.
- the containerfile does away with many packages that are not strictly required for forgejo operations
---
.forgejo/workflows/checks.yml | 5 +-
ansible.cfg | 1 +
provisioning/group_vars/all/forgejo.yml | 241 +-----
.../host_vars/forge-production/forgejo.yml | 47 +-
.../host_vars/forge-stage/forgejo.yml | 48 +-
.../host_vars/forge-stage/secrets.yml | 773 ++++++++++++------
provisioning/host_vars/forge-test/forgejo.yml | 46 +-
provisioning/host_vars/forge-test/secrets.yml | 69 +-
provisioning/requirements.yml | 6 +-
.../defaults/main.yml | 37 +-
.../handlers/main.yml | 3 +-
.../sourceware_forge_forgejo/tasks/main.yml | 264 +++++-
.../templates/Containerfile.j2 | 92 +++
.../templates/app.ini.j2 | 148 ++++
.../templates/forgejo.j2 | 5 +
.../templates/forgejo.sh | 6 -
scripts/lint | 3 +-
17 files changed, 1154 insertions(+), 640 deletions(-)
create mode 100644 provisioning/roles/sourceware_forge_forgejo/templates/Containerfile.j2
create mode 100644 provisioning/roles/sourceware_forge_forgejo/templates/app.ini.j2
create mode 100644 provisioning/roles/sourceware_forge_forgejo/templates/forgejo.j2
delete mode 100755 provisioning/roles/sourceware_forge_forgejo/templates/forgejo.sh
diff --git a/.forgejo/workflows/checks.yml b/.forgejo/workflows/checks.yml
index 56b0a5b..cf911f9 100644
--- a/.forgejo/workflows/checks.yml
+++ b/.forgejo/workflows/checks.yml
@@ -41,11 +41,12 @@ jobs:
- name: ansible lint
id: ansiblelint
continue-on-error: true
+ env:
+ ANSIBLE_VAULT_PASSWORD: "dummy-password-for-linting"
run: |
source ./.venv/bin/activate
ansible-galaxy collection install -r provisioning/requirements.yml -p downloaded-collections
- cd provisioning
- ansible-lint -v
+ ansible-lint -v provisioning
echo "result=pass" | tee -a $FORGEJO_OUTPUT
- name: reuse
diff --git a/ansible.cfg b/ansible.cfg
index 02e6be0..a0fd642 100644
--- a/ansible.cfg
+++ b/ansible.cfg
@@ -3,6 +3,7 @@
[defaults]
roles_path=provisioning/roles:downloaded-roles
collections_path=downloaded-collections
+module_path=downloaded-collections:downloaded-roles
inventory=provisioning/inventory.yml
callback_result_format=yaml
vault_password_file=scripts/vault-pass
diff --git a/provisioning/group_vars/all/forgejo.yml b/provisioning/group_vars/all/forgejo.yml
index 148c14a..db88ce7 100644
--- a/provisioning/group_vars/all/forgejo.yml
+++ b/provisioning/group_vars/all/forgejo.yml
@@ -1,241 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
+# Copyright (C) 2025-2026 Arm Ltd.
---
# For details on forgejo configuration, see the cheat sheet here:
# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#overall-default
# Use the version provided in podman-versions.yml
-forgejo_version: "{{ latest_forgejo_release }}"
-forgejo_slogan: "Core Toolchain and Developer Tools"
+sourceware_forge_forgejo_version: "{{ latest_forgejo_release }}"
-forgejo_systemd:
- unit:
- after:
- - syslog.target
- - network.target
- - "postgresql@{{ sourceware_forge_postgres_main_version }}-main.service"
- wants:
- - "postgresql@{{ sourceware_forge_postgres_main_version }}-main.service"
- requires: []
- number_of_files: 524288
-
-forgejo_run_mode: "prod" # RUN_MODE
-forgejo_system_user: git # RUN_USER
-forgejo_system_group: git
-
-forgejo_cache_directory: /srv/forgejo/cache
-forgejo_install_path: /srv/forgejo/bin
-
-# This cannot be done until the fix for https://github.com/bodsch/ansible-collection-scm/issues/17
-# is merged from the rockdreamer fork of the role
-forgejo_config_dir: /srv/forgejo
-
-forgejo_working_dir: /srv/forgejo # WORK_PATH
-# Until the fix for https://github.com/bodsch/ansible-collection-scm/issues/20 is merged
-# forgejo_working_dir is also the home directory of the git user
-forgejo_system_user_home_dir: /srv/git
-forgejo_system_user_create_home: true
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#database-database
-forgejo_database:
- db_type: postgres
- host: "127.0.0.1:{{ sourceware_forge_postgres_ports[sourceware_forge_postgres_main_version] }}"
- name: "{{ sourceware_forge_postgres_database }}"
- user: "{{ sourceware_forge_postgres_user }}"
- passwd: "{{ sourceware_forge_postgres_password }}"
- ssl_mode: "{{ sourceware_forge_forgejo_postgres_ssl_mode }}"
- log_sql: false # false
-
-forgejo_badges:
- enabled: false
-
-forgejo_attachment:
- enabled: true # true
- max_size: "16" # in MB
-
-# See https://forgejo.org/docs/latest/admin/config-cheat-sheet/#cache-cache
-# and https://forgejo.org/docs/latest/admin/recommendations/#cacheadapter
-forgejo_cache:
- adapter: "memory" # memory ("memory", "redis", "memcache", or "twoqueue")
- # or
- # adapter: "redis"
- # host: "redis://127.0.0.1:6379/0?pool_size=100&idle_timeout=180s"
-
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#cron-cron
-forgejo_cron:
- archive_cleanup:
- enabled: true
- run_at_start: true
- schedule: "@every 30m"
- older_than: 2h
- git_gc_repos:
- comment: garbage collect all repositories
- enabled: false
- run_at_start: false
- notice_on_success: false
- schedule: "@every 72h"
- timeout: 7200s
- args: ""
- resync_all_sshkeys:
- comment: update the '.ssh/authorized_keys' file with Gitea SSH keys
- enabled: true
- run_at_start: false
- notice_on_success: false
- schedule: "@every 24h"
- resync_all_hooks:
- comment: resynchronize pre-receive, update and post-receive hooks of all repositories.
- enabled: true
- run_at_start: false
- notice_on_success: false
- schedule: "@every 72h"
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#git-git
-forgejo_git:
- # git operation timeout in seconds
- timeout:
- gc: "720" # 720
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#log-log
-# https://forgejo.org/docs/latest/admin/logging-documentation/
-forgejo_log:
- root_path: "{{ forgejo_working_dir }}/log"
- mode:
- - console
- # - file
- level: info # info
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#mailer-mailer
-forgejo_mailer:
- enabled: true
- subject_prefix: "[forge]"
- protocol: "sendmail" # one of "smtp", "smtps", "smtp+starttls", "smtp+unix", "sendmail", "dummy"
- from: "{{ sourceware_forge_forgejo_mailer_from }}"
- # Should we be sending plaintext or is html ok and any text email should occur through
- # project-specific automation?
- send_as_plain_text: true # false
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#markup-markup
-forgejo_markup:
- mermaid_max_source_characters: "10000" # 5000
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#metrics-metrics
-forgejo_metrics:
- enabled: "true" # false
- # token: ""
- enabled_issue_by_label: "true" # false
- enabled_issue_by_repository: "true" # false
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#oauth2-oauth2
-forgejo_oauth2:
- enabled: false # true
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#openid-openid
-forgejo_openid:
- enable_openid_signin: false # true
- enable_openid_signup: false # true
-# whitelisted_uris: []
-# blacklisted_uris: []
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#packages-packages
-forgejo_packages:
- enabled: false # true
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#repository-repository
-sourceware_forge_default_repo_units:
- - repo.code
- - repo.pulls
- - repo.actions
-sourceware_forge_default_fork_repo_units:
- - repo.code
- - repo.pulls
-
-forgejo_repository:
- root: "{{ forgejo_working_dir }}/data/forgejo-repositories"
- # allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions.
- disabled_repo_units: "{{ sourceware_forge_disabled_repo_units }}"
- # allowed values: repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki, repo.projects, repo.packages, repo.actions.
- default_repo_units: "{{ sourceware_forge_default_repo_units }}"
- default_fork_repo_units: "{{ sourceware_forge_default_fork_repo_units }}" # [repo.code, repo.pulls]
- disable_stars: true # false
- force_private: false # false
- default_private: public # last
- default_push_create_private: false # true
- max_creation_limit: "0" # -1
- pull_request:
- default_merge_style: rebase # merge
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#security-security
-forgejo_security:
- internal_token_uri: "file:{{ forgejo_working_dir }}/token" # file:/etc/forgejo/internal_token
- install_lock: true # false
- password_hash_algo: pbkdf2_hi # pbkdf2
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#server-server
-forgejo_server:
- domain: "{{ ansible_fqdn }}"
- root_url: "https://{{ ansible_fqdn }}/" # "%(protocol)s://%(domain)s:%(HTTP_PORT)s/"
- http_port: "3000" # 3000
- offline_mode: true # false
- ssh_domain: "{{ ansible_fqdn }}" # "%(DOMAIN)s"
- ssh_port: "22" # 22
- app_data_path: "{{ forgejo_working_dir }}/data" # data
- # home (can be "home", "explore", "organizations", "login", or any URL such
- # as "/org/repo" or even "https://anotherwebsite.com")
- landing_page: "organizations"
- lfs_start_server: "{{ sourceware_forge_lfs_start_server }}"
- disable_ssh: false
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#service-service
-forgejo_service:
- register_email_confirm: true # false
- disable_registration: false # false
- allow_only_internal_registration: true # false
- allow_only_external_registration: false # false
- enable_notify_mail: true # false
- enable_captcha: false # false
- require_signin_view: false # false
- default_keep_email_private: false # false
- default_allow_create_organization: false # true
- default_user_is_restricted: false # false
- enable_timetracking: false # true
- default_enable_timetracking: false # true
- no_reply_address: noreply.localhost
- allowed_user_visibility_modes:
- - public
- - limited
- # - private
- default_org_member_visible: true # false
- default_user_visibility: public # public
- default_org_visibility: public # public
- show_milestones_dashboard_page: false # true
- email_domain_allowlist: "{{ sourceware_forge_email_domain_allowlist }}"
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#session-session
-forgejo_session:
- provider: "file" # memory
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#ssh-minimum-key-sizes-sshminimum_key_sizes
-forgejo_ssh:
- minimum_key_sizes:
- rsa: 2048
- # ed25519: 256
- # ecdsa: 256
- # dsa: -1
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#ui-ui
-forgejo_ui:
- meta:
- author: "Sourceware" # forgejo - git with a cup of tea
- description: "Core Toolchain and Developer Tools" # forgejo (git with a cup of tea) is a painless self-hosted Git service written in Go
- keywords:
- - sourceware
- - git
- - forge
- - forgejo
-
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#webhook-webhook
-forgejo_webhook:
- allowed_host_list:
- - external
- - loopback
+# [database]
+sourceware_forge_forgejo_db_host: "127.0.0.1:{{ sourceware_forge_postgres_ports[sourceware_forge_postgres_main_version] }}"
+sourceware_forge_forgejo_db_name: "{{ sourceware_forge_postgres_database }}"
+sourceware_forge_forgejo_db_user: "{{ sourceware_forge_postgres_user }}"
+sourceware_forge_forgejo_db_password: "{{ sourceware_forge_postgres_password }}"
diff --git a/provisioning/host_vars/forge-production/forgejo.yml b/provisioning/host_vars/forge-production/forgejo.yml
index b898306..9fffdbc 100644
--- a/provisioning/host_vars/forge-production/forgejo.yml
+++ b/provisioning/host_vars/forge-production/forgejo.yml
@@ -1,41 +1,20 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
+# Copyright (C) 2025-2026 Arm Ltd.
---
-forgejo_name: "Sourceware Forge" # APP_NAME
+# app.ini overrides for forge-production
+sourceware_forge_forgejo_app_name: "Sourceware Forge"
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#admin-admin
-forgejo_admin:
- # Disallow regular (non-admin) users from creating organizations.
- disable_regular_org_creation: true # false
- send_notification_email_on_new_user: true
- # Default configuration for email notifications for users (user configurable).
- # Options: enabled, onmention, disabled
- # default_email_notifications: "" # enabled
- # user_disabled_features: []
- # external_user_disable_features: []
+# [database]
+sourceware_forge_forgejo_db_ssl_mode: require
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#actions-actions
-forgejo_actions:
- # Disable actions in production server for now
- enabled: true
- default_actions_url: "https://data.forgejo.org"
- artifact_retention_days: "30" # 90
- # LOG_RETENTION_DAYS: 90?
- # zombie_task_timeout: ""
- # endless_task_timeout: ""
- # abandoned_job_timeout: ""
- # skip_workflow_strings: []
+# [repository]
+sourceware_forge_forgejo_disabled_repo_units: "repo.packages,repo.releases"
-# sourceware_forge_token: "secret"
-sourceware_forge_lfs_start_server: false
-# allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions.
-sourceware_forge_disabled_repo_units:
- - repo.packages
- - repo.releases
+# [admin]
+sourceware_forge_forgejo_disable_regular_org_creation: "true"
+# [mailer]
sourceware_forge_forgejo_mailer_from: no-reply@forge.sourceware.org
-sourceware_forge_forgejo_postgres_ssl_mode: require
-sourceware_forge_email_domain_allowlist:
- - gcc.gnu.org
- - sourceware.org
- - cygwin.com
+
+# [service]
+sourceware_forge_forgejo_email_domain_allowlist: ""
diff --git a/provisioning/host_vars/forge-stage/forgejo.yml b/provisioning/host_vars/forge-stage/forgejo.yml
index 9857c50..7e879b7 100644
--- a/provisioning/host_vars/forge-stage/forgejo.yml
+++ b/provisioning/host_vars/forge-stage/forgejo.yml
@@ -1,42 +1,20 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
+# Copyright (C) 2025-2026 Arm Ltd.
---
-forgejo_name: "Sourceware Forge (Staging)" # APP_NAME
+# app.ini overrides for forge-stage
+sourceware_forge_forgejo_app_name: "Sourceware Forge (Staging)"
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#admin-admin
-forgejo_admin:
- # Disallow regular (non-admin) users from creating organizations.
- disable_regular_org_creation: true # false
- send_notification_email_on_new_user: true
- # Default configuration for email notifications for users (user configurable).
- # Options: enabled, onmention, disabled
- # default_email_notifications: "" # enabled
- # user_disabled_features: []
- # external_user_disable_features: []
+# [database]
+sourceware_forge_forgejo_db_ssl_mode: require
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#actions-actions
-forgejo_actions:
- # Disable actions in production server for now
- enabled: true
- default_actions_url: "https://data.forgejo.org"
- artifact_retention_days: "30" # 90
- # LOG_RETENTION_DAYS: 90?
- # zombie_task_timeout: ""
- # endless_task_timeout: ""
- # abandoned_job_timeout: ""
- # skip_workflow_strings: []
+# [repository]
+sourceware_forge_forgejo_disabled_repo_units: "repo.packages,repo.releases"
-# sourceware_forge_token: "secret"
-sourceware_forge_lfs_start_server: false
-# allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions.
-sourceware_forge_disabled_repo_units:
- - repo.packages
- - repo.releases
+# [admin]
+sourceware_forge_forgejo_disable_regular_org_creation: "true"
+# [mailer]
sourceware_forge_forgejo_mailer_from: no-reply@forge-stage.sourceware.org
-sourceware_forge_forgejo_postgres_ssl_mode: require
-sourceware_forge_email_domain_allowlist:
- - gcc.gnu.org
- - forge-stage.sourceware.org
- - sourceware.org
- - cygwin.com
+
+# [service]
+sourceware_forge_forgejo_email_domain_allowlist: "gcc.gnu.org,sourceware.org,cygwin.com"
diff --git a/provisioning/host_vars/forge-stage/secrets.yml b/provisioning/host_vars/forge-stage/secrets.yml
index 44f4a5a..b2d1e3e 100644
--- a/provisioning/host_vars/forge-stage/secrets.yml
+++ b/provisioning/host_vars/forge-stage/secrets.yml
@@ -1,246 +1,529 @@
$ANSIBLE_VAULT;1.1;AES256
-62333535646133343838663735383637373461643633303039643465396537316535656636613362
-3936663037623234336564303935396239353565636132320a396266393937333033633733613066
-32313363376430353339393561663164353761386130336666633635653763326433633335353661
-3866343763623264360a316637356162326637393538313130663130333863643430376639646537
-34346333363263336166646232303935323234346235633736316635366539343765346533363839
-35343938333734333134396335386235333338616439356466636130323734643064326336373036
-37343266303662633633326266363539663165393165333664383737666665356363633032346138
-65373066353162613265393134376161613736313731613165616365303461623666616339666530
-62656166346232306137666635613133316362643462633363333465396439383536313464363737
-30343464306266633165306261656163663664316435396163626634303734343835386638616664
-65336161373166306539323266396238656461653836373131646561613638383762343563373834
-65383439626161323232383332333032383363666266643966363361336139323961363766336530
-34303037396363303635343735363866333562653365633862623838343431373235613137666336
-35373630383662333634363230633237646236393232316236646239633534323333333763653464
-61336665313430333334336134393061663563626532353837373536303962313034366439663263
-65653662323161623638336634653862663834383261663366613834343534333130646339313661
-39366530333061313062353034306265613064313133383661643465666538643037636439313033
-66646662366530386162363637623163636130386466373533323966643933366261306134616237
-39363032336435616235353965333536373236646234356666333332643836363566613339616230
-64303230613262653766333430376538316231356135303136353938656139346439626235636363
-63383530306437636365343434316361313764383665313063613331643363346266336262336530
-61306263333331633437373737613034663536626164376332663536346432643530313034613964
-64386534616130626638643336626363643366656135373634346335633161363132376361363361
-64343936313462653663313463303634396462323239653465613966636664366334623561303765
-33656536613535323362353732663863353634353761616462393961656234313132636534326132
-30363666613532313036303866373930393336636438623834393031346332636239363964326662
-31313037663239663234373261646162363734623566346461393566313061663934396638383866
-35393263323663366632326635333762343532363339376231643362633635346265333936373933
-30666266343938356464363631353862663061396562333138323431323636363331636266333463
-35306564366132303966373666666634393230636139666561383966306166316663356235376266
-62383065373236663162393138626532613337363638616233376438343763646330386662656662
-35343232643365366135663865613862383334626664353434383036373834623938316231643764
-62656536373462343265303832316332643534316135313462313535373863656661313139616139
-35306666383762636336356162316462306663366164663962353530623166333735643332366433
-66656365353137323864653436653031353730313534396630316236363233303666636139636434
-34376166366338396436333139326134646262323036396332363737323965633639313034663631
-63316332363731636435306433613038326334653366663937373236306431653733393563633764
-37363765643537626436653839623536316361346231343962353164323335646662633538353833
-64316634333338373435653363333730616135633333383337323035376565623333656665613630
-64333830643032343237636166373934366565326364363931393762633562376364363162306465
-38636562336436373965383863636530373337346636653061396566613136333266393331653636
-63346464326263313032633866383266306466363530643565646265333265353133353930383763
-66636635613432323339323838633231363331346261393863616665363633343862366132366166
-39363163373737353464623366623063383133646166303335333134636233373064303631383535
-62636631373662643533306632613734343232623239393061303939613963303539316336633131
-30663264323838626265666534393961333936316432386366613065333665306630396163633530
-33313430663730633262623138623263303435623031326466356565333731303563316232636530
-32356530306464303464313131343036346331313639633635396663356437313333643835356438
-30303831623330393039666230333432653464316238326637366162366433376561306330646265
-65396239643662363733646634646536316433663433303332313662613133643138623634343930
-35323437366162646236613965316366643265623432646331363631613836626439656361343166
-37376162313032386531313766393434316437633664663962303362346631613463633539303939
-33653733333633353136633730393034613530363066333834303631343630653538303135303936
-37303533383031393434326330356138666632626362343961356565646461356339366263633662
-36626365613363393231646331303038353864373662373938333835303931313363386364373262
-30663630343139333434336461613766626366636263316662306234353630363237646462616161
-35333838316636323431646531623434646432343838393835626438373632396565663832613732
-63396537353036373837333133346531333163373538313164653433663338363039333132656162
-61643464386463346234346566343730623234393732336661376663373037616534333461313866
-39643265626533653738393739383232646332343934613637656561393238323831356666333763
-36383063313262373233666130316637356534343361323339313433616530393735623734383530
-35646362643763663832323231383636616335393563623863396234636262346230333765386235
-35323831623430346336316235323332333030353661613139366539376662313534316138656439
-66326266666537303462643262626432643564613131386230306230366364623838333761643339
-34613664386531346261343539633365313133663235646465366437616664343161646265343032
-63306162346363323335383634333563616237653163343065613566653465343339613935333932
-33373330333736396336623662373261306639386536623963663433333830303738376564636434
-35613832343230376662353861353839653731396533633462396432376163346530353866613964
-65636562383635373761376636343830333733343530383564363930353861633265656139366439
-36343065363166313838336232653037656537616262356230373166373632626164633234626361
-61363764656564366230356566333337316130393534616638373433303336333336643565323635
-62303463353864383230663233396564666630653032316337303831633964373466376534306433
-66663465363333383836316365326533366163373039356361613733333130383532343363623437
-32636134336633646435633162656537623432306665623236376463303563313437656564353834
-63346266333665396533666332366262336132643334653536643664323330356633313834393838
-65313632663639633361353538626661393730373835343864396438303338353130623134336132
-33336139303363646433616130623565393138626436396263663363623164616362343536343263
-63393039646163346630643035373038313661343566336566323162633062666463336335663065
-30613438383336623039323136363766396532643563346532333133643537306133623038306333
-35353534393234323831613838613335353837353565613061633563383635303964396338366431
-33626434346135303966396537323365666636383736663331646139633738383364383561626430
-37656330666463313030623838663730653631646235303264393762373131656330333033656632
-34633635666163383262306263636438646439663939343134666432346264303865623837373834
-62363734363733356538656535353135636362366436663961363366316434326630613134396433
-36353332656237303136343762366130333265623837316266336433323734616637623265343236
-64613935326136383561623036393834333833646465333362306362386435643436653864396532
-35343063383539616662633530656334633931366234343031633561396335366132316538333733
-30636332303036313462313133663833313264623562613437346638646664323632336330613437
-36623164636434623766363462376338663663333131376130326239303462336366353561396438
-37363236383961346636653034613536633263343732383865323463633637633266346364393137
-38633830646132363665393639663165373363303062353363626666333463343835653134313338
-39316664333334333561623636386435613431663930396239383039333638346337663031366631
-66313264376531636338333335646235643035626563393232346339623135383533363538656466
-36366131633465353965646539643233393836343532396233613132646266313166303335346232
-35386636636563633638313830356238303732663138393134373639646338663834643566323334
-62376437346265636162353436663335386238336236626665653564343938313537336461633833
-63653334616234363234336134366564396564386432613936363637376461623138396333633338
-64666637646138323061386233393236323234356564613632633435643530306433356566613363
-39313435653133623133633939386538353664333034366539393261333638333264633730646263
-34343031303066333237643565343864356466313064623334643763666138666536323739383933
-66323062306337323733633935393162633864663938333238616634396364636665326665306465
-61336366373833646262333063336265353564306634303265613739396533383534663361666366
-66666261343834313934323066643431623930303064376533323132646637373234666363316635
-63643530333237643063613737326466626233306565356436636665393130653864303462333362
-63613632313238303230323266343761366261643165366665656333623634666633616164653439
-61366561633461353337613832303631303432626361656465623162376339346661363137363738
-34386435326531633665363131393533303138633035383231306539633365623835353662343337
-35383433353631373331316636303231626261356631383939323964323764666635333862613938
-36356562306535303937383666643237613731323866363333326632623465663866306530303431
-62353464386233393664343063326664613864666634393831376165663031626630326239373133
-34343361636563323833343634336561393864353639336537646665326432666636303665316465
-38666463643765303961386133363236303938623565353734636231643137663961363566316630
-39656163363335323138303835333962303433376233323938633464373961343435666265343630
-38393432313764333362396565313564346436396234313438333061393439343063376663333966
-62376264353833373434343139383030323561653134656664323831633566653833653664613735
-62333438393462343032383861643866303161386634313965393666633662383364353161663562
-66313635623530336231316164323239383337333830653363393965656134383536333466613762
-35633465666533346235643561363133653331323866323464363165663964373161643331653561
-35646238663130363763316530343632613365386238326337356365616166316531653766316434
-66343438613737326639633038356533383364623666383132303239633031313966393833616234
-66323037353435373234323339613936623065363132363530366565373538613139386536323062
-63666431626533636466386331643136343233656562653837363134356266306261356338383461
-66633935353630653036383836356532373438333637396665316163653065626664303166396331
-30316164363331626132666161386333633366636231376163303436383934393133653565626639
-62316233666266343731383938326166653865326430626135656235623834613036363936393563
-65306161656266313862316663656365373034663336393633353164373339663237653765333533
-34383435346664356162316164373061393861636438653766346333396537393233623934633135
-34396637396439323962663665346661623963616332336539666463383963303165306333666363
-62336336303937643066366230373233353761636562626262373537383338656161373030643666
-65613430336537343632666263383363623238613265623931376462306131383031623832633166
-36346530313363363234373364346162333662376534353161363861663762653535353061386463
-36313861613563326362313864373935326636656533656132306633393031656565376463633164
-65313031326161333266313835336265303261373566383139306465623439643230316432366334
-33316431323137333862346535336665393635313563366465313765656366393337303362303037
-34653564663936393161636662363664643266336438656265396236363234623131656265306164
-33643635316461623137343966623131636238666266326362393737356166343138626137376433
-35373165613236643238623463366166333562353130386230376163316661363239626339633966
-37386261333832656335343436326166333030333461613535316634643234333962353366613133
-31343762613131343238313733633433313062393662303661326662333433623730386232366138
-37653336616462343565616666393632356333336536343837346531356230326261653037633863
-64323236396266666430336562333562653161343264623465363236346539383565323233613763
-35666665323634646164646330383438303533353233363936396439666535653335303338333436
-30316663393065353230336638336133666232313561653934363737666662366363343731343035
-63643566343136326464613562643137623462356266353037653831653835626238336363663965
-37336334333566633832376133376638303330393739646630336130323862623834393562343962
-31656632303863613566636435343061633136333961353438346634323930376164393364623062
-61303835366332316166386236643162386365663739376564396530666462376238323562646337
-31623365313562623663343133336161623362313134653665333166653439396664343531663334
-36643762303230356162646361383634666530663834633766363862343631373363383037616666
-66356632366335346435613537343264383531393738636530393733323139366530343634373264
-34326136646561323262663538333734383639636665353133366632666536353765343139306138
-39393936306338353332396461393061383734333035663465623465366330393237303532363962
-32396539343562666432313336356462343666303661343264393335323730636134643239386136
-38643936376239663766303939366633323534646132653934373135643837663966353838626631
-39663537653634653631643664623435653332363935363732316533373333363731366234653337
-61636264663430326531633331323665316634356662616330303962656261333635346265363131
-38373134646630643965613131636539333361646431323335356263623562653336316137633265
-63353965613236373039373236656437613861326139376263343435626564626462316362663330
-33343130343136376264303766323661343733666533376638303433333435373537306637656539
-39366430626334393430323362393662613734306439653862323763306632336531383637323330
-34393063626361336239333366643363663862323138386239363734333730333965333638623639
-38653861663833313035373839353233326530386638613138353033623238653038353238613534
-32636366393865386339313531396338616634636464623733353638643936306439656634313562
-66333631363539303665333031363331376636646661336363666566363366323930333531346434
-36336636396239333864653965633034333262646362633539333935363937326261623862396364
-32613064326537636362303635656465633164643237343965313466376539343961313539323163
-61363637636265633564363539613666383736646238343735303330636264356262663534303465
-61316662643531613064363161656333663464396663326562316330616562366262613066393062
-66646232303134383334386139383739306336316466353835333834313034613330633632373438
-66326431626238613030663831353430623265303236333462386462396563343666646536343332
-36613430363965643332333031383632366636353061316234613763363432653137666236366333
-35356232646539363863666438313439353136643933623564383435383963386262653334636665
-33373564623166353234613137373531333633613765623332613739363938343161386335613234
-63323161326132366134323266396237626639306238303838613532336630303465653937376534
-39303733336461353531333435623935396463383231663466386166383935643730306430613038
-35353237323464346433656133323238653464323734373639643438353535663561656434626635
-35343535376239646566646263633133306363343432343431306565653432666532653035383665
-34653464666663326130376334656231663036616134356164636638616161333633383035393131
-63616339656630343537323931393034633866663132643937363230613531653936373266363138
-34616132313832313362616163333362653634366434363062623133633734646336656365333135
-62613539333839356536376436613533656435366165633766336130626539353963333138383538
-33323038663838373662396362303063376262656663373364626132306432333261643562343239
-30366466343763343264303362323536656162373436363364386162373461643865326661343430
-64393338616136653961663834343534376562316539353262666264656561363766623936613636
-37653433373238646335613634313862303765393063616439643564323130663937333831623363
-30366332383938396262616632333135656234376639376130336630396333613061393834393733
-30633632383338653835653339343266663630636262613765366666613466396630383361303233
-39663133386264623637663966363163656432633661363264383937356333623665313637653330
-35373136646637373038613130656130346330343364373137353362386539616339643531343165
-32663537313566373938663764366433666263333631336233616531333239366633376239356464
-66643235613561343233353838306165663832333535343566633837383865323261323136623964
-33353864653762343063656238376261393336666536396532336339643139636333663233363231
-32366430383463393665373832623539376138393065366161623933656234366663653431323864
-61376663393861626261623139303163393631383436346565613333366532613432353265383361
-33613732303236663065316662303833343762366665636261383662656461666233333862356266
-37316264323435383430363762636165376530633764636631343966363164366130356235636566
-34313262313136613663326230366632386434386261366264386163373436363061633265313134
-32613331646537393064353739613832386665353033343530363730306331346636376661666263
-36396161643437613136313565623361316132313264613130383439613438393264336133633639
-62333163356331343238386633306534383235666564316233613132646132653932636231383537
-61383664306130656135306262346332346536666434643730336662383031373965306537396335
-61393934396535656136373135396237306438303232656635393566633539343230613532616664
-37353233343661656332613133323366386635326162346234306238623530373261663735393232
-63366239313834336165306463373334663665633934346333303166363839306332386333373033
-31313335623930656537333061306432336431343236393736613936646233363639343136393833
-66373566613366666636663430333339343238386161373630663630646436643366333662633030
-36666335333939616163666434613061353436323731373765666432356637616563626433363639
-36633361363861383037393966343335646463313837613264386638383733663462323931326361
-38333464653562366366396433373535653330393733663536376561333631373766663966393638
-33316239383162616664313531393231313966316431396662653361363733623431383964306534
-32353937623030306336643539623532643631646661336263393231353865306261626334666239
-33303863376638363432353366653366366236366561613432663966323761623165393565633037
-33633135623062636664393235353238336432643466356165383436616463646564326264306461
-34643836616232353763646465313338323436623733616439666638646565623837333033383833
-32303164616663636162613333613438386433666630653061616638316665326333383930303361
-63336564383432613666663837623761323438653535373836636331373361383238346635333265
-32356366646537333265363664393534316538303433366233313965333634616633333536386561
-30643161656634613638326337353434363262316635366638303636653262343836353436346532
-65646132336635353564656262626566336262353665363734303736313635653032653035303334
-32616261363038356333643561336633663337323937323836316334376461346364376464623937
-30383263383361646534643665333635633639306432643032623634353933623764653030356463
-39633939613931333465613162343134633866326166326539326232623764393965386430643032
-34346136346231353930353462363564356630636532373763663536343738363964303464313361
-30613739356133313965363831383839306264653434646265653238393838393666396532313731
-36353364636232653137646432623434636631306264323437376438383863356234343833313661
-32306236353835316233313535656432356139393662323932643937663763623463616135333465
-66333333323063343438333535313230333534333665653030383035326661393166633337353136
-64653833636435326235343162353138623236663331643263643363396565363963373265383366
-30643061303837376565663336383335626633363566363461393736316335366664353330306637
-30386238326463663964373336646132306563323735303963626634626130663466363435353663
-30306164643536653032643436613934643966643062633835646234356535323639363361643431
-34363663366365363366623336313532303062363461643430343034356161383937323039633266
-35613931393230626233313333623735383663363663333963393637633263373566316130316332
-65616462363865313564386263356533356433363930326365663466373438316137383130356333
-62343461373763333664323837613162393036646330663134383166653965346135356538386463
-30353732316466316462633162303465303839656130633639326631383166396635643363383264
-64393764613234333534636639633437646439333365613036356533356666653866326535393332
-33383138613330346138313130346338613863623635633239363832316265353538623930333964
-31386336393334343434663938313563356537663665653566613162383464653136616532623664
-30633862626166616131343833373437353332363665396164633437386262323430613836646466
-66666339393637346231383563386661653930306335326232643862613663633565666166613635
-61396133666531303934336330333431366664653631646537383639373462336236393338646535
-36393536636533316331613538356135306538376331613866656434623136316432383936663064
-62343035306239616139653538666131303362643438373939316533356432613138346636333563
-39613166316638333734613339346533316437333364613666303234323237313139
+37313464623732656462303837353566363833313633306639323439363465303934363132303532
+6665396535653336613238353039633266303931303131390a326663366131653662303466666432
+62303134633332373332663661383663356537653262343639353234313732363461353230323731
+3065323266343666380a313461636532643261303864383239616264663066663231396433646663
+62613137633532663837323261663866666136666164333534363938373938653430353262316464
+65346463303330363766336466383066333533636132333433353036346133666464346664383031
+33616633663966633463333430383133323761653762333530373866336232326463326235383966
+34343036396139343262636235646436613665623134373939653835363838363436373064303031
+38366636323934373735343132653463393539316464383738376666633633333438613230613565
+34353766656464343363323336396130353831646536326336353032623236663631366136383131
+37653966643630636162353134363734366431326439323264313234326262373038383033383965
+63316335623434303763396638663237303036336463626532616532643735373565363532363031
+64393366336361613832656565366562613333333466373130336333313036313138343231636131
+35313030653935316365633239623034626333316135393466376562336466623661356563306230
+32376634383230303664666231343763373164636534636536643334346431643432663731313031
+33616535626235663465363933653633326130643436663963646433356161373162663366633932
+39336166306464386466633466316366373830623964313838613334356463383539343864313530
+61623735343139623435663639396662623639636462663163383965383739323239626336653636
+34396261393139353863613966653136663636643439653730343738626462626365306163353930
+36613839373234323232636562353065343031363735386334623539653637376163316531333633
+65613264623364623366616365333934653633306534343532303062646363333530626437303233
+36393036663535616661663665316439336363636365633132623334323438613332373937373731
+39643937663136396434306235333739383930353236396161323864636431623665396361613461
+64353766333337616434313834616638646337623930303731646236336363633235653636656239
+65383665373332343535663566333138613965303333616330666130613563323161376266386636
+31653133356563336463636138626262646236643035663438636263346534616430623030303563
+66343930643933323263333538623237333532316635626261363264373966393636663261653863
+31346637386535613133353333343533323865646333366336376531653863663236623138633235
+66616530353931626561313634373033643666356532636331626333633464633663663366656230
+63633231376261393639336135323963663962396230313832326163383936643664366563306665
+65396564326438656463303732343736366439393762646566666236363433306337316366376164
+62613063623834653132666337366139623630346430386362303161386537376263666664383565
+31316237623738346435656361383631303035313763643964366233316165353333323938353965
+66636164633163356263356330643936613333666365653965323932386565333362653637326135
+35393561623664393733366232346665373164616131653834336232666539613636376438366330
+62356537383261313533623261616337323764393537643335656439326564333138633563353437
+65353838316132623536323230646663346466653935383432643164323237376532636438643836
+36376363653663386235643534393330356137313230376239303466363238306164366139396165
+35653733373033626262393239643666396263393932316339366661373365666639646637373262
+38303065656363376531623965313962326566333331626633653865313066303562643632656236
+34353761616263313132343834346264393633326538643930633664353337376338363834326163
+31316538326630363732326331383166653566343532656634383334633336373061636364643863
+61363438393238306630323437306665643566636333663962313038626237306263663634653032
+63626364393065323537653161343539323434616235373839386136643731336164393866326665
+62653564646632616162336331616135393334393564656335326262303262663034313239353433
+34363466323735626637363436393133353333343739303639646435663064353662356163386638
+32623539386161623130376136626639336636376264636666656336636561386461363661636539
+39396661363036366438356164323564386537656261306164336532653563336133613566356161
+63656564633235373030363433383438663936613032643337363430396564313236653535653732
+63316661613165313133306537663531346539313732383135613562306662363033626338373732
+61306638636137386562306332666530313832303033303231623137636162376163396238343865
+36336165616463333262623736353061376533346135303936313632343161393431393761663035
+66326165303337366631613337313134626464386636306532326665356636383634393633316231
+63386331666335353533393533313761623136313131316631663063613337363039313666643866
+37373237623135613065376337643666303634303438636261663835613462323932653234333666
+37366635663864326361366437626332333165616332363461383438623438363565666162353863
+37663662666466373835376435653031616535633563333335353864333932306334633036313634
+62363763306165613164353566336137653133383039346339616265373163356364386363633835
+38396637663532336666333464343265643631393430383738666364616130636438663236356532
+34373666393734316430363730356237353361656635343663353666393566396237643531633566
+65643831326632376539396262613962363564366334303536366333396537646364346131316539
+38656233326535363533376362336262633339343131663063336463393331306336623535656331
+66306336316236316633653331353834366362316636626562663838323736303363303366393965
+33373731616432616237653464356332386435613637373833633033313132343566326366663530
+31373962383164646133636433653462303938333566393964313333323033383866396263326538
+62356237336336663132613137613363346366653264336237633864633239306532356265656265
+61373264326263306431306333656234396231383336343639316461643331313233346238393334
+65636661396566373330326639303439376631373761373037663439396635646135313666636161
+37393330356138663233626632653839373137633238353132333931323835623836656265663330
+63373561383432633662656132323739383632333366613732306330393937343936376561316535
+39326666393565313165626232616264376565316433636462313439653061393561373163383733
+65346566613138343564646430326164306132363433316437656564666562366536393232393237
+36306163363665353633356634313832376637303837313336623161333538636236636366616135
+39396464396633376534623634353636653431653035663265656335393836346336363566343836
+32376434633036316633313931633933613766303434393435666638353263313066353835303734
+66306134333635393134613464353165373937366464333338643639336661306462326434353335
+66356362646433306363316466343062633762663733346130393662373435326261653339353833
+33303636386634656536383466323330616232303833366162303766336436393730666665323038
+63393263396131393235363735633566346132373336336533623661386535636131326564393535
+33383331643535646363656233323066643037616332343736663133613465326637363764363331
+36383033323436366565363163303435623963396335396562643066613236363562366434346661
+37363835623034316661323537316432353861636664376566316366366561366164633065343266
+39396135383961396338396532323766393932646536396233656363663036396164356634653234
+63633965613734313063333832306461633835636133393264643936353834666164623830333931
+61363634303438636564353565323834393238636332396236393033353065346532626535303364
+63323634326430663762643861663766306235626661613634616538333963663562643032626234
+37353662663630653039363265343638343934623438316362316639383233313166623635336264
+34643734376564353662326538333639636331613238336232623866633735613834336463363236
+34323531613932633435306264393137323431336630353139313062643661326362626565613637
+38343065616262363436363030333764356263303062363761346563663763353365636430656233
+31336134653839356436393236643730353533383838666630313831316661633339343939616566
+35333234393965386262356130373265633737666666363432363162363739343533643332623631
+66376436326335343739653561323339306639633235646533373763323431666636626163653130
+38646263633133386661303430623930353937323431633537633539323139383633393665383430
+31653065373862376562313434623839626361633430633161393366616135306163623436613533
+32626437346539363334613136666562386662306338613337383235653962353064393834333132
+66643237373234313037636566626330376361356234383564343333336162313430313661303632
+35373939656637333065363236336330616431393733363062353839623434626635303532303564
+63363664336163386232653132666163383333613133306236353330393831316633393163656233
+35383661666132373765333966623466623130653133333135326163663830373139346431306430
+39316230343232666465346362663432346236396237313165643336363335643938356162636431
+64666566643331353036393937616233313561353566346263663935326430343036323130313036
+36353932373536376638633932333766373734373937333438356632623665636164343136373934
+66626639383233306261333936303461633736373531303436373238616530343137643132653561
+37316531306232666535633832303838643839616138363133306364353333376637343739616438
+63623966313839333464643239383161333033666334303338326233366361666265313434653530
+65343931383439663739646334383133323566323235386538613866346335313766306639326431
+38346163316334633466626539313739626536633866356161393931353235306635363461376237
+37323065633964656235653530393839323936383862363263643633313035613834396135306539
+65363765623433656533363938653634316237303434303934656364313836393434353065663939
+32353366393463306235376430653866643364383538363766643332666335343238303532666161
+35316162336636363837623062326630303362316565373637303764333061663837316638393732
+30373139666136346265333834663236373364613864663535393961306265396336373838396233
+63616662303766346134613664633839383638333033333039393135343834346266633239373139
+63663434386564636165353332356166316131643263613138336233646464646532643031613031
+34633338316263363663346637643666663531663031636665316232653035346562616137323434
+66643839343932343639303663636564396538636130353763323061393763373435356361656135
+34633533383163653838653733306236326139353262373433393037633562396332623038313439
+62613331373938393939323361356132656338653965343562393130306166653731633035636234
+62623037613831313161666337306230613462383262646131376136313537333565323161623632
+32646264623566383436343561663562646563646561646636303037613766326233346530333838
+30326633323862653162366331653738313936366332623065616666616233666162613930643139
+33633334636136373366626330653166356533316534636165643534313238333339626361616137
+66643666363765396639626233653134376465633233323062646131633062356131386562633230
+35333161303433313764316438643066646635326330653332366266336364653934613532616261
+38643730636462326333643231636562393237353236393039633665356238343737393964663165
+30363335613436376136333036313263356361343230343237313762333832393264316337326136
+33303134666534393737383638373364396637336535356133396431393133383538336534666231
+31393664353738363435353930316234646563346232366464386563316461363465666637333465
+30336430313238663830353462323632383866633762336262326464613937636339333932336463
+64323831396261636138363164313236326465303433313762336463383535333964343564616637
+62366562356133623832363365613935313637373838373062616464386466366265636333346162
+35376465653862373730623764623035303836666332316461343764613531663338616432616230
+34313831323436623731333532316433616461323563313461356564383861346563363266663663
+31363761373130643932323064363635323637336461323361386666643765343563653933363238
+30393531376465353463333031343864303361666232643266666365626632323238643530643461
+37303239323365313639633065633930393461646366353531646662646465373737366139633031
+63386439303131386562643865653634356434663037396264326434616536303039613431303637
+30363463353335616534336265643463643639356339393036623136643334356662643239646162
+63306461326236346538376138336464306333653331366236336334626432306432353533356438
+37363063363331396539356130356434656238666435393866626335366431343235636333346665
+65613765343632626232646434333438626639366330313062373662356364346234626236373465
+62346465366261376161323138643935383265626438653435343965303236346663663261303733
+35663466663732343465626535656337356233306332363037343833623037373635373139653430
+30633831383630363335653032373035356533633838333432363635363638323666613037643463
+38643362616365656265366132613239373331623363306564613130663433316536313164366165
+64616239336634326564336266666337613433653863343830623332383665386336303832396231
+36356439373135373939393332313664646538613932323261366333396230303730386433333563
+64333730343733326463626134306639636538346634363431633437633538336336623661636365
+38366364636564353932646663646638383031373639663563346536626336653838666362633038
+35643739643530653261356361343764333366306135663237373632346166643031396364646234
+33616432343232346332313063633338663436396531363130363063326561613561396539356539
+62646636353538396335313763346433643865656131336632343666346363313863666533303632
+66613966336335633535383936383937646637386537623635316432623037616263376236313838
+66656635643565343831643938356231346536623461363636383130666539316638383564303335
+62636430306532613337333734623432663838623565323639663933363666333765346233643733
+65623566383038316361353061613633393561343833383039343037306466393834306166323833
+63663662336466363761373432363733313665623530386336313335666537636362653736363433
+65656230656335313931363434643364623464373565396439383365383030313862353330343162
+35663163366438663435363361316461323932653132313933343637346537346235643631373639
+64633037343236633136353938636662613035643032313238313036303931323631396532616263
+37353865363161316430353834323830633264386165653162633833303763396464353934323331
+66366666643531636132363966313361663732363062366436643538316465663934366166653631
+38336531626237393137643566663062386337636339353163313536343132313961613832393838
+34616539323134363239636539366461666665393937623236393061613933303030393131323230
+37626565643637626230643136616638353231303032356232343938616230626537363766343730
+35643431346161653562613262333137613037663861316337376263303830653661383239666136
+62376562316663303734633733393934366563353738646364343339376433633430653063643736
+34383163316238346335366233636531656237313131396233373465326632346363633038616263
+34373664663133326463643732326162646563386236383862373363336538316164353862626661
+37366661396638383461346666373438346463616336623466346161323938656264663734346335
+35306237626461366638333736326330663239643834386364646638393866616362356533303539
+61663131646363653537636138653835336332666631643462616634373163633231663230626637
+37653066626266346439626465646530373237373965313066623562373030633935343766666332
+64366164663465623861633437313531313437356165613465356432366631313332363363353337
+66643166653365353832353937613539363230623432653938306364646634333239643833626130
+66376137343932376661663230383162373061353933393165386331306332356635336363646638
+30376561336366383938373636663238353361613136353632323630376136633365633164653839
+63633763303139303032613231333162336437653364383064613764316237653638333234346231
+64643437366233656364653162653666366263333737396232376564366539383863626237366434
+38646638383635353062616566303037326665633166633435343061353734663536303864633437
+61343237323231383030633230323865356432643038386264363533376236643338613535353533
+62633238373865396364396264333539306238386566636133313537626464636565353339383433
+33373662633838366533663532666638373935366137626237393261346661386631303262383830
+30306135383439383663313564613966383563336333333033356232363633646630303166376662
+37653930396536356166356139373731383962343836326235613562643437356561333537356362
+62323635363965343034636364643165363832626261336434306135653736653338376164663462
+36663537333532316539343365656130303966313837386465343030363565656137323262373161
+36353135623739643662303162626332333133643931326237386363346236653864633463303330
+62656539623639323033613961336334373834313631353865373339633365626466323561656263
+39376132643134653630393662653132396630383466616338376533373733646432643766353236
+65623632656465323537646334616262386262316437666231616135313037663866613532346464
+62316665643434653132336164656534313737393039353436336566646430633030366234303466
+62663566636231616265626266353436363166333539613536656633623435346566346538623035
+36396361393933646264633363333536633265313863376164613735626661323035656562323335
+37363264646364343933616533386335363237623061636265393530353737616332306137303034
+30336162346634666635303764346161363366336363303766353136343366333035326463393832
+32343364323035313362323635396361326262636334393739323663643435613138313663323434
+64613030366136363534613033386637643734623963303633373331306336646131363137626132
+36373133333464356239626130326635396134643561366134663662376230663438313539306534
+34616231333665643432616436303133626236663534363036646261623666323735363564663765
+34623833643835316162666234356663336536363061373638356563343634386332376663353335
+33303262343536636336326633633536613933366639653462343931643165303665333537346532
+36303132633030313266396436366566386264323338353538303265623862663838663538333838
+66396439363631393862313132336564636662666161313830383130376564323561383165323138
+34616436376330383366333264396539306430363634326261313838393764666661313233336538
+62663432616333363336616238366164383332303635636132363961343439303930616630653934
+35663164623334343064366364336639376530313236323462396439363232643036313935666335
+37393633326437636566316531616166313933656366313334613535373961663735623235386134
+33363862386433383932363231346564393765333262376238663037336166623835376232336436
+35333435343463376630613664623936663732663265366564306239376164346130396437643436
+37363363613830323837323334346233336666373566616330636131396633666130383665396165
+63396562333836626336366435373335616536323434306439623432393634363739643835623134
+38633637373363653534336637393865653239623162316335623661313731373566373130333439
+30376239303861623037316235396330656465333736346435366264396535303061326535393064
+33363933616236323234616166643937663436303533313162393538653731376465386266633663
+38616465356436303031636637663935356133316361363539313730333434383363336366333332
+63306366393137336432613332316530636633633437353131313736623532616239333134656163
+31613232303164366664663636306165626331396662656434636130666438633637643738353261
+64666664306433623264613036323134643864353638326661613237383633613733643561383634
+33313031313033633436333634366133383432616465653630313864643132363935313262353339
+66396435373561376439643566353238613030393834323338326139313834396131323739623965
+63326435313432326134346433646336666130393332336132353137623662396265373138633837
+34393262616237616561363239313364303866313765353436386231373966313965363634386562
+38353934633938313436396235626432633465326234353035323030396263646231616666383466
+64343566643637373032303463626339616632663964306136343963366135643262373165323738
+32653636653262613338643536656638373436653738633535393837626536663234626630653232
+64323036613533356366393361613866323433666163303164353062633930366330626634316630
+38343465323238613033653332393362343630383235316663313635313836666539663962613365
+62663430656638383532646662646238363632353236336461623738333764666463643661383461
+30333430626235363164636531616536363263376233366262333633633535306333613163646131
+64353836636533616264376139393132623239333231313239313763663034343533666433663666
+37333064303162363738353563323631623061666631303763666438653039626339323439346163
+36373032366437366432346534623838316666353433376565323064373031323032313263373161
+64616334653236383364656635303531306538313039353230313865386666383861616162333866
+35363662373638303932376430626639333338633865323761666136626531386263343939656333
+61313037646561313935613765313939643464396137653239326439373839656531303831323161
+30663130666632316361623635353739313734616333353432643364323265616365313034616237
+65383435343661613662613337646233373839656634653237626632326266643138653231343461
+31346664366633306462323139356337613033303664353438653061613634373833353236363334
+34633236343538663434383833316238313764366630613335653630623634616134333061393333
+64343532326466376562393130396363386536666634353165336336616334613763336263666531
+37313536613361656138313831373436633364663965616639663233386234626335613033646138
+32323262326634303862663731316536626261666336323163383365346361636361613736366432
+33653161643061353832333138363461666265626633653337323134663335393637333637623036
+37353264666665633933663533363934376566386163656464613564663666386333343932376566
+66373737393061383164353962623033323863393239343335393433356261626137613333303637
+66613431383637643537316437633162323636326236663035373334323531656137376437303938
+63336164666661363030383239653030636132396239646366333337346461303833663430613462
+32363130316561383131356138313163346434373332313231363465323063303134373934333066
+35383961383365633134356337343931666531343637376639623066363432336536346166646131
+65336339626636396332396466646339643638666432333762373936306339313764636137623736
+34383137666161363035636538626564373636393265653531316365663131383934363633343036
+66616661376435366236376639616434316262346663653436333636333331653065633333636135
+37336431383765393263336464313765626333373934336637306439373865386332336433373761
+36363362393434333961343133353332363663343566663235396165303430636162326562646133
+39383061353065336439323464643434316433313231373438373532633666363238623333386265
+62353939343362356439636633343738313430366666363437323339346361316261393262313935
+32326535386533646636363532343330616435386630313339643261343634616237316230653833
+39323736623139343961356439386137653465346538313236303963376131313932376330396465
+62333133336563373134306132633865643637666561316265666632353866373464653766313530
+32633435656538336562666438643536663065336439353261333332343236643162393634333735
+62653233643835353965353965346663623936623063623963663134633762323734313331656434
+66366633393737316664353062313635386534333037653762626338333537303463386662326636
+32643761303961366262383665376238396432623366306465343563646638356232663935656462
+31353634643437633639623563646330396665613732633835373436366335356231663366313265
+36656566626637323933356433343437303331623165663930666632623762663161343966343462
+65303230346230613233306661616161303237303362656663623538356362346630386636373238
+61626164386636643265313433343063316439373161353265356565333234666535323531326138
+31393739396163363061616262666231633630663537326136313930623365646239343736373332
+65623236646263316536363165383630376638376634393863616663366265306461333733383932
+31646234313732346632326532613061353433666433353162666637363038353665643535323264
+62303861373935333962353333653033613865376663303431343365346535383737353833383631
+63306638343234643137313532306531646638343961346361306361623134333366376236356138
+36633232383864626134386139366235393032373537363965393232633365393332666265396161
+61313331306335393766346437666332613362333137623963343339343966633066646161613364
+63666536313935643231656634373231663633303633373363646463663234653938323736353437
+65323736626666353035393262373064383231656439373832353464646534643239343937643736
+62663139626631366362613730356534336564366465316134383664366637303736653961353131
+38316363363666343033393664343735623862386237393532663836613061643361666138383631
+65633464393862386362386538333136626661366536306633386233313330333931356132653762
+62373936376534393937336631363537373062306466386466383539336163373961616631383163
+38353930363262326362316136363362626464366662633236313836376633303265363033353931
+61616661633538326462656330336135376264323739376334363164373739383361306437303162
+39313039303032333932373834333662346230316465666433363665333837363866303863326363
+62626466663438343763663131353835396530386264653038656438643532616264353065396665
+32356238343466343438363134356563306131393563313332653461323966633263633932356165
+38656461343135646266656466386561323966613130343532396238313239356564656137633462
+65313633616638336464353562613237326631326438373661663735616339383263313537383565
+31613266383839613864613664373465306463326561396637396162663765373838306139376565
+34376665643239336330393339303234336662333434363963316561633763376634613437343037
+30616430653136323564366166396231343639373534376234336439343233363531646261336566
+61663361333561633736663865323461316639383563643831613864356539323334393663396232
+66643065346661353434343762316534626434366431663936393136373063316631336266386661
+38363734663137663530653261333837326235343663653531636536353863393265353035623064
+34393364393763343532346564306465386565636237613361336665316363373530306535613861
+66643464666361393535663533353934386237646364393865313661653634343861393836303432
+34323539326161336633313564363666393765363130653164303133636631666531666232656432
+31636661366135343937386361663163356565383332383335636136323365346164303635353865
+61363932343939383733386461616365666432613933623565356266626634323632323333613965
+63616331376362336136333163303030383337623361643634303830366538393834313535653266
+38666236373136663162353136643031323865356331646439376139373735633930633762616164
+32336632616434363237343762363439343262363734373637363535623935353034633262336662
+62303564623439386636303861663739616330313232653635346662393837393663376539623438
+33633838383831393733656162613734323331333933643730346330393339613733313736383731
+64343635323363636162366431326631623730303737633263356530666535383639356434353433
+33336439326562366238656333373063393062333436393339396235376435393439353966643436
+35636364376133363138393731613365343764666666333131636133393439363264356236303362
+62336233353362393466633832666538323962346338393538623961373639626631623135633435
+33643034333133636565303435386435666534653265666633316466326635623935303535386134
+32666463613636373339306665666564616639353461613264333663353032656333373737363636
+35346137346265633964333332303763313831623439323266396231383330613732656461333334
+35323635323537623939363935636239353735303732656235353134356563323434643133303438
+33613664393365643132303031613465386561323431343634383562313031643763386665383663
+31613065643464303165633039343462326261303530393134386661313131636235666266336432
+31653264616139333735306336393935643261626564323263303434323161313464313437396232
+66626263663364303238333539626162303839366533323937653039306238343334666363313937
+31366439633637346337386239326339303135346362313533326463383334363837663534386365
+38653134393738396363376333373765366231303465646438653035636664356334393231643461
+64613265343163633830386334383432613961653061386565343835626330383836323935383238
+36346336323631623862646238623935383265653739616366633761333262366362376435666435
+34396630333961613565303232633534313434323330636437333563636233643732663337333432
+30393036626162373039663635313431336234616433363834363564393062616665636634363564
+64316431646234373666383136653734313230623031643931373738663735303762333765623333
+38653739363930326336623632306637306433316331363438343238626264346465633861613039
+62346636303134346332323465633761346535353462373763616535363734643239613535656262
+31613664653065373037363331663435643339323764356433663135623733343339356664326637
+65393961373030393433663434656133666538376432396234346135613730346664626236633936
+65353764303338643366343164616631626636656439383431666637376336623935366135653234
+35343031393530396231343433313962323433303431356333643933363135343461323330303262
+30343861643365666165313561383565663131376465613437616434393064646164303530643834
+36326564363533353761363064663463396431303232666233316638656666646433656632386462
+63383665663365653334376230376238623237323337313636633162636433623730306365613130
+34386434343538303433343263346233346262303233383438373338333966643836653335646431
+38623435636539376664646532656533346635626636633164626236313264323434393536316239
+62383765616337373162316434663864396234353961393938656264323138366535366234303830
+39326631636438376563636238633336366131653937316533333833653132336466366164343039
+61633431303264633064653235326166336236383064666437356537663466383162636263323466
+37316135366534323663343461653738636135663634373235396336383666336332643065363165
+34366632643637643132356637653734366336303537383933303935393231343433653338373837
+66363637623531316335623838386163346335326536363635616463343662336234326234383563
+36643033366261336637633833316165303137643437333531663865663866343765363933623135
+39336461613137643737353936623434396162316335356335373761393663613833316637396163
+66333439656534626239623837343132366563613661616163636630636538623238303337663930
+63316132373335393534356665656163306230383064333032303137393234343234663063373465
+30396130366535383063613539363533373363323738333861356231366132633861366330313933
+37323334653738343734373264663366313431663561393566353736666236623964393338313861
+61373536643034316531363161636132363436616634613238303739383135626461303331666135
+66336530386337613030613437626461366236653931323863306633386564346434616436376638
+64663237333437363731636430373161376332616635383536626663356537376263343836393533
+37343863363662306266353233623737656331613835316634653935343065346537666335363234
+66643830303466323631366366316162656138643838616631646365653131623431613936333636
+39336330626633636536633931646530383534313038353936303430656532383332363439306263
+38393033313139363264656338633832313765663734326235356137343565623961333566336232
+64386435626539343833613530653735623665613362656366306166323062383531333737303066
+66346632353939363931663736363133653437653835316463323730616439623536633366643534
+31633465316530383966356362666365313862626165313738666230626462383133326565336231
+31306530636633313532343763336165396337336232613965343932323361613334646437333465
+66366461346130656636306537313737353836653337333833376664373362666239666636343262
+33313739626162353734656539393266303263343836373366333836653634333664333664666231
+34323238363430656237646436666531363238356536336434396161303536303135616236333665
+37656365623939316438353130646435373030333366326164383161633931616239356163633135
+31363833333432393535653539646534373931343563653734356133323038333431386639643862
+36356134613562343961323433653333323062343234386534313962633435623866633436303430
+35616564626431666239613734346333373533363230353562373832646638633435363139386237
+36313534656434376565363031376262353565643038633730373061333863643766356232373961
+31366662373031653237336438343865383732373437386561303736623435376439613862623363
+63313133643934643630303462396364616138333237333565613964346137633462303562656264
+62346130343231333932383432363266323934613063373764643139353039353262653339343135
+36343238313639333431396131396339356336363536623765636639336633646138346561303038
+31313433363061613166326439636637386263613363396361346332303238616466326261333963
+35323233666234303637306636666461323831366533316332636563376330613939636134643634
+38373538663662656464326639623032663934323665326166383263653333313631666437633333
+34363738666335343362633464363031653639383433313730313931643862393233356665333135
+33343831353436353731623736343134343138326633333334343830626463613934363262383163
+32383033356363663135663166343330343464323535646533376638343164613936386265373330
+32376137383837613730303931306537353166363562666332663536336264336562373133613539
+32316163386561383633616361313963386133303330656136353766393230366537333538336436
+62616564356561616366323264316365653430633038383862376139613833616666373039386639
+39653766663239383162336564343864323434383330643232303233306238323433353665663130
+65613630336135303939303637303231326238623336323463393231663764616132613437323061
+36356464663235663333623063326231646464313639316332333336323433643135306239663030
+61363734613439396437316231396434623265316234656230333566343938356238656639646534
+65383739663464313362656361383136383332353634383832303031616634323663643431323637
+37323232653263633938383535313735623533633465633665303235613538333637333832333834
+62356161336330323534373435366137336531353331623531323438373435323831373031323939
+30393132373762613631393964333666306465316434633238373734313461396264336131313935
+65333233613438386661386331656264323736333563663235306633633233383763313964343661
+63373430396562326535616438326362646538626335353233636234343039313533616238646165
+35353837343066313836383362383064376637643364643563623539613663383534343432633835
+62303330633630613565383861313930643539366632613538633237383465323165373562393765
+66643833633661643339616236636261613633636562366132663862376162646139386435616134
+64613139363638303439383961316266323934383431616362643632386138626639323337353965
+35373239383137313432326138306638306336353336353833343730303834393766396531656438
+36393665366565623330346439646334323130656634333930353563373662383265306134366165
+66646332663035363061633338633161393362643564356366323733306334663535623161333361
+61653865393532376539623439323264646365633835323932313934323263303061613766393066
+33646262393233653231313761306561613864373432666631326365393664323238323465356635
+33396464653431616630303462353036666634633432353861343765366464313066623338393865
+65643333353264643539663735366430633930333033663165303237303536656231386431313934
+37653430306665313338623330626165353338613138313033653334623961333738636665623732
+32326332323638306162643034306431303434363631306364633961316630383436346432376632
+36383165613361346533633638363332373037656137613962356662613265333265393136303630
+36336333356166666130336233313636646135373338313336306632653361343533646432653831
+39386630366566356437623739333336373863373530363738383262643932636462646463613337
+34653137343130656536383761383064363936363734386136313764346437353533316566663931
+39613962646562383161333836646236343465333037376632656635333465326435663462626563
+32333063323238313332623932373263346632366138383630633539383264626334383761306238
+34633263306532386234376636313534376238343330663136353764323231623864356537643764
+35386464386238663766323238396131393039636161656365626135333031353839653162363762
+64653330383062343337623165393237336534656564626431343166626662306530343639663637
+66383536356130343335666236383065343435303637393937383762383738363566666664643162
+39663534646661326133656566306133323033373130363936643038623737373939633362303064
+38343234306533643661313863653632643566623261623165333039373261323963343464336461
+64613239376461636430353738336630373433326230326336643336633335386165626236326439
+35636663333034326433343061626337386561346136653166376431333732303363393430393166
+65346338373533633866346261663533366136626262366536303932666161373166393938383438
+66333762323336393731386464353461373835333961643362633565303936306539326266636331
+32396130323537323430633732333637666631653862343239663864346131346263346438623535
+39663563633734396265303037613632353137306232663933376434376463653263666137323534
+62393262616263333935613332623231363535396134373231376337666564303830363864353961
+65616264306331393063343364623139643030323036636232306634346232356136333436646437
+30393030343261646266356163626539326439326230306365316564323061383230666438376232
+38336532626338613161303963643933396134616465303635366266633932653638323738613736
+32336266663032373366316534323435643230643537616535616632383332343439656163326162
+63366263383863666661666364353430666138393761626134633064303838373231643166316566
+64376462626661333830306636303161623061343034393732373738383139333032666138653535
+30346231633138626238363963366332666165613162636561386466303436323733323330373137
+36303837326462633961656561346335343135343563393363633164393637323061636137656237
+33623865616232666439623031323634323534623634643737356432373135386631373231353363
+66613131373238316136303931356630643964393162366331306638633337623063386132623538
+62323564313237343833633561353535633463626637373839316262323734633432323066663065
+34323161616666323839343339633362643439396263343462363564613837623630653865616633
+36333866333465316662323534356563373738383530386262366435343531616437663033343037
+65303438353566643439383636643336316166366434343536636239623635353262653530653632
+63353939623135396432326335393033303734626231616334356563383365636633393264666565
+64646438353261383964343233356465623636326262363363393038353738656563376666616233
+36643966323662333765393535613066636662336136343330383832326637663134326230613466
+39333936323636303332626562656265613037623965373830643936343831333338353038396538
+33316430633461353766363266306461333639626664383735356139323933313932623662636239
+37396639643062666337663039373165663562353566386363393164383434313839643937356366
+37323935396130353031643262336564613230363735613134356465353435386136323530643133
+31333864346234383733323061643964616636386639376235633333386638323464663433623233
+61343361333266613666326438653335376163383763306539393136646562353465653531393866
+63663738333432356661646533636135336365316137663339356438353163363066393630373862
+32323066333564663533393965353238613037386135343664633861316566396632346138336164
+33653763393331333735313863643536333161636435623439353766653135353562623739643261
+37653366383531336134313738353133396265393334373564303463663362336432363830326131
+63363038613963633566343363353034623663303434656632636236626464623835396438303136
+39386131353536643864623339376430636138393264613838306138663536646661633665393362
+36376564613265396339626666386539616465646137383833376238653665663064626431373136
+39316436303830626338363163303038313463653561636365633535306131663035343363663833
+30353336353864323535313038616635353637353963653538646666353034396334316432346161
+62373861343137326565383333363531323237633435303033613764643366316531626237623035
+32386461303130303064616561633837326335613435393662323163373631636235356330353664
+64666136613831666634333430326631616164383661343937623966313836653237383934386433
+66666534646133343736306164666131643661386133656230656538343037633131316637316564
+32336162613531356661643135313363386332356533363535646136646461633737333863643130
+64363030376662316137313134303635666135396265363633633866633536623739356530373666
+39363539383163333038373237663966376532336164663239313464303631313263663733633438
+65363861366435333662313839396539383231653064343762623535643263646338306265633062
+34313063383335366436363530363362323631303531383536343739393433616332643331353762
+36656539653132616331366430366363373666663937366638346661613333653834326262326431
+34303131646439393434613166386535653037646130363464313739663734313566636666313534
+33356664623633363361656136373531306336336665636462396633323034326662633639303961
+31353662383032646535343461363466353438666535356536383933373238303932636563376663
+32326131363162636238366665386139626331656131363139646539316163643831353462626539
+64393036346561643632666366386338306361313130323333666261393266613938303332326135
+33633539393931333166663761366564376561666333613834653938343133636566346431613664
+63323334356236636132303938363162373233333433343364623736663461303534633430393535
+38363562353539333030343731616138616364373537333432363066626363313930613537643730
+32386563396630313161356435313362663662613931373636666331373663613139363339666638
+30343832666165653434316261383230653466646335333332613535356463346238616663396631
+37323333633362303363316164363039373133613765306633616233323431616133636161626638
+34613766356231656665333666636635633334336538386636653165383066316132616435303464
+39356533333530653835353530376630636234666136313765373732663561373638313937643634
+38326636623430363061373733646564303038653766303538333064653133336563373831353766
+64366430353135656634663530623832393832626236336164393730326661643962353434656263
+65633564363038373431323461613462303035353733623030326136303134333964653639346538
+64303336343739373537333465633363666366393163663032353531313731356635323564613430
+61326238646265396634306139633061373166663330653730613431343264353265376638336561
+63306666383030613334363063333963656662366136343731646162656565303461623631383638
+31323737323566353536323036336631343038343230633366343938663863393534336433346463
+31323135636565336636346134666136623131623266623764376465653337666630343632643964
+64366333313865396461666637356162393833323361636235393066333761336366643434623061
+64663739656137393333393438373536636533663166336533303564616331616334633864653365
+37393136303139656539663533313463376561616237373563306263373265613930653331346336
+63323531343430613563653164353839653433353337643464393763616664656231613138393961
+32313432663165306364326630346461313038356239363465626261643932616333633838613434
+35353031343231653661393535633562643732363538633137613234366666653566346661396532
+32326265333562336661326337316238376235363566366333623038653864333230353564636631
+61366231326330353937383331396237376237333765656136623137613636663039323739663164
+37343962633939653535663637653235653431623962386633353838663566383734316433316364
+61356639373832353264663936623138643334666633366435303138303734626337663965663831
+32356431636639353262336535393565383436626438396639393161633631353762366235303637
+30623438646366646438373034646134303736623531623530373433616430326633356535343631
+65333066383464633232393332626332336566393737313235653136373538633433363563643638
+62333063656330383761353831316230313963623962366233626538316236333864613166373463
+64306365323930343265636137646564343831636331303633333734303837373730343438633465
+34313635633739396132306538306563323462373637616133616131393730353865333134343537
+62373562373930366564363932346463303435303038333435666564366135306137323565306431
+62363334653337366438363063623661306461356430366666373462303765383861313165656133
+38663834333833366331366464343231316366626666353266393362393834343031366533366261
+33666465613961623766396263376332626262626632323131646130623432663964323131643733
+33303934613464393261323662643834663633343739663235383565376437383765303236386332
+62316266386233663235313665616231626536383530313631306265633962643632363862306162
+30646661353732376536393339626532366133333038356633306130313933323036653730366637
+62316435386537326661303334653133383362393034396462656333373166623666353261313736
+65313166656533303131666666616538316139616133623433353936663434636236363265666464
+64303932306133613833363537646230313131383963333464623661363534326239623566323164
+38353163643265336161636465643938623763313565303865623962633639336635303336323730
+38383765393431613431376333343862303034666530643338343133303232353831616135643430
+62323731653866343333633033313966383932326636346164303761633662346264306532353733
+64396337636330653735376530366166386461326336336335306538306336643937396236303330
+62633533353338383035653861376139363530333234613563363066613836613361353866633337
+31653138353235613930663662366431656133646233353531313561323132306234323436623365
+31323561653362633636303933643633663338303761383961363566396238353433323230373131
+32653031323034343038663833323063613466353831663433373065376465353664396361653037
+30313434636566303764616366316137663562663261643830633836356530343732303865336562
+35383530646535396337633463646231623436353435346137613363326362626635623735353038
+30326334653433313734386361396537356633383465306539346338333563643762636331643633
+66626231383636623266646466356462396366323430306633393364313366363666356533616366
+30353838346232313234343463373530306565313636653331366535313431353032343835373962
+34653863333663356363653339303235303338303130326462363936663539313930663761393061
+31633536643035323632373535663134613731393030666165393436356339313837663663656461
+39326463363965643535346233326261623534383164323161326330383030353864326131626566
+32336131393436383431656438653562386564623433643434396533306337366333646539393836
+63383731613139346161
diff --git a/provisioning/host_vars/forge-test/forgejo.yml b/provisioning/host_vars/forge-test/forgejo.yml
index 924ed7e..f349c44 100644
--- a/provisioning/host_vars/forge-test/forgejo.yml
+++ b/provisioning/host_vars/forge-test/forgejo.yml
@@ -1,37 +1,23 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
+# Copyright (C) 2025-2026 Arm Ltd.
---
-forgejo_name: "Sourceware Forge Test" # APP_NAME
+# app.ini overrides for forge-test
+sourceware_forge_forgejo_app_name: "Sourceware Forge Local Test VM"
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#admin-admin
-forgejo_admin:
- # Disallow regular (non-admin) users from creating organizations.
- disable_regular_org_creation: false # false
- send_notification_email_on_new_user: true
- # Default configuration for email notifications for users (user configurable).
- # Options: enabled, onmention, disabled
- # default_email_notifications: "" # enabled
- # user_disabled_features: []
- # external_user_disable_features: []
+# [database]
+sourceware_forge_forgejo_db_ssl_mode: disable
-# https://forgejo.org/docs/latest/admin/config-cheat-sheet/#actions-actions
-forgejo_actions:
- # Allow actions
- enabled: true
- # But not downloading actions code from forgejo yet
- default_actions_url: "https://{{ ansible_fqdn }}/"
- # artifact_retention_days: "" # 90
- # zombie_task_timeout: ""
- # endless_task_timeout: ""
- # abandoned_job_timeout: ""
- # skip_workflow_strings: []
+# [server]
+sourceware_forge_forgejo_lfs_start_server: true
-sourceware_forge_lfs_start_server: true
-# allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions.
-sourceware_forge_disabled_repo_units: []
+# [repository]
+sourceware_forge_forgejo_disabled_repo_units: ""
+# [admin]
+sourceware_forge_forgejo_disable_regular_org_creation: "false"
+
+# [mailer]
sourceware_forge_forgejo_mailer_from: no-reply@localhost
-sourceware_forge_forgejo_postgres_ssl_mode: disable
-sourceware_forge_email_domain_allowlist:
- - localhost
- - forge-test
+
+# [service]
+sourceware_forge_forgejo_email_domain_allowlist: ""
diff --git a/provisioning/host_vars/forge-test/secrets.yml b/provisioning/host_vars/forge-test/secrets.yml
index 480e285..46012a7 100644
--- a/provisioning/host_vars/forge-test/secrets.yml
+++ b/provisioning/host_vars/forge-test/secrets.yml
@@ -12,14 +12,17 @@
# a version encrypted with ansible-vault encrypt.
# See https://docs.ansible.com/ansible/latest/vault_guide/vault_encrypting_content.html for
# the documentation on how ansible-vault works.
-forgejo_admin_user:
- username: "forge-admin"
- password: "forge-admin"
- email: "forge-admin@localhost"
+
+### SSH access
+sourceware_ssh_access_authorized_keys: []
+
+### Anubis
# Generate using openssl rand -hex 32
sourceware_forge_anubis_key: 9a74df8d0f09756729abc0b141f4b21f1d7e0766c12d221e7ef5601331c5016c
+### Batrachomyomachia
+
# This must be set from the value obtained in the UI
# See the README.md file on what the permissions of this key should be
sourceware_forge_batrachomyomachia_forgejo_api_key: UPDATEME
@@ -43,13 +46,69 @@ sourceware_forge_batrachomyomachia_origin_ssh_public_key: '
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGSUwzuArJyFa5yrqGwqYXDQQBv
57x9aVqEiH9Bl97Ew forge-bot-sample-01'
+### Forgejo
+
+sourceware_forge_forgejo_admin_username: "forge-admin"
+sourceware_forge_forgejo_admin_password: "forge-admin"
+sourceware_forge_forgejo_admin_email: "forge-admin@localhost"
+
sourceware_forge_postgres_password: test
+# Generate using forgejo generate secret LFS_JWT_SECRET
+sourceware_forge_forgejo_server_lfs_jwt_secret: L2qyImcDB7o-nPrJZiHDbUJ7sciGNGFN0XaX6jwNc1w
+
+# Generate using forgejo generate secret JWT_SECRET
+sourceware_forge_forgejo_oauth2_jwt_secret: mW9_rk1aYq0pqbj9lt0YDGMbs48Ro_k2kA4C1Kt_H6k
+
+# Generate using forgejo generate secret SECRET_KEY
+sourceware_forge_forgejo_security_secret_key: '
+ jxaWZJrBphDXuTogfB0JGMoJi3qinM5DkroTF0PzBV2'
+
# Generate using openssl rand -hex 64
-sourceware_forge_token: "
+sourceware_forge_forgejo_security_token: "
ce9b069fcd93f2f75d0af093242123d6c7783642574422707783166b9b24e644
dfd602f71bfcfeb26b107fae26bad3c38c5dc090877bf5e96d8907d9a17fce87"
+sourceware_forge_forgejo_ssh_server_keys:
+ - name: forgejo_host_rsa_key
+ private_key: |
+ -----BEGIN RSA PRIVATE KEY-----
+ MIIEowIBAAKCAQEA6PRiDd1MUOQtu+eWGOsFcewa3wqcOGy0vkeqA5Hz6EUYCYEd
+ zpw/s5yhEF1wdRhizFud1/xmKT1WSNtYiMzdQKOGJ20XGWYBYFYhbP2oStpgJyZ0
+ d5kaZSTdD2Y5QCBskdRSEqB4S4H2kWe+8DMechS6AMuz6A6a5fhSwQj1oIFJuIwb
+ rON/wgP/xmeVU8SJCn6fMOW3783LMZJNtn1GkA//8ajSa1TgfsuUUTq50xp/efCG
+ 0VdgE9nyz+4b0qK4d5qQIGbbBC+vqlyXt+KLoGPlP9ajvP/Fs5AqSpU+RhaLW36a
+ quC0Rpcfl+LP8YO1PnsDMkyVP3gSZT/qEOjkpwIDAQABAoIBACMqSOb44f1QBItZ
+ 8TF/wMmqr3+91Uk7N6mFned+D8ifLXq5z+sRcRhG65VR1ZkHflqE9fXVtwJArRbA
+ bcPw0PFh/e1TrWn7GPgW6GLQg6gRAPTH/ErVhMOB5hDeCIRioKD+4QjIyn/zdWoL
+ tCoEPXNRJ6bZGSZNlhpi+vMCzDlXITMdDWBYNIfJsBEfKu/STYL+SCr5OonWJb1A
+ 1WqXbGwvXn/n+pg55R4SE7CzdpYd2bKo4EBOFrr3TgyckjOqCazIX3IbbQXdtr6M
+ ua+0hyoGi64+ainQjNgyNUIf0cxQEpgc6DLlq+cROFwechv/eT7i+51ZcPC+s3Pa
+ P28NbakCgYEA9wYzT8TONc0G2LLFkKBxyFlW5D3X/r0Bv815nd3jkaFp+Uziwovh
+ McO7XbfvyXSMIabqMV1c68A2JRLc7zzSpdRt8sAhHelevXfY2Hxdc7LSE9ENT4iR
+ 1mK/+COhF8U3JUZ7tT0LcWyem3h/jJkKCAyDaeHA/2XSghBOyOWbJWsCgYEA8WtO
+ 7LvsEfxHz6tlDQh6VfE0sL9QwdbxNvUR3SvgWayxmeBAk3o1dzMnJXlbT8MuFVsY
+ rs0diuPTLxBMBeSnSDUKgMuqMHtygWtGv8PIMhNA/H9RvcbL5xFIvppwsqYwwhHQ
+ w74OA6q3Zhi+DyP0vZ4ga20jRKTKH2qpDhcSULUCgYBBxuHk7MfoJZccHsZi04ZY
+ zglIL3uTdmq/0wv+UHZnce7RFnsPSMYHRVJgCzmLkEA8OcEEshKrJ/yC9Lnl7nE8
+ /Qrl5+kpmNnEY+RXCQ6tX0F3S2Ra+Ee1KYhqn7ompTog79rDEOU6J604Qubb3miA
+ aiyYBigpGcjrH0KLVjBwzwKBgQC5fFoid2w0kWHXQ/ea4OWlfHKgTg3NMMkaEYcN
+ KHXyUEYQVQUoil/j2rB8EVa/3NVeYSSAwWWuXcbXRS0z5e9FAkO0m0aCg4aBuxub
+ oOAC4Vov5d628bOeMGB02ZI3IIsbwLZmfnKkDJlmXyI/3b9fpMuB3lOXnQkSxE9p
+ XP6cdQKBgBphyCAV2kcx26f8+qMX2t5Yh1afdQyv90xFmOUGbcEQTOHizTd8yuO2
+ BLWQlcP8nH05a98wiA/fqWjQh8r0GklwAiKxqfK3iNohBVfHWwdZnUfoiaHgj1f2
+ ZOICi7fpdEh6+pAp0Te5onh3J7hm9E4eaNFkAu7GZdyCgWaQStot
+ -----END RSA PRIVATE KEY-----
+ public_key: |
+ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDo9GIN3UxQ5C2755YY6wVx7Brf
+ Cpw4bLS+R6oDkfPoRRgJgR3OnD+znKEQXXB1GGLMW53X/GYpPVZI21iIzN1Ao4Yn
+ bRcZZgFgViFs/ahK2mAnJnR3mRplJN0PZjlAIGyR1FISoHhLgfaRZ77wMx5yFLoA
+ y7PoDprl+FLBCPWggUm4jBus43/CA//GZ5VTxIkKfp8w5bfvzcsxkk22fUaQD//x
+ qNJrVOB+y5RROrnTGn958IbRV2AT2fLP7hvSorh3mpAgZtsEL6+qXJe34ougY+U/
+ 1qO8/8WzkCpKlT5GFotbfpqq4LRGlx+X4s/xg7U+ewMyTJU/eBJlP+oQ6OSn
+
+### DKIM keys
+
# apt install opendkim opendkim-tools
# opendkim-genkey -d forge.sourceware.org -s default
# And use the generated default.txt file as source
diff --git a/provisioning/requirements.yml b/provisioning/requirements.yml
index d067ec3..53ee99f 100644
--- a/provisioning/requirements.yml
+++ b/provisioning/requirements.yml
@@ -6,7 +6,5 @@ collections:
- name: community.general
- name: community.postgresql
- name: containers.podman
- # Use an in-development version of the role for the time being
- - name: git+https://github.com/rockdreamer/ansible-collection-scm.git,devel
- # - name: bodsch.scm
- # version: 1.3.1
+ - name: bodsch.scm
+ version: 1.7.1
diff --git a/provisioning/roles/sourceware_forge_forgejo/defaults/main.yml b/provisioning/roles/sourceware_forge_forgejo/defaults/main.yml
index 7ba9de1..b835b04 100644
--- a/provisioning/roles/sourceware_forge_forgejo/defaults/main.yml
+++ b/provisioning/roles/sourceware_forge_forgejo/defaults/main.yml
@@ -1,3 +1,38 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
+# Copyright (C) 2025-2026 Arm Ltd.
---
+sourceware_forge_forgejo_version: null # Must be set in group_vars or host_vars
+sourceware_forge_forgejo_root_dir: /srv/forgejo
+sourceware_forge_forgejo_force_containers: true
+sourceware_forge_forgejo_create_home_directory: true
+sourceware_forge_forgejo_home_directory: /srv/git
+
+# app.ini defaults
+sourceware_forge_forgejo_slogan: "Core Toolchain and Developer Tools"
+sourceware_forge_forgejo_user: git
+sourceware_forge_forgejo_group: git
+sourceware_forge_forgejo_run_mode: "prod"
+
+# [database]
+sourceware_forge_forgejo_db_log_sql: false
+
+# [server]
+sourceware_forge_forgejo_domain: "{{ ansible_facts['fqdn'] }}"
+sourceware_forge_forgejo_http_listen_port: 3000
+sourceware_forge_forgejo_root_url: "https://{{ ansible_facts['fqdn'] }}/"
+sourceware_forge_forgejo_ssh_domain: "{{ ansible_facts['fqdn'] }}"
+sourceware_forge_forgejo_ssh_listen_port: 220
+sourceware_forge_forgejo_app_data_path: "{{ sourceware_forge_forgejo_root_dir }}/data"
+sourceware_forge_forgejo_lfs_start_server: false
+sourceware_forge_forgejo_offline_mode: true
+sourceware_forge_forgejo_landing_page: organizations
+
+# [repository]
+sourceware_forge_forgejo_repository_root: "{{ sourceware_forge_forgejo_root_dir }}/data/forgejo-repositories"
+sourceware_forge_forgejo_default_repo_units: "repo.code,repo.pulls,repo.actions"
+sourceware_forge_forgejo_default_fork_repo_units: "repo.code,repo.pulls"
+
+# [security]
+# These values are provided in one of the secrets.yml files, with the exception of the forge-test temporary VM.
+# sourceware_forge_forgejo_security_secret_key: "secret"
+# sourceware_forge_forgejo_security_token: "secret"
diff --git a/provisioning/roles/sourceware_forge_forgejo/handlers/main.yml b/provisioning/roles/sourceware_forge_forgejo/handlers/main.yml
index 627335b..a6b2d79 100644
--- a/provisioning/roles/sourceware_forge_forgejo/handlers/main.yml
+++ b/provisioning/roles/sourceware_forge_forgejo/handlers/main.yml
@@ -1,7 +1,8 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
+# Copyright (C) 2025-2026 Arm Ltd.
---
- name: Restart forgejo
ansible.builtin.systemd_service:
name: forgejo
state: restarted
+ daemon_reload: true
diff --git a/provisioning/roles/sourceware_forge_forgejo/tasks/main.yml b/provisioning/roles/sourceware_forge_forgejo/tasks/main.yml
index 48fc482..8a78751 100644
--- a/provisioning/roles/sourceware_forge_forgejo/tasks/main.yml
+++ b/provisioning/roles/sourceware_forge_forgejo/tasks/main.yml
@@ -1,14 +1,16 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
+# Copyright (C) 2025-2026 Arm Ltd.
---
-# See https://github.com/bodsch/ansible-collection-scm/issues/19
+# This was used based on recommendations from
# https://forgejo.org/docs/latest/admin/recommendations/#git-over-ssh
-- name: Add AcceptEnv GIT_PROTOCOL
+# See also https://github.com/bodsch/ansible-collection-scm/issues/19
+# However we are moving to podman based deployment and it's simpler to
+# use the built-in sshd service in forgejo
+- name: Remove AcceptEnv GIT_PROTOCOL
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
- regexp: 'AcceptEnv GIT_PROTOCOL'
- line: AcceptEnv GIT_PROTOCOL
- insertafter: 'AcceptEnv '
+ regexp: '.*AcceptEnv GIT_PROTOCOL.*'
+ state: absent
- name: Disable X11Forwarding
ansible.builtin.lineinfile:
@@ -16,56 +18,236 @@
regexp: 'X11Forwarding'
line: X11Forwarding no
-- name: Create git group
+- name: Create group for running the forgejo service
ansible.builtin.group:
- name: "{{ forgejo_system_group }}"
+ name: "{{ sourceware_forge_forgejo_group }}"
state: present
system: true
+ register: sourceware_forge_forgejo_created_group
-- name: Create git user
+- name: Create user running the forgejo service
ansible.builtin.user:
- name: "{{ forgejo_system_user }}"
- groups: "{{ forgejo_system_group }}"
- shell: /bin/bash
+ name: "{{ sourceware_forge_forgejo_user }}"
+ groups: "{{ sourceware_forge_forgejo_group }}"
+ shell: /bin/false
+ comment: forgejo user
system: true
- createhome: "{{ forgejo_system_user_create_home }}"
- home: "{{ forgejo_system_user_home_dir }}"
+ password: '!' # --disabled-password
+ createhome: "{{ sourceware_forge_forgejo_create_home_directory }}"
+ home: "{{ sourceware_forge_forgejo_home_directory }}"
+ register: sourceware_forge_forgejo_created_user
-- name: Ensure working directory exists
+- name: Remove files created by old installation method
ansible.builtin.file:
- path: "{{ forgejo_working_dir }}"
+ path: "{{ item }}"
+ state: absent
+ force: true
+ loop:
+ - /srv/forgejo/log # we use journald
+ - /srv/forgejo/token # token is now a podman secret
+ - /usr/bin/forgejo # old binary location
+ - /usr/local/bin/forgejo.sh # old script
+ - /opt/forgejo # old binary versions
+
+- name: Ensure root directory exists
+ ansible.builtin.file:
+ path: "{{ sourceware_forge_forgejo_root_dir }}"
state: directory
- recurse: true
- owner: "{{ forgejo_system_user }}"
- group: "{{ forgejo_system_group }}"
- mode: "0755"
+ owner: root
+ group: root
+ mode: "0750"
-- name: Add a token file
- ansible.builtin.copy:
- content: "{{ sourceware_forge_token }}"
- dest: "{{ forgejo_working_dir }}/token"
- mode: "0640"
- owner: "{{ forgejo_system_user }}"
- group: "{{ forgejo_system_group }}"
+- name: Check writeable forgejo directories
+ ansible.builtin.file:
+ path: "{{ item }}"
+ state: directory
+ mode: "0750"
+ owner: "{{ sourceware_forge_forgejo_user }}"
+ group: "{{ sourceware_forge_forgejo_group }}"
+ loop:
+ - "{{ sourceware_forge_forgejo_root_dir }}/data"
+ - "{{ sourceware_forge_forgejo_root_dir }}/custom"
-- name: Run the main forgejo role
- ansible.builtin.include_role:
- name: bodsch.scm.forgejo
+- name: Generate Containerfile
+ ansible.builtin.template:
+ src: Containerfile.j2
+ dest: "{{ sourceware_forge_forgejo_root_dir }}/Containerfile"
+ mode: u=rw,g=r,o=r
+ owner: root
+ group: root
+
+- name: Generate app.ini
+ ansible.builtin.template:
+ src: app.ini.j2
+ dest: "{{ sourceware_forge_forgejo_root_dir }}/app.ini"
+ mode: u=rwx,g=,o=
+ owner: git
+ group: git
+ notify:
+ - Restart forgejo
+
+- name: Generate command to run forgejo in container
+ ansible.builtin.template:
+ src: forgejo.j2
+ dest: "/usr/local/bin/forgejo"
+ mode: u=rwx,g=rx,o=
+ owner: root
+ group: git
# Install a robots.txt file based on https://codeberg.org/robots.txt
- name: Add robots.txt
ansible.builtin.copy:
src: robots.txt
- dest: "{{ forgejo_working_dir }}/custom/robots.txt"
+ dest: "{{ sourceware_forge_forgejo_root_dir }}/custom/robots.txt"
mode: "0644"
- owner: "{{ forgejo_system_user }}"
- group: "{{ forgejo_system_group }}"
+ owner: "{{ sourceware_forge_forgejo_user }}"
+ group: "{{ sourceware_forge_forgejo_group }}"
-# Add a wrapper script
-- name: Add forgejo wrapper script
- ansible.builtin.template:
- src: forgejo.sh
- dest: "/usr/local/bin/forgejo.sh"
- mode: "0755"
- owner: root
- group: root
+- name: Build a container image for forgejo
+ containers.podman.podman_image:
+ name: "localhost/forgejo:{{ sourceware_forge_forgejo_version }}"
+ state: build
+ force: "{{ sourceware_forge_forgejo_force_containers }}"
+ build:
+ cache: "{{ not sourceware_forge_forgejo_force_containers }}"
+ file: "{{ sourceware_forge_forgejo_root_dir }}/Containerfile"
+ notify:
+ - Restart forgejo
+
+- name: Create forgejo_database_password secret
+ containers.podman.podman_secret:
+ state: present
+ name: forgejo_database_password
+ data: "{{ sourceware_forge_forgejo_db_password }}"
+ notify:
+ - Restart forgejo
+
+- name: Create forgejo_server_lfs_jwt_secret secret
+ containers.podman.podman_secret:
+ state: present
+ name: forgejo_server_lfs_jwt_secret
+ data: "{{ sourceware_forge_forgejo_server_lfs_jwt_secret }}"
+ notify:
+ - Restart forgejo
+
+- name: Create forgejo_oauth2_jwt_secret secret
+ containers.podman.podman_secret:
+ state: present
+ name: forgejo_oauth2_jwt_secret
+ data: "{{ sourceware_forge_forgejo_oauth2_jwt_secret }}"
+ notify:
+ - Restart forgejo
+
+- name: Create forgejo_security_secret_key secret
+ containers.podman.podman_secret:
+ state: present
+ name: forgejo_security_secret_key
+ data: "{{ sourceware_forge_forgejo_security_secret_key }}"
+ notify:
+ - Restart forgejo
+
+- name: Create forgejo_security_token secret
+ containers.podman.podman_secret:
+ state: present
+ name: forgejo_security_token
+ data: "{{ sourceware_forge_forgejo_security_token }}"
+ notify:
+ - Restart forgejo
+
+- name: Add a forgejo ssh private_key
+ containers.podman.podman_secret:
+ state: present
+ name: "forgejo_ssh_host_key_{{ item.name }}"
+ data: "{{ item.private_key }}"
+ loop: "{{ sourceware_forge_forgejo_ssh_server_keys }}"
+ loop_control:
+ label: "{{ item.name }}"
+ no_log: true
+ notify:
+ - Restart forgejo
+
+- name: Add a forgejo ssh public_key
+ containers.podman.podman_secret:
+ state: present
+ name: "forgejo_ssh_host_key_{{ item.name }}.pub"
+ data: "{{ item.public_key }}"
+ loop: "{{ sourceware_forge_forgejo_ssh_server_keys }}"
+ loop_control:
+ label: "{{ item.name }}"
+ no_log: true
+ notify:
+ - Restart forgejo
+
+- name: Build list of all secrets for forgejo container
+ ansible.builtin.set_fact:
+ sourceware_forge_forgejo_container_secrets: >-
+ {{
+ [
+ 'forgejo_database_password',
+ 'forgejo_server_lfs_jwt_secret',
+ 'forgejo_oauth2_jwt_secret',
+ 'forgejo_security_secret_key',
+ 'forgejo_security_token'
+ ] +
+ (sourceware_forge_forgejo_ssh_server_keys | map(attribute='name') | map('regex_replace', '^(.*)$', 'forgejo_ssh_host_key_\1') | list) +
+ (sourceware_forge_forgejo_ssh_server_keys | map(attribute='name') | map('regex_replace', '^(.*)$', 'forgejo_ssh_host_key_\1.pub') | list)
+ }}
+ notify:
+ - Restart forgejo
+
+- name: Create a Quadlet file for forgejo
+ containers.podman.podman_container:
+ name: forgejo
+ image: "localhost/forgejo:{{ sourceware_forge_forgejo_version }}"
+ state: quadlet
+ user: "{{ sourceware_forge_forgejo_created_user.uid }}:{{ sourceware_forge_forgejo_created_group.gid }}"
+ network:
+ - host
+ ports:
+ - "{{ sourceware_forge_forgejo_http_listen_port }}:{{ sourceware_forge_forgejo_http_listen_port }}/tcp"
+ - "{{ sourceware_forge_forgejo_ssh_listen_port }}:{{ sourceware_forge_forgejo_ssh_listen_port }}/tcp"
+ cap_add:
+ - NET_BIND_SERVICE
+ volumes:
+ - "{{ sourceware_forge_forgejo_root_dir }}/app.ini:{{ sourceware_forge_forgejo_root_dir }}/app.ini:ro,Z,noexec"
+ - "{{ sourceware_forge_forgejo_root_dir }}/custom/robots.txt:{{ sourceware_forge_forgejo_root_dir }}/custom/robots.txt:ro,Z,noexec"
+ - "{{ sourceware_forge_forgejo_root_dir }}/data:{{ sourceware_forge_forgejo_root_dir }}/data:rw,Z"
+ secrets: "{{ sourceware_forge_forgejo_container_secrets }}"
+ tmpfs:
+ "/tmp": "rw,nosuid,nodev,noexec,size=50000k,mode=777"
+ "/var/tmp": "rw,nosuid,nodev,noexec,size=50000k,mode=777"
+ ulimit:
+ - "nofile=524288:524288"
+ generate_systemd:
+ after:
+ - syslog.target
+ - network.target
+ - "postgresql@{{ sourceware_forge_postgres_main_version }}-main.service"
+ requires:
+ # - forgejo_valkey
+ - "postgresql@{{ sourceware_forge_postgres_main_version }}-main.service"
+ quadlet_options:
+ - "AutoUpdate=registry"
+ - "Pull=newer"
+ - |
+ [Install]
+ WantedBy=default.target
+ notify:
+ - Restart forgejo
+
+- name: Flush handlers
+ ansible.builtin.meta: flush_handlers
+
+- name: Enable and start forgejo
+ ansible.builtin.systemd_service:
+ name: forgejo
+ state: started
+ enabled: true
+
+- name: Create admin user
+ bodsch.scm.forgejo_admin_user:
+ username: "{{ sourceware_forge_forgejo_admin_username }}"
+ password: "{{ sourceware_forge_forgejo_admin_password }}"
+ email: "{{ sourceware_forge_forgejo_admin_email }}"
+ working_dir: "{{ sourceware_forge_forgejo_root_dir }}"
+ config: "{{ sourceware_forge_forgejo_root_dir }}/app.ini"
diff --git a/provisioning/roles/sourceware_forge_forgejo/templates/Containerfile.j2 b/provisioning/roles/sourceware_forge_forgejo/templates/Containerfile.j2
new file mode 100644
index 0000000..9f465ec
--- /dev/null
+++ b/provisioning/roles/sourceware_forge_forgejo/templates/Containerfile.j2
@@ -0,0 +1,92 @@
+# SPDX-License-Identifier: GPL-3.0-or-later
+# Copyright (C) 2026 Arm Ltd.
+FROM docker.io/library/debian:trixie-slim
+
+RUN \
+ groupadd --system --gid {{ sourceware_forge_forgejo_created_group.gid }} git && \
+ useradd --system --gid git --no-create-home --shell /bin/false --uid {{ sourceware_forge_forgejo_created_user.uid }} git && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }} && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }}/config && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }}/custom && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }}/custom/options/locale_next && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }}/custom/options/locale && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }}/data && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }}/home && \
+ mkdir -p {{ sourceware_forge_forgejo_root_dir }}/log && \
+ chown -R git:git {{ sourceware_forge_forgejo_root_dir }}/*
+
+VOLUME ["{{ sourceware_forge_forgejo_root_dir }}/data"]
+
+ENV HOME={{ sourceware_forge_forgejo_root_dir }}/home
+
+RUN set -eux && \
+ apt-get update && \
+ DEBIAN_FRONTEND=noninteractive apt-get -qq -y full-upgrade && \
+ \
+ DEBIAN_FRONTEND=noninteractive apt-get -qq install -y --no-install-recommends \
+ ca-certificates \
+ curl \
+ gettext \
+ git \
+ gnupg \
+ openssh-client \
+ && \
+ apt-get dist-clean \
+ && \
+ arch=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) \
+ && \
+ curl -sSLo forgejo-{{ sourceware_forge_forgejo_version }}-linux-${arch} https://codeberg.org/forgejo/forgejo/releases/download/v{{ sourceware_forge_forgejo_version }}/forgejo-{{ sourceware_forge_forgejo_version }}-linux-${arch} \
+ && \
+ curl -sSLo forgejo-{{ sourceware_forge_forgejo_version }}-linux-${arch}.sha256 https://codeberg.org/forgejo/forgejo/releases/download/v{{ sourceware_forge_forgejo_version }}/forgejo-{{ sourceware_forge_forgejo_version }}-linux-${arch}.sha256 \
+ && \
+ sha256sum -c forgejo-{{ sourceware_forge_forgejo_version }}-linux-${arch}.sha256 \
+ && \
+ rm forgejo-{{ sourceware_forge_forgejo_version }}-linux-${arch}.sha256 \
+ && \
+ mv forgejo-{{ sourceware_forge_forgejo_version }}-linux-${arch} /usr/bin/forgejo \
+ && \
+ chmod +x /usr/bin/forgejo \
+ && \
+ DEBIAN_FRONTEND=noninteractive \
+ dpkg --purge --force-all \
+ adduser \
+ curl \
+ debian-archive-keyring \
+ debsuryorg-archive-keyring \
+ git-man \
+ libsystemd-shared \
+ sqv \
+ && \
+ DEBIAN_FRONTEND=noninteractive \
+ dpkg --purge --force-all \
+ apt \
+ ucf \
+ && \
+ DEBIAN_FRONTEND=noninteractive \
+ dpkg --purge --force-all \
+ perl-base \
+ sensible-utils \
+ sysvinit-utils \
+ ;
+
+EXPOSE {{ sourceware_forge_forgejo_ssh_listen_port }} {{ sourceware_forge_forgejo_http_listen_port }}
+
+WORKDIR {{ sourceware_forge_forgejo_root_dir }}
+#git:git
+USER {{ sourceware_forge_forgejo_created_user.uid }}:{{ sourceware_forge_forgejo_created_group.gid }}
+
+RUN \
+ forgejo embedded extract --destination {{ sourceware_forge_forgejo_root_dir }}/custom options/locale_next/locale_en-US.json \
+ && \
+ sed -i -e 's/pull request/merge request/' {{ sourceware_forge_forgejo_root_dir }}/custom/options/locale_next/locale_en-US.json \
+ && \
+ sed -i -e 's/Pull request/Merge request/' {{ sourceware_forge_forgejo_root_dir }}/custom/options/locale_next/locale_en-US.json \
+ && \
+ forgejo embedded extract --destination {{ sourceware_forge_forgejo_root_dir }}/custom options/locale/locale_en-US.ini \
+ && \
+ sed -i -e 's/pull request/merge request/' {{ sourceware_forge_forgejo_root_dir }}/custom/options/locale/locale_en-US.ini \
+ && \
+ sed -i -e 's/Pull request/Merge request/' {{ sourceware_forge_forgejo_root_dir }}/custom/options/locale/locale_en-US.ini \
+ ;
+
+CMD ["/usr/bin/forgejo", "--custom-path", "{{ sourceware_forge_forgejo_root_dir }}/custom", "-c", "{{ sourceware_forge_forgejo_root_dir }}/app.ini", "web"]
\ No newline at end of file
diff --git a/provisioning/roles/sourceware_forge_forgejo/templates/app.ini.j2 b/provisioning/roles/sourceware_forge_forgejo/templates/app.ini.j2
new file mode 100644
index 0000000..e68e680
--- /dev/null
+++ b/provisioning/roles/sourceware_forge_forgejo/templates/app.ini.j2
@@ -0,0 +1,148 @@
+;; SPDX-License-Identifier: GPL-3.0-or-later
+;; Copyright (C) 2025-2026 Arm Ltd.
+;; {{ ansible_managed }}
+
+APP_NAME = {{ sourceware_forge_forgejo_app_name }}
+APP_SLOGAN = {{ sourceware_forge_forgejo_slogan }}
+RUN_USER = {{ sourceware_forge_forgejo_user }}
+WORK_PATH = {{ sourceware_forge_forgejo_root_dir }}
+RUN_MODE = {{ sourceware_forge_forgejo_run_mode }}
+
+[ui.meta]
+AUTHOR = Sourceware
+DESCRIPTION = Core Toolchain and Developer Tools
+KEYWORDS = sourceware,git,forge,forgejo
+
+[database]
+DB_TYPE = postgres
+HOST = {{ sourceware_forge_forgejo_db_host }}
+NAME = {{ sourceware_forge_forgejo_db_name }}
+USER = {{ sourceware_forge_forgejo_db_user }}
+PASSWD_URI = file:/run/secrets/forgejo_database_password
+SSL_MODE = {{ sourceware_forge_forgejo_db_ssl_mode }}
+LOG_SQL = {{ sourceware_forge_forgejo_db_log_sql }}
+
+[server]
+DOMAIN = {{ sourceware_forge_forgejo_domain }}
+START_SSH_SERVER = true
+DISABLE_SSH = false
+SSH_DOMAIN = {{ sourceware_forge_forgejo_ssh_domain }}
+SSH_PORT = {{ sourceware_forge_forgejo_ssh_listen_port }}
+SSH_SERVER_HOST_KEYS = {{ sourceware_forge_forgejo_ssh_server_keys | map(attribute='name') | map('regex_replace', '^(.*)$', '/run/secrets/forgejo_ssh_host_key_\\1') | join(',') }}
+HTTP_PORT = {{ sourceware_forge_forgejo_http_listen_port }}
+ROOT_URL = {{ sourceware_forge_forgejo_root_url }}
+APP_DATA_PATH = {{ sourceware_forge_forgejo_app_data_path }}
+LFS_START_SERVER = {{ sourceware_forge_forgejo_lfs_start_server }}
+LFS_JWT_SECRET_URI = file:/run/secrets/forgejo_server_lfs_jwt_secret
+OFFLINE_MODE = {{ sourceware_forge_forgejo_offline_mode }}
+LANDING_PAGE = {{ sourceware_forge_forgejo_landing_page }}
+
+[repository]
+ROOT = {{ sourceware_forge_forgejo_repository_root }}
+DISABLED_REPO_UNITS = {{ sourceware_forge_forgejo_disabled_repo_units }}
+DEFAULT_REPO_UNITS = {{ sourceware_forge_forgejo_default_repo_units }}
+DEFAULT_FORK_REPO_UNITS = {{ sourceware_forge_forgejo_default_fork_repo_units }}
+DISABLE_STARS = true
+FORCE_PRIVATE = false
+DEFAULT_PRIVATE = public
+MAX_CREATION_LIMIT = 0
+SCRIPT_TYPE = bash
+
+[repository.pull-request]
+DEFAULT_MERGE_STYLE = rebase
+
+[admin]
+DISABLE_REGULAR_ORG_CREATION = {{ sourceware_forge_forgejo_disable_regular_org_creation }}
+SEND_NOTIFICATION_EMAIL_ON_NEW_USER = true
+
+[mailer]
+ENABLED = true
+PROTOCOL = smtp
+;; We can no longer use sendmail as we are confined in a container.
+SMTP_ADDR = localhost
+SMTP_PORT = 25
+FROM = {{ sourceware_forge_forgejo_mailer_from }}
+SUBJECT_PREFIX = [forge]
+SEND_AS_PLAIN_TEXT = true
+
+[service]
+REGISTER_EMAIL_CONFIRM = true
+DISABLE_REGISTRATION = false
+EMAIL_DOMAIN_ALLOWLIST = {{ sourceware_forge_forgejo_email_domain_allowlist }}
+EMAIL_DOMAIN_BLOCKLIST =
+EMAIL_DOMAIN_BLOCK_DISPOSABLE = true
+ALLOW_ONLY_INTERNAL_REGISTRATION = true
+ALLOW_ONLY_EXTERNAL_REGISTRATION = false
+ENABLE_NOTIFY_MAIL = true
+ENABLE_CAPTCHA = false
+REQUIRE_SIGNIN_VIEW = false
+DEFAULT_KEEP_EMAIL_PRIVATE = false
+DEFAULT_ALLOW_CREATE_ORGANIZATION = false
+DEFAULT_USER_IS_RESTRICTED = true
+ENABLE_TIMETRACKING = false
+DEFAULT_ENABLE_TIMETRACKING = false
+NO_REPLY_ADDRESS = noreply.localhost
+ALLOWED_USER_VISIBILITY_MODES = public
+DEFAULT_ORG_MEMBER_VISIBLE = true
+DEFAULT_ORG_VISIBILITY = public
+DEFAULT_USER_VISIBILITY = public
+SHOW_MILESTONES_DASHBOARD_PAGE = false
+
+[ssh.minimum_key_sizes]
+RSA = 2048
+
+[openid]
+ENABLE_OPENID_SIGNIN = false
+ENABLE_OPENID_SIGNUP = false
+
+[cron.update_checker]
+ENABLED = true
+
+[cron.git_gc_repos]
+ENABLED = false
+TIMEOUT = 7200
+
+[cron.archive_cleanup]
+ENABLED = true
+RUN_AT_START = true
+SCHEDULE = @every 30m
+OLDER_THAN = 2h
+
+[session]
+PROVIDER = file
+
+[log]
+MODE = console
+LEVEL = info
+ROOT_PATH = /srv/forgejo/log
+
+[security]
+INSTALL_LOCK = true
+SECRET_KEY_URI = file:/run/secrets/forgejo_security_secret_key
+INTERNAL_TOKEN_URI = file:/run/secrets/forgejo_security_token
+PASSWORD_HASH_ALGO = pbkdf2_hi
+
+[oauth2]
+ENABLED = false
+JWT_SECRET_URI = file:/run/secrets/forgejo_oauth2_jwt_secret
+
+[metrics]
+ENABLED = true
+ENABLED_ISSUE_BY_LABEL = true
+ENABLED_ISSUE_BY_REPOSITORY = true
+
+[packages]
+ENABLED = false
+
+[attachment]
+ENABLED = true
+MAX_SIZE = 16 # MB
+
+[badges]
+ENABLED = false
+
+[actions]
+ENABLED = true
+DEFAULT_ACTIONS_URL = https://data.forgejo.org
+LOG_RETENTION_DAYS = 90
+ARTIFACT_RETENTION_DAYS = 30
diff --git a/provisioning/roles/sourceware_forge_forgejo/templates/forgejo.j2 b/provisioning/roles/sourceware_forge_forgejo/templates/forgejo.j2
new file mode 100644
index 0000000..25d0532
--- /dev/null
+++ b/provisioning/roles/sourceware_forge_forgejo/templates/forgejo.j2
@@ -0,0 +1,5 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-3.0-or-later
+# Copyright (C) 2026 Arm Ltd.
+{{ ansible_managed | comment }}
+podman exec -i forgejo forgejo "$@"
diff --git a/provisioning/roles/sourceware_forge_forgejo/templates/forgejo.sh b/provisioning/roles/sourceware_forge_forgejo/templates/forgejo.sh
deleted file mode 100755
index 982b17e..0000000
--- a/provisioning/roles/sourceware_forge_forgejo/templates/forgejo.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# SPDX-License-Identifier: GPL-3.0-or-later
-# Copyright (C) 2025 Arm Ltd.
-{{ ansible_managed | comment }}
-
-sudo -u "{{ forgejo_system_user }}" /usr/bin/forgejo -w "{{ forgejo_working_dir }}" -c "{{ forgejo_config_dir }}/forgejo.ini" "$@"
diff --git a/scripts/lint b/scripts/lint
index 1a10b09..d83451e 100755
--- a/scripts/lint
+++ b/scripts/lint
@@ -18,6 +18,5 @@ command -v shellcheck >/dev/null 2>&1 || { echo >&2 "Please install shellcheck."
set -x
shellcheck scripts/*
ansible-galaxy collection install -r provisioning/requirements.yml -p downloaded-collections
-pushd "$REPODIR/provisioning" > /dev/null || exit 1
-ansible-lint -v
+ansible-lint -v provisioning
--
2.52.0
More information about the Forge
mailing list