Copy disabled (too large)
Download .txt
Showing preview only (11,704K chars total). Download the full file to get everything.
Repository: YunoHost/doc
Branch: main
Commit: 8e6fc8404d42
Files: 1752
Total size: 10.8 MB
Directory structure:
gitextract_z2uj399p/
├── .github/
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── actions/
│ │ └── docusaurus/
│ │ └── action.yml
│ └── workflows/
│ ├── auto_regen_pot.yml
│ └── build.yml
├── .gitignore
├── .markdownlint-cli2.yaml
├── README.md
├── docs/
│ ├── admin/
│ │ ├── 01.about_self_hosting.mdx
│ │ ├── 02.what_is_yunohost/
│ │ │ ├── 10.structure.mdx
│ │ │ ├── 20.demo.mdx
│ │ │ └── index.mdx
│ │ ├── 05.get_started/
│ │ │ ├── 02.why_should_you_not_host_yourself.mdx
│ │ │ ├── 05.methods.mdx
│ │ │ ├── 10.providers/
│ │ │ │ ├── 05.registrar/
│ │ │ │ │ ├── _category_.yaml
│ │ │ │ │ ├── gandi.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── namecheap.mdx
│ │ │ │ │ └── ovh/
│ │ │ │ │ ├── _category_.yaml
│ │ │ │ │ ├── autodns.mdx
│ │ │ │ │ └── manualdns.mdx
│ │ │ │ ├── 10.isp.mdx
│ │ │ │ ├── 15.vpn/
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ └── vpn_advantage.mdx
│ │ │ │ ├── 20.servers.mdx
│ │ │ │ └── _category_.yaml
│ │ │ ├── 20.install_on/
│ │ │ │ ├── _configuration.mdx
│ │ │ │ ├── _install_script.mdx
│ │ │ │ ├── arm_board.mdx
│ │ │ │ ├── index.mdx
│ │ │ │ ├── on_top_of_debian.mdx
│ │ │ │ ├── raspberry_pi.mdx
│ │ │ │ ├── regular_computer.mdx
│ │ │ │ ├── remote_server.mdx
│ │ │ │ ├── virtualbox.mdx
│ │ │ │ └── wsl.mdx
│ │ │ ├── 40.post_install/
│ │ │ │ ├── 10.find_ip.mdx
│ │ │ │ ├── 15.port_forwarding.mdx
│ │ │ │ ├── 20.dns_config.mdx
│ │ │ │ └── _category_.yaml
│ │ │ ├── 90.guidelines.mdx
│ │ │ └── _category_.yaml
│ │ ├── 12.webadmin.mdx
│ │ ├── 15.command_line.mdx
│ │ ├── 20.users/
│ │ │ ├── groups_and_permissions.mdx
│ │ │ └── index.mdx
│ │ ├── 25.domains/
│ │ │ ├── certificate.mdx
│ │ │ └── index.mdx
│ │ ├── 30.apps/
│ │ │ ├── custom_apps.mdx
│ │ │ └── index.mdx
│ │ ├── 35.email/
│ │ │ ├── 05.clients.mdx
│ │ │ ├── 10.migration.mdx
│ │ │ └── index.mdx
│ │ ├── 40.backups/
│ │ │ ├── 05.evaluate.mdx
│ │ │ ├── 10.backup_methods.mdx
│ │ │ ├── 15.clone_filesystem.mdx
│ │ │ ├── 20.avoid_hardware_failure.mdx
│ │ │ ├── 25.include_exclude_files.mdx
│ │ │ ├── 30.custom_backup_methods.mdx
│ │ │ ├── 35.migrate_or_merge_servers.mdx
│ │ │ └── index.mdx
│ │ ├── 42.security.mdx
│ │ ├── 43.upgrade/
│ │ │ ├── 11.0-bullseye.mdx
│ │ │ ├── 12.0-bookworm/
│ │ │ │ ├── 05.issues_faq.mdx
│ │ │ │ └── index.mdx
│ │ │ └── index.mdx
│ │ ├── 45.tutorials/
│ │ │ ├── 05.domains/
│ │ │ │ ├── _category_.yaml
│ │ │ │ ├── dns_dynamicip.mdx
│ │ │ │ ├── dns_local_network.mdx
│ │ │ │ ├── dns_nohost_me.mdx
│ │ │ │ └── dns_subdomains.mdx
│ │ │ ├── 10.theming.mdx
│ │ │ ├── 15.filezilla.mdx
│ │ │ ├── 25.external_storage.mdx
│ │ │ ├── 35.email_configure_relay.mdx
│ │ │ ├── 55.moving_app_folder.mdx
│ │ │ ├── 65.sftp_on_apps.mdx
│ │ │ ├── 90.freebox_storage.mdx
│ │ │ └── _category_.yaml
│ │ ├── 50.troubleshooting/
│ │ │ ├── 03.cleanup.mdx
│ │ │ ├── 05.fail2ban.mdx
│ │ │ ├── 10.change_root_password.mdx
│ │ │ ├── 15.noaccess.mdx
│ │ │ ├── 20.ipv6.mdx
│ │ │ ├── 25.blacklist_forms.mdx
│ │ │ └── index.mdx
│ │ ├── 80.advanced/
│ │ │ ├── 40.torhiddenservice.mdx
│ │ │ ├── 45.certificate_custom.mdx
│ │ │ ├── 70.chatons.mdx
│ │ │ └── _category_.yaml
│ │ ├── _category_.yaml
│ │ └── index.mdx
│ ├── community/
│ │ ├── 05.faq.mdx
│ │ ├── 10.help.mdx
│ │ ├── 15.forum.mdx
│ │ ├── 20.chat_rooms.mdx
│ │ ├── 25.yunohost_project_organization.mdx
│ │ ├── 30.project_budget.mdx
│ │ ├── 35.security_team.mdx
│ │ ├── 40.press_kit.mdx
│ │ ├── 40.sponsors_partners.mdx
│ │ ├── 90.terms_of_services.mdx
│ │ └── index.mdx
│ └── dev/
│ ├── 05.git.mdx
│ ├── 10.doc.mdx
│ ├── 20.translation.mdx
│ ├── 50.packaging/
│ │ ├── 05.structure.mdx
│ │ ├── 10.manifest.mdx
│ │ ├── 15.resources.mdx
│ │ ├── 20.scripts/
│ │ │ ├── 20.helpers_v2.0.mdx
│ │ │ ├── 20.helpers_v2.1.mdx
│ │ │ ├── _category_.yaml
│ │ │ └── index.mdx
│ │ ├── 30.doc.mdx
│ │ ├── 40.test.mdx
│ │ ├── 50.publish.mdx
│ │ ├── 60.advanced/
│ │ │ ├── 20.config_panels.mdx
│ │ │ ├── 30.sso_ldap_integration.mdx
│ │ │ ├── 50.hooks.mdx
│ │ │ ├── 60.advanced_packagers.mdx
│ │ │ ├── 70.packaging_v2.mdx
│ │ │ └── _category_.yaml
│ │ ├── 80.misc/
│ │ │ ├── _category_.yaml
│ │ │ ├── packaging_apps_git.mdx
│ │ │ ├── packaging_apps_virtualbox.mdx
│ │ │ └── shell_variables_scope.mdx
│ │ ├── 90.policy.mdx
│ │ └── index.mdx
│ ├── 80.core/
│ │ ├── 05.architecture.mdx
│ │ ├── 10.devenv.mdx
│ │ ├── 20.ynh_core.mdx
│ │ ├── 25.ynh_admin.mdx
│ │ ├── forms.mdx
│ │ ├── index.mdx
│ │ └── maindomain.mdx
│ └── index.mdx
├── docusaurus.config.ts
├── footer.ts
├── i18n/
│ ├── de/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ └── 05.faq.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── docs/
│ │ └── admin/
│ │ ├── 01.about_self_hosting/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 02.what_is_yunohost__10.structure/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 02.what_is_yunohost__20.demo/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 02.what_is_yunohost__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__02.why_should_you_not_host_yourself/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__05.methods/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__gandi/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__namecheap/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__ovh__autodns/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__ovh__manualdns/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__10.isp/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__15.vpn__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__15.vpn__vpn_advantage/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__20.servers/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on___configuration/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on___install_script/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__arm_board/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__on_top_of_debian/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__raspberry_pi/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__regular_computer/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__remote_server/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__virtualbox/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__wsl/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__40.post_install__10.find_ip/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__40.post_install__15.port_forwarding/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__40.post_install__20.dns_config/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__90.guidelines/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 12.webadmin/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 15.command_line/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 20.users__groups_and_permissions/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 20.users__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 25.domains__certificate/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 25.domains__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 30.apps__custom_apps/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 30.apps__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 35.email__05.clients/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 35.email__10.migration/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 35.email__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__05.evaluate/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__10.backup_methods/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__15.clone_filesystem/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__20.avoid_hardware_failure/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__25.include_exclude_files/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__30.custom_backup_methods/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__35.migrate_or_merge_servers/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 42.security/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 42security/
│ │ │ ├── fr.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43.upgrade__11.0-bullseye/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43.upgrade__12.0-bookworm__05.issues_faq/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43.upgrade__12.0-bookworm__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43.upgrade__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43upgrade__110-bullseye/
│ │ │ ├── es.stats.json
│ │ │ ├── fr.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43upgrade__120-bookworm__05issues_faq/
│ │ │ ├── fr.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43upgrade__120-bookworm__index/
│ │ │ ├── es.stats.json
│ │ │ ├── fr.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43upgrade__index/
│ │ │ ├── es.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 45.tutorials__05.domains__dns_dynamicip/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__05.domains__dns_local_network/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__05.domains__dns_nohost_me/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__05.domains__dns_subdomains/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__10.theming/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__15.filezilla/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__25.external_storage/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__35.email_configure_relay/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__55.moving_app_folder/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__65.sftp_on_apps/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__90.freebox_storage/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__03.cleanup/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__05.fail2ban/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__10.change_root_password/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__15.noaccess/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__20.ipv6/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__25.blacklist_forms/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__11.0-bullseye/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__12.0-bookworm__05.issues_faq/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__12.0-bookworm__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80.advanced__40.torhiddenservice/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80.advanced__45.certificate_custom/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80.advanced__70.chatons/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80advanced__40torhiddenservice/
│ │ │ ├── fr.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 80advanced__45certificate_custom/
│ │ │ ├── es.stats.json
│ │ │ ├── fr.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 80advanced__70chatons/
│ │ │ ├── gl.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ └── index/
│ │ ├── ar.po
│ │ ├── ca.po
│ │ ├── de.po
│ │ ├── en.pot
│ │ ├── es.po
│ │ ├── eu.po
│ │ ├── fr.po
│ │ ├── gl.po
│ │ ├── id.po
│ │ ├── it.po
│ │ ├── kab.po
│ │ ├── nn.po
│ │ ├── pl.po
│ │ ├── pt_BR.po
│ │ ├── ru.po
│ │ ├── tr.po
│ │ ├── uk.po
│ │ ├── uz.po
│ │ └── zh_Hans.po
│ ├── en/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── es/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ └── 20.chat_rooms.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── fr/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ ├── 05.faq.mdx
│ │ │ │ ├── 10.help.mdx
│ │ │ │ ├── 20.chat_rooms.mdx
│ │ │ │ ├── 30.project_budget.mdx
│ │ │ │ ├── 35.security_team.mdx
│ │ │ │ ├── 40.sponsors_partners.mdx
│ │ │ │ └── 90.terms_of_services.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── it/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ ├── 05.faq.mdx
│ │ │ │ └── 20.chat_rooms.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ └── ru/
│ ├── code.json
│ ├── docusaurus-plugin-content-blog/
│ │ └── options.json
│ ├── docusaurus-plugin-content-docs/
│ │ └── current.json
│ └── docusaurus-theme-classic/
│ ├── footer.json
│ └── navbar.json
├── package.json
├── redirects.ts
├── scripts/
│ ├── check_missing_or_bad_image_path.sh
│ ├── dead_links.py
│ ├── forms_doc_generate.py
│ ├── forms_doc_template.md.j2
│ ├── generate_docs.sh
│ ├── helpers_doc_generate.py
│ ├── helpers_doc_template.md.j2
│ ├── patch_enabled_locales.sh
│ ├── po4a.py
│ ├── resources_doc_generate.py
│ ├── resources_doc_template.md.j2
│ └── update_ui_translations.sh
├── sidebars.ts
├── src/
│ ├── YunoHostImagesListScript.js
│ ├── components/
│ │ ├── Button.tsx
│ │ ├── Column.tsx
│ │ ├── Columns.tsx
│ │ ├── Figures.tsx
│ │ ├── HardRedirects.tsx
│ │ ├── Highlight.tsx
│ │ ├── SidebarDocCardList.tsx
│ │ ├── SmallInline.tsx
│ │ ├── YunoHostDocsCard.module.css
│ │ ├── YunoHostDocsCard.tsx
│ │ └── YunoHostImagesList.tsx
│ ├── css/
│ │ └── custom.css
│ ├── pages/
│ │ ├── index.module.css
│ │ └── index.tsx
│ └── theme/
│ ├── DocCard/
│ │ ├── index.tsx
│ │ └── styles.module.css
│ └── MDXComponents.tsx
└── static/
├── img/
│ ├── ecosystem.odg
│ ├── ecosystem_fr.odg
│ ├── internet_topologies_fr_src.odg
│ ├── internet_topologies_src.odg
│ ├── internet_topologies_with_ynh_fr_src.odg
│ ├── internet_topologies_with_ynh_src.odg
│ ├── portForwarding_src_en.odg
│ └── portForwarding_src_fr.odg
└── js/
└── language-detect.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Problem
- *Description of why you made this PR, what is its purpose*
## Solution
- *And how do you relevantly fix that problem*
## PR checklist
- [ ] PR finished and ready to be reviewed
================================================
FILE: .github/actions/docusaurus/action.yml
================================================
name: Check and build Docusaurus doc
inputs:
base_url:
description: Base URL to pass to Docusaurus
required: true
default: /
runs:
using: "composite"
steps:
- name: Set up Python
uses: actions/setup-python@v5
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Installation
shell: bash
run: npm ci
- name: Install perl dependencies (for po4a)
shell: bash
run: sudo apt install gettext libyaml-tiny-perl libsyntax-keyword-try-perl libpod-parser-perl libsgmls-perl opensp perl liblocale-gettext-perl libterm-readkey-perl libtext-wrapi18n-perl libunicode-linebreak-perl -y
- name: Check image paths consistency
shell: bash
run: bash scripts/check_missing_or_bad_image_path.sh
- name: Tweak enabled locales according to Weblate statistics (keep langs with >= 5% translated)
shell: bash
run: bash scripts/patch_enabled_locales.sh
- name: Regen UI translations
shell: bash
run: bash scripts/update_ui_translations.sh
- name: Build translated .mdx using the .po from po4a/weblate
shell: bash
run: python3 ./scripts/po4a.py build_translated_mdx
- name: Build docs
env:
BASE_URL: "${{ inputs.base_url }}"
shell: bash
run: |
echo "Using baseUrl=$BASE_URL"
npm run build
================================================
FILE: .github/workflows/auto_regen_pot.yml
================================================
name: Auto-regen the .pot used as source for translations (po4a/Weblate)
on:
push:
branches: [ "main" ]
jobs:
auto_regen_pot:
runs-on: ubuntu-latest
permissions:
# Give the default GITHUB_TOKEN write permission to commit and push the changed files back to the repository.
contents: write
steps:
- uses: actions/checkout@v4
- name: Install perl dependencies (for po4a)
shell: bash
run: sudo apt install gettext libyaml-tiny-perl libsyntax-keyword-try-perl libpod-parser-perl libsgmls-perl opensp perl liblocale-gettext-perl libterm-readkey-perl libtext-wrapi18n-perl libunicode-linebreak-perl -y
- name: Check image paths consistency
shell: bash
run: bash scripts/check_missing_or_bad_image_path.sh
- name: Build translated .mdx using the .po from po4a/weblate
shell: bash
run: python3 ./scripts/po4a.py regen_pot
- uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "🌐 ${{ github.workflow }}"
================================================
FILE: .github/workflows/build.yml
================================================
name: Build Docusaurus doc
on:
push:
branches:
- main
- next
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
build:
name: Build Docs
timeout-minutes: 30
runs-on: ubuntu-latest
env:
# This variable allow to build for either doc.yunohost.org or nextdoc.yunohost.org
BUILD_FOR: ${{ github.ref == 'refs/heads/main' && 'main' || 'next' }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Check and build doc
uses: ./.github/actions/docusaurus
- name: Archive the docs
uses: actions/upload-artifact@v4
with:
name: docs
path: build/
deploy:
name: Deploy the new doc
needs: build
runs-on: ubuntu-latest
if: ${{github.event_name == 'push' && ( github.ref == 'refs/heads/main' || github.ref == 'refs/heads/next' ) }}
env:
APP: ${{ github.ref == 'refs/heads/main' && 'my_webapp' || 'my_webapp__4' }}
steps:
- name: Download the built docs artifact
uses: actions/download-artifact@v4
with:
name: docs
path: docs
- name: Install tools
run: |
sudo apt install sshpass rsync
- name: Deploy
run: sshpass -p ${{ secrets.DOC_SFTP_PWD }}
rsync -avz --delete
-e "ssh -o StrictHostKeyChecking=no"
docs/ ${APP}@apicius.yunohost.org:~/www/
================================================
FILE: .gitignore
================================================
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Virtualenv for tools
/.venv
/venv
.po4a
i18n/*/docusaurus-plugin-content-docs/current/admin/
================================================
FILE: .markdownlint-cli2.yaml
================================================
ignores:
# This page contains markdown issues on purpose
- pages/06.contribute/05.write_documentation/02.markdown_guide/doc_markdown_guide*
# Those pages are auto-generated, issues found there should be fixed upstream
- pages/06.contribute/10.packaging_apps/10.manifest/10.appresources/packaging_app_manifest_resources.md
- pages/06.contribute/10.packaging_apps/20.scripts/10.helpers/packaging_app_scripts_helpers.md
- pages/06.contribute/10.packaging_apps/20.scripts/12.helpers21/packaging_app_scripts_helpers_v21.md
- pages/06.contribute/10.packaging_apps/80.resources/15.appresources/packaging_apps_resources.md
- pages/06.contribute/15.dev/03.forms/forms.md
config:
default: true
# FIXME: should be removed when actually fixed
no-alt-text: false
# Title pages have first-level headings duplicated with the markdown header
single-title: false
# Github and grav don't have the same heading link fragment algorithm, headings with `'` are broken
link-fragments: false
code-block-style:
style: fenced
code-fence-style:
style: backtick
emphasis-style:
style: asterisk
strong-style:
style: asterisk
ul-style:
style: dash
ul-indent:
indent: 2
heading-style:
style: atx
no-duplicate-heading:
siblings_only: true
hr-style:
style: ---
ol-indent:
indent: 2
ol-prefix:
style: ordered
no-trailing-punctuation:
punctuation: ".,;:"
no-inline-html: false
MD040:
allowed_languages:
- bash
- html
- css
- javascript
- php
- json
- yaml
- toml
- markdown
- text
- nginx
language_only: true
proper-names:
code_blocks: false
html_elements: false
names:
- YunoHost
- GitHub
line-length: false
no-reversed-links: false
no-missing-space-atx: false
first-line-heading: false
================================================
FILE: README.md
================================================
# YunoHost Documentation
This repository contains the code for [the YunoHost documentation](https://doc.yunohost.org). It is built using [Docusaurus 3](https://docusaurus.io), a modern static website generator.
Issues are to be reported on [the YunoHost bugtracker](https://github.com/YunoHost/issues/issues).
App-specific documentation doesn't happen here but in the package/app repositories themselves. More info in [the dedicated page](https://doc.yunohost.org/packaging/doc/).
Checkout **<https://doc.yunohost.org/dev/doc/>** for more info on how to work on documentation, and **<https://doc.yunohost.org/dev/translation>** for more info on how to work on translation.
# Building / previewing the doc locally
Checkout instructions on <https://doc.yunohost.org/dev/doc/> or [this file in this repo](docs/dev/10.doc.mdx)
================================================
FILE: docs/admin/01.about_self_hosting.mdx
================================================
---
title: About self-hosting
hide_table_of_contents: true
---
Self-hosting means owning and administrating your own server, typically at home, to host your **personal data and services** yourself instead of relying exclusively on third parties. For instance, you can self-host your blog, such that it 'lives' on a machine that you have control of, instead of having it on somebody else's computer (a.k.a. FAANG or The Cloud) in exchange for money, advertisements, or private data.
Self-hosting implies owning a server. **A server is a computer that is typically accessible on the network 24/7**, and usually does not have a screen or keyboard (it is instead controlled remotely). Contrary to a popular belief, a server is not necessarily a huge and extra-powerful machine: nowadays, a small, ~$30 ARM board is adequate for self-hosting.

Self-hosting is not about making "your Internet" more secure and does not provide anonymity by itself. Instead, it is about being autonomous and in control of your services and data — which also means being responsible for them.
================================================
FILE: docs/admin/02.what_is_yunohost/10.structure.mdx
================================================
---
title: Structure of a YunoHost server
hide_table_of_contents: true
---
This page provide an overview of the ecosystem of a YunoHost server. While this overview contains several approximations, the purpose here is to introduce the global picture before digging into the different aspects.

Everything starts with the special user **admin**. This is the administrator of the machine who can install, configure and manage things on the server through the web administration interface, or via SSH and the command line interface. *(If you are already familiar with GNU/Linux, it is quite similar to root. YunoHost has this additional 'admin' user for several technical reasons.)*
The administrator can create users and install applications, among other admin actions. Users automatically have their own email address when they get created. Users will also be able to connect to the user portal (SSO) to access applications. Some applications can typically be installed either as publicly-accessible, or as private, i.e. only some users will have access to it depending on which groups they are member of.
Applications and their features of the server rely on different services to work properly. Services (sometimes also called daemons) are programs that are constantly running on the server to ensure various tasks are done, such as answering to web requests from web browsers, or relaying emails.
================================================
FILE: docs/admin/02.what_is_yunohost/20.demo.mdx
================================================
---
title: Try YunoHost
description: A demo server
routes:
default: '/try'
hide_table_of_contents: true
---
import {YunoHostDocsCard, YunoHostDocsCardHeading} from '@site/src/components/YunoHostDocsCard';
# Try YunoHost on a demo server
:::caution
This demo server is reset *every 30 minutes* and could be down from time to time, but at least you can test and that's really cool :)
:::
<div style={{display: "flex"}} >
<YunoHostDocsCard>
<YunoHostDocsCardHeading url="https://demo.yunohost.org/" color="#30ae40">
<span><FAIcon icon='fa-user' /> User interface</span>
</YunoHostDocsCardHeading>
https://demo.yunohost.org
username: `demo`
password: `demo`
</YunoHostDocsCard>
<YunoHostDocsCard>
<YunoHostDocsCardHeading url="https://demo.yunohost.org/yunohost/admin/" color="#1267da">
<span><FAIcon icon='fa-cog'/> Administration interface</span>
</YunoHostDocsCardHeading>
https://demo.yunohost.org/yunohost/admin/
username: `demo`
password: `demo`
</YunoHostDocsCard>
</div>
:::info
**Demo server gracefully provided by [Gitoyen](https://www.gitoyen.net?target=_blank) <FAIcon icon="fa-heart" style={{color: "green"}}/>**
:::
================================================
FILE: docs/admin/02.what_is_yunohost/index.mdx
================================================
---
title: What is YunoHost?
hide_table_of_contents: true
---
<img src={require('/img/icons/logo-ynh_horizontal.png').default} alt="YunoHost logo" id="ynhlogo" style={{display: "block", textAlign: "center", margin: "auto", maxWidth: "300px", marginBottom: "1.5em"}}/>
YunoHost is an **operating system** aiming to **simplify server administration** and therefore democratize [self-hosting](/admin/about_self_hosting) while making sure it stays reliable, secure, ethical and lightweight. It is a copylefted libre software project maintained by volunteers. Technically, it can be seen as a server distribution based on [Debian GNU/Linux](https://debian.org).
YunoHost can be installed on [many kinds of hardware](/admin/get_started/install_on), either at home or on a remote server (VPS).

## Features
- <SmallInline url='/img/icons/logo-debian.png' alt="Debian logo"/> Based on Debian, for a trustworthy & familiar base;
- <SmallInline url='/img/icons/icon-tools.png' /> Administer your server through a **friendly web interface** as well as a handy CLI;
- <SmallInline url='/img/icons/icon-package.png' /> Deploy **apps in just a few clicks** from [our more than 500 apps catalog](https://apps.yunohost.org)!;
- <SmallInline url='/img/icons/icon-users.png' /> Manage **users** <small>(based on LDAP)</small>;
- <SmallInline url='/img/icons/icon-globe.png' /> Manage **domain names**;
- <SmallInline url='/img/icons/icon-medic.png' /> Create and restore **backups**;
- <SmallInline url='/img/icons/icon-door.png' /> Connect to all apps simultaneously through the **user portal** <small>(NGINX, SSOwat)</small>;
- <SmallInline url='/img/icons/icon-mail.png' /> Includes a **full e-mail stack** <small>(Postfix, Dovecot, OpenDKIM, PostSRSd)</small>;
- <SmallInline url='/img/icons/icon-lock.png' /> Manages **SSL certificates** <small>(based on Let's Encrypt)</small>;
- <SmallInline url='/img/icons/icon-shield.png' />... and **security systems** <small>(`fail2ban`, firewall using `nftables`)</small>.
## Origin
YunoHost was created in February 2012 after something like this:
> "Shit, I'm too lazy to reconfigure my mail server... Beudbeud, how were you able to get your little server running with LDAP?"
> <small>*Kload, February 2012*</small>
All that was needed was an admin interface for Beudbeud's server to make something usable, so Kload decided to develop one. Finally, after automating several configs and packaging in some web apps, YunoHost v1 was finished.
Noting the growing enthusiasm around YunoHost and around self-hosting in general, the original developers, along with new contributors, decided to start work on version 2, a more extensible, more powerful, more easy-to-use, and, at that, one that makes a nice cup of fair-trade coffee for the elves of Lapland.
The name **YunoHost** comes from the jargon "[Y U NO](https://knowyourmeme.com/memes/y-u-no-guy) Host". The [Internet meme](https://en.wikipedia.org/wiki/Internet_meme) should illustrate it:
<center>

</center>
## What YunoHost is not?
**YunoHost is *not* an enterprise or a for-profit entity.** It is developed and maintained by volunteers. We do not sell services, we do not host or control your data or services in any way, and we have no intention or interest in monetizing anything. We also do not offer any formal guarantees. Our goal is simply to develop and maintain YunoHost in the hope that it contributes to a more decentralized internet and empowers people to reclaim autonomy over their digital services and technology. That said, we do our best to provide community support, and commercial support may be available through third parties if needed.
**YunoHost as a project is *not* apolitical.** By its very nature, YunoHost promotes a decentralized internet and technologies that empower people. We reject the flawed notion that technology is inherently neutral, or that software projects should remain neutral. Many contributors to the project remain vigilant about the social and political implications of technological developments, and emphasize the importance of solidarity and alignment with broader movements such as feminism, LGBTQIA+ rights and visibility, environmental justice, and social justice. We stand firmly against fascism, sexism, racism, xenophobia, [bigotry](https://simple.wikipedia.org/wiki/Bigotry), ableism, imperialism, extractivism, [eugenics](https://en.wikipedia.org/wiki/Eugenics), and right-wing libertarianism. If you are not aligned with these values, you are encouraged to *not* use YunoHost and look for a different system.
**YunoHost is *not* designed to "scale" in the traditional sense.** It is intended for a relatively modest number of user accounts and simultaneous users. While there is no strict limit—since performance depends heavily on your specific setup — we estimate that some technical adjustments may be necessary when reaching 250~500 user accounts, or about 50 simultaneous users on resource-intensive apps. That said, YunoHost can comfortably handle hosting a website or several lightweight services, even with thousands of daily visitors.
**YunoHost is primarily designed for people who want things to "just work".** Of course, it’s not perfect — we're constantly working to improve the user experience, robustness, and simplicity. Though YunoHost is "tinkerable", the first target public is *not* power users with complex or highly customized use cases in mind. We encourage you to keep your setup as simple as possible. That said, you are more than welcome to experiment and share your feedback with us!
**YunoHost is *not* designed to be a *heavy* multi-tenant solution** for providing services to completely separate organizations across different domains. While you *can* manage multiple domains and subdomains — such as hosting apps for friends, colleagues, and an association — you should keep in mind that there is no strict isolation between apps. Under the hood, all applications share the same system and environment.
(Note for power users) **YunoHost does not use "hard" containerization technologies** such as Docker, for its apps. This is partly for historical reasons and partly to keep the system lightweight — both in terms of resource usage and technical complexity. That said, we do take security seriously: applications run under dedicated user accounts with limited privileges and capabilities, and we're continuously working to enhance the system’s security.
## Artworks
Black and white YunoHost by ToZz. Licence: CC-BY-SA 4.0. Logos and other artwork are available in [the Artworks repository](https://github.com/YunoHost/yunohost-artwork).
<img src="https://raw.githubusercontent.com/YunoHost/yunohost-artwork/refs/heads/main/logos/png/yunohost-logo_black.png" width="220" id="darklogo"/>
<img src="https://raw.githubusercontent.com/YunoHost/yunohost-artwork/refs/heads/main/logos/png/yunohost-logo_white.png" width="220" id="whitelogo"/>
================================================
FILE: docs/admin/05.get_started/02.why_should_you_not_host_yourself.mdx
================================================
---
title: Why should you (not?) host yourself?
hide_table_of_contents: true
description: " "
hide_title: true
---
## Why should you host yourself?
- **You believe in a free, open and decentralized internet.** In a centralized internet, private companies and government can spy, analyze and influence people by dictating how they connect with each other, and by filtering content. YunoHost is developed by a community who believe in an open and decentralized internet, and we hope that you do, too!
- **You want to have control of your data and services.** Your pictures, chat messages, browsing history, and that text you are writing for school, have nothing to do on somebody else's server (a.k.a. The Cloud). They are part of your private life, but also part of your family's life, your friend's life, and so on. These data should be managed by *you*, not a random company in the US who wants your data to analyze them and sell the results.
- **You want to learn about how computers and the Internet work.** Operating your own server is a pretty good context to understand the basic mechanisms at the heart of operating systems and the Internet. You might have to deal with command line interface, network architecture, DNS configuration, SSH, and so on.
- **You want to explore new possibilities and customize things.** Ever dreamed of running a Minecraft server for you friends, or a persistent IRC or XMPP client? With your very own server, you can manually install and run virtually any program you want, and customize every bit.
## Why should you *not* host yourself?
- **Self-hosting requires some work and patience.** Hosting yourself is a bit like growing your own garden or vegetables: it requires work and patience. While YunoHost aims to do all the hard work for you, self-hosting still requires that you take time to learn and configure a few things to setup your server properly. You will also need to perform maintenance tasks (such as upgrades) from time to time, or to ask for support if some things break.
- **With great servers comes great responsibilities.** Operating a server means that you are responsible for the data you are hosting. Nobody will be able to recover them for you if they get lost. YunoHost provides backup features, which you should use regularly to backup the configurations and data you care about. You should also keep an eye on security news and recommendations so that your server or critical data don't get compromised.
- **Quality and performance probably won't be as good as premium services.** YunoHost (and most of the applications packaged for it) are free and open-source software, developed by communities of people in their free time and on the basis of best effort. There is no absolute guarantee that software will work in every possible circumstance. The performance of your self-hosted server is also related to its CPU and RAM, and to the available internet connectivity.
================================================
FILE: docs/admin/05.get_started/05.methods.mdx
================================================
---
title: Choose your self-hosting mode
hide_table_of_contents: true
---
You can host yourself at home (on a small computer), or on a remote server. Each solution has its pros and cons:
## At home, for instance on an ARM board or an old computer
You can host yourself at home with an ARM board or a re-purposed regular computer, connected to your home router/box.
- **Pros**: you will have physical control of the machine and only need to buy the hardware;
- **Cons**: you will have to [manually configure your internet box](/admin/get_started/post_install/port_forwarding) and [might be limited by your ISP](/admin/get_started/providers/isp/).
## At home, behind a VPN
A VPN is an encrypted tunnel between two machines. In practice, it makes it "as if" you were directly, locally, connected to your server machine, but actually from somewhere else on the Internet. This allows you to still host yourself at home, while bypassing possible limitations of your ISP. See also [the Internet Cube project](https://internetcu.be/) and [the FFDN](https://www.ffdn.org/).
- **Pros**: you will have physical control of the machine, and the VPN hides your traffic from your ISP and allows you to bypass its limitations;
- **Cons**: you will have to pay a monthly subscription for the VPN.
## On a remote server (VPS or dedicated server)
You can rent a virtual private server or a dedicated machine from [associative](https://db.ffdn.org/) or [commercial](/admin/get_started/providers/servers) "Cloud" providers.
- **Pros**: your server and its internet connectivity will be fast;
- **Cons**: you will have to pay a monthly subscription and won't have physical control of your server.
## Summary
export const styleNone = {
textAlign: 'center',
};
export const styleGood = {
textAlign: 'center',
backgroundColor: 'green',
color: 'white',
};
export const styleMeh = {
textAlign: 'center',
backgroundColor: 'darkgoldenrod',
color: 'white',
};
export const styleDanger = {
textAlign: 'center',
backgroundColor: 'brown',
color: 'white',
};
<table>
<thead>
<tr>
<th></th>
<th style={styleNone}>At home<br/><small>(e.g. ARM board, old computer)</small></th>
<th style={styleNone}>At home<br/>behind a VPN</th>
<th style={styleNone}>On a remote server<br/>(VPS or dedicated)</th>
</tr>
</thead>
<tbody>
<tr>
<td style={styleNone}>Hardware cost</td>
<td style={styleMeh} colspan="2">About 50€<br/><small>(e.g. a Raspberry Pi)</small></td>
<td style={styleGood}>None</td>
</tr>
<tr>
<td style={styleNone}>Monthly cost</td>
<td style={styleGood}>Negligible<br/><small>(electricity)</small></td>
<td style={styleMeh}>Around 5€<br/><small>(VPN)</small></td>
<td style={styleMeh}>Starting at ~3€<br/><small>(VPS)</small></td>
</tr>
<tr>
<td style={styleNone}>Physical control of the machine</td>
<td style={styleGood}>Yes</td>
<td style={styleGood}>Yes</td>
<td style={styleDanger}>No</td>
</tr>
<tr>
<td style={styleNone}>Manual port routing required</td>
<td style={styleMeh}>Yes</td>
<td style={styleGood}>No</td>
<td style={styleGood}>No</td>
</tr>
<tr>
<td style={styleNone}>Possible ISP limitations</td>
<td style={styleDanger}>Yes<br/><small>(see <Link to="/admin/get_started/providers/isp">here</Link>)</small></td>
<td style={styleGood}>Bypassed by VPN</td>
<td style={styleGood}>Typically no</td>
</tr>
<tr>
<td style={styleNone}>Internet connectivity</td>
<td style={styleMeh} colspan="2">Depends on home connectivity</td>
<td style={styleGood}>Typically pretty good</td>
</tr>
</tbody>
</table>
================================================
FILE: docs/admin/05.get_started/10.providers/05.registrar/_category_.yaml
================================================
================================================
FILE: docs/admin/05.get_started/10.providers/05.registrar/gandi.mdx
================================================
---
sidebar_label: Gandi
title: Obtaining an API key from Gandi
---
This page is meant to guide you in obtaining an API key from Gandi in order to configure YunoHost's automatic DNS configuration mecanism
:::caution
**DO NOT share your API tokens with anybody!** A malicious attacker obtaining your tokens could take over your domain, and possibly your server!
:::
1. Go to [https://account.gandi.net/](https://account.gandi.net/)
2. You should land on this page. Then click on 'Security'

3. In the next page, click on '(re)Generate the API key'.

================================================
FILE: docs/admin/05.get_started/10.providers/05.registrar/index.mdx
================================================
---
title: Registrars
---
Since version 4.3, YunoHost includes a mechanism to interface your server with your DNS registrar API, with the purpose of simplifying and automatizing DNS records registration and maintenance.
The procedure requires an initial configuration where you need to generate an API key on your registrar's interface.
Not all registrars are supported. So far, the community tested and validated the interface with [Gandi](https://gandi.net) and [OVH](https://ovh.com), which are recommended. The interface with other registrars may work, but is still considered experimental until we gather feedback from the community.
The list below can help you to choose a registrar if you plan to buy a domain name to use it with YunoHost.
| Registrar | Compatibility | Easy to obtain an API key | Howto |
|-------------------------------------|-----------------------------|---------------------------|-------|
| [Gandi](https://www.gandi.net) | ✘ (broken) | ✘ | [Obtain an API key](/admin/get_started/providers/registrar/gandi) <br/> [See bug here](https://github.com/YunoHost/issues/issues/2419) |
| [OVH](https://ovh.com/domaines) | ✔ (tested) | ✘ | [Obtain an API key](/admin/get_started/providers/registrar/ovh/autodns) <br/> [Configure manually](/admin/get_started/providers/registrar/ovh/manualdns) |
| [Namecheap](https://namecheap.com) | ✘ (in lexicon but untested) | ✘✘✘ API not available without 50$ on the account | [Obtain an API key](/admin/get_started/providers/registrar/namecheap) |
================================================
FILE: docs/admin/05.get_started/10.providers/05.registrar/namecheap.mdx
================================================
---
sidebar_label: Namecheap
title: Obtaining an API key from Namecheap
---
See the [API Documentation](https://www.namecheap.com/support/api/intro/) for reference.
1. Login to your Namecheap account.
2. Go to the Profile > Tools menu.
3. Scroll down to the Business & Dev Tools section. Click on MANAGE next to Namecheap API Access.
4. Toggle ON/OFF, read our Terms of Service, enter your account password.
5. After enabling API access, you will be allotted an APIKey. Your Namecheap account username will act as API username. Your access to the API is authenticated using these elements.
================================================
FILE: docs/admin/05.get_started/10.providers/05.registrar/ovh/_category_.yaml
================================================
label: "OVH"
================================================
FILE: docs/admin/05.get_started/10.providers/05.registrar/ovh/autodns.mdx
================================================
---
sidebar_label: OVH DNS config via API
title: Obtaining an API key from OVH
---
This page is meant to guide you in obtaining an API key from OVH in order to configure YunoHost's automatic DNS configuration mecanism
:::caution
**DO NOT share your API tokens with anybody!** A malicious attacker obtaining your tokens could take over your domain, and possibly your server!
:::
1. Go to [the OVH token request page](https://eu.api.ovh.com/createToken/)
2. Fill the form with the required information as shown below:
- Account ID or email address: This is your usual OVH login
- Password: This is your usual OVH password
- Script Name: for example `YunoHost Auto DNS`
- Script description: for example `YunoHost Auto DNS`
- Validity: `Unlimited`
- Rights: use the `+` button to add the following lines
- `GET` : `/domain/zone/*`
- `POST` : `/domain/zone/*`
- `PUT` : `/domain/zone/*`
- `DELETE` : `/domain/zone/*`

3. You will obtain three tokens (an application key, a secret application key, and a consumer key) which should be used in YunoHost's configuration
================================================
FILE: docs/admin/05.get_started/10.providers/05.registrar/ovh/manualdns.mdx
================================================
---
sidebar_label: OVH manual DNS config
title: DNS Configuration with OVH
---
Let's see how to properly set the DNS redirections with [OVH](http://www.ovh.com).
Once you bought your domain name, got to the Web Control Panel, and click on you domain name on the left side:

Click on the **DNS Zone** tab, then on **Add an entry**:

Now you need to add the DNS redirections as specified by the [standard DNS zone configuration](/admin/get_started/post_install/dns_config)
Click on "Change in text format", keep the first four lines:
```text
$TTL 3600
@ IN SOA dns104.ovh.net. tech.ovh.net. (2020083101 86400 3600 3600000 60)
IN NS dns104.ovh.net.
IN NS ns104.ovh.net.
```
then erase everything below, and replace it with the configuration generated by YunoHost as explained in [this page](/admin/get_started/post_install/dns_config).
### Dynamic IP
[General tutorial on dynamic IP](/admin/tutorials/domains/dns_dynamicip).
You should follow this part if you have a dynamic IP.
Find out if your ISP provides you with a dynamic IP address [here](/admin/get_started/providers/isp/).
Let's create a DynHost id.
Follow [this tutorial](http://blog.developpez.com/brutus/p6316/ubuntu/configurer_dynhost_ovh_avec_ddclient) to install ddclient.
ddclient will take care of telling OVH that the IP has changed. Then OVH will update the IP.
You need to add in the configuration file:
- your login and password DynHost
- your domain name
You should also check out [OVH's guide on DynHost](https://www.ovh.co.uk/g2024.hosting_dynhost).
================================================
FILE: docs/admin/05.get_started/10.providers/10.isp.mdx
================================================
---
title: Internet service providers
hide_table_of_contents: true
description: " "
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<Tabs
defaultValue="europe"
values={[
{label: 'Africa', value: 'africa'},
{label: 'Asia', value: 'asia'},
{label: 'Europe', value: 'europe'},
{label: 'North America', value: 'northamerica'},
{label: 'South America', value: 'southamerica'},
{label: 'Oceania', value: 'oceania'},
]}>
<TabItem value="africa">
<Tabs>
<TabItem value="ivory" label="Côte d'Ivoire" default>
| Fournisseur d’accès | Box/modem/routeur | [Port 25 ouvrable](/admin/email)| [Hairpinning](http://fr.wikipedia.org/wiki/Hairpinning) | [Reverse DNS](https://en.wikipedia.org/wiki/Reverse_DNS_lookup) | Fixed IP |
| :--------: | :------: | :---: | :-----: | :-----: | :-----: |
| **Orange** | Livebox2 | non | **non** | **non** | **non** |
| **Moov** | | | | | |
| **MTN** | | | | | |
</TabItem>
</Tabs>
</TabItem>
<TabItem value="asia">
<Tabs>
<TabItem value="southko" label="South Korea" default>
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| --------------------------- | ------------------------ | --- | --- | ------- |
| **LG U+ (HelloVision)** | Yes (Without ISP Router) | No | - | Partial |
| **KT (SkyLife, Qook&Show)** | Yes | No | - | Partial |
| **SKT (SK Broadband)** | Yes | No | - | Partial |
</TabItem>
<TabItem value="twn" label="Taïwan">
| Service provider | Box/modem/router | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| -------------------------- | -------- | --- | -------------------------- | --- | ------- |
| **CHT (Chunghwa Telecom)** | Multiple | Yes | Yes (Need hidden settings) | No | Partial |
</TabItem>
</Tabs>
</TabItem>
<TabItem value="europe">
<Tabs>
<TabItem value="belnl" label="Belgium (nl)">
| Service provider | Box/modem/router | [Poort 25 openen mogelijk](/admin/email)| [Hairpinning](http://fr.wikipedia.org/wiki/Hairpinning) | [Reverse DNS](https://en.wikipedia.org/wiki/Reverse_DNS_lookup) | vaste IP |
| :----------: | :---: | :---: | :-----: | :-----: | :-----: |
| **Proximus** | BBox2 | ja | **nee** | **nee** | **nee** |
| | BBox3 | ja | **nee** | **nee** | **nee** |
| **Scarlet** | BBox2 | ja | **nee** | **nee** | **nee** |
:::caution
**Proximus** zou niet openstaan voor self-hosting. Het openen van de poorten zou moeilijker zijn om SPAM te voorkomen. Het loont de moeite om een vpn te gebruiken.
:::
</TabItem>
<TabItem value="belfr" label="Belgium (fr)">
| Fournisseur d’accès | Box/modem/routeur | [Port 25 ouvrable](/admin/email)| [Hairpinning](http://fr.wikipedia.org/wiki/Hairpinning) | [Reverse DNS](https://en.wikipedia.org/wiki/Reverse_DNS_lookup) | IP fixe |
| :----------: | :----------: | :---: | :-----: | :-----: | :-----: |
| **Proximus** | BBox2 | oui | **non** | **non** | **non** |
| | BBox3 | oui | **non** | **non** | **non** |
| **Scarlet** | BBox2 | oui | **non** | **non** | **non** |
:::caution
**Proximus** ne serait pas ouvert à l’auto-hébergement. L’ouverture des ports serait plus difficile afin d’éviter tout SPAM. Il serait préférable de passer par [Neutrinet](http://neutrinet.be), un des [membres de la Fédération French Data Network](http://www.ffdn.org/fr/membres).
:::
</TabItem>
<TabItem value="fin" label="Finland">
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ---------------- | ---------------- | ------------------------------------------------------- | --------------------------- | -------- |
| DNA | No | Yes | No | No. Only for business. |
| Elisa | No | Yes | Not available for consumers | No. Only for Business. |
| Telia | No | Yes | Not available for consumers | No. Only for Business. |
:::caution
Regulations in Finland prohibit the use of Port 25 for consumers.
:::
</TabItem>
<TabItem value="fra" label="France" default>
:::tip
Tous les fournisseurs d’accès à Internet [membres de la Fédération French Data Network](http://www.ffdn.org/fr/membres) ont une politique favorable à l’auto-hébergement.
:::
| Fournisseur d’accès | Box/modem/routeur | [Port 25 ouvrable](/admin/email) | [Hairpinning](http://fr.wikipedia.org/wiki/Hairpinning) | [Reverse DNS](https://en.wikipedia.org/wiki/Reverse_DNS_lookup) personnalisable | [IP fixe](/admin/tutorials/domains/dns_dynamicip) | [Non listé sur le DUL](https://en.wikipedia.org/wiki/Dialup_Users_List) |
| -------------------- | ------------------------ | -------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------- |
| OVH | Personnel<br/>ou Box OVH | ✔ | ✔ | ✔ | ✔ | … |
| Free | Freebox | ✔ | ✔ | ✔ (sauf IPv6, pas de support, et buggué sur certaines plages d'adresses ipv4) | ✔ | ✘ |
| SFR | Neufbox | ✔ | ✔/✘ | … | ✔/✘ | … |
| Orange | Livebox | ✘ | ✔ (depuis la Livebox 4) | ✘ (XXX.pro.dns-orange.fr disponible sur les abonnements orange pro) | ✘ (en option depuis la Livebox 3 et sur les abonnements orange pro) | … |
| Bouygues<br/>Télécom | Bbox | ✔ | ✔ | ✘ | … | … |
| Darty | Dartybox | ✔ | ✔ | ✘ | … | … |
Pour une liste plus complète et précise, référez-vous à la très bonne documentation de [wiki.auto-hebergement.fr](http://wiki.auto-hebergement.fr/fournisseurs/fai#d%C3%A9tail_des_fai).
:::tip
[FDN](http://www.fdn.fr) fournit des [VPN](http://www.fdn.fr/-VPN-.html) permettant de rapatrier une (ou plusieurs sur demande) IPv4 fixe et un /48 en IPv6 et ainsi « nettoyer » votre connexion si vous êtes chez l’un des FAI *limitants* du tableau ci-dessus.
:::
</TabItem>
<TabItem value="hun" label="Hungary">
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ------------------------------------- | ------------------ | ------------------------------------------------------- | ------------------------ | ---------- |
| DIGI Távközlési és Szolgáltató Kft. | No. Business only. | No | No. Business only | No. Business only |
| Telekom Magyarország | No | No | No | No |
:::tip
DIGI allows non-business users to subscribe to their business plan, for roughly the same price as the regular plan. Fix IP is an additional subscription for business plan users.
:::
</TabItem>
<TabItem value="irl" label="Ireland">
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ---------------- | ---------------- | ------------------------------------------------------- | ------------------------ | -------- |
| Whizzy Internet | Yes | Yes | Yes | Yes |
</TabItem>
<TabItem value="swe" label="Sweden">
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ---------------- | ------------------ | ------------------------------------------------------- | ------------------------ | ------------------ |
| Telia | No. Business only. | Yes | No. Business only. | No. Business only. |
| Bredbandsbolaget | No. Business only. | Yes | No. Business only. | No. Business only. |
| Ownit | Yes | N/A? | ? | Yes |
Ownit reserves port 3 and 4 of their router to TV. With a simple call to their hotline, explaining that you want to selfhost, they can reassign one of the ports to be in bridge mode. It means that your server will have its own public fixed IP address, in addition to the modem's.
</TabItem>
<TabItem value="che" label="Switzerland">
NB: Most of non-business IP provided by ISP are blocklisted.
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ---------------- | ---------------- | ------------------------------------------------------- | ------------------------ | -------- |
| Sunrise | Yes | No | - | - |
| Swisscom | Yes | No | No | No |
| VTX | Yes | No | - | - |
</TabItem>
<TabItem value="gbr" label="UK">
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ---------------- | ---------------- | ------------------------------------------------------- | -------------------------- | -------- |
| BT Internet | Yes | - | - | No |
| Virgin Media | - | - | No | No |
| ZEN Internet | Yes | - | Yes | Yes |
| PlusNet | Yes | No | Yes, if you raise a ticket | Small one off Charge |
</TabItem>
</Tabs>
</TabItem>
<TabItem value="northamerica">
<Tabs>
<TabItem value="canada" label="Canada">
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ---------------- | ---------------- | ------------------------------------------------------- | ------------------------ | ---------------- |
| Telus | No. Extra charge | - | - | No. Extra charge |
| TekSavvy | Yes | No | - | No. Extra charge |
</TabItem>
<TabItem value="usa" label="USA" default>
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ----------------- | ------------------------------------- | ------------------------------------------------------- | ------------------------ | ---------------------------------- |
| Cox | No. Only for business class customer. | No | No | Yes, as a business class customer |
| Charter | No. Only for business class customer. | No | No | Yes, as a business class customer |
| DSLExtreme | Yes | No | No | Yes, extra charge. |
| AT&T | No. Only for business class customer. | unknown. | unknown. | unknown. |
| Xfinity (Comcast) | No. Only for business class customer. | unknown. | unknown. | Yes, as a business class customer |
</TabItem>
</Tabs>
</TabItem>
<TabItem value="southamerica">
<Tabs>
<TabItem value="brazil" label="Brazil" default>
| Service provider | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fixed IP |
| ---------------------- | ------------------- | ------------------------------------------------------- | ------------------------ | -------- |
| Global Village Telecom | No. Only for Fix IP | No | No | Yes, extra charge. |
</TabItem>
</Tabs>
</TabItem>
<TabItem value="oceania">
</TabItem>
</Tabs>
================================================
FILE: docs/admin/05.get_started/10.providers/15.vpn/index.mdx
================================================
---
title: VPN providers
---
import {HighlightFFDN, HighlightNonProfit} from '@site/src/components/Highlight';
Since setting up a server at home is an uncommon practice, most Internet connections provided to individuals are unsuitable for this purpose especially if you desire to send mail. A net neutral VPN providing a dedicated fixed public IPv4 address and IPv6 addresses [can help to circumvent some limitations or difficulties](/admin/get_started/providers/vpn/vpn_advantage).
:::info
Note that except if you have a <a href="https://en.wikipedia.org/wiki/Threat_model">threat model</a> that implies to really be "hidden", you do not need to hide your home IP address using a VPN. It is really not a huge deal to expose your IP address, do not trust the big commercial VPN companies who tries to sell you a product by inducing fear.
If you *do* have such a threat model, especially against state threats, most of the providers listed below will **not** be of any help to you, since they will have to comply with police and judicial demands.
However, a VPN can help you to bypass port-forwarding limitations, or to get a stable IP address (if you ISP only provide dynamic IP) and this page will help you for that!
:::
Below, you can find a list of providers compatible for self-hosting and especially those providing .cube format for VPNClient apps and those providing [internetcube](https://internetcu.be).
:::info
By **compatible for self-hosting** we means VPN offers with at least:
- a fixed dedicated public IPv4
- port forwarding or opened features
- net neutrality: no traffic analysis, no user data resale, no alteration of traffic (without legal obligations)...
:::
## English-speaking sites
| VPN provider | [VPNClient](https://github.com/labriqueinternet/vpnclient_ynh) compatibility | IPv6 | rDNS IPv4 | rDNS IPv6 | Price | Membership | Net Neutrality |
| ------------ | ---------------------------------------------------------------------------- | ---- | --------- | --------- | ----- | ---------- | -------------- |
| [Neutrinet](https://neutrinet.be/en/vpn) | ✔ (.cube + [internetcube](https://internetcu.be)) | ✔ | ✔ | ✔ | ~10€¹/month or 30€/year | included | <HighlightFFDN/> <HighlightNonProfit/> |
¹ [Pay what you want](https://en.wikipedia.org/wiki/Pay_what_you_want)
:::info
If you try an other VPN provider that include **public dedicated ipv4 and port forwarding**, feel free to contribute to this documentation. We need people to test specific offers of those commercial providers:
- ✘ [VPN area](https://vpnarea.com/front/home/dedicated-ip) does not allow forwarding port 80. Running a webserver is against their TOS.
- [Trust zone](https://trust.zone/fr/order?p=25)
- [PureVPN](https://www.purevpn.fr/ip-vpn-dedie)
- [RapidVPN](https://www.rapidvpn.com/vpn)
:::
## French-speaking sites
| VPN provider | [VPNClient](https://github.com/labriqueinternet/vpnclient_ynh) compatibility | IPv6 | rDNS IPv4 | rDNS IPv6 | Price | Membership | Net Neutrality |
| ------------ | ---------------------------------------------------------------------------- | ---- | --------- | --------- | ----- | ---------- | -------------- |
| [Aquilenet](https://www.aquilenet.fr/vpn/) | ✔ (.cube) | ✔ | ✔ | ✔ | 3 à 5 / mois | ~15€¹ /an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Alsace Réseau Neutre](https://arn-fai.net/vpn) | ✔ (.cube + [internetcube](https://internetcu.be)) | ✔ | ✔ | ✔ | 4 € (ou [Ğ1](https://duniter.org/fr/monnaie-libre-g1/)) / mois | 15€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Baionet](https://www.baionet.fr/nos-services/vpn/) | ✘ (wireguard) | ? | ? | ? | 2,5 € ou 5 € / mois | 5€ ou 40€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [FAImaison](https://www.faimaison.net/services/vpn.html) | ✔ (.cube) | ✘ | ✔ | ✘ | Prix libre | 8 ou 16€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [French Data Network](https://www.fdn.fr/services/vpn/) | ✔ (.cube) | ✔ | ✔ | ✔ | 6,5€ à 23€ / mois | 15 ou 30€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Franciliens](https://www.franciliens.net/acces-internet/vpn/) | ✔ (.cube + [internetcube](https://internetcu.be)) | ✔ | ✔ | ✔ | 4€ à 23€ / mois | 15€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Grifon](https://grifon.fr/services/vpn/) | ✔ (manuelle) + L2TP/IPSec | ✔ | ✔ | ✔ | 5€ / mois | 15€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Igwan.net](https://igwan.net) | ✘ (L2TP/IPSec) | ? | ? | ? | 4 ou 8€ / mois | ? / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Illyse](https://www.illyse.net/acces-internet-par-vpn/) | ✔ (manuelle) | ✔ | ✔ | ✔ | 6 ou 8€ / mois | 20€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [ILOTH](https://iloth.net/vpn/) | ✔ (.cube) | ✘ | ✔ | ✘ | 80€ / an | 5 à 100€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Milkywan](https://milkywan.fr/prices#popupTunnel) | ✔ (manuelle) | ✔ | ✔ | ✔ | 5 € / mois | incluse | |
| [Mycélium](https://mycelium-fai.org/wiki/documentation/services/vpn) | ✔ (manuelle) | ✘ | ✘ | ✘ | Prix libre | incluse<br/>Réservé aux nordistes(FR 59) | <HighlightFFDN/> <HighlightNonProfit/> |
| [Neutrinet](https://neutrinet.be/en/vpn) | ✔ (.cube + [internetcube](https://internetcu.be)) | ✔ | ✔ | ? | ~8 €¹ / mois | incluse | <HighlightFFDN/> <HighlightNonProfit/> |
| [Rézine](https://www.rezine.org/acces_internet/tunnels_chiffr%C3%A9s/) | ✔ (manuelle) | ✔ | ✔ | ✔ | 5 à 10€ / mois | Prix libre | <HighlightFFDN/> <HighlightNonProfit/> |
| [Swiss Neutral Network](https://www.swissneutral.net/?page_id=31) | ✔ (.cube) | ✔ | ✔ | ✔ | 30.- CHF/mois | 50.- CHF / an<br/>Réservé aux suisses | <HighlightFFDN/> <HighlightNonProfit/> |
| [Tetaneutral](https://tetaneutral.net/adherer/) | ✘ (wireguard) | ? | ? | ? | 5€¹ / mois | 5 à 100€¹ / an | <HighlightFFDN/> <HighlightNonProfit/> |
| [Touraine Data Network](https://tdn-fai.net/) | ✔ (.cube + [internetcube](https://internetcu.be)) | ✔ | ? | ? | 5€ / mois | 10 à 20€ / an | <HighlightFFDN/> <HighlightNonProfit/> |
¹ [Pay what you want](https://en.wikipedia.org/wiki/Pay_what_you_want)
## German-speaking sites
| VPN provider | [VPNClient](https://github.com/labriqueinternet/vpnclient_ynh) compatibility | IPv6 | rDNS IPv4 | rDNS IPv6 | Price | Membership | Net Neutrality |
| ------------ | ---------------------------------------------------------------------------- | ---- | --------- | --------- | ----- | ---------- | -------------- |
| [In-Berlin](https://in-vpn.de/provider/vpn.html) | ✔ (manuelle) | ✔ | ✔ | ✔ | 9 or 14€ / month | 20€ / an | <HighlightNonProfit/> |
| [Portunity](https://www.portunity.de/access/produkte/vpn-loesungen/vpn-tunnel.html) | ✔ (manuelle) | ✔ | ✔ | ✔ | from 6,80€ / month | | |
| [FesteIP-Kit (Portunity)](https://www.festeip-kit.de/) | ✘ (managed ready-to-use router utilizing a Raspberry Pi) | ✔ | ✔ | ✔ | from 10,80€ / month | | |
================================================
FILE: docs/admin/05.get_started/10.providers/15.vpn/vpn_advantage.mdx
================================================
---
sidebar_label: Advantages
title: Advantage of a VPN for self-hosting
---
Since setting up a server at home is an uncommon practice, most Internet connections provided to individuals are unsuitable for this purpose. A net neutral VPN providing a static IPv4 address and IPv6 addresses can help to circumvent some limitations or difficulties.
:::caution
Not all existing [VPN providers](/admin/get_started/providers/vpn/) meet these conditions, make sure the one you choose meets them.
:::
## Advantages
### Plug & Play
By setting up a VPN on your server, you'll be able to make it accessible to the rest of the Internet without having to change the configuration of the router you connect it to. This can be really handy if you are going on vacation, moving or have an Internet disconnection, as you will be able to easily connect it to someone you trust without having to configure the router of the person who is helping you.
In the same way, you save yourself the trouble of opening your router's ports and bypassing hairpinning.
### No micro DNS outages
If your Internet connection does not have a fixed public IP, you will be forced to set up a dynamic domain name (Dynamic DNS). This solution may be acceptable, but the DNS will only be updated at regular intervals (every two minutes if it is a `noho.st` or `nohost.me` domain name). So there is a chance that this will cause some display errors in the browser from time to time, or even that another site will be displayed (the risks are however reduced because the practice of self-hosting is not widespread).
With a neutral VPN, this problem is circumvented because the VPN can be compared to a Virtual Internet connection, which has its own fixed IPv4 address, so no need to update the domain name.
### The case of email
Email is one of the most complex protocols to self-host, usually it is what a user self-hosts last. Indeed, it is very easy to find yourself in a situation where emails sent by the server are refused by the recipient SMTP servers.
To avoid this you need to:
- configure the reverse DNS of the server's Internet connection (or VPN)
- a fixed IPv4
- that this IPv4 is removable from all blacklists (notably the IP must not be on the DUL)
- to be able to open port 25 (as well as the other SMTP ports)
Unfortunately, none of the most common French ISPs respect all these points.
To overcome this, the use of a VPN respecting these points can be an alternative.
### Trust
Finally, if you do not want the content of your server's communications to be spied on by equipment present on your ISP's network, you can use a VPN to encrypt your communications and deport your trust to a VPN provider. Remember, since 2015, the government officially deploys black boxes at the large network operators whose objective is to tap all French digital communications to preserve the scientific, economic and industrial interests of France.
## Disadvantages
### Cost
A neutral VPN has a cost since the operator who provides it must run a server and use bandwidth. The prices of the FFDN's associative VPNs are around 6 € per month.
### Packet path
When you set up a VPN on your server, if you don't set up any particular configuration, the transfer of a file from a computer on the local network to the server using the VPN, will go through the end of the VPN i.e. through the server of the VPN provider.
To solve this problem, there are two solutions:
- transform the server into a router and connect the home equipments to it, these equipments will then benefit from the VPN confidentiality too.
- use the YunoHost server as a DNS resolver when you are at home, in order to redirect the server's domain names to the local IP rather than the public IP. This operation can be done either on each equipment or on the router (if the latter allows it).
================================================
FILE: docs/admin/05.get_started/10.providers/20.servers.mdx
================================================
---
title: Server providers
hide_table_of_contents: true
description: " "
---
import {HighlightFFDN, HighlightNonProfit, HighlightCHATONS} from '@site/src/components/Highlight';
## Pre-installed YunoHost Offers
* [Alsace Réseau Neutre](https://arn-fai.net) (VPS) <HighlightFFDN/> <HighlightCHATONS/>
* [ECOWAN](https://ecowan.fr) (VPS)
* [Hosterfy](https://www.hosterfy.com/en/kvm-vps-hosting) (VPS)
* [Scaleway Dedibox](https://www.scaleway.com/en/dedibox/operating-systems/) (dedicated server)
* [Numericoop](https://numericoop.fr/solution-sur-mesure/) (VPS) <HighlightCHATONS/>
## YunoHost IT outsourcing
* [ReflexLibre](https://reflexlibre.net) (France only) <HighlightCHATONS/>
* [Numericoop](https://numericoop.fr/solution-sur-mesure/) (France only) <HighlightCHATONS/>
* [Librezo](https://librezo.fr/) (France only)
================================================
FILE: docs/admin/05.get_started/10.providers/_category_.yaml
================================================
label: "Providers"
link:
type: "generated-index"
title: "Providers"
================================================
FILE: docs/admin/05.get_started/20.install_on/_configuration.mdx
================================================
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
## <FAIcon icon="fa-cog"/> Proceed with the initial configuration
:::info
If you are in the process of restoring a server using a YunoHost backup, you should skip this step and instead [restore the backup instead of the postinstall step](/admin/backups).
:::
:::info
This documentation assumes you're on the same local network as your YunoHost installation.
For a VPS, please use the public IP address instead of the local domain or address.
:::
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
On a computer, open a browser and try to reach the webadmin:
- if you're installing on a VPS, you probably used the `curl | bash` install method, and it should have pointed you with the address, typically `https://xx.xx.xx.xx` (with the **public IPv4** of your server)
- if you're installing at home, and assuming that *you are on the same local network as the server*
- you can try to open https://yunohost.local (this may or may not work depending if your computer and network supports the Bonjour protocol)
- if you already know the local IP of the machine, go to `https://xx.xx.xx.xx` (with the **local** IP, typically starting with `192.168.`)
- otherwise you will need to [find out its local IP ](/admin/get_started/post_install/find_ip) before continuing.
:::warning
During the first visit, you will very likely encounter a security warning related to the certificate used by the server. For now, your server uses a self-signed certificate. You will later be able to add a certificate automatically recognized by web browsers as described in the [certificate documentation](/admin/domains/certificate). For now, you should add a security exception to accept the current certificate. (Though, PLEASE, do not take the habit of blindly accepting this kind of security alert!)
:::
You should then land on this page:
<Figure caption="Preview of the Web initial configuration page" src="/img/webadmin/postinstall_web.png"/>
</TabItem>
<TabItem value="cli" label="From the command line">
You can also perform the postinstallation with the command `yunohost tools postinstall` directly on the server, or [via SSH](/admin/command_line).
<Figure caption="Preview of the command-line post-installation" src="/img/postinstall_cli.png"/>
</TabItem>
</Tabs>
### <FAIcon icon="fa-globe"/> Main domain
<details>
<summary>
WSL specific configuration
</summary>
You will have to choose a fake domain, since it will not be accessible from outside.
For example, `ynh.wsl`. The tricky part is advertising this domain to your host.
Alter your `C:\Windows\System32\drivers\etc\hosts` file. You should have a line starting by `::1`, update it or add it if needed to get:
```text
::1 ynh.wsl localhost
```
If you want to create subdomains, do not forget to add them in the `hosts` file too:
```text
::1 ynh.wsl subdomain.ynh.wsl localhost
```
</details>
This will be the domain used by your server's users to access the **authentication portal**. You can later add other domains, and change which one is the main domain if needed.
- If you're new to self-hosting and do not already have a domain name, we recommend using a **.nohost.me** / **.noho.st** / **.ynh.fr** (e.g. `homersimpson.nohost.me`). Provided that it's not already taken, the domain will be configured automatically and you won't need any further configuration step. Please note that the downside is that you won't have full-control over the DNS configuration.
- If you already own a domain name, you probably want to use it here. You will later need to configure DNS records as explained [here](/admin/get_started/post_install/dns_config).
:::tip
Yes, you *have to* configure a domain name. If you don't have any domain name and don't want a **.nohost.me** / **.noho.st** / **.ynh.fr** either, you can set up a dummy domain such as `yolo.test` and tweak your **local** `/etc/hosts` file such that this dummy domain [points to the appropriate IP, as explained here](/admin/tutorials/domains/dns_local_network).
:::
### <FAIcon icon="fa-key"/> First user
The first user is now created at this stage. You should pick a username and a reasonably complex password. (We cannot stress enough that the password should be **robust**!) This user will be added to the Admins group, and will therefore be able to access the user portal, the web admin interface, and connect [via **SSH**](/admin/command_line) or [**SFTP**](/admin/tutorials/filezilla). Admins will also receive emails sent to `root@yourdomain.tld` and `admin@yourdomain.tld`: these emails may be used to send technical information or alerts. You can later add additional users, which you can also add to the Admins group.
This user replaces the old `admin` user, which some old documentation page may still refer to. In which case: just replace `admin` with your username.
## <FAIcon icon="fa-stethoscope"/> Run the initial diagnosis
Once the postinstall is done, you should be able to actually log in the web admin interface using the credentials of the first user you just created.
The diagnosis system is meant to provide an easy way to validate that all critical aspects of your server are properly configured - and guide you in how to fix issues. The diagnosis will run twice a day and send an alert by email if issues are detected.
:::tip
**Don't run away** ! The first time you run the diagnosis, it is quite expected to see a bunch of yellow/red alerts because you typically need to [configure DNS records](/admin/get_started/post_install/dns_config) (if not using a `.nohost.me`/`noho.st`/`ynh.fr` domain), as well as [port forwarding](/admin/get_started/post_install/port_forwarding) on your home's router.
:::
:::tip
If an alert is not relevant (for example because you don't intend on using a specific feature), it is perfectly fine to flag the issue as 'ignored' by going in the webadmin > Diagnosis, and clicking the ignore button for this specifc issue.
:::
:::warning
Especially, installations on WSL or virtual machines will likely not be reachable from outside without further network configuration on Virtualbox and your machine.
:::
<Tabs groupId="admin-commands">
<TabItem value="web" label="(Recommended) From the web interface">
To run a diagnosis, go on Web Admin in the Diagnosis section. Click Run initial diagnosis and you should get a screen like this:
<Figure caption="Preview of the diagnostic panel" src="/img/webadmin/diagnostic.png"/>
</TabItem>
<TabItem value="cli" label="From the command line">
```bash
yunohost diagnosis run
yunohost diagnosis show --issues --human-readable
```
</TabItem>
</Tabs>
## <FAIcon icon="fa-lock"/> Get a Let's Encrypt certificate
Once you configured DNS records and port forwarding (if needed), you should be able to install a Let's Encrypt certificate. This will get rid of the spooky security warning from earlier for new visitors.
For more detailed instructions, or to lean more about SSL/TLS certificates, see [the corresponding page here](/admin/domains/certificate).
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
Go in Domains > Click on your domain > Certificate
<Figure caption="Preview of the diagnostic panel" src="/img/webadmin/certificate-before-LE.png"/>
</TabItem>
<TabItem value="cli" label="From the command line">
```bash
yunohost domain cert install
```
</TabItem>
</Tabs>
## 🎉 Congratz!
You now have a pretty well configured server. If you're new to YunoHost, we recommend having a look at [the guided tour](/admin/webadmin). You should also be able to [install your favourite applications](https://apps.yunohost.org/). Don't forget to [plan backups](/admin/backups) !
================================================
FILE: docs/admin/05.get_started/20.install_on/_install_script.mdx
================================================
## <FAIcon icon="fa-rocket"/> Run the install script
- Open a command line prompt on your server (either directly or [through SSH](/admin/command_line))
- Make sure you are root (or type `sudo -i` to become root)
- Run the following command:
```bash
curl https://install.yunohost.org | bash
```
:::danger
Always make sure there's an `s` at the end of `https`.
:::
:::warning
You might need to first install `curl` and `ca-certificates` by running:
```bash
apt install curl ca-certificates
```
:::
:::note
**For advanced users concerned with the `curl | bash` approach:** consider reading ["Is curl|bash insecure?"](https://sandstorm.io/news/2015-09-24-is-curl-bash-insecure-pgp-verified-install) on Sandstom's blog, and possibly [this discussion on Hacker News](https://news.ycombinator.com/item?id=12766350&noprocess).
:::
================================================
FILE: docs/admin/05.get_started/20.install_on/arm_board.mdx
================================================
---
title: On an ARM board
description: Looks like a Raspberry Pi, isn't quite one
sidebar_position: 2
sidebar_custom_props:
doc_card_image: /img/icons/icon-olinuxino.png
pagination_next: admin/get_started/install_on/on_top_of_debian
sidebar_class_name: hidden
---
import InitialConfiguration from "./_configuration.mdx";
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import YunoHostImagesList from '@site/src/components/YunoHostImagesList';
import InstallScript from "./_install_script.mdx";
## <FAIcon icon="fa-list-alt"/> Pre-requisites
- An ARM board with at least 512MB RAM
- A power supply (either an adapter or a USB cable) for your board;
- A microSD card: 16GB capacity (at least), [class "A1"](https://en.wikipedia.org/wiki/SD_card#Class) highly recommended (such as [this SanDisk A1 card](https://www.amazon.fr/SanDisk-microSDHC-Adaptateur-homologu%C3%A9e-Nouvelle/dp/B073JWXGNT/));
- A [reasonable ISP](/admin/get_started/providers/isp/), preferably with a good and unlimited upstream bandwidth
- An ethernet cable (RJ-45) to connect your server to your router.
- A computer to read this guide, flash the image and access your server.
:::warning
Each ARM board is different and there might be specific instructions for your board.
Please follow the Armbian documentation first!
:::
## <FAIcon icon="fa-download" /> Download the Armbian image
You should download the Armbian **Bookworm** (Debian 12) image from your vendor's or Armbian's website.
<div class="text--center">
<Button url="https://www.armbian.com/download" color="skyblue"><SmallInline url="/img/icons/logo-armbian.png" alt="armbian logo"/> Armbian Download page</Button>
</div>
<YunoHostImagesList hardware="arm"/>
## <FAIcon icon="sim-card"/> Flash the Armbian image
Now that you downloaded the image of Armbian, you should flash it on a microSD card
<Tabs>
<TabItem value="etcher" label="With Etcher (recommended)">
Download <Link to="https://www.balena.io/etcher/" target="_blank">Etcher</Link> for your operating system and install it.
Plug your SD card, select your image and click "Flash"

</TabItem>
<TabItem value="usbimager" label="With USBimager">
Download [USBimager](https://bztsrc.gitlab.io/usbimager/) for your operating system and install it.
Plug your SD card, select your image and click "Write"

</TabItem>
<TabItem value="dd" label="With dd">
If you are on GNU/Linux / macOS and know your way around command line, you may also flash your USB stick or SD card with `dd`. You can identify which device corresponds to your USB stick or SD card with `fdisk -l` or `lsblk`. A typical SD card name is something like `/dev/mmcblk0`. BE CAREFUL and make sure you got the right name.
Then run:
```bash
# Replace /dev/mmcblk0 if the name of your device is different...
dd if=/path/to/armbian.img of=/dev/mmcblk0 status=progress ; sync
```
</TabItem>
</Tabs>
## <FAIcon icon="fa-plug"/> Power up the board
- Insert the SD card in the board
- Connect your board to your home router via Ethernet
- For advanced users requiring WiFi instead, please follow [the official documentation](https://docs.armbian.com/User-Guide_Autoconfig/#sample-config-file).
- If you want to follow the initial boot, connect a screen and keyboard on your board.
- Power up the board
## <FAIcon icon="fa-terminal"/> Connect to the board
Next you need to [find the local IP address of your server](/admin/get_started/post_install/find_ip) to connect as root user [via SSH](/admin/command_line) with the temporary password `1234` (see [the Armbian doc](https://docs.armbian.com/User-Guide_Getting-Started/#how-to-login)).
```bash
ssh root@192.168.x.xxx
```
<InstallScript />
<InitialConfiguration />
================================================
FILE: docs/admin/05.get_started/20.install_on/index.mdx
================================================
---
title: Install on...
slug: /admin/get_started/install_on
sidebar_class_name: hidden_menu_caret bold
hide_table_of_contents: true
---
import DocCardList from '@theme/DocCardList';
import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
Select the hardware on which you want install YunoHost:
<DocCardList items={useCurrentSidebarCategory().items} />
================================================
FILE: docs/admin/05.get_started/20.install_on/on_top_of_debian.mdx
================================================
---
title: On top of Debian
description: Typically on a VPS, or if you can't use preinstalled images
sidebar_position: 6
sidebar_custom_props:
doc_card_image: /img/icons/logo-debian.png
pagination_next: admin/get_started/guidelines
sidebar_class_name: hidden
---
import InstallScript from "./_install_script.mdx";
import InitialConfiguration from "./_configuration.mdx";
YunoHost can be installed "on top" of Debian. This can be useful if you already have a Debian machine or can't use the recommended methods. Note that there is no actual difference in your resulting YunoHost installation between doing this and using the other methods involving pre-installed images: the pre-installed images are just convenient to skip a bunch of steps and having the system already shipped with everything needed.
## <FAIcon icon="fa-download" /> Get Debian
You should download the version **Bookworm** (Debian 12) and select the architecture for your PC. When in doubt, select `amd64`, or `i386` for a pre-2010 PC.
<div class="text--center">
<Button url="https://www.debian.org/distrib/netinst" color="skyblue"><SmallInline url="/img/icons/logo-debian.png" alt="Debian logo"/> Debian Download page</Button>
</div>
Alternatively, you can browse the [Debian archive](https://cdimage.debian.org/mirror/cdimage/archive) for the latest 12.x version, select your architecture, the select `iso-cd` and download the `netinst` iso.
### Installation
You might want to **wipe the hard drive** before starting the Debian installer.
Flash the ISO your USB key, for example using [Etcher](https://www.balena.io/etcher/), [USBimager](https://bztsrc.gitlab.io/usbimager/) or `dd`.
Debian installer will ask for a **hostname** and a **domain name**. You can use `yunohost` and `yunohost.local`. It is not that important since the YunoHost Installer will overwrite those anyway.
Debian will ask for a **root password**, which should be reaonably complex as it is your primary defense to possible attacks.
The installer will also ask for a **user account** and another password.
:::warning
**IMPORTANT:** this username should be DIFFERENT from the first YunoHost user which you will choose during YunoHost's posinstall… For example, you can name it `debian`. Be sure to also use a long complex password.
:::
When the install asks where to install and how to **create disk partitions**, select the option to **use the whole disk**, unless you know what you're doing.
- We recommend not to separate the `/home`, `/var` or `/tmp` partitions. Use the option to "keep all files in one partition".
- If you don't know what you're doing, don't encrypt the disk (Decryption at power-on will be an issue)
The installer will ask about **mirrors**. Select a country and server close to your location, or use the default options.
The installer will ask which **desktop environment** you want. This is generally useless and might waste resources.
- Unselect all desktop environment
- Keep "standard system utilities" checked
### After installing Debian
1. Remove the installation media (unplug the USB stick)
2. Reboot
3. Login as `root`
4. Install curl by typing `apt install curl`
<InstallScript />
<InitialConfiguration />
================================================
FILE: docs/admin/05.get_started/20.install_on/raspberry_pi.mdx
================================================
---
title: On a Raspberry Pi
description: One of the most popular baked boards
sidebar_position: 1
sidebar_custom_props:
doc_card_image: /img/icons/icon-raspberrypi.png
pagination_next: admin/get_started/guidelines
sidebar_class_name: hidden
---
import InitialConfiguration from "./_configuration.mdx";
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import YunoHostImagesList from '@site/src/components/YunoHostImagesList';
## <FAIcon icon="fa-list-alt"/> Pre-requisites
- A Raspberry Pi 3, 4 or 5
- A power supply (either an adapter or a USB cable) for your board;
- A microSD card: 16GB capacity (at least), [class "A1"](https://en.wikipedia.org/wiki/SD_card#Class) highly recommended (such as [this SanDisk A1 card](https://www.amazon.fr/SanDisk-microSDHC-Adaptateur-homologu%C3%A9e-Nouvelle/dp/B073JWXGNT/));
- An ethernet cable (RJ-45) to connect your server to your router.
- A [reasonable ISP](/admin/get_started/providers/isp/), preferably with a good and unlimited upstream bandwidth
- A computer to read this guide, flash the image and access your server.
:::warning
Support for Raspberry Pi 2 was dropped. If you really want to install YunoHost on a Pi 2, download and install
"Raspberry Pi OS (32-bit)" from [the official website](https://www.raspberrypi.com/software/operating-systems/)
and then [follow the instructions](./on_top_of_debian) to install YunoHost on Debian.
:::
## <FAIcon icon="fa-download" /> Download the YunoHost image
:::note
(FIXME: this bit is currently broken...)
Optionally, you can [download the project's public key](https://forge.yunohost.org/keys/yunohost_bookworm.asc) to check the authenticity of the images.
:::
<YunoHostImagesList hardware="rpi345"/>
## <FAIcon icon="fa-sim-card"/> Flash the YunoHost image
Now that you downloaded the image of YunoHost, you should flash it on a microSD card
<Tabs>
<TabItem value="etcher" label="With Etcher (recommended)">
Download <Link to="https://www.balena.io/etcher/" target="_blank">Etcher</Link> for your operating system and install it.
Plug your SD card, select your image and click "Flash"

</TabItem>
<TabItem value="usbimager" label="With USBimager">
Download [USBimager](https://bztsrc.gitlab.io/usbimager/) for your operating system and install it.
Plug your SD card, select your image and click "Write"

</TabItem>
<TabItem value="dd" label="With dd">
If you are on GNU/Linux / macOS and know your way around command line, you may also flash your USB stick or SD card with `dd`. You can identify which device corresponds to your USB stick or SD card with `fdisk -l` or `lsblk`. A typical SD card name is something like `/dev/mmcblk0`. BE CAREFUL and make sure you got the right name.
Then run:
```bash
# Replace /dev/mmcblk0 if the name of your device is different...
dd if=/path/to/yunohost.img of=/dev/mmcblk0 status=progress ; sync
```
</TabItem>
</Tabs>
## <FAIcon icon="fa-plug"/> Power up the board
- Insert the SD card in the board
- Connect your board to your home router via Ethernet
- For advanced users requiring WiFi instead, please follow [the official documentation](https://www.raspberrypi.com/documentation/computers/configuration.html#connect-to-a-wireless-network).
- If you want to follow the initial boot, connect a screen and keyboard on your board.
- Power up the board
<InitialConfiguration />
================================================
FILE: docs/admin/05.get_started/20.install_on/regular_computer.mdx
================================================
---
title: On a regular computer
description: An old desktop computer or laptop, or any x86 machine
sidebar_position: 4
sidebar_custom_props:
doc_card_image: /img/icons/icon-computer.png
pagination_next: admin/get_started/guidelines
sidebar_class_name: hidden
---
import InitialConfiguration from "./_configuration.mdx";
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import YunoHostImagesList from '@site/src/components/YunoHostImagesList';
## <FAIcon icon="fa-list-alt"/> Pre-requisites
- A x86-compatible hardware dedicated to YunoHost with at least 512MB of RAM and 16GB of disk
- this may be an old laptop, desktop computer, or a proper server machine
- A 1GB+ USB key
- A [reasonable ISP](/admin/get_started/providers/isp/), preferably with good and unlimited upstream bandwidth
- An ethernet cable (RJ-45) to connect your server to your router.
- A computer to read this guide, flash the image and access your server.
## <FAIcon icon="fa-download" /> Download the YunoHost image
:::warning
If your machine is 32 bits, be sure to download the 32-bit image.
:::
:::info
(FIXME: this bit is currently broken...)
Optionally, you can [download the project's public key](https://forge.yunohost.org/keys/yunohost_bookworm.asc) to check the authenticity of the images.
:::
<YunoHostImagesList hardware="regular"/>
## <FAIcon icon="fa-brands fa-usb"/> Flash the YunoHost image
Flash the image on the USB key or CD/DVD.
<Tabs>
<TabItem value="etcher" label="With Etcher (recommended)">
Download <Link to="https://www.balena.io/etcher/" target="_blank">Etcher</Link> for your operating system and install it.
Plug your USB key, select your image and click "Flash"

</TabItem>
<TabItem value="usbimager" label="With USBimager">
Download [USBimager](https://bztsrc.gitlab.io/usbimager/) for your operating system and install it.
Plug your USB key, select your image and click "Write"

</TabItem>
<TabItem value="dd" label="With dd">
If you are on GNU/Linux / macOS and know your way around command line, you may also flash your USB stick or SD card with `dd`. You can identify which device corresponds to your USB stick or SD card with `fdisk -l` or `lsblk`. A typical SD card name is something like `/dev/mmcblk0`. BE CAREFUL and make sure you got the right name.
Then run:
```bash
# Replace /dev/mmcblk0 if the name of your device is different...
dd if=/path/to/armbian.img of=/dev/mmcblk0 status=progress ; sync
```
</TabItem>
<TabItem value="ventoy" label="Using Ventoy">
Ventoy will be useful if you can't sucessfully boot the YunoHost image using the other methods.
[Ventoy](https://www.ventoy.net/) is a nice tool that makes it really easy to put multiple linux images on a USB stick. When the computer refuses to boot from an image on a USB stick, Ventoy will usually be able to boot it anyway!
1. Install [Ventoy](https://www.ventoy.net/) on the USB stick. Refer to the [install instructions](https://www.ventoy.net/en/doc_start.html).
- This will create 2 partitions on the stick.
2. Using your favorite file explorer app, copy the YunoHost image file on the big `Ventoy` partition (not "VTOYEFI")
- Don't use *Balena Etcher*, USBImager or `dd` for this!
Later, when you'll boot the computer using this USB stick, Ventoy will appear and will list the images on the USB stick. Select the YunoHost image, then select GRUB2 launch option (or use whichever works for your computer 😉)
</TabItem>
</Tabs>
## <FAIcon icon="fa-plug"/> Boot the machine on your USB stick
- Connect your computer to your home router via Ethernet
- Boot up your server with the USB stick or a CD-ROM inserted, and select it as **bootable device**.
- Depending on your hardware, you will need to press one of the following keys:
`<F9>`, `<F10>`, `<F11>`, `<F12>`, `<DEL>`, `<ESC>` or `<Alt>`.
- N.B. : if the server was previously installed with a recent version of Windows (8+), you first need to tell Windows, to "actually reboot". This can be done somewhere in "Advanced startup options".
:::tip
If you can't boot the YunoHost image, try using Ventoy (select "Ventoy" in the section "Flash the YunoHost image" above).
:::
## <FAIcon icon="fa-rocket"/> Launch the graphical install
You should see a screen like this:
<Figure caption="Preview of the ISO menu" src="/img/softwares/virtualbox_3.png"/>
<Tabs>
<TabItem value="classic" label="Classic installation on a whole disk">
:::danger
Once you have validated the keyboard layout, the installation will be launched and will completely erase the data on your hard disk!
:::
1. Select `Graphical install`
2. Select your language, your location, your keyboard layout, and eventually your timezone.
3. The installer will then download and install all required packages.
</TabItem>
<TabItem value="expert" label="Installation in expert mode">
The YunoHost project simplified the classic installation as much as possible in order to avoid as many people as possible being lost with questions that are too technical or related to specific cases.
With the expert mode installation, you have more possibilities, especially concerning the exact partitioning of your storage media. You can also decide to use the classic mode and [add your disks afterwards](/admin/tutorials/external_storage).
### Summary of the steps in expert mode
1. Select `Expert graphical install`.
2. Select your language, location, keyboard layout and possibly your timezone.
3. Partition your disks. This is where you can set up a RAID or encrypt all or part of the server.
4. Specify a possible HTTP proxy to use for the installation of the packages
5. Specify on which volumes grub should be installed
### Regarding partitioning
In general, we recommend against partitioning `/var`, `/opt`, `/usr`, `/bin`, `/etc`, `/lib`, `/tmp` and `/root` on separate partitions. This will prevent you from having to worry about full partitions that could crash your machine, cause app installations to fail, or even corrupt your databases.
For performance reasons, it is recommended to mount your fastest storage (SSD) on the root `/`.
If you have one or more hard drives to store data, you can choose to mount it on one of these folders depending on your usage.
| Path | Contents |
| -------------------------------- | -------- |
| `/home` | User folders accessible via SFTP |
| `/home/yunohost.backup/archives` | YunoHost backups to be placed ideally elsewhere than on the disks that manage the data |
| `/home/yunohost.app` | Heavy data from YunoHost applications (nextcloud, matrix...) |
| `/home/yunohost.multimedia` | Heavy data shared between several applications |
| `/var/mail` | User mail |
If you want flexibility and don't want to (re)size partitions, you can also choose to mount on `/mnt/hdd` and follow this [tutorial to mount all these folders with `mount --bind`](/admin/tutorials/external_storage).
### About encryption
Be aware that if you encrypt all or part of your disks, you will have to type the passphrase every time you restart your server, which can be a problem if you are not on site. There are however solutions (quite difficult to implement) that allow you to type the passphrase via SSH or via a web page (search for "dropbear encrypted disk").
### About RAID
Keep in mind that:
- the disks in your RAIDs must be of different brands, wear and tear or batches (especially if they are SSDs)
- a RAID 1 (even without a spare) is more reliable than a RAID 5 from a probability point of view
- hardware raids are dependent on the raid card, if the card fails you will need a replacement to read and rebuild the array
</TabItem>
</Tabs>
:::info
If the YunoHost installer fails and you can't solve the issue, know that it's also possible to install Debian and then install YunoHost on top. See [the specific instructions](/admin/get_started/install_on/on_top_of_debian).
:::
<InitialConfiguration />
================================================
FILE: docs/admin/05.get_started/20.install_on/remote_server.mdx
================================================
---
title: On a remote server
description: "Cloud machines: VPS or dedicated servers"
sidebar_position: 3
sidebar_custom_props:
doc_card_image: /img/icons/icon-vps.png
pagination_next: admin/get_started/install_on/on_top_of_debian
sidebar_class_name: hidden
---
import InstallScript from "./_install_script.mdx";
import InitialConfiguration from "./_configuration.mdx";
## <FAIcon icon="fa-list-alt"/> Pre-requisites
- A dedicated or virtual private server with Debian 12 (Bookworm) <small>(with **kernel >= 6.1**)</small> preinstalled, 512MB RAM and 16GB capacity (at least)
- A computer or a smartphone to read this guide and access your server.
## <FAIcon icon="fa-terminal"/> Connect to the server
You will need to connect to your server via `ssh`.
<InstallScript />
<InitialConfiguration />
================================================
FILE: docs/admin/05.get_started/20.install_on/virtualbox.mdx
================================================
---
title: In a virtual machine
description: For testing and debugging purposes
sidebar_position: 5
sidebar_custom_props:
doc_card_image: /img/icons/icon-virtualbox.png
pagination_next: admin/get_started/guidelines
sidebar_class_name: hidden
---
import InitialConfiguration from "./_configuration.mdx";
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import YunoHostImagesList from '@site/src/components/YunoHostImagesList';
:::warning
Installing YunoHost in a VirtualBox is usually intended for testing or development. It is not convenient to run an actual server on the long-term, because the machine it's installed on probably won't be up 24/7, and because Virtualbox adds an additional layer of complexity in exposing the machine to the Internet.
:::
## <FAIcon icon="fa-list-alt"/> Pre-requisites
- An x86 computer with [VirtualBox installed](https://www.virtualbox.org/wiki/Downloads) and enough RAM capacity to be able to run a small virtual machine with 1024MB RAM and 8GB capacity (at least)
## <FAIcon icon="fa-download"/> Download the YunoHost image
:::warning
If your host OS is 32 bits, be sure to download the 32-bit image.
:::
:::note
(FIXME: this bit is currently broken...)
Optionally, you can [download the project's public key](https://forge.yunohost.org/keys/yunohost_bookworm.asc) to check the authenticity of the images.
:::
<YunoHostImagesList hardware="virtualbox"/>
## Create a new virtual machine

:::warning
It's okay if you can only have 32-bit versions, just be sure that you downloaded the 32-bit image previously.
:::
## Tweak network settings
:::warning
This step is important to properly expose the virtual machine on the network
:::
Go to **Settings** > **Network**:
- Select `Bridged adapter`
- Select your interface's name:
**wlan0** if you are connected wirelessly, or **eth0** otherwise.

## <FAIcon icon="fa-plug"/> Boot up the virtual machine
Start the virtual machine after selecting the YunoHost image.

:::warning
If you encounter the error "VT-x is not available", you probably need to enable Virtualization in the BIOS of your computer.
:::
## <FAIcon icon="fa-rocket"/> Launch the graphical install
You should see a screen like this:
<Figure caption="Preview of the ISO menu" src="/img/softwares/virtualbox_3.png"/>
<Tabs>
<TabItem value="classic" label="Classic installation on a whole disk">
:::danger
Once you have validated the keyboard layout, the installation will be launched and will completely erase the data on your hard disk!
:::
1. Select `Graphical install`
2. Select your language, your location, your keyboard layout, and eventually your timezone.
3. The installer will then download and install all required packages.
</TabItem>
<TabItem value="expert" label="Installation in expert mode">
The YunoHost project simplified the classic installation as much as possible in order to avoid as many people as possible being lost with questions that are too technical or related to specific cases.
With the expert mode installation, you have more possibilities, especially concerning the exact partitioning of your storage media. You can also decide to use the classic mode and [add your disks afterwards](/admin/tutorials/external_storage).
### Summary of the steps in expert mode
1. Select `Expert graphical install`.
2. Select your language, location, keyboard layout and possibly your timezone.
3. Partition your disks. This is where you can set up a RAID or encrypt all or part of the server.
4. Specify a possible HTTP proxy to use for the installation of the packages
5. Specify on which volumes grub should be installed
### Regarding partitioning
In general, we recommend against partitioning `/var`, `/opt`, `/usr`, `/bin`, `/etc`, `/lib`, `/tmp` and `/root` on separate partitions. This will prevent you from having to worry about full partitions that could crash your machine, cause app installations to fail, or even corrupt your databases.
For performance reasons, it is recommended to mount your fastest storage (SSD) on the root `/`.
If you have one or more hard drives to store data, you can choose to mount it on one of these folders depending on your usage.
| Path | Contents |
|--------|---|
| `/home` | User folders accessible via SFTP |
| `/home/yunohost.backup/archives` | YunoHost backups to be placed ideally elsewhere than on the disks that manage the data |
| `/home/yunohost.app` | Heavy data from YunoHost applications (nextcloud, matrix...) |
| `/home/yunohost.multimedia` | Heavy data shared between several applications |
| `/var/mail` | User mail |
If you want flexibility and don't want to (re)size partitions, you can also choose to mount on `/mnt/hdd` and follow this [tutorial to mount all these folders with `mount --bind`](/admin/tutorials/external_storage).
### About encryption
Be aware that if you encrypt all or part of your disks, you will have to type the passphrase every time you restart your server, which can be a problem if you are not on site. There are however solutions (quite difficult to implement) that allow you to type the passphrase via SSH or via a web page (search for "dropbear encrypted disk").
### About RAID
Keep in mind that:
- the disks in your RAIDs must be of different brands, wear and tear or batches (especially if they are SSDs)
- a RAID 1 (even without a spare) is more reliable than a RAID 5 from a probability point of view
- hardware raids are dependent on the raid card, if the card fails you will need a replacement to read and rebuild the array
</TabItem>
</Tabs>
:::tip
If the YunoHost installer fails and you can't solve the issue, know that it's also possible to install Debian and then install YunoHost on top. See [these instructions](/admin/get_started/install_on/on_top_of_debian).
:::
<InitialConfiguration />
================================================
FILE: docs/admin/05.get_started/20.install_on/wsl.mdx
================================================
---
title: On WSL
description: Experimental, for people who like cyberfrankensteins
sidebar_position: 8
sidebar_custom_props:
doc_card_image: /img/icons/logo-wsl.png
pagination_next: admin/get_started/guidelines
sidebar_class_name: hidden
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import InstallScript from "./_install_script.mdx";
import InitialConfiguration from "./_configuration.mdx";
:::danger
This setup is mainly meant for local testing by advanced users. Due to limitations on WSL's side (changing IP address, notably), selfhosting from it can be tricky and will not be described here.
:::
## <FAIcon icon="fa-list-alt"/> Pre-requisites
- Windows 10 and above
- Administration rights
- Windows Subsystem for Linux, installed from the Optional Features menu of Windows
- *Recommended:* Windows Terminal (Preview) app, installed from the Microsoft Store. Much better than the standard Terminal, as it offers shortcuts to the WSL distros.
## Introduction
WSL is a nice feature of Windows 10, making Linux pseudo-distributions available through command line. Let's say pseudo, because even though they are not really like virtual machines, they rely on virtualization capacities that make their integration with Windows almost seamless.
Docker for Windows can now rely on WSL instead of Hyper-V, for example.
:::warning
Bear in mind, this setup itself is *not* a container of any kind. If something breaks, there is no rollback capability.
You may need to delete the Debian distro altogether and restore it whole.
:::
## Install Debian
Let's install YunoHost into its own distro, not altering the default one. In a PowerShell terminal:
```bash
# Let's go in your home directory and prepare the working directories
cd ~
mkdir -p WSL\YunoHost
# Download the Debian appx package and unzip it
curl.exe -L -o debian.zip https://aka.ms/wsl-debian-gnulinux
Expand-Archive .\debian.zip -DestinationPath .\debian
# Import the Debian base into a new distro
wsl --import YunoHost ~\WSL\YunoHost ~\debian\install.tar.gz --version 2
# Cleanup
rmdir .\debian -R
```
You can now access it: run `wsl.exe -d YunoHost`
It is under Debian 9 Stretch, so let's upgrade it:
```bash
# In WSL
sudo sed -i 's/stretch/bookworm/g' /etc/apt/sources.list`
sudo apt update
sudo apt upgrade
# optional
sudo apt full-upgrade
# wget needed for later setup
sudo apt install wget -y
```
## Prevent WSL from tweaking configuration files
Edit `/etc/wsl.conf` and put the following code in it:
```text
[network]
generateHosts = false
generateResolvConf = false
```
## Force the use of iptables-legacy
:::warning[FIXME]
YunoHost now uses nftables, these instructions might be out of date.
:::
Somehow the YunoHost post-installation does not like `nf_tables`, the new software replacing `iptables`.
We can still explicitely use the good ol' `iptables` though:
```bash
# In WSL
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
```
## Install Systemd
Debian on WSL does not have `systemd`, a service configuration software.
This is a key element for YunoHost, and for any decent Debian distro (seriously MS, what the heck). Let's install it:
1. Install dotNET runtime:
```bash
# In WSL
wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install -y apt-transport-https
sudo apt update
sudo apt install -y dotnet-sdk-3.1
```
2. Install [Genie](https://github.com/arkane-systems/genie):
```bash
# In WSL
# Add their repository
echo "deb [trusted=yes] https://wsl-translinux.arkane-systems.net/apt/ /" > /etc/apt/sources.list.d/wsl-translinux.list
# Install Genie
sudo apt update
sudo apt install -y systemd-genie
```
## Install YunoHost
```bash
# In WSL
# Let's switch to the root user, if you were not already
sudo su
# Initialize the Genie bottle to have systemd running
genie -s
# Your hostname should have been appended with "-wsl"
```
<InstallScript />
### Access the command line
Always call `genie -s` while starting your distro.
```bash
wsl -d YunoHost -e genie -s
```
## Backup and restore the distro
### Make your first distro backup
As said before, there is no rollback capability. So let's export your fresh distro. In PowerShell:
```bash
cd ~
wsl --export YunoHost .\WSL\YunoHost.tar.gz
```
### In case of crash, delete and restore the whole distro
```bash
cd ~
wsl --unregister YunoHost
wsl --import YunoHost .\WSL\YunoHost .\WSL\YunoHost.tar.gz --version 2
```
<InitialConfiguration />
================================================
FILE: docs/admin/05.get_started/40.post_install/10.find_ip.mdx
================================================
---
title: Find your server's local IP
hide_table_of_contents: true
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
On an installation at home, your server should typically be accessible using the `yunohost.local` domain. If for any reason this does not work, you may need to find the *local* IP of your server.
## What is a local IP?
The local IP is the address used to refer to your server inside the local network (typically your home) where multiple devices are connected to a router (your internet box). The local IP typically looks like `192.168.x.y` (or sometimes `10.0.x.y` or `172.16.x.y`)
## How to find it?
Any of these tricks should allow you to find the local IP of your server:
<Tabs>
<TabItem value="angryip" label="With AngryIP (Recommended)" default>
You can use the [AngryIP](https://angryip.org/download/) software to achieve that. You can scan these local IP ranges in this order until you find the active IP corresponding to your server:
```
192.168.0.0 -> 192.168.0.255
192.168.1.0 -> 192.168.1.255
192.168.2.0 -> 192.168.255.255
10.0.0.0 -> 10.0.255.255
172.16.0.0 -> 172.31.255.255
```

:::tip
- you can order by ping like on this screenshot to easily see effectively-used IP.
- your server should typically be displayed as listening on port 80 and 443
- when in doubt, just type `https://192.168.x.y` in your browser to check if it's a YunoHost or not.
:::
</TabItem>
<TabItem value="router" label="With your internet router / box">
Connect to your internet box / router interface to list the machines connected.
</TabItem>
<TabItem value="arp-scan" label="With arp-scan">
If you're using Linux, you can open a terminal and use `sudo arp-scan --local` to list the IP on your local network (this may also work in Windows);
If the `arp-scan` command displays a confusing number of devices, you can check which ones are open to SSH with `nmap -p 22 192.168.1.0/24` to sort them out (adapt the IP range to your local network)
</TabItem>
<TabItem value="direct" label="With a direct access on the server">
Plug a screen on your server, log in and type `hostname --all-ip-address`.
The default credentials (before post-installation!) to log in are:
- login: `root`
- password: `yunohost`
(If you are using a raw Armbian image instead of the pre-installed YunoHost image, the credentials are root / 1234)
</TabItem>
</Tabs>
## I still can't find my local IP
If you are unable to find your server using any of the previous tricks, maybe your server did not boot correctly:
- Make sure that your server is properly plugged in;
- If you're using an SD card, make sure the connector is not too dusty;
- Plug a screen on your server and try to reboot to check that it's properly booting;
- Make sure that your ethernet cable is working and properly plugged in;
================================================
FILE: docs/admin/05.get_started/40.post_install/15.port_forwarding.mdx
================================================
---
title: Configure port-forwarding
description: "Make your server accessible from outside your home"
---
If you are self-hosting at home and without a VPN, you will probably want to forward ports on your home router ("Internet box") if you want your server to be reachable from outside your local network. The sketch below tries to briefly summarize the role and necessity of port forwarding when setting up a server at home.
<Figure caption="Illustration of the importance of port-forwarding" src="/img/portForwarding_en.png" />
### 0. Diagnose ports opened
The diagnosis tool can be used to verify that all necessary ports are exposed to the Internet.
### 1. Access your box/router administration interface
Your box/router admin interface is usually reachable via [http://192.168.0.1](http://192.168.0.1) or [http://192.168.1.1](http://192.168.1.1). Then, you will probably need to authenticate yourself the credentials given by your internet server provider.
### 2. Find the local IP of your server
Identify the *local* IP of your server using one of the method listed [on the corresponding page](/admin/get_started/post_install/find_ip).
A local IP address typically looks like `192.168.xx.yy`, or `10.0.xx.yy`.
The local IP address needs to be static, so that the port forwards that you are going to configure in the next step will always reach your server. You should go into your box/router and make sure that the local IP address of your server is static instead of dynamic.
### 3. Forwarding ports
In your router admin interface, look for something like "router configuration" or "port forwarding". The naming differs among the various kinds of router models.
Opening the ports listed below is necessary for the various services available in YunoHost to work. For each of them, the 'TCP' forwarding is needed. Some interfaces refer to 'external' and 'internal' ports: these are the same in our case.
- Web: `80` <small>(HTTP)</small>, `443` <small>(HTTPS)</small>
- [SSH](/admin/command_line): `22`
- [Email](/admin/email): `25`, `587` <small>(SMTP)</small>, `993` <small>(IMAP)</small>
If you use both a modem and a router, then you need to do the following:
1. first on the modem (the box closest to the internet) create rules to forward the above ports to your router;
2. then on the router (the box between the modem and your devices) create rules to forward the above ports to the static IP address for your server.
:::warning
<FAIcon icon="fa-exclamation-triangle"/> Many internet service providers (ISPs) block outgoing traffic on port 25 by default, to fight spam. Port 25 is however necessary if you want your server to be able to send email. In other extreme cases, some ISPs may not even allow you to use port 80/443 (web) freely... Depending on the ISP, it might be possible to open them in the admin interface... Check [this page](/admin/get_started/providers/isp/) for more info.
:::
================================================
FILE: docs/admin/05.get_started/40.post_install/20.dns_config.mdx
================================================
---
title: DNS zone configuration
---
DNS (domain name system) is a system that converts human-readable addresses
(domain names) into machine-understandable addresses (IP). For your server to be
easily accessible by human beings, and for some services like mail to work
properly, DNS must be configured.
If you're using an [automatic domain](/admin/tutorials/domains/dns_nohost_me) provided by the YunoHost Project, the configuration should be
performed automatically. If you're using your own domain name (e.g. bought via
a registrar), you should manually configure your domain on your registrar's
interface.
## Recommended DNS configuration
NB: Examples here use the placeholder `your.domain.tld`, you have to replace it with your real domain, such as `www.yunohost.org`.
YunoHost provides a recommended DNS configuration, available via:
- the webadmin, in Domain > your.domain.tld > DNS configuration;
- or the command line, `yunohost domain dns suggest your.domain.tld`
For specific needs or specific setups, and if you know what you're doing, you
might want or have to tweak these, or add additional ones (e.g. to handle
subdomains).
The recommended configuration typically looks like this:
```bash
#
# Basic ipv4/ipv6 records
#
@ 3600 IN A 111.222.33.44
* 3600 IN A 111.222.33.44
# (If your server is IPv6 capable, there are some AAAA records)
@ 3600 IN AAAA 2222:444:8888:3333:bbbb:5555:3333:1111
* 3600 IN AAAA 2222:444:8888:3333:bbbb:5555:3333:1111
#
# Mail (MX, SPF, DKIM and DMARC)
#
@ 3600 IN MX 10 your.domain.tld.
@ 3600 IN TXT "v=spf1 a mx -all"
mail._domainkey 3600 IN TXT "v=DKIM1; k=rsa; p=someHuuuuuuugeKey"
_dmarc 3600 IN TXT "v=DMARC1; p=none"
```
Though it might be easier to understand it if displayed like this:
| Type | Name | Value |
| :-----: | :--------------------: | :--------------------------------------------------: |
| **A** | **@** | `111.222.333.444` (your IPv4) |
| A | * | `111.222.333.444` (your IPv4) |
| AAAA | @ | `2222:444:8888:3333:bbbb:5555:3333:1111` (your IPv6) |
| AAAA | * | `2222:444:8888:3333:bbbb:5555:3333:1111` (your IPv6) |
| **MX** | **@** | `your.domain.tld.` (and priority: 10) |
| TXT | @ | `"v=spf1 a mx -all"` |
| TXT | mail._domainkey | `"v=DKIM1; k=rsa; p=someHuuuuuuugeKey"` |
| TXT | _dmarc | `"v=DMARC1; p=none"` |
### A few notes about this table
- Not all these lines are absolutely necessary. For a minimal setup, you only need the records in bold.
- The dot at the end of `your.domain.tld.` is important ;);
- `@` corresponds to `your.domain.tld`, and e.g. `muc` corresponds to `muc.your.domain.tld`;
- These are example values ! See your generated conf for the actual values you should use;
- We recommend a [TTL](https://en.wikipedia.org/wiki/Time_to_live#DNS_records) of 3600 (1 hour). But you can use something else if you know what you're doing;
- Don't put an IPv6 record if you're not sure IPv6 really works on your server! You might have issues with Let's Encrypt if it doesn't.
- If you're using the domain provider Namecheap the SRV DNS entries are formatted as **Service**: `_xmpp-client` **Protocol**: `_tcp` **Priority**: `0` **Weight**: `5` **Port**: `5222` **Target**: `your.domain.tld`
## Reverse DNS
If your ISP or VPS provider let you define a [Reverse DNS
lookup](https://en.wikipedia.org/wiki/Reverse_DNS_lookup) for your public IPv4
and/or IPv6 addresses, you must configure it. It will prevent you to be marked as
spam by anti-spam filters.
**N.B.: the reverse DNS configuration happens on your Internet Service Provider or VPS provider. It is *not* handled by your domain's registrar.**
If your public IPv4 address is `111.222.333.444` and your DNS
domain is `domain.tld`, you should get following answer when using `nslookup`
command tool:
```bash
nslookup 111.222.333.444
444.333.222.111.in-addr.arpa name = domain.tld.
```
The diagnosis system available in the webadmin performs this checks automatically (in section Email).
## Dynamic IP
If your global IP address is constantly changing, follow this [tutorial](/admin/tutorials/domains/dns_dynamicip).
================================================
FILE: docs/admin/05.get_started/40.post_install/_category_.yaml
================================================
label: After installation
link:
type: generated-index
description: Configure your network to access your server
================================================
FILE: docs/admin/05.get_started/90.guidelines.mdx
================================================
---
title: Advices and guidelines
---
This page lists some advice and guidelines which every YunoHost administrator should be aware to take care of a YunoHost server :)
## Do not break YunoHost
To put it another way: your server is either a production server (meant to work) or a test server on which you allow yourself to experiment.
If your goal is to run a production server:
- be aware that servers are fragile system. Stay cautious, methodical and patient;
- limit experimentations and customizations (for instance of config file);
- do not install dozens of apps just to see how they look;
- use non-official apps with caution, and do not use apps that are still 'in progress', 'not working' or level 0;
- if something gets broken, think twice about fixing it by yourself if you don't know what you are doing. <small>(For instance, do not attempt to recreate yourself the admin user just because it mysteriously disappeared...)</small>
## Keep it simple!
YunoHost is designed to work with general and simple use cases in mind. Deviating from those conditions will make things harder and you will need technical knowledge to make it work. For instance:
- do not try to run YunoHost in a context where you cannot have control over ports 80 and 443 (or no internet at all);
- do not try to host five servers behind the same internet connection if you are not already an advanced user;
- do not fall into nerd whims such as willing to replace NGINX with Apache (or run both at the same time);
- do not try to use custom SSL certificates if you don't really need them;
- ...
Keep things as simple as you can!
## Do not reinstall every day
Some people tend to fall into "the reinstallation spiral" - where each time something breaks in the server and it is not obvious how to fix it, or because the server became "dirty", one ends up reinstalling the whole server from scratch because it looks like an "easy" and quick solution to clean the table.
Please don't do this. Reinstalling is a heavy operation and is not a good long-term strategy for fixing problems. You will get tired and won't learn anything. Forget the dream of having a "clean" server. A real-life server always end up being a bit "dirty". Also, you need to (progressively) learn how to solve issues when you encounter them. Reach for [help](/community/help) with detailed symptoms of what you are trying to do and what is happening, and fix the issues. Over time, you will get a much better control over your server than just blindly reinstalling every time.
## Do backups
If you host services and data that are important for your users, it is important that you setup a backup policy. Backups can be easily created from the webadmin - you can download it from the webadmin or via your favorite FTP client, such as FileZilla or your own terminal. You should perform backup regularly and keep them in a safe and different physical location from your server. More info on [the backup documentation](/admin/backups).
## Check root’s email
As an administrator, you should configure an email client to check emails sent to `root@your.domain.tld` (which should be an alias to the first user your added) or otherwise forward them to another address that you actively check. Those mails may contain information on what is happening on your server such as automated periodic tasks.
## YunoHost is free software, maintained by volunteers
Finally, keep in mind that YunoHost is a free software maintained by volunteers - and that the goal of YunoHost (to democratize self-hosting) is not an easy one! It is provided without any warranty. The team of volunteers does its best to maintain and provide the best possible experience - yet features, applications and YunoHost as a whole are far from being perfect and you will experience small and big shortcomings at some points. When this happens, kindly [reach for help on the chat or forum, or report the issue](/community/help)! :)
If you like YunoHost and want to see the project being kept alive and make progress, feel free to leave a thank you note and to [donate](https://yunohost.org/donate.html) to the project and talk about it around you!
Last but not least, since YunoHost is a free software project, you are legitimate and welcomed to come and [contribute](/dev/) to the project, be it on the technical aspects (i.e. code) and less-technical aspects (such as contributing to this documentation! ;))
================================================
FILE: docs/admin/05.get_started/_category_.yaml
================================================
label: "🚀 Get started"
link:
type: "generated-index"
title: "🚀 Get started"
================================================
FILE: docs/admin/12.webadmin.mdx
================================================
---
title: ⭐ Webadmin interface
hide_table_of_contents: true
---
YunoHost has an administrator web interface. The other way to administrate your YunoHost install is through the [command line](/admin/command_line).
The webadmin can be accessed at `https://yourdomain.tld/yunohost/admin` or using the local IP or global IP of your server (`https://1.2.3.4/yunohost/admin`)
<Figure caption="Screenshot of YunoHost webadmin" src="/img/webadmin/webadmin.jpg" />
================================================
FILE: docs/admin/15.command_line.mdx
================================================
---
title: 🛠️ SSH and command line
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
## What's SSH?
**SSH** stands for Secure Shell, and refers to a protocol that allows you to remotely control and administer a machine using the command line interface (CLI). It is available by default in any terminal on GNU/Linux and macOS. On Windows, you may want to use [MobaXterm](https://mobaxterm.mobatek.net/download-home-edition.html) (after launching it, click on Session then SSH).
The command line interface (CLI) is, in the computer world, the original (and more technical) way of interacting with a computer compared to graphical interface. Command line interfaces are generally said to be more complete, powerful or efficient than a graphical interface, though also more difficult to learn.
## How to connect
### Credentials *before* running the postinstall
- If you are **installing at home**, the default credentials are login: `root` and password: `yunohost` (or `1234` if you flashed an armbian image)
- If you are **installing a remote server (VPS)**, your provider should have communicated the login and password to you (or allowed you to configure an SSH key)
### Credentials *after* running the postinstall
During the postinstall, you've been asked to choose a user and an administration password. This user account allows you to connect to the server through SSH. The password also becomes the new password for the `root` user. Additionally, **the `root` SSH login becomes disabled after the postinstall and you should log in using the user account created during postinstall !**. The only exception is that you may still be able to login using `root` *from the local network - or from a direct console on the server* (this is to cover the event where the LDAP server is broken and the users who are members of the `admins` group are unusable).
:::tip
If you connected with the administration account and would like to become `root` for convenience (e.g. to avoid typing `sudo` in front of every command), you can become `root` using the command `sudo su` or `sudo -i`.
:::
### Address to use
If you are **installing at home** (e.g. on a Raspberry Pi or OLinuXino or old computer):
- you should be able to connect to your server using `yunohost.local` (or `yunohost-2.local`, depending on how many servers are on your network).
- if `yunohost.local` and the like do not work, your need to [find out the local IP of the server](/admin/get_started/post_install/find_ip).
- if you installed a server at home but are attempting to connect from outside your local network, make sure port 22 is correctly forwarded to your server.
If your server is a remote server (VPS), your provider should have provided you with the IP address of the machine
In any cases, if you already configured a domain name pointing to the appropriate IP, it's much better to use `your.domain.tld` instead of the IP address.
### Connecting
The SSH command typically looks like:
```bash
# before the postinstall:
ssh root@11.22.33.44
# or after the postinstall:
ssh username@11.22.33.44
# using the domain name instead of the IP (more convenient)
ssh username@your.domain.tld
# using the local domain name instead of the IP (for local access)
ssh username@yunohost.local
# if you changed the SSH port
ssh -p 2244 username@your.domain.tld
```
:::note
`fail2ban` will ban your IP for 10 minutes if you perform 10 failed login attempts. If you need to unban the IP, have a look at the page about [Fail2Ban](/admin/troubleshooting/fail2ban)
:::
## Which other users may connect to the server?
By default, only YunoHost users in the `admins` group can log in to YunoHost's SSH and SFTP servers. Non-admin YunoHost users can't connect via SSH for security reasons. With the permissions system it is possible to specifically grant SFTP or even SSH access to non-admin users.
:::caution
Be careful who you give SSH access to. This increases even more the attack surface available to a malicious user.
:::
<Tabs>
<TabItem value="web" label="From the web interface">
Go to `Users > Manage groups and permissions`.
From here, you can add SFTP or SSH permissions to any user or group.
If you want to add an SSH public key to the user, you have to do it from the command line, as the web interface does not yet offer this feature.
</TabItem>
<TabItem value="cli" label="From the command line">
To allow a user or group to access via SFTP or SSH:
```bash
# SFTP
yunohost user permission add sftp <username>
# SSH
yunohost user permission add ssh <username>
```
To remove permission:
```bash
# SFTP
yunohost user permission remove sftp <username>
# SSH
yunohost user permission remove ssh <username>
```
Finally, it is possible to add, delete and list SSH keys, to improve SSH access security, using the commands:
```bash
yunohost user ssh add-key <username> <key>
yunohost user ssh remove-key <username> <key>
yunohost user ssh list-keys <username>
```
</TabItem>
</Tabs>
## Security and SSH
A more extensive discussion about security & SSH can be found on the [dedicated page](/admin/security).
## The command line
:::info
Providing a full tutorial about the command line is quite beyond the scope of the YunoHost documentation : for this, consider reading a dedicated tutorial such as [this one](https://ryanstutorials.net/linuxtutorial/) or [this one](http://linuxcommand.org/). But be reassured that you don't need to be a CLI expert to start using it !
:::
### The `yunohost` command
The `yunohost` command can be used to administer your server and perform the various actions similarly to what you do on the webadmin. The command must be launched either from the `root` user or from a user who is a member of the `admins` group by preceding the command with `sudo`. (ProTip™: you can become `root` with the command `sudo su` as a user who is a member of the `admins` group).
YunoHost commands usually have this kind of structure :
```text
yunohost app install wordpress --label Webmail
^ ^ ^ ^
| | | |
category action argument options
```
Don't hesitate to browse and ask for more information about a given category or action using the the `--help` option. For instance, those commands :
```bash
yunohost --help
yunohost user --help
yunohost user create --help
```
will successively list all the categories available, then the actions available in the `user` category, then the usage of the action `user create`. You might notice that the YunoHost command tree is built with a structure similar to the YunoHost admin pages.
### The `yunopaste` command
This command allow you to share with an other person the output of a command.
Example:
```bash
tail -n 100 /var/log/mail.info | yunopaste
```
### The `ynh-vpnclient-loadcubefile.sh` command
This command is only available and relevant in the context of the `VPN Client` application installed. You can use it to load a new .cube in case you can't get to the VPN Client interface to do so.
```bash
ynh-vpnclient-loadcubefile.sh -u <username> -p <password> -c <path>.cube
```
### Some useful commands
If your administration web interface indicates that the API is unreachable, try starting `yunohost-api`:
```bash
systemctl start yunohost-api
```
If you can no longer connect with an user member of `admins` group via SSH and via the web interface, the `slapd` service may be down, try restarting it:
```bash
systemctl restart slapd
```
If you have manually modified configurations and want to know the changes:
```bash
yunohost tools regen-conf --with-diff --dry-run
```
================================================
FILE: docs/admin/20.users/groups_and_permissions.mdx
================================================
---
title: Users groups and permissions
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
You can access the *groups and permissions* management interface from the webadmin
by going into the 'Users' section and clicking the corresponding button:

## Managing groups
The group mechanism can be used to define groups of users which then can be used to restrict permissions for applications and other services (such as mail or XMPP). Note that it is *not* mandatory to create a group to do so: you can also restrict access to an app or service on a user-per-user basis.
Using groups is however useful for semantics, for example if you host multiple groups of friends, associations or businesses on your server, you might want to create groups like `association1` and `association2` and add members of each association to the relevant group.
It's also possible to define mail aliases for a group, such that mails sent to `groupe@domain.tld` will be dispatched to all members of the group.
### Default groups
By default, these special groups are created:
- `all_users`, that contain all users registered on YunoHost,
- `visitors`, that applies to people viewing the server while not logged in.
- `admins`, that contains YunoHost administrators, who will have SSH access as well as to the webadmin.
The content of those groups cannot be changed, only the permissions given to them.
### List existing groups
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
The existing groups are listed at the top of the *groups and permissions* page.

</TabItem>
<TabItem value="cli" label="From the command line">
To list the currently existing groups in CLI :
```bash
yunohost user group list
groups:
all_users:
members:
- alice
- bob
- charlie
- delphine
```
</TabItem>
</Tabs>
### Creating a new group
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
To create a new group, simply click on the "New Group" button at the top of the page. You may only choose a name formed with letters (uper- and lowercase) and spaces. The group is created empty and without any permission.

</TabItem>
<TabItem value="cli" label="From the command line">
In CLI, to create a new group called `yolo_crew`
```bash
yunohost user group create yolo_crew
```
</TabItem>
</Tabs>
### Updating a group
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
Let's add a first to this group: in the group panel, click the button "add a user" and scroll to the desired user, then click on it.

To remove a user, click on the cross next to their username, in the group panel.

</TabItem>
<TabItem value="cli" label="From the command line">
In CLI, use the following command to add `charlie` and `delphine`to the `yolo_crew` group:
```bash
yunohost user group add yolo_crew charlie delphine
```
(similarly, `remove` can be used to remove members from a group)
Now in the group list we should see:
```bash
yunohost user group list
groups:
all_users:
members:
- alice
- bob
- charlie
- delphine
yolo_crew:
members:
- charlie
- delphine
```
</TabItem>
</Tabs>
### Deleting groups
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
To delete a group, click on the red cross on the top right of the group panel. You will be asked for confirmation.

</TabItem>
<TabItem value="cli" label="From the command line">
To delete the group `yolo_crew` in CLI, you may run
```bash
yunohost user group delete yolo_crew
```
</TabItem>
</Tabs>
## Managing permissions
The permission mechanism allow to restrict access to services (for example mail, XMPP...) and apps, or even specific parts of the apps (for example the administration interface of WordPress).
### List permissions
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
The groups page lists the permissions given to each group, including the special groups `all_users` and `visitors`.

</TabItem>
<TabItem value="cli" label="From the command line">
To list permissions and corresponding accesses in CLI:
```bash
yunohost user permission list
permissions:
mail.main:
allowed: all_users
wordpress.admin:
allowed:
wordpress.main:
allowed: all_users
xmpp.main:
allowed: all_users
```
Here, we find that all registered users can use email, XMPP, and access the WordPress blog. However, nobody can access the WordPress admin interface.
More details can be displayed by adding the `--full` option which will display the list of users corresponding to groups allowed, as well as urls associated to a permission (relevant for web apps).
</TabItem>
</Tabs>
### Add accesses to group or users
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
To add a permission to a group, simply click the "+" button in the group panel, scroll to the desired permission, then click on it.

Note that you can also allow a single user, by using the specific panel at the bottom of the page.

</TabItem>
<TabItem value="cli" label="From the command line">
To allow a group to access the WordPress admin interface in CLI:
```bash
yunohost user permission update wordpress.admin --add yolo_crew
```
Note that you can also allow a single user, by using the specific panel at the bottom of the page.
```bash
yunohost user permission update wordpress.admin --add alice
```
And now we may see that both the YoloCrew and Alice have access to the WordPress admin interface:
```bash
yunohost user permission list
[...]
wordpress.admin:
allowed:
- yolo_crew
- alice
[...]
```
Note that, for example, if we want to restrict permission for email so that only Bob is allowed to email, we should also remove `all_users` from the permission, by deleting it from the `all_users` group panel, or in CLI:
```bash
yunohost user permission update mail --remove all_users --add bob
```
</TabItem>
</Tabs>
Note that some permissions may be "protected", meaning that you won't be able to add/remove the visitor group to this permission. Generally, this is because it would make no sense (or is a security risk) to do so.
The webadmin will issue a warning if you set a permission that is superseded by a wider permission.

### Hide/display specific tiles in the user portal
Since YunoHost 4.1, you can choose to hide/display specific tiles in the SSO.
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
In the webadmin, you can do so by going in the corresponding app view, go in `Manage label and tiles` and check/uncheck the option `Display the tile in the user portal` for the corresponding permission.
</TabItem>
<TabItem value="cli" label="From the command line">
In command line, this may be done with:
```bash
# Enable the tile for the WordPress admin interface
yunohost user permission update wordpress.admin --show_tile True
```
</TabItem>
</Tabs>
## Configuring group aliases
Each group can use mail aliases, but their configuration is only available from the CLI so far. For example, the `admins` group is configured with aliases such as `admins@domain.tld`, `root@domain.tld` ... : mail sent to these addresses will be dispatched to all members of the `admins` group.
The command `yunohost user group info` will list them.
```bash
yunohost user group info admins
[...]
mail-aliases:
- root@maindomain.tld
- admin@maindomain.tld
- admins@maindomain.tld
- webmaster@maindomain.tld
- postmaster@maindomain.tld
- abuse@maindomain.tld
[...]
```
To add a new mail, use the action `add-mailalias` or `remove-mailalias` to delete it.
```bash
yunohost user group add-mailalias <group> <address@domaine.tld>
```
================================================
FILE: docs/admin/20.users/index.mdx
================================================
---
title: 👥 Accounts and portal
---
## Users
Users are human being who have access to applications and other services on your server. The administrator can add and manage users through the web administration (in the User category) or through the command line (see `yunohost user --help`). After that, users obtain a personal email address (chosen by the admin), and can log in the user portal to access applications they have permissions over and configure other parameters.
The first user created also automatically gets email aliases `root@main.domain.tld` and `admin@main.domain.tld`, such that mail sent to these addresses will end up in the first user's mailbox.
:::caution
You should be careful about who you give your server access to. In terms of security, this largely increase the attack surface for someone who wants to mess with the server one way or another.
:::
## The user portal, or SSO

The user portal, also called the SSO for 'Single Sign On' allows user to browse easily between the different apps they have access to. In particular, the term 'Single Sign On' comes from the fact that user only need to log in the portal to automatically be logged to all apps that require authentication (or at least those who are integrated with the SSO/LDAP, since this is sometimes technically complicated or not possible at all).
In the portal, users can also click on the avatar in the top-left to configure some other settings such as their identify, mail aliases, automatic mail forwards, or change their password.
:::info
You should be aware that the SSO can only be reached through the actual domain name (i.e. `https://the.domain.tld/yunohost/sso`), and NOT by just using the IP of the server (i.e. `https://11.22.33.44/yunohost/sso`), contrarily to the webadmin ! This is a bit confusing but is necessary for technical reason. If you are in a situation where you need to access the SSO without having your DNS properly configured for some reason, you might consider tweaking your `/etc/hosts` as described in [this page](/admin/tutorials/domains/dns_local_network).
:::
## Creating new users
Only the administrator can create new users. From the webadmin, open the `Users` menu and click on the `+ New user` main button. Fill in all the whole form.
Users are created with an associated email address with the format `username@domain.tld`. Additional email aliases and email forwards can later be added by the admin and the user.
The password should be at least 8 characters - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind of characters (uppercase, lowercase, digits and special characters).
Finalize the user creation by clicking on the `Save` button.
<Figure caption="From the main menu of the webadmin, open `Users`" src="/img/webadmin/create_user_1.png"/>
<Figure caption="From the top of the users list, click on `+ New user`" src="/img/webadmin/create_user_2.png"/>
<Figure caption="Fill in the form" src="/img/webadmin/create_user_3.png"/>
## User groups and permissions
See [this dedicated page](/admin/users/groups_and_permissions).
## SSH access
See [this dedicated page](/admin/command_line).
================================================
FILE: docs/admin/25.domains/certificate.mdx
================================================
---
title: Certificate
hide_table_of_contents: true
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
Certificates are used to guarantee the confidentiality and authenticity of the communication between a web browser and your server. In particular, they protect against attackers trying to impersonate your server.
YunoHost provides a **self-signed** certificate, it means that your server guaranties the certificate validity. It's enough **for personal usage**, because you trust your own server. But this could be a problem if you want to open access to anonymous like web user for a website.
In practice, visitors will see a screen list this:

Which basically asks the visitor : **"Do you trust the server hosting this website?"**. This can rightfully frighten a lot of people.
To avoid this confusion, it's possible to get a certificate signed by a known authority named **Let's Encrypt** which provides free certificates directly recognized by browsers. YunoHost allows you to directly install this certificate from the web administration interface or from the command line.
## Install a Let's Encrypt certificate
Before attempting to install a Let's Encrypt certificate, you should make sure that your DNS is correctly configured (your.domain.tld should point to your server's IP) and that your domain is accessible through HTTP from outside your local network (i.e. at least port 80 should be forwarded to your server).
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
Go to the 'Domain' part of the admin interface, then in the section dedicated to your.domain.tld. You should find a 'SSL certificate' button:

In the 'SSL certificate' section, you can see the status of the current certificate. If you just added the domain, it should be a self-signed certificate.

If your domain is correctly configured, it is then possible to install the Let's Encrypt certificate via the green button.

Once the install is made, you can check that the certificate is live via your browser by going to your domain in HTTPS. The certificate will automatically be renewed every three months.

</TabItem>
<TabItem value="cli" label="From the command line">
Connect to your server through SSH.
You can check the status of your current certificate with:
```bash
yunohost domain cert status your.domain.tld
```
Install a Let's Encrypt certificate with
```bash
yunohost domain cert install your.domain.tld
```
This should return :
```bash
Success! The SSOwat configuration has been generated
Success! Successfully installed Let's Encrypt certificate for domain DOMAIN.TLD!
```
Once this is done, you can check that the certificate is live via your browser by going to your domain in HTTPS. The certificate will automatically be renewed every three months.
</TabItem>
</Tabs>
## Troubleshooting
If due to some bad tweaking, your certificate ends up in a bad state (e.g. lost the certificate or unable to read the files), you should be able to clean the situation by regenerating a self-signed certificate:
```bash
yunohost domain cert install your.domain.tld --self-signed --force
```
If YunoHost thinks that your domain is badly configured despite the fact that you checked the DNS configuration and you have access in HTTP to your server from outside your local network, then you can:
- add a line `127.0.0.1 your.domain.tld` to the file `/etc/hosts` on your server;
- if the certificate installation still doesn't work, you can disable the checks with `--no-checks` after the `cert install` command.
================================================
FILE: docs/admin/25.domains/index.mdx
================================================
---
title: 🌐 Domains
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
YunoHost lets you manage and serve multiple domains on a single server. So you can host, for example, a blog and Nextcloud on a first domain `yolo.com`, and a webmail client on a second domain `swag.nohost.me`. Each domain is automatically configured to handle web services and e-mail.
Domains can be managed in the 'Domains' section of the webadmin, or via the `yunohost domain` category of the command line.
Whenever you add a domain, it is assumed that you have purchased (or at least control) the domain, so that you can manage its [DNS configuration](/admin/get_started/post_install/dns_config). An exception is [domains in `.nohost.me`, `.noho.st` and `ynh.fr`](/admin/tutorials/domains/dns_nohost_me) which are offered by the YunoHost Project, and can be directly integrated with YunoHost through automatic DynDNS configuration. To limit abuse and costs, an instance can only have one domain offered at a time, but you can add as many sub-domains to it as you like. For example, if you choose `example.ynh.co.uk` you can then add the domains `video.example.ynh.co.uk` or `www.exemple.ynh.fr` or any other sub-domain you may require.
Domains can be managed in the 'Domain' section of the webadmin, or through the `yunohost domain` category of the command line.

## 3 types of domains
<Tabs>
<TabItem value="nohost" label="Yunohost's domains (the free and easy way)">
In order to make self-hosting as accessible as possible, the YunoHost Project provides a *free* and *automatically configured* domain name service. By using this service, you won't have to [configure DNS records](/admin/get_started/post_install/dns_config) yourself, which can be tedious and technical.
The following (sub)domains are offered:
- `whateveryouwant.nohost.me`;
- `whateveryouwant.noho.st`;
- `whateveryouwant.ynh.fr`.
In more, YunoHost uses an integrated dynamic DNS mechanism, so your server can stay reachable even if your public IP change.
To get one of this domain you simply need to choose `I don't have a domaine name…` during the initial configuration (postinstall) or on the `Add domain` page.

:::info
To limit resources costs and abuses, each instance may only have one of these domains setup at any given time, however you can add as many sub-domains of it as you wish. For example, if you choose `example.noho.st` you can later add the domains `video.example.noho.st` or `www.example.ynh.noho.st` or any other sub-domain you may need. In this case you need to select `I already have a domain name`.
:::
[More information on this domains](/admin/tutorials/domains/dns_nohost_me)
</TabItem>
<TabItem value="own" label="Your own domains">
Having your own domain brings several advantages:
- more control and autonomy
- simpler domain name (for example directly in .net or .org)
However, you have to pay for it each year (about 15€/year ... depending on the TLD) and you have to do some extra configuration to [setup a correct DNS zone](/admin/get_started/post_install/dns_config). Our diagnosis tool can trigger alert to help you to do this configuration.
If you already have your own domain, you can simply click "I already have a domain name…". If you don't, in order to simplify and automate the DNS configuration, we suggest you to buy it from a [registrar whose API is supported by YunoHost](/admin/get_started/providers/registrar/).

[Know more on DNS zone configuration](/admin/get_started/post_install/dns_config)
</TabItem>
<TabItem value="local" label="Local domains (only reachable in your local network)">
Starting from YunoHost v4.3, domains ending by `.local` are fully supported, in addition to the default `yunohost.local`.
They do not use the DNS protocol, but the mDNS one (also known as Zeroconf, Bonjour), which allows them to be published with no specific configuration but exclusively on your local network or VPN.
Their use is this especially suitable when you do not need your apps to be available on the Internet.

:::info
mDNS protocol does not allow for subdomains to be created. So `domain.local` will work, while `sub.domain.local` is not possible.
:::
`Yunomdns` service takes care of publishing your `.local` domains on your network.
It has a configuration file, `/etc/yunohost/mdns.yml`, which allows you to choose which domains are published, and on which network interfaces.
This file is automatically regenerated whenever you add or delete a `.local` domain.
The service will always try to publish `yunohost.local`. If you have multiple YunoHost servers on your network, try `yunohost-2.local`, and so on.
The number may change depending on which server starts first, so do not rely on it to use actual apps and create your own domains.
:::caution
Unfortunately, Android devices before version 12 (released in 2021) do not seem to be listening to mDNS protocol.
To be able to reach `.local` domains on your Android devices, you will have to add in their DNS settings your YunoHost server's local IP address.
:::
</TabItem>
</Tabs>
## DNS configuration
DNS (Domain Name System) is a system that enables computers worldwide to translate human-readable domain names (such as `yolo.com`) into machine-readable IP addresses (such as `11.22.33.44`). For this translation (and other features) to work, DNS records need to be carefully configured.
YunoHost can generate a recommended DNS configuration for each domain, including the records required for e-mail. The recommended DNS configuration is available in the web administrator via Domains > (the domain) > DNS configuration, or with the command `yunohost domain dns suggest the.domain.tld`.
## About Non-latin characters
If your domain has special, non-latin characters, it will be transformed by YunoHost into its [internationalized version](https://en.wikipedia.org/wiki/Internationalized_domain_name) through [Punycode](https://en.wikipedia.org/wiki/Punycode). So when you use the command line, you have to use the punycode format return for example by `yunohost domain list`.
## SSL/HTTPS certificates
Another important aspect of domain configuration is the SSL/HTTPS certificate. YunoHost is integrated with Let's Encrypt, so once your server is correctly reachable from anybody on the internet through the domain name, the administrator can request a Let's Encrypt certificate. See the documentation about [certificates](/admin/domains/certificate) for more information.
================================================
FILE: docs/admin/30.apps/custom_apps.mdx
================================================
---
title: Installing "custom" apps
---
While YunoHost has many apps available in the catalog, you may want to install apps that are not available in the official catalog, or set up your very own website that you crafted using HTML / CSS / PHP ..
## Installing your very own webapp
A special application exists called [My webapp](https://apps.yunohost.org/app/my_webapp).
It can be seen as "an empty shell" in which you can drop your own HTML, CSS, JS, etc files through SFTP or other means. It also supports PHP, and an SQL database can be initialized.
## Adding a reverse proxy to an app that you manually installed, for example using Docker
While YunoHost apps do not use Docker for reasons that are beyond the scope of this page, you can manually install Docker apps on your server (assuming you know what you're doing and won't tinker too much with the base system ...). However, this is not limited to Docker, you may have deployed an app "manually" using Python, Ruby or another language, and such an app usually listens on a specific port.
Once your app or container is set up, you will probably need to actually *expose* the container on the web on a specific URL. This can be done using another special app called [Redirect](https://apps.yunohost.org/app/redirect).
Make sure to choose the reverse proxy mode, and point it to something like `http://127.0.0.1:PORT` where `PORT` is the port of your custom app.
It will add the appropriate configuration bits in Nginx, SSOwat and a tile in the user portal.
## Adding a custom tile in the portal pointing to an external app
The [Redirect app](https://apps.yunohost.org/app/redirect) can also be used to add a "shortcut" tile in the user portal that points to an app or page located on a completely different server. Make sure to use the "explicit redirect" mode and the URL of the external page or app.
Generally, you should refrain from manually tinkering and installing apps, except if you are sure they will not interfere with your server. YunoHost proposes two generic apps to help you out:
================================================
FILE: docs/admin/30.apps/index.mdx
================================================
---
title: 📦 Applications
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import Highlight from '@site/src/components/Highlight';
import {HighlightApplications, HighlightAppInstall} from '@site/src/components/Highlight';
One of the key feature of YunoHost is the ability to easily install applications which are then immediately usable. Example of applications include a blog system, a "cloud" (to host and sync files), a website, an RSS reader...
Applications can be installed and managed through the webadmin interface in <HighlightApplications/> or through commands of the `yunohost app` category.
<Figure caption="Apps list in the webadmin, with its Install button." src="/img/webadmin/apps_list.png"/>
The application catalog and its categories can be browsed directly from the webadmin by clicking on the <HighlightAppInstall/> button in the apps list, or from this documentation.
<div class="text--center">
<Button url="https://apps.yunohost.org/" border="none" color="black" backgroundColor="orange"><FAIcon icon='fa-cubes'/> Browse the application catalog <FAIcon icon='fa-arrow-right'/></Button>
</div>
:::caution
Be careful and stay reasonable on the number of installed applications. Each additional installation increases the attack surface and the risk of failure. Ideally, if you want to test, do it with another instance for example in [a virtual machine](/admin/get_started/install_on/virtualbox).
:::
## Installing an app
Let's say you want to install a *Custom Webapp*. Before actually running the installation steps, YunoHost will usually have you fill in a form to properly set it up for you.
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
<Figure src="/img/webadmin/app_install_form.png" caption="Pre-installation form of the Custom Webapp"/>
</TabItem>
<TabItem value="cli" label="From the command line">
<Figure src="/img/app_install_form_cli.png" caption="Pre-installation form of the Custom Webapp in CLI"/>
</TabItem>
</Tabs>
### Subpaths vs. individual domains per apps
Among specific questions, forms usually ask you to choose a domain and a path onto which the app will be accessible.
In the context of YunoHost, it is quite common to have a single (or a few) domains on which several apps are installed in "subpaths", so that you end up with something like this:
```text
yolo.com
├── /blog : WordPress (a blog)
├── /cloud : Nextcloud (a cloud service)
├── /rss : TinyTiny RSS (a RSS reader)
├── /wiki : DokuWiki (a wiki)
```
Alternatively, you may choose to install each (or some) apps on a dedicated domain. Beyond the aesthetic, using sub-domains instead of sub-paths allows the possibility to move a service to another server more easily. Also, some applications may need an entire domain dedicated to them, for technical reasons. The disadvantage is that you have to add a new domain each time, and therefore potentially configure additional DNS records, restart the diagnostics and install a new Let's Encrypt certificate.
This might look prettier for end users, but is generally considered more complicated and less efficient in the context of YunoHost, since you need to add a new domain each time. Nevertheless, some apps might need an entire domain dedicated to them, for technical reasons.
If all apps from the previous example were installed on a separate domain, this would give something like this:
```text
blog.yolo.com : WordPress (a blog)
cloud.yolo.com : Nextcloud (a cloud service)
rss.yolo.com : TinyTiny RSS (a RSS reader)
wiki.yolo.com : DokuWiki (a wiki)
```
:::info
Many applications integrate a feature that allows you to change the URL of your application. This choice between subpath and subdomain can be reversed in some cases via a simple manipulation in the administration interface.
:::
### User access management and public apps
The installation form usually asks whether or not the app should be publically accessible. If you choose to not make it public, only users logged in YunoHost will be able to reach it.
:::tip
After installation, this can be configured via the webadmin in the [Groups and permissions panel](/admin/users/groups_and_permissions), or similarly via the command-line subcategory `yunohost user permission`.
:::
### Instructions after installation
Some applications need to give you instructions, URLs or credentials once they are installed. So remember to check the email of the first user account or the admin user selected before installation, if it was prompted.
### Multi-instance applications
Some applications support the ability to be installed several times (at different locations) ! To do so, just go another time in <HighlightApplications/> → <HighlightAppInstall/>, and select again the application to install.
## LDAP / SSO integration
Applications that allow users to register may support integration with the LDAP / Single Sign On of YunoHost, so that users who connect to the user portal can be automatically logged in all these apps.
However, some applications do not support this as it can be either not implemented in the upstream, or the package does not work on this part yet. This information is usually available on the README of the application package.
## Application configuration
After installation, some settings handled by YunoHost can be tweaked, such as user and group permissions, application's tile and label in the SSO page, or its access URL.
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
You can access the app's operations page by clicking its name in the applications list.
<Figure src="/img/webadmin/app_config_operations.png" caption="Application operations page in the webadmin"/>
You can also delete the application from this page.
</TabItem>
<TabItem value="cli" label="From the command line">
From the command line, you can change:
- the app's label in the SSO: `yunohost app change-label <app> <new_label>`
- the app's url: `yunohost app change-url app [-d <DOMAIN>] [-p <PATH>]`
You can also delete the app: `yunohost app remove <app>`
`<app>` is to be replaced with the app's ID. If this is the first instance of the app, like Nextcloud, the ID is `nextcloud`. If this is the second, then it's `nextcloud__2` and so on. To list all your apps and check their ID, you can run `yunohost app info`.
</TabItem>
</Tabs>
### Configuration panels
Some apps include a *configuration panel*, which features actions and settings specific for each app that they usually do not handle themselves. They can also spare you the need for altering configuration files by hand.
:::info
Configuration panels are *not* meant to tweak every aspects of the apps. You will surely use their own administration panels more often than YunoHost's configuration panels.
:::
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
The configuration panels are accessible in the webadmin in their operations page, trough the <Highlight no_break={true} color='darkblue'><FAIcon icon="fa-cogs"/> Config panel</Highlight> button.
<Figure src="/img/webadmin/app_config_panel.png" caption="Configuration panel for My Webapp"/>
</TabItem>
<TabItem value="cli" label="From the command line">
From the command line, you can list the configuration panel settings with the following command: `yunohost app config get <app>`
```bash
$ yunohost app config get my_webapp
main.php_fpm_config.phpversion:
ask: PHP version
value: none
main.sftp.password:
ask: Set a password for the SFTP access
value: **************
main.sftp.with_sftp:
ask: Do you need a SFTP access?
value: yes
```
To change a setting, either use `yunohost app config set <app>` to get prompted about all the settings, or use `yunohost app config set <app> <key> -v <new_value>` to alter a specific one.
The `<key>` is the setting name, for example `main.sftp.with_sftp` from above.
</TabItem>
</Tabs>
## Execute commands within the app
Starting YunoHost v11.1.21.4, if you need to execute commands with the app's binary, or PHP commands, etc., you can execute the command `yunohost app shell <app>`.
It will:
- open a new Bash shell as the app's system user
- open the app's working directory (e.g. `/var/www/<app>`)
- preload the environment with variables taken from the app's service, if it exists
- override `php`, so that it points to the PHP version used by the app
## Applications packaging
Applications must be packaged manually by application packagers/maintainers. Apps can be integrated with YunoHost to support upgrades, backup/restore and LDAP/SSO integration among other things.
If you want to learn or contribute to app packaging, please check the [contributor documentation](/dev/).
### Integration and quality levels
Automated tests are being run regularly to test the integration and quality of all apps who were declared to be `working` by packagers. The result is a level between 0 and 8, whose meaning is detailed on [this page](/dev/packaging/test). Some tests results may also be available [on this dashboard](https://apps.yunohost.org/dash).
By default, only applications of sufficient quality are offered. When the quality of an application drops and until the problem is reolved, the app is hidden from the catalog to prevent its installation and its upgrades are put on hold.
================================================
FILE: docs/admin/35.email/05.clients.mdx
================================================
---
title: Configure email clients
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
You can fetch and send emails using your YunoHost instance from desktop email clients such as Thunderbird Desktop or on your smartphone with applications like K-9 Mail.
Modern mail clients should be able to configure themselves automatically. If autoconfiguration fails, you can do it manually following the instructions below. (If the autoconfiguration fails though, it should be understood as a bug in YunoHost, and we would be glad to read your feedback to try to reproduce the issue on our side!)
### Generic settings
Here are the element you should enter to manually configure your mail client (`domain.tld` refers to what's after the @ in your email address, and `username` what's before @).
| Protocol | Port | Encryption | Authentication | Username |
| :--: | :-: | :--: | :--: | :--: |
| IMAP | 993 | SSL/TLS | Normal password | `username` (without the `@domain.tld`) |
| SMTP | 587 | STARTTLS | Normal password | `username` (without the `@domain.tld`) |
### Client by client
<Tabs>
<TabItem value="thunderbird" label="Mozilla Thunderbird">
##### <SmallInline url='/img/icons/logo-thunderbird.png'/> Configure Thunderbird Desktop (on a desktop computer)
To manually configure a new account in Thunderbird Desktop, add the account information, then click on 'Configure manually'.
- For the incoming server, use IMAP with port 993 and SSL/TLS.
- For outgoing server, use port 587 with STARTTLS.
- Select 'Normal Password' for the the authentication method of both.
You may need to accept the certificate exceptions for fetching mails and after you send your first mail. Don't forget to remove the dot before the domain name.


- [Manage alias mails](https://support.mozilla.org/en-US/kb/configuring-email-aliases)
</TabItem>
<TabItem value="k9" label="K-9 Mail (Thunderbird Mobile)">
##### <SmallInline url='/img/icons/logo-k9.png'/> Configure K-9 Mail / Thunderbird Mobile (on Android)
Follow the following steps. (As for Thunderbird Desktop, you might need to accept certificates at some points)
- Enter your email address then click "Next"
<img src="/img/softwares/thunderbird_mobile_config_1.png" width="280"/>
- Enter your domain name in the "Server" field, fill the "Security" and "Port" fields as per the IMAP row in the table above, then enter your password in the "Password" field and click "Next"
<img src="/img/softwares/thunderbird_mobile_config_2.png" width="280"/>
- Again, your domain name in the "Server" field, but fill the "Security" and "Port" fields as per the SMTP row in the table above, then enter your password in the "Password" field and click "Next"
<img src="/img/softwares/thunderbird_mobile_config_3.png" width="280"/>
</TabItem>
<TabItem value="dekko" label="Dekko">
##### <SmallInline url='/img/icons/logo-dekko.png'/> Configure Dekko (on Ubuntu Touch)
The first time you can simply choose "Add account". If you already have an account configured, tap the hamburger menu then tap the gear, choose Mail, Accounts and press the '+'-symbol.
Then you choose IMAP. Fill in the fields and press Next. Now Dekko will look for the configuration. Check that all fields are correct. Make sure you have your YunoHost username, NOT your email address and choose "Allow untrusted certificates". Do this for IMAP and SMTP and press Next. Dekko will now synchronise the account after which you are done. Congratz!
<img src="/img/softwares/dekko_config_1.png" width="280"/>
<img src="/img/softwares/dekko_config_2.png" width="280"/>
<img src="/img/softwares/dekko_config_3.png" width="280"/>
<img src="/img/softwares/dekko_config_4.png" width="280"/>
</TabItem>
</Tabs>
================================================
FILE: docs/admin/35.email/10.migration.mdx
================================================
---
title: Migrate emails to YunoHost
---
*[Documentation linked to YunoHost email](/admin/email)*.
Migration of emails from one server to another can be done with two recommended tools: ImapSync or Larch.
This tool must be installed on your desktop computer. The transfer method looks at this schema:
**`Old email server −> desktop computer with ImapSync or Larch −> new email server`**
### ImapSync
[ImapSync site](http://imapsync.lamiral.info/)
Install ImapSync on your client computer by following this [guide](http://imapsync.lamiral.info/INSTALL):
```bash
sudo dnf install imapsync # Under Fedora
```
Transfer emails from one server to another:
```bash
imapsync --host1 <domain/IP> --port1 993 --ssl1 --user1 <user> --password1 <password> \
--host2 <domain/IP> --port2 993 --ssl2 --user2 <user> --password2 <password>
```
Note that transfer settings `--port 993` and `--ssl` are specific to YunoHost email server.
### Larch
[Larch site](https://github.com/rgrove/larch/)
After beforehand installed `gem`, install `larch` on your client computer:
```bash
sudo gem install larch
```
Transfer emails from one server to another:
```bash
larch -a -f imaps://server_of_origin.org -t imaps://server_of_destination.org
```
For other types of transfer refer to [Larch documentation](https://github.com/rgrove/larch#label-Usage).
================================================
FILE: docs/admin/35.email/index.mdx
================================================
---
title: 📬 Emails
---
import Highlight from '@site/src/components/Highlight';
import {HighlightWebAdmin, HighlightDiagnosis, HighlightApplications, HighlightAppInstall} from '@site/src/components/Highlight';
YunoHost comes with a complete mail stack allowing you to host your own email server, and therefore to have your own email addresses in `something@your.domain.tld`.
The mail stack includes an SMTP server (Postfix), an IMAP server (Dovecot), antispam (Rspamd) and DKIM configuration.
## Making sure your setup is right
Email is a complicated ecosystem and quite a few details can prevent it from working properly.
To validate your setup:
- if you are self-hosting at home and not using a VPN, ensure [your ISP doesn't block port 25](/admin/get_started/providers/isp/) ;
- route ports according to [this documentation](/admin/get_started/post_install/port_forwarding) ;
- carefully configure mail DNS records according to [this documentation](/admin/get_started/post_install/dns_config) ;
- test your configuration using the diagnostic features (<HighlightWebAdmin/> → <HighlightDiagnosis/> → <Highlight no_break={true} color='grey'><FAIcon icon="fa-envelope"/> Email</Highlight> ). You can also use [mail-tester.com](https://mail-tester.com); a score of at least 8~9/10 is a reasonable goal <small>(be careful: only 3 tests per domain per day are allowed)</small>
## Email clients
To interact with the email server (read and send emails), you can either install a webmail client such as Roundcube or Rainloop on your server or configure a desktop/mobile client as described in [this page](/admin/email/clients).
Desktop and mobile clients have the advantage of copying your emails to the device, allowing offline viewing and relative protection against possible hardware failures of your server.
## Configuring email aliases and auto-forwards
Mail aliases and forwards can be configured for each user. For instance, the first user created on the server automatically has an alias `root@the.domain.tld` configured—meaning that an email sent to this address will end up in the inbox of the first user. Automatic forwards may be configured, for instance if a user doesn't want to configure an additional email account and just wants to receive emails from the server on, say, his/her Gmail address (a copy of each email will be kept on the YunoHost server).
Another feature which few people know about is the use of suffixes beginning with "+". For example, emails sent to `johndoe+booking@the.domain.tld` will automatically land in the `booking` directory (lowercase) of John Doe's mailbox or in John Doe's inbox if the `booking` directory doesn't exist. It is a practical technique, for example, to provide an email address to a website, then easily sort (via automatic filters) the mail coming from this website.
Groups also can use alias features; by default, the group `admins` has aliases such as `root@<domain.tld>` and `webmaster@<domain.tld>`. [More info on the groups and permissions page](/admin/users/groups_and_permissions).
## What happens if my server becomes unavailable?
If your server becomes unavailable, emails sent to your server will stay in a pending queue on the sender's side for as long as ~5 days. The sender's host will regularly try to resend the email, until it drops it if it was unable to send it.
## See also
- [Removing your server’s IP/domain from antispam listings](/admin/troubleshooting/blacklist_forms).
- [Migrating from an email provider to a YunoHost instance](/admin/email/migration)
- [Configuring an SMTP relay](/admin/tutorials/email_configure_relay).
================================================
FILE: docs/admin/40.backups/05.evaluate.mdx
================================================
---
title: Backup strategies
---
In the context of self-hosting, backups are an important element to compensate for unexpected events (fire, database corruption, loss of access to the server, compromised server...). The backup policy to implement depends on the importance of the services and data you manage. For example, backing up a test server will be of little interest, while you will want to be very careful if you are managing critical data for an association or a company - and in such cases, you will want to store the backups *in a different location or locations*.
## What is a good backup?
A good backup consists of at least **3 copies of the data** (including the original data), on at least **2 separate storages**, in at least **2 separate locations** (far enough apart) and ideally with 2 separate methods. If your backups are encrypted **these rules also apply to the decryption phrase/key**.
A good backup is also in many cases, a recent backup, so it takes either a lot of rigor or to **automate** the process.
A good backup is checked regularly to ensure the effectiveness and integrity of the data.
Finally, a good backup is one that is **restorable within an acceptable timeframe** for you. Remember to document your restoration method and to estimate the transfer time of a copy, especially if the Internet connections involved are not symmetrical.
:::info
Example of **a robust and comfortable combination**:
- a remote and automatic backup with borg
- a backup on external disk and automatic with borg
- a regular snapshot/image (and before updates)
- a monitored RAID 1 array (or a commercial VPS that will also be on an array)
- a decryption passphrase stored on 3 media in 2 locations
:::
## Some possible methods
- [generate an archive and download it manually (default method of YunoHost)](/admin/backups)
- [backup automatically (recommended method)](/admin/backups/backup_methods)
- [generate an archive directly on another disk](/admin/tutorials/external_storage)
- [make a disk image or snapshot](/admin/backups/clone_filesystem)
- [save useful data via a custom method](/admin/backups/custom_backup_methods)
## Risks
Below, a list of risks sorted from the most to the least probable, whose probability remains to be adapted according to your situation (location of the server, quality of the installations, user profiles, etc.). It is up to you to put the cursor where it should be, especially considering the consequences of a data loss.
:::caution
Keep in mind that real accidents are linked to the occurrence of 2 events simultaneously.
:::
- **Lack of rigor**: strategies based on manual backups require a lot of rigor in the regularity
- **Bad handling**: it can happen that a backup is erased by mistake during a restoration or if you rely on a synchronization system, you could delete a file and the deletion would be synchronized instantly
- **Cryptolocker**: this is a virus that encrypts files and demands a ransomware. If your users are using nextcloud and windows, an infected windows could synchronize encrypted files and thus you lose your copy.
- **Hardware failure**: SD cards are the least reliable media over time (~2 years of life in a server), followed by SSD disks (about 3 years of life) and hard drives (3 years). Note that a new equipment has also probability to break down during the first 6 months. In all cases, your copies should not be on the same physical media.
- **Software failure/bug**: a software bug may result in data deletion or you may not know how to fix a problem and want to restore your system.
- **Electricity or internet failure**: do you have a plan if this happens? What if you are on vacation?
- **Disaster or natural or unnatural event**: a small child, a cat, lightning or a simple leak can destroy your equipment. Fires or floods can also destroy your backup copy at the other end of your home...
- **Server compromise**: a malicious person or a robot could attack your server and delete your data
- **Machine theft**: a burglary or theft of a computer on which your password manager is located to decrypt your backups
- **Search**: whether you are guilty or not, a search can result in the seizure of the entire computer equipment of a place (or even several)
- **Death/health problem**: you may not be able to type your passphrase anymore
## About Nextcloud or Thunderbird (IMAP) synchronization
A method that allows a partial backup is to backup files and emails via synchronization software like Nextcloud client or ThunderBird. This way, you avoid the risk of hardware failure.
If this method is easy to set up, it is not without risk because of the synchronization itself. For example, if you are on Windows or Mac, you increase the risk of data loss following the encryption of files by a [cryptolocker](https://en.wikipedia.org/wiki/Ransomware) type virus. On any type of system, a false manipulation can delete all your copies on the server and on the equipment that synchronizes. This concern is aggravated by the fact that the deletion synchronization is usually rather instantaneous.
While the risk of false manipulation can be mitigated by desktop backup software such as TimeShift, the risk of false manipulation can only be mitigated by a backup on a hard drive. Only a backup on a disconnected external hard drive really protects you from ransomware.
================================================
FILE: docs/admin/40.backups/10.backup_methods.mdx
================================================
---
title: Backup methods
---
YunoHost currently has three apps integrating backup solutions offering more features than the simple ".tar" mechanism shipped in YunoHost, in particular automatic and remote backups.
## [BorgBackup](https://www.borgbackup.org/) (cf the [Borg "client"](https://apps.yunohost.org/app/borg) and [Borg "server"](https://apps.yunohost.org/app/borgserver) apps)
- backup of data on an external disk or on a remote Borg repository
- deduplication and compression of files, which makes it possible to keep many previous copies without too much storage overhead
- data encryption, which allows you to store data with a third party
- to define the frequency and type of data to be backed up
- a mail alert system in case of backup failure.
There are [remote borg repository providers](https://www.borgbackup.org/support/commercial.html), it is also possible to create your own repository on another YunoHost with the [borgserver application](https://github.com/YunoHost-Apps/borgserver_ynh).
## [Restic](https://restic.net/) (cf the [Restic app](https://apps.yunohost.org/app/restic))
- backup of data to remote storage (support for different types of storage: SFTP, S3, Backblaze B2, Azure, etc. *SFTP is recommended* for simplicity)
- deduplication and compression of files, which makes it possible to keep many previous copies without too much storage overhead
- data encryption, which allows you to store data at a third party
- to define the frequency and type of data to be backed up
- a mail alert system in case of backup failure.
## [Archivist](https://apps.yunohost.org/app/archivist)
:::warning
This application is currently broken!
:::
- based on rsync and GPG
- backup of data on a remote storage (support for different types of storage)
- data encryption, which allows you to store data at a third party
The package also allows you to finely define the frequency and type of data to be backed up and integrates an email alert system in case of backup failure.
More info [on the forum](https://forum.yunohost.org/t/new-app-archivist/3747).
================================================
FILE: docs/admin/40.backups/15.clone_filesystem.mdx
================================================
---
title: Snapshotting the entire filesystem
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
YunoHost's backup tool only backs up useful files and relies on restore scripts to reinstall the dependencies of your applications. In other words, YunoHost's mechanism amounts to reinstalling and then reincorporating the data.
Making full system images can be a complementary or alternative way to backup your machine. The advantage is that your system can be restored to the exact state it was in at the time of the backup.
Depending on your type of installation, you can either create a snapshot or clone the storage medium by removing it from your server (turned off).
## Creating a snapshot
A snapshot allows you to freeze an image of the file system. Snapshots are very useful when doing an update or testing, because they allow you to easily go back in case of a glitch. On the other hand, apart from some very high availability clusters, snapshots do not really protect you against hardware failures or disasters (cf. OVH fire in Strasbourg in 2021).
In general, snapshots are quite disk space saving, the principle is that your file system will store the differences that occurred since your snapshot. Thus, only the modifications consume space.
:::info
Remember to delete the old snapshots to avoid wasting your storage space by storing all the differences since that date!
:::
You can use this method with most VPS (often paying), virtual machine managers or if you have installed YunoHost with an advanced filesystem like btrfs, ceph or ZFS, you can also create snapshots via the command line
<Tabs>
<TabItem value="vps" label="VPS">
Below, some documentation for the most known suppliers:
- [DigitalOcean (EN)](https://docs.digitalocean.com/products/images/snapshots/)
- [Gandi](https://docs.gandi.net/fr/simple_hosting/operations_courantes/snapshots.html)
- [OVH](https://docs.ovh.com/fr/vps/snapshot-vps/)
- [Scaleway (EN)](https://www.scaleway.com/en/docs/backup-your-data-with-snapshots/)
</TabItem>
<TabItem value="virtualbox" label="VirtualBox">
Select the virtual machine and click `Snapshots`, then specify the snapshot name and click `OK`.

To restore, select the virtual machine, click on `Snapshots` then `Restore Snapshot option`.

Then click on `Restore Snapshot`.

</TabItem>
<TabItem value="proxmox" label="Proxmox">
- Select the virtual machine
- Go to the `Backup` tab
- Click on `Backup now`.
- Choose `Snapshot` mode
- Validate
</TabItem>
<TabItem value="btrfs" label="BTRFS">
Below we consider that `/pool/volume` is the volume to snapshot.
Create a read-only snapshot
```bash
btrfs subvolume snapshot /pool/volume /pool/volume/$(date +"%Y-%m-%d_%H:%M")
```
List snapshots
```bash
btrfs subvolume show /pool/volume
```
Restore a snapshot
```bash
btrfs sub del /pool/volume
btrfs sub snap /pool/volume/2021-07-22_16:12 /pool/volume
btrfs sub del /pool/volume/2021-07-22_16:12
```
Delete a snapshot
```bash
btrfs subvolume delete /pool/volume/2021-07-22_16:12
```
:::caution
Be careful not to delete the original volume
:::
:::tip
See [this tutorial](https://www.linux.com/training-tutorials/how-create-and-manage-btrfs-snapshots-and-rollbacks-linux-part-2/) for more info
:::
</TabItem>
<TabItem value="ceph" label="CEPH">
Below we consider that `pool/volume` is the volume to snapshot.
Create a snapshot
```bash
rbd snap create pool/volume@$(date +"%Y-%m-%d_%H:%M")
```
List snapshots
```bash
rbd snap ls pool/volume
```
Restore a snapshot
```bash
rbd snap rollback pool/volume@2021-07-22_16:22
```
Delete a snapshot
```bash
rbd snap rm pool/volume@2021-07-22_16:12
```
</TabItem>
<TabItem value="zfs" label="ZFS">
Below we consider that `pool/volume` is the volume to snapshot.
Create a snapshot
```bash
zfs snapshot pool/volume@$(date +"%Y-%m-%d_%H:%M")
```
List snapshots
```bash
zfs list -t snapshot -o name,creation
```
Restore a snapshot
```bash
zfs rollback pool/volume@2021-07-22_16:22
```
Delete a snapshot
```bash
zfs destroy pool/volume@2021-07-22_16:12
```
</TabItem>
</Tabs>
## Create a cold image of the file system
You can clone your media (SD card, ssd disk, VPS volume...) to create a disk image. This image before compression will be the exact size of your media, that's why this method applies rather to machines of less than 64GB.
Unless you can read a snapshot, this method requires you to stop the server while you create the image. With a VPS, you have to restart in rescue mode from your provider's interface.
<Tabs>
<TabItem value="usbimage" label="With USBimager">
This can be done with [USBimager](https://bztsrc.gitlab.io/usbimager/) (Note: make sure you download the 'Read-write' version! Not the 'Write-only' version!). The process then consists of the "reverse" of the SD card flashing process:
- Turn off your server
- Retrieve the SD card and plug it into your computer
- In USBimager, click on "Read" to create an image ("photograph") of the SD card. You can use the resulting file to restore the whole system later.
More details in [USBimager documentation](https://gitlab.com/bztsrc/usbimager/#creating-backup-image-file-from-device)
</TabItem>
<TabItem value="dd" label="In command line with dd">
It is possible to achieve the same thing with `dd` if you are comfortable with the command line:
```bash
dd if=/dev/mmcblk0 | gzip > ./my_snapshot.gz
```
(replace `/dev/mmcblk0` with the real name of your SD card or hard drive)
</TabItem>
</Tabs>
================================================
FILE: docs/admin/40.backups/20.avoid_hardware_failure.mdx
================================================
---
title: Avoid hardware failure
---
## Physically secure your server
Very often people who self-host don't have proper storage for their system. Leaving the server in several parts, in a high traffic area, accessible to children or pets, or in a poorly ventilated area can quickly turn into a disaster.
## Secure your hard drives
Ideally, your hard disks should be fixed to prevent vibrations which can accelerate the wear of the equipment or even reduce its performance, especially if there is another disk next to it.
## Reduce swapiness for SD cards and SSDs
If you use a swap file with an SSD or SD card with too much swapiness, your storage media could give up the ghost prematurely due to too many writes.
To prevent this:
```bash
cat /proc/sys/vm/swappiness
```
If it is above 10:
```bash
sysctl vm.swappiness=10
nano /etc/sysctl.conf
```
If present, change the vm.swappiness value to 10. Otherwise add the line:
```text
vm.swappiness = 10
```
## Storage redundancy
In order to limit hardware failures of storage media, it can be relevant to set up a cluster of mirrored disks (RAID, ZFS). The idea here is that everything that is written to one disk will be written to the other. This way, if one fails, the other continues to work and the server is still fully functional.
There are also more advanced clusters that maximize fault tolerance (failure of 2 disks like RAID6) or storage (see RAID 5).
However, these disk clustering techniques should not be considered as backups. A RAID array should be considered as a single storage medium. Indeed, if this technique prevents having to reinstall in case of a probable disk crash, it is far from zero risk.
Some examples of situations known to professional system administrators:
- the disks of a cluster mounted with disks of the same brand can fail almost at the same time within a few hours
- without monitoring the health of the disks, there is a good chance that the failure of one disk in the cluster will only be noticed when a second one fails (\>\<)
- if you don't have a spare disk, the delay in purchasing one may result in the other disk crashing
- a half-functional disk that produces errors can propagate its error through the cluster
- the disk connectors or the RAID controller can also produce errors or fail
- the more complex you make the architecture with many components, the more likely it is that one of them will fail
:::info
If you want to set up a RAID array or use btrfs, the easiest way is to do it at installation with the YunoHost iso in expert mode (when partitioning the system).
:::
================================================
FILE: docs/admin/40.backups/25.include_exclude_files.mdx
================================================
---
title: Include or exclude files
---
## Include files
YunoHost usually already knows what needs to be backed up. However, if you have made manual changes, such as installing an app outside of the YunoHost application system, you may want to extend YunoHost's mechanism to specify other files to be backed up.
By default, if configurations tracked by YunoHost are changed, they will be backed up. On the other hand, a database or an app added by hand, changes on some configurations not tracked, will not be backed up.
You can create a backup hook and a restore hook to add data to backup. Here is an example:
`/etc/yunohost/hooks.d/backup/99-conf_custom`
```bash
#!/bin/bash
# Source YNH helpers
source /usr/share/yunohost/helpers
ynh_backup_dest (){
YNH_CWD="${YNH_BACKUP_DIR%/}/$1"
mkdir -p $YNH_CWD
cd "$YNH_CWD"
}
# Exit hook on subcommand error or unset variable
ynh_abort_if_errors
# Openvpn
ynh_backup_dest "conf/custom/openvpn"
ynh_backup "/etc/sysctl.d/openvpn.conf"
ynh_backup "/etc/openvpn"
ynh_backup "/etc/fail2ban/jail.d/openvpn.conf"
ynh_backup "/etc/fail2ban/filter.d/openvpn.conf"
# Samba
ynh_backup_dest "conf/custom/samba"
ynh_backup "/etc/samba"
ynh_backup "/var/lib/samba"
ynh_backup "/etc/yunohost/hooks.d/post_user_create/99-samba"
ynh_backup "/etc/yunohost/hooks.d/post_user_delete/99-samba"
ynh_backup --src_path="/etc/yunohost/hooks.d/post_user_update/99-samba" --not_mandatory
ynh_backup "/etc/cron.daily/clean-trash"
# MISC
ynh_backup_dest "conf/custom/misc"
ynh_backup "/etc/sysctl.d/noipv6.conf"
ynh_backup "/usr/local/bin/"
ynh_backup "/etc/yunohost/hooks.d/backup/99-conf_custom"
ynh_backup "/etc/yunohost/hooks.d/restore/99-conf_custom"
```
`/etc/yunohost/hooks.d/restore/99-conf_custom`
```bash
#!/bin/bash
# Source YNH helpers
source /usr/share/yunohost/helpers
ynh_restore_dest (){
YNH_CWD="${YNH_BACKUP_DIR%/}/$1"
cd "$YNH_CWD"
}
# Exit hook on subcommand error or unset variable
ynh_abort_if_errors
# Openvpn
app="custom_openvpn" # This variable is important for the following helper
ynh_install_app_dependencies "openvpn openvpn-auth-ldap samba"
ynh_restore_dest "conf/custom/openvpn"
ynh_restore_file "/etc/sysctl.d/openvpn.conf"
ynh_restore_file "/etc/openvpn"
ynh_restore_file "/etc/fail2ban/jail.d/openvpn.conf"
ynh_restore_file "/etc/fail2ban/filter.d/openvpn.conf"
# Samba
app="custom_samba" # This variable is important for the following helper
ynh_install_app_dependencies "samba"
ynh_restore_dest "conf/custom/samba"
ynh_restore_file "/etc/samba"
ynh_restore_file "/var/lib/samba"
ynh_restore_file "/etc/yunohost/hooks.d/post_user_create/99-samba"
ynh_restore_file "/etc/yunohost/hooks.d/post_user_delete/99-samba"
ynh_restore_file --src_path="/etc/yunohost/hooks.d/post_user_update/99-samba" --not_mandatory
ynh_restore_file "/etc/cron.daily/clean-trash"
chown -R openvpn:openvpn /etc/openvpn
# MISC
ynh_restore_dest "conf/custom/misc"
ynh_restore_file "/etc/sysctl.d/noipv6.conf"
ynh_restore_file "/usr/local/bin/"
ynh_restore_file "/etc/yunohost/hooks.d/backup/99-conf_custom"
ynh_restore_file "/etc/yunohost/hooks.d/restore/99-conf_custom"
```
## Exclude files
There is no mechanism to exclude specific files from a YunoHost backup, other than the 2 options presented below:
### Avoid backing up certain `/home` folders
If needed, you can specify that certain user `home` folders not be backed up by the `yunohost backup` command, by creating an empty file named `.nobackup` inside.
Caution: this setup only works with **first-level subfolders of `/home`**, such as `/home/user1` or `/home/yunohost.multimedia`. It does not work for other levels of subfolders, like `/home/user1/bigfolder/`.
### Do not backup large amounts of data
Some apps like Nextcloud are potentially attached to large amounts of data. It is possible to not backup them by default. In this case, the app is said to "backup only the core" (of the app).
During an update, apps containing a large amount of data usually make a backup without these data.
To temporarily disable backup of large data, for applications that implement this feature, you can set the `BACKUP_CORE_ONLY` variable. To do this, the variable must be set before the backup command:
```bash
BACKUP_CORE_ONLY=1 yunohost backup create --apps nextcloud
```
Be careful: you will have to backup Nextcloud users' data yourself.
If you want this behavior to be permanent:
```bash
yunohost app setting nextcloud do_not_backup_data -v 1
```
================================================
FILE: docs/admin/40.backups/30.custom_backup_methods.mdx
================================================
---
title: Custom backup methods
---
It is possible to create your own backup method and link it to YunoHost's backup file collection system. This can be useful if you want to use your own backup software or conduct disk mount/dismount operations for example.
This operation is done with a hook and will allow you to launch a backup this way:
```bash
yunohost backup create --method custom
```
Below is a simplistic example that can be used to set up a rotational backup with different disks that are changed every week:
`/etc/yunohost/hooks.d/backup_method/05-custom`
```bash
#!/bin/bash
set -euo pipefail
work_dir="$2"
name="$3"
repo="$4"
size="$5"
description="$6"
case "$1" in
need_mount)
# Set false if your method can itself put files in good place in your archive
true
;;
backup)
mount /dev/sda1 /mnt/hdd
if [[ "$(df /mnt/hdd | tail -n1 | cut -d" " -f1)" != "/dev/sda1" ]]
then
exit 1
fi
pushd "$work_dir"
current_date=$(date +"%Y-%m-%d_%H:%M")
cp -a "${work_dir}" "/mnt/hdd/${current_date}_$name"
popd
umount /mnt/hdd
;;
*)
echo "hook called with unknown argument \`$1'" >&2
exit 1
;;
esac
exit 0
```
================================================
FILE: docs/admin/40.backups/35.migrate_or_merge_servers.mdx
================================================
---
title: Migrate or merge servers
---
## Migrate a server
If YunoHost's archive system is not convenient enough to migrate a server, you can also [migrate from server to server with rsync](https://www.man42.net/blog/2017/07/how-to-migrate-a-debian-server/).
## Merge 2 YunoHost servers
If you merge 2 servers together, you will need to recreate the users, domains and permissions of the first server on the destination server. Then you can restore app by app.
:::danger
There is a limitation concerning apps that have the same ID. It will not be possible to restore them easily. Also be careful not to delete the eponymous app from the destination server :/
:::
================================================
FILE: docs/admin/40.backups/index.mdx
================================================
---
title: 🚑 Backups
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
In the context of self-hosting, backups are essential for mitigating the impact of unexpected events—such as fires, database corruption, server access issues, or security breaches. The backup strategy you implement should be tailored to the importance of the services and data you are managing. For instance, backing up a test server will be of little interest, whereas when handling critical data for an NGO or business, backups become much more vital. In these cases, it’s crucial to store backups in one, or ideally **several** locations.
## Manual backup
YunoHost comes with a backup system that allows you to back up (and restore) system configurations and data (e.g. emails) and apps, if they support it.
You can manage backups either from the command line (`yunohost backup --help`) or from the web administration (in the Backups section), though some features are not yet available in the webadmin.
The current default method consists of creating a `.tar` archive containing all relevant files.
#### Creating backups
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
You can easily create backup archives from the webadmin by going to `Backups > Local storage` and clicking on `New backup`. You will then be asked to select which configuration, data and apps you want to back up.

</TabItem>
<TabItem value="cli" label="From the command line">
You can create a new backup archive from the command line. Here are a few simple examples of commands and their corresponding behavior:
- Backing up everything (all system parts and apps):
```bash
yunohost backup create
```
- Backing up only apps:
```bash
yunohost backup create --apps
```
- Backing up only two apps (WordPress and shaarli):
```bash
yunohost backup create --apps wordpress shaarli
```
- Backing up only emails:
```bash
yunohost backup create --system data_mail
```
- Backing up emails and WordPress:
```bash
yunohost backup create --system data_mail --apps wordpress
```
For more information and options regarding backup creation, consult `yunohost backup create --help`. You can also list the system parts that can be backed up with `yunohost hook list backup`.
</TabItem>
</Tabs>
### Downloading backups
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
After creating backups, it is possible to list and inspect them using the corresponding views in the web administration interface. A button allows you to download the archive. If the archive is larger than 3GB, it may be better to proceed via SFTP.
`Backup > Local Archives > <Archive name> > Download`
</TabItem>
<TabItem value="sftp" label="With a SFTP client">
Currently, the most accessible way to download big archives is to use the program FileZilla as explained in [this page](/admin/tutorials/filezilla).
By default, backups are stored in `/home/yunohost.backup/archives/`.
</TabItem>
<TabItem value="cli" label="From the command line">
The `yunohost backup list` and `yunohost backup info <archive_name>` commands provide information about the names and sizes of backups.
It is possible to use `scp` (a program based on [`ssh`](/admin/command_line)) to copy files between two machines via the command line. So, from a GNU/Linux machine, you can use the following command to download an archive:
```bash
scp admin@your.domain.tld:/home/yunohost.backup/archives/<archive_name>.tar ./
```
If your SSH port is different from 22
```bash
scp -P ssh_port admin@your.domain.tld:/home/yunohost.backup/archives/<archive_name>.tar ./
```
</TabItem>
</Tabs>
:::caution
Don't forget to store your backup in a different location from your server.
:::
:::info
If you want, you can connect an external disk to your server so that the archives are saved directly to it. See this guide on [adding external storage to your server](/admin/tutorials/external_storage).
:::
### Testing
You should regularly test your backups by at least listing the contents of the archives and checking the size of the associated data. It is best to practice restoration regularly.
```bash
# List the files
tar -tvf /home/yunohost.backup/archives/ARCHIVE.tar | less
# List database exports
tar -tvf /home/yunohost.backup/archives/ARCHIVE.tar | grep "(db|dump)`.sql"
# Check the weight
ls -lh /home/yunohost.backup/archives/ARCHIVE.tar
```
### Restoring backups
:::info
SPOILER: The larger your data volume and the more applications you have, the more complex your recovery will be.
:::
#### Simple case: little data, archive already present
<Tabs groupId="admin-commands">
<TabItem value="web" label="From the web interface">
Go in `Backup > Local storage` and select your archive. You can then select which items you want to restore, then click on 'Restore'.

</TabItem>
<TabItem value="cli" label="From the command line">
From the command line, you can run `yunohost backup list` to get the available archive names. They are basically their filenames without extensions.
You can then run `yunohost backup restore <archivename>` (hence without its `.tar` extension) to restore an archive. As for `yunohost backup create`, this will restore everything in the archive by default. If you want to restore only specific items, you can use something like `yunohost backup restore <archivename> --apps wordpress`, which will restore only the WordPress app.
:::tip
In the case of a complete restoration, it is possible to restore instead of launching the initial configuration.
:::
</TabItem>
</Tabs>
To restore an app, the domain on which it was installed should already be configured (or you need to restore the corresponding system configuration). You also cannot restore an app that is already installed... which means that to restore an old version of an app, you must first uninstall it.
#### Uploading an archive
In many cases, the archive is not on the server on which you want to restore it. So it has to be uploaded, which depending on its size can take more or less time.
<Tabs groupId="admin-commands">
<TabItem value="sftp" label="With a SFTP client">
Currently, the most accessible solution for uploading backups is to use the FileZilla program as explained in [this page](/admin/tutorials/filezilla).
By default, backups are to be placed in `/home/yunohost.backup/archives/`.
gitextract_z2uj399p/
├── .github/
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── actions/
│ │ └── docusaurus/
│ │ └── action.yml
│ └── workflows/
│ ├── auto_regen_pot.yml
│ └── build.yml
├── .gitignore
├── .markdownlint-cli2.yaml
├── README.md
├── docs/
│ ├── admin/
│ │ ├── 01.about_self_hosting.mdx
│ │ ├── 02.what_is_yunohost/
│ │ │ ├── 10.structure.mdx
│ │ │ ├── 20.demo.mdx
│ │ │ └── index.mdx
│ │ ├── 05.get_started/
│ │ │ ├── 02.why_should_you_not_host_yourself.mdx
│ │ │ ├── 05.methods.mdx
│ │ │ ├── 10.providers/
│ │ │ │ ├── 05.registrar/
│ │ │ │ │ ├── _category_.yaml
│ │ │ │ │ ├── gandi.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── namecheap.mdx
│ │ │ │ │ └── ovh/
│ │ │ │ │ ├── _category_.yaml
│ │ │ │ │ ├── autodns.mdx
│ │ │ │ │ └── manualdns.mdx
│ │ │ │ ├── 10.isp.mdx
│ │ │ │ ├── 15.vpn/
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ └── vpn_advantage.mdx
│ │ │ │ ├── 20.servers.mdx
│ │ │ │ └── _category_.yaml
│ │ │ ├── 20.install_on/
│ │ │ │ ├── _configuration.mdx
│ │ │ │ ├── _install_script.mdx
│ │ │ │ ├── arm_board.mdx
│ │ │ │ ├── index.mdx
│ │ │ │ ├── on_top_of_debian.mdx
│ │ │ │ ├── raspberry_pi.mdx
│ │ │ │ ├── regular_computer.mdx
│ │ │ │ ├── remote_server.mdx
│ │ │ │ ├── virtualbox.mdx
│ │ │ │ └── wsl.mdx
│ │ │ ├── 40.post_install/
│ │ │ │ ├── 10.find_ip.mdx
│ │ │ │ ├── 15.port_forwarding.mdx
│ │ │ │ ├── 20.dns_config.mdx
│ │ │ │ └── _category_.yaml
│ │ │ ├── 90.guidelines.mdx
│ │ │ └── _category_.yaml
│ │ ├── 12.webadmin.mdx
│ │ ├── 15.command_line.mdx
│ │ ├── 20.users/
│ │ │ ├── groups_and_permissions.mdx
│ │ │ └── index.mdx
│ │ ├── 25.domains/
│ │ │ ├── certificate.mdx
│ │ │ └── index.mdx
│ │ ├── 30.apps/
│ │ │ ├── custom_apps.mdx
│ │ │ └── index.mdx
│ │ ├── 35.email/
│ │ │ ├── 05.clients.mdx
│ │ │ ├── 10.migration.mdx
│ │ │ └── index.mdx
│ │ ├── 40.backups/
│ │ │ ├── 05.evaluate.mdx
│ │ │ ├── 10.backup_methods.mdx
│ │ │ ├── 15.clone_filesystem.mdx
│ │ │ ├── 20.avoid_hardware_failure.mdx
│ │ │ ├── 25.include_exclude_files.mdx
│ │ │ ├── 30.custom_backup_methods.mdx
│ │ │ ├── 35.migrate_or_merge_servers.mdx
│ │ │ └── index.mdx
│ │ ├── 42.security.mdx
│ │ ├── 43.upgrade/
│ │ │ ├── 11.0-bullseye.mdx
│ │ │ ├── 12.0-bookworm/
│ │ │ │ ├── 05.issues_faq.mdx
│ │ │ │ └── index.mdx
│ │ │ └── index.mdx
│ │ ├── 45.tutorials/
│ │ │ ├── 05.domains/
│ │ │ │ ├── _category_.yaml
│ │ │ │ ├── dns_dynamicip.mdx
│ │ │ │ ├── dns_local_network.mdx
│ │ │ │ ├── dns_nohost_me.mdx
│ │ │ │ └── dns_subdomains.mdx
│ │ │ ├── 10.theming.mdx
│ │ │ ├── 15.filezilla.mdx
│ │ │ ├── 25.external_storage.mdx
│ │ │ ├── 35.email_configure_relay.mdx
│ │ │ ├── 55.moving_app_folder.mdx
│ │ │ ├── 65.sftp_on_apps.mdx
│ │ │ ├── 90.freebox_storage.mdx
│ │ │ └── _category_.yaml
│ │ ├── 50.troubleshooting/
│ │ │ ├── 03.cleanup.mdx
│ │ │ ├── 05.fail2ban.mdx
│ │ │ ├── 10.change_root_password.mdx
│ │ │ ├── 15.noaccess.mdx
│ │ │ ├── 20.ipv6.mdx
│ │ │ ├── 25.blacklist_forms.mdx
│ │ │ └── index.mdx
│ │ ├── 80.advanced/
│ │ │ ├── 40.torhiddenservice.mdx
│ │ │ ├── 45.certificate_custom.mdx
│ │ │ ├── 70.chatons.mdx
│ │ │ └── _category_.yaml
│ │ ├── _category_.yaml
│ │ └── index.mdx
│ ├── community/
│ │ ├── 05.faq.mdx
│ │ ├── 10.help.mdx
│ │ ├── 15.forum.mdx
│ │ ├── 20.chat_rooms.mdx
│ │ ├── 25.yunohost_project_organization.mdx
│ │ ├── 30.project_budget.mdx
│ │ ├── 35.security_team.mdx
│ │ ├── 40.press_kit.mdx
│ │ ├── 40.sponsors_partners.mdx
│ │ ├── 90.terms_of_services.mdx
│ │ └── index.mdx
│ └── dev/
│ ├── 05.git.mdx
│ ├── 10.doc.mdx
│ ├── 20.translation.mdx
│ ├── 50.packaging/
│ │ ├── 05.structure.mdx
│ │ ├── 10.manifest.mdx
│ │ ├── 15.resources.mdx
│ │ ├── 20.scripts/
│ │ │ ├── 20.helpers_v2.0.mdx
│ │ │ ├── 20.helpers_v2.1.mdx
│ │ │ ├── _category_.yaml
│ │ │ └── index.mdx
│ │ ├── 30.doc.mdx
│ │ ├── 40.test.mdx
│ │ ├── 50.publish.mdx
│ │ ├── 60.advanced/
│ │ │ ├── 20.config_panels.mdx
│ │ │ ├── 30.sso_ldap_integration.mdx
│ │ │ ├── 50.hooks.mdx
│ │ │ ├── 60.advanced_packagers.mdx
│ │ │ ├── 70.packaging_v2.mdx
│ │ │ └── _category_.yaml
│ │ ├── 80.misc/
│ │ │ ├── _category_.yaml
│ │ │ ├── packaging_apps_git.mdx
│ │ │ ├── packaging_apps_virtualbox.mdx
│ │ │ └── shell_variables_scope.mdx
│ │ ├── 90.policy.mdx
│ │ └── index.mdx
│ ├── 80.core/
│ │ ├── 05.architecture.mdx
│ │ ├── 10.devenv.mdx
│ │ ├── 20.ynh_core.mdx
│ │ ├── 25.ynh_admin.mdx
│ │ ├── forms.mdx
│ │ ├── index.mdx
│ │ └── maindomain.mdx
│ └── index.mdx
├── docusaurus.config.ts
├── footer.ts
├── i18n/
│ ├── de/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ └── 05.faq.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── docs/
│ │ └── admin/
│ │ ├── 01.about_self_hosting/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 02.what_is_yunohost__10.structure/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 02.what_is_yunohost__20.demo/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 02.what_is_yunohost__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__02.why_should_you_not_host_yourself/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__05.methods/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__gandi/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__namecheap/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__ovh__autodns/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__05.registrar__ovh__manualdns/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__10.isp/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__15.vpn__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__15.vpn__vpn_advantage/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__10.providers__20.servers/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on___configuration/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on___install_script/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__arm_board/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__on_top_of_debian/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__raspberry_pi/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__regular_computer/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__remote_server/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__virtualbox/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__20.install_on__wsl/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__40.post_install__10.find_ip/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__40.post_install__15.port_forwarding/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__40.post_install__20.dns_config/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 05.get_started__90.guidelines/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 12.webadmin/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 15.command_line/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 20.users__groups_and_permissions/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 20.users__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 25.domains__certificate/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 25.domains__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 30.apps__custom_apps/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 30.apps__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 35.email__05.clients/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 35.email__10.migration/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 35.email__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__05.evaluate/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__10.backup_methods/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__15.clone_filesystem/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__20.avoid_hardware_failure/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__25.include_exclude_files/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__30.custom_backup_methods/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__35.migrate_or_merge_servers/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 40.backups__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 42.security/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 42security/
│ │ │ ├── fr.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43.upgrade__11.0-bullseye/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43.upgrade__12.0-bookworm__05.issues_faq/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43.upgrade__12.0-bookworm__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43.upgrade__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 43upgrade__110-bullseye/
│ │ │ ├── es.stats.json
│ │ │ ├── fr.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43upgrade__120-bookworm__05issues_faq/
│ │ │ ├── fr.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43upgrade__120-bookworm__index/
│ │ │ ├── es.stats.json
│ │ │ ├── fr.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 43upgrade__index/
│ │ │ ├── es.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 45.tutorials__05.domains__dns_dynamicip/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__05.domains__dns_local_network/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__05.domains__dns_nohost_me/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__05.domains__dns_subdomains/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__10.theming/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__15.filezilla/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__25.external_storage/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__35.email_configure_relay/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__55.moving_app_folder/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__65.sftp_on_apps/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 45.tutorials__90.freebox_storage/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__03.cleanup/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__05.fail2ban/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__10.change_root_password/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__15.noaccess/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__20.ipv6/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__25.blacklist_forms/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 50.troubleshooting__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__11.0-bullseye/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__12.0-bookworm__05.issues_faq/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__12.0-bookworm__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 55.upgrade__index/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80.advanced__40.torhiddenservice/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80.advanced__45.certificate_custom/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80.advanced__70.chatons/
│ │ │ ├── ar.po
│ │ │ ├── ca.po
│ │ │ ├── de.po
│ │ │ ├── en.pot
│ │ │ ├── es.po
│ │ │ ├── eu.po
│ │ │ ├── fr.po
│ │ │ ├── gl.po
│ │ │ ├── id.po
│ │ │ ├── it.po
│ │ │ ├── kab.po
│ │ │ ├── nn.po
│ │ │ ├── pl.po
│ │ │ ├── pt_BR.po
│ │ │ ├── ru.po
│ │ │ ├── tr.po
│ │ │ ├── uk.po
│ │ │ ├── uz.po
│ │ │ └── zh_Hans.po
│ │ ├── 80advanced__40torhiddenservice/
│ │ │ ├── fr.stats.json
│ │ │ ├── kab.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 80advanced__45certificate_custom/
│ │ │ ├── es.stats.json
│ │ │ ├── fr.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ ├── 80advanced__70chatons/
│ │ │ ├── gl.stats.json
│ │ │ ├── pl.stats.json
│ │ │ └── tr.stats.json
│ │ └── index/
│ │ ├── ar.po
│ │ ├── ca.po
│ │ ├── de.po
│ │ ├── en.pot
│ │ ├── es.po
│ │ ├── eu.po
│ │ ├── fr.po
│ │ ├── gl.po
│ │ ├── id.po
│ │ ├── it.po
│ │ ├── kab.po
│ │ ├── nn.po
│ │ ├── pl.po
│ │ ├── pt_BR.po
│ │ ├── ru.po
│ │ ├── tr.po
│ │ ├── uk.po
│ │ ├── uz.po
│ │ └── zh_Hans.po
│ ├── en/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── es/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ └── 20.chat_rooms.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── fr/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ ├── 05.faq.mdx
│ │ │ │ ├── 10.help.mdx
│ │ │ │ ├── 20.chat_rooms.mdx
│ │ │ │ ├── 30.project_budget.mdx
│ │ │ │ ├── 35.security_team.mdx
│ │ │ │ ├── 40.sponsors_partners.mdx
│ │ │ │ └── 90.terms_of_services.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ ├── it/
│ │ ├── code.json
│ │ ├── docusaurus-plugin-content-blog/
│ │ │ └── options.json
│ │ ├── docusaurus-plugin-content-docs/
│ │ │ ├── current/
│ │ │ │ └── community/
│ │ │ │ ├── 05.faq.mdx
│ │ │ │ └── 20.chat_rooms.mdx
│ │ │ └── current.json
│ │ └── docusaurus-theme-classic/
│ │ ├── footer.json
│ │ └── navbar.json
│ └── ru/
│ ├── code.json
│ ├── docusaurus-plugin-content-blog/
│ │ └── options.json
│ ├── docusaurus-plugin-content-docs/
│ │ └── current.json
│ └── docusaurus-theme-classic/
│ ├── footer.json
│ └── navbar.json
├── package.json
├── redirects.ts
├── scripts/
│ ├── check_missing_or_bad_image_path.sh
│ ├── dead_links.py
│ ├── forms_doc_generate.py
│ ├── forms_doc_template.md.j2
│ ├── generate_docs.sh
│ ├── helpers_doc_generate.py
│ ├── helpers_doc_template.md.j2
│ ├── patch_enabled_locales.sh
│ ├── po4a.py
│ ├── resources_doc_generate.py
│ ├── resources_doc_template.md.j2
│ └── update_ui_translations.sh
├── sidebars.ts
├── src/
│ ├── YunoHostImagesListScript.js
│ ├── components/
│ │ ├── Button.tsx
│ │ ├── Column.tsx
│ │ ├── Columns.tsx
│ │ ├── Figures.tsx
│ │ ├── HardRedirects.tsx
│ │ ├── Highlight.tsx
│ │ ├── SidebarDocCardList.tsx
│ │ ├── SmallInline.tsx
│ │ ├── YunoHostDocsCard.module.css
│ │ ├── YunoHostDocsCard.tsx
│ │ └── YunoHostImagesList.tsx
│ ├── css/
│ │ └── custom.css
│ ├── pages/
│ │ ├── index.module.css
│ │ └── index.tsx
│ └── theme/
│ ├── DocCard/
│ │ ├── index.tsx
│ │ └── styles.module.css
│ └── MDXComponents.tsx
└── static/
├── img/
│ ├── ecosystem.odg
│ ├── ecosystem_fr.odg
│ ├── internet_topologies_fr_src.odg
│ ├── internet_topologies_src.odg
│ ├── internet_topologies_with_ynh_fr_src.odg
│ ├── internet_topologies_with_ynh_src.odg
│ ├── portForwarding_src_en.odg
│ └── portForwarding_src_fr.odg
└── js/
└── language-detect.js
SYMBOL INDEX (59 symbols across 19 files)
FILE: docusaurus.config.ts
function getUrl (line 10) | function getUrl() : string {
FILE: scripts/dead_links.py
function list_known_pages (line 10) | def list_known_pages(pages_dir: Path) -> list[str]:
function list_dead_links (line 22) | def list_dead_links(pages_dir: Path, known_pages: list[str]) -> list[tup...
function main (line 34) | def main() -> None:
FILE: scripts/forms_doc_generate.py
function get_current_commit (line 32) | def get_current_commit(docdir: Path) -> str:
function get_changelog_version (line 45) | def get_changelog_version(srcdir: Path) -> str:
function dict_key_first (line 54) | def dict_key_first(dict: dict, key) -> dict:
function list_config_panel (line 59) | def list_config_panel(srcdir: Path) -> dict[str, str]:
function list_form_options (line 78) | def list_form_options(srcdir: Path) -> dict[str, str]:
function main (line 132) | def main() -> None:
FILE: scripts/helpers_doc_generate.py
function get_helpers_tree (line 31) | def get_helpers_tree(helpers_version: str) -> dict[str, dict]:
function get_current_commit (line 89) | def get_current_commit(docdir: Path) -> str:
function get_changelog_version (line 102) | def get_changelog_version(srcdir: Path) -> str:
class Block (line 111) | class Block:
method __init__ (line 112) | def __init__(self) -> None:
class Parser (line 127) | class Parser:
method __init__ (line 128) | def __init__(self, filepath: Path) -> None:
method parse_blocks (line 133) | def parse_blocks(self) -> None:
method parse_block (line 200) | def parse_block(self, b: Block) -> None:
function is_global_comment (line 262) | def is_global_comment(line: str) -> bool:
function malformed_error (line 266) | def malformed_error(line_number: int) -> str:
function main (line 270) | def main() -> None:
FILE: scripts/po4a.py
function download_po4a (line 45) | def download_po4a() -> Path:
function translated_langs (line 67) | def translated_langs() -> list[str]:
function po4a_config (line 80) | def po4a_config(langs: list[str], pages: list[str], print_whole: bool = ...
function main (line 109) | def main() -> None:
FILE: scripts/resources_doc_generate.py
function get_current_commit (line 32) | def get_current_commit(docdir: Path) -> str:
function get_changelog_version (line 45) | def get_changelog_version(srcdir: Path) -> str:
function list_resources (line 54) | def list_resources(srcdir: Path) -> dict[str, str]:
function main (line 79) | def main() -> None:
FILE: src/YunoHostImagesListScript.js
function onRouteDidUpdate (line 3) | function onRouteDidUpdate({location, previousLocation}) {
FILE: src/components/Button.tsx
function Button (line 5) | function Button({
FILE: src/components/Column.tsx
function Column (line 4) | function Column({
FILE: src/components/Columns.tsx
function Columns (line 4) | function Columns({
FILE: src/components/Figures.tsx
function Figure (line 4) | function Figure({
FILE: src/components/HardRedirects.tsx
function HardRedirect (line 8) | function HardRedirect({ url }: { url: string }) {
function DocumentedHardRedirect (line 16) | function DocumentedHardRedirect({
FILE: src/components/Highlight.tsx
function Highlight (line 4) | function Highlight({
function HighlightWebAdmin (line 30) | function HighlightWebAdmin() {
function HighlightApplications (line 37) | function HighlightApplications() {
function HighlightAppInstall (line 44) | function HighlightAppInstall() {
function HighlightDiagnosis (line 51) | function HighlightDiagnosis() {
function HighlightFFDN (line 59) | function HighlightFFDN() {
function HighlightNonProfit (line 66) | function HighlightNonProfit() {
function HighlightCHATONS (line 74) | function HighlightCHATONS() {
FILE: src/components/SidebarDocCardList.tsx
function SidebarDocCardListFull (line 18) | function SidebarDocCardListFull({ className }: Props) {
function SidebarDocCardList (line 33) | function SidebarDocCardList(props: Props): ReactNode {
FILE: src/components/SmallInline.tsx
function SmallInline (line 4) | function SmallInline({
FILE: src/components/YunoHostDocsCard.tsx
function YunoHostDocsCard (line 9) | function YunoHostDocsCard({ children }: { children: ReactNode }) {
function YunoHostDocsCardHeading (line 17) | function YunoHostDocsCardHeading({
FILE: src/components/YunoHostImagesList.tsx
function YunoHostImagesList (line 20) | function YunoHostImagesList({ hardware }: { hardware: string }) {
function YunoHostImagesListElement (line 28) | function YunoHostImagesListElement() {
function generateImagesList (line 71) | function generateImagesList() {
FILE: src/pages/index.tsx
function Home (line 4) | function Home() {
FILE: src/theme/DocCard/index.tsx
function CardContainer (line 14) | function CardContainer({
function CardLayout (line 31) | function CardLayout({
function CardCategory (line 71) | function CardCategory({ item }: { item: PropSidebarItemCategory }) {
function CardLink (line 88) | function CardLink({ item }) {
function DocCard (line 103) | function DocCard({ item }) {
Copy disabled (too large)
Download .json
Condensed preview — 1752 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (12,069K chars).
[
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 195,
"preview": "## Problem\n\n- *Description of why you made this PR, what is its purpose*\n\n## Solution\n\n- *And how do you relevantly fix "
},
{
"path": ".github/actions/docusaurus/action.yml",
"chars": 1332,
"preview": "name: Check and build Docusaurus doc\n\ninputs:\n base_url:\n description: Base URL to pass to Docusaurus\n required: "
},
{
"path": ".github/workflows/auto_regen_pot.yml",
"chars": 1044,
"preview": "name: Auto-regen the .pot used as source for translations (po4a/Weblate)\n\non:\n push:\n branches: [ \"main\" ]\n\njobs:\n "
},
{
"path": ".github/workflows/build.yml",
"chars": 1472,
"preview": "name: Build Docusaurus doc\n\non:\n push:\n branches:\n - main\n - next\n\nconcurrency:\n group: ${{ github.workfl"
},
{
"path": ".gitignore",
"chars": 330,
"preview": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.lo"
},
{
"path": ".markdownlint-cli2.yaml",
"chars": 1862,
"preview": "\nignores:\n # This page contains markdown issues on purpose\n - pages/06.contribute/05.write_documentation/02.markdown_g"
},
{
"path": "README.md",
"chars": 829,
"preview": "# YunoHost Documentation\n\nThis repository contains the code for [the YunoHost documentation](https://doc.yunohost.org). "
},
{
"path": "docs/admin/01.about_self_hosting.mdx",
"chars": 1132,
"preview": "---\ntitle: About self-hosting\nhide_table_of_contents: true\n---\n\nSelf-hosting means owning and administrating your own se"
},
{
"path": "docs/admin/02.what_is_yunohost/10.structure.mdx",
"chars": 1450,
"preview": "---\ntitle: Structure of a YunoHost server\nhide_table_of_contents: true\n---\n\nThis page provide an overview of the ecosyst"
},
{
"path": "docs/admin/02.what_is_yunohost/20.demo.mdx",
"chars": 1141,
"preview": "---\ntitle: Try YunoHost\ndescription: A demo server\nroutes:\n default: '/try'\nhide_table_of_contents: true\n---\n\nimport {Y"
},
{
"path": "docs/admin/02.what_is_yunohost/index.mdx",
"chars": 7168,
"preview": "---\ntitle: What is YunoHost?\nhide_table_of_contents: true\n---\n\n<img src={require('/img/icons/logo-ynh_horizontal.png').d"
},
{
"path": "docs/admin/05.get_started/02.why_should_you_not_host_yourself.mdx",
"chars": 2942,
"preview": "---\ntitle: Why should you (not?) host yourself?\nhide_table_of_contents: true\ndescription: \" \"\nhide_title: true\n---\n\n## W"
},
{
"path": "docs/admin/05.get_started/05.methods.mdx",
"chars": 3736,
"preview": "---\ntitle: Choose your self-hosting mode\nhide_table_of_contents: true\n---\n\nYou can host yourself at home (on a small com"
},
{
"path": "docs/admin/05.get_started/10.providers/05.registrar/_category_.yaml",
"chars": 0,
"preview": ""
},
{
"path": "docs/admin/05.get_started/10.providers/05.registrar/gandi.mdx",
"chars": 646,
"preview": "---\nsidebar_label: Gandi\ntitle: Obtaining an API key from Gandi\n---\n\nThis page is meant to guide you in obtaining an API"
},
{
"path": "docs/admin/05.get_started/10.providers/05.registrar/index.mdx",
"chars": 1601,
"preview": "---\ntitle: Registrars\n---\n\nSince version 4.3, YunoHost includes a mechanism to interface your server with your DNS regis"
},
{
"path": "docs/admin/05.get_started/10.providers/05.registrar/namecheap.mdx",
"chars": 596,
"preview": "---\nsidebar_label: Namecheap\ntitle: Obtaining an API key from Namecheap\n---\n\nSee the [API Documentation](https://www.nam"
},
{
"path": "docs/admin/05.get_started/10.providers/05.registrar/ovh/_category_.yaml",
"chars": 13,
"preview": "label: \"OVH\"\n"
},
{
"path": "docs/admin/05.get_started/10.providers/05.registrar/ovh/autodns.mdx",
"chars": 1164,
"preview": "---\nsidebar_label: OVH DNS config via API\ntitle: Obtaining an API key from OVH\n---\n\nThis page is meant to guide you in o"
},
{
"path": "docs/admin/05.get_started/10.providers/05.registrar/ovh/manualdns.mdx",
"chars": 1740,
"preview": "---\nsidebar_label: OVH manual DNS config\ntitle: DNS Configuration with OVH\n---\n\nLet's see how to properly set the DNS re"
},
{
"path": "docs/admin/05.get_started/10.providers/10.isp.mdx",
"chars": 14763,
"preview": "---\ntitle: Internet service providers\nhide_table_of_contents: true\ndescription: \" \"\n---\n\nimport Tabs from '@theme/Tabs';"
},
{
"path": "docs/admin/05.get_started/10.providers/15.vpn/index.mdx",
"chars": 7572,
"preview": "---\ntitle: VPN providers\n---\n\nimport {HighlightFFDN, HighlightNonProfit} from '@site/src/components/Highlight';\n\nSince s"
},
{
"path": "docs/admin/05.get_started/10.providers/15.vpn/vpn_advantage.mdx",
"chars": 3839,
"preview": "---\nsidebar_label: Advantages\ntitle: Advantage of a VPN for self-hosting\n---\n\nSince setting up a server at home is an un"
},
{
"path": "docs/admin/05.get_started/10.providers/20.servers.mdx",
"chars": 828,
"preview": "---\ntitle: Server providers\nhide_table_of_contents: true\ndescription: \" \"\n---\n\nimport {HighlightFFDN, HighlightNonProfit"
},
{
"path": "docs/admin/05.get_started/10.providers/_category_.yaml",
"chars": 72,
"preview": "label: \"Providers\"\nlink:\n type: \"generated-index\"\n title: \"Providers\"\n"
},
{
"path": "docs/admin/05.get_started/20.install_on/_configuration.mdx",
"chars": 7765,
"preview": "import Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n## <FAIcon icon=\"fa-cog\"/> Proceed with the initi"
},
{
"path": "docs/admin/05.get_started/20.install_on/_install_script.mdx",
"chars": 830,
"preview": "\n## <FAIcon icon=\"fa-rocket\"/> Run the install script\n\n- Open a command line prompt on your server (either directly or ["
},
{
"path": "docs/admin/05.get_started/20.install_on/arm_board.mdx",
"chars": 3798,
"preview": "---\ntitle: On an ARM board\ndescription: Looks like a Raspberry Pi, isn't quite one\nsidebar_position: 2\nsidebar_custom_pr"
},
{
"path": "docs/admin/05.get_started/20.install_on/index.mdx",
"chars": 370,
"preview": "---\ntitle: Install on...\nslug: /admin/get_started/install_on\nsidebar_class_name: hidden_menu_caret bold\nhide_table_of_co"
},
{
"path": "docs/admin/05.get_started/20.install_on/on_top_of_debian.mdx",
"chars": 3208,
"preview": "---\ntitle: On top of Debian\ndescription: Typically on a VPS, or if you can't use preinstalled images\nsidebar_position: 6"
},
{
"path": "docs/admin/05.get_started/20.install_on/raspberry_pi.mdx",
"chars": 3462,
"preview": "---\ntitle: On a Raspberry Pi\ndescription: One of the most popular baked boards\nsidebar_position: 1\nsidebar_custom_props:"
},
{
"path": "docs/admin/05.get_started/20.install_on/regular_computer.mdx",
"chars": 8072,
"preview": "---\ntitle: On a regular computer\ndescription: An old desktop computer or laptop, or any x86 machine\nsidebar_position: 4\n"
},
{
"path": "docs/admin/05.get_started/20.install_on/remote_server.mdx",
"chars": 805,
"preview": "---\ntitle: On a remote server\ndescription: \"Cloud machines: VPS or dedicated servers\"\nsidebar_position: 3\nsidebar_custom"
},
{
"path": "docs/admin/05.get_started/20.install_on/virtualbox.mdx",
"chars": 5946,
"preview": "---\ntitle: In a virtual machine\ndescription: For testing and debugging purposes\nsidebar_position: 5\nsidebar_custom_props"
},
{
"path": "docs/admin/05.get_started/20.install_on/wsl.mdx",
"chars": 4649,
"preview": "---\ntitle: On WSL\ndescription: Experimental, for people who like cyberfrankensteins\nsidebar_position: 8\nsidebar_custom_p"
},
{
"path": "docs/admin/05.get_started/40.post_install/10.find_ip.mdx",
"chars": 2850,
"preview": "---\ntitle: Find your server's local IP\nhide_table_of_contents: true\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem "
},
{
"path": "docs/admin/05.get_started/40.post_install/15.port_forwarding.mdx",
"chars": 2926,
"preview": "---\ntitle: Configure port-forwarding\ndescription: \"Make your server accessible from outside your home\"\n---\n\nIf you are s"
},
{
"path": "docs/admin/05.get_started/40.post_install/20.dns_config.mdx",
"chars": 4442,
"preview": "---\ntitle: DNS zone configuration\n---\n\nDNS (domain name system) is a system that converts human-readable addresses\n(doma"
},
{
"path": "docs/admin/05.get_started/40.post_install/_category_.yaml",
"chars": 116,
"preview": "label: After installation\nlink:\n type: generated-index\n description: Configure your network to access your server\n"
},
{
"path": "docs/admin/05.get_started/90.guidelines.mdx",
"chars": 4435,
"preview": "---\ntitle: Advices and guidelines\n---\n\nThis page lists some advice and guidelines which every YunoHost administrator sho"
},
{
"path": "docs/admin/05.get_started/_category_.yaml",
"chars": 80,
"preview": "label: \"🚀 Get started\"\nlink:\n type: \"generated-index\"\n title: \"🚀 Get started\"\n"
},
{
"path": "docs/admin/12.webadmin.mdx",
"chars": 460,
"preview": "---\ntitle: ⭐ Webadmin interface\nhide_table_of_contents: true\n---\n\nYunoHost has an administrator web interface. The other"
},
{
"path": "docs/admin/15.command_line.mdx",
"chars": 7651,
"preview": "---\ntitle: 🛠️ SSH and command line\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n## What's"
},
{
"path": "docs/admin/20.users/groups_and_permissions.mdx",
"chars": 8427,
"preview": "---\ntitle: Users groups and permissions\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nYou "
},
{
"path": "docs/admin/20.users/index.mdx",
"chars": 3233,
"preview": "---\ntitle: 👥 Accounts and portal\n---\n\n## Users\n\nUsers are human being who have access to applications and other services"
},
{
"path": "docs/admin/25.domains/certificate.mdx",
"chars": 3797,
"preview": "---\ntitle: Certificate\nhide_table_of_contents: true\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/Tab"
},
{
"path": "docs/admin/25.domains/index.mdx",
"chars": 7048,
"preview": "---\ntitle: 🌐 Domains\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nYunoHost lets you manag"
},
{
"path": "docs/admin/30.apps/custom_apps.mdx",
"chars": 2064,
"preview": "---\ntitle: Installing \"custom\" apps\n---\n\nWhile YunoHost has many apps available in the catalog, you may want to install "
},
{
"path": "docs/admin/30.apps/index.mdx",
"chars": 9397,
"preview": "---\ntitle: 📦 Applications\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport Highlight fr"
},
{
"path": "docs/admin/35.email/05.clients.mdx",
"chars": 3922,
"preview": "---\ntitle: Configure email clients\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nYou can f"
},
{
"path": "docs/admin/35.email/10.migration.mdx",
"chars": 1344,
"preview": "---\ntitle: Migrate emails to YunoHost\n---\n\n*[Documentation linked to YunoHost email](/admin/email)*.\n\nMigration of email"
},
{
"path": "docs/admin/35.email/index.mdx",
"chars": 3622,
"preview": "---\ntitle: 📬 Emails\n---\n\nimport Highlight from '@site/src/components/Highlight';\nimport {HighlightWebAdmin, HighlightDia"
},
{
"path": "docs/admin/40.backups/05.evaluate.mdx",
"chars": 5372,
"preview": "---\ntitle: Backup strategies\n---\n\nIn the context of self-hosting, backups are an important element to compensate for une"
},
{
"path": "docs/admin/40.backups/10.backup_methods.mdx",
"chars": 2085,
"preview": "---\ntitle: Backup methods\n---\n\nYunoHost currently has three apps integrating backup solutions offering more features tha"
},
{
"path": "docs/admin/40.backups/15.clone_filesystem.mdx",
"chars": 5684,
"preview": "---\ntitle: Snapshotting the entire filesystem\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';"
},
{
"path": "docs/admin/40.backups/20.avoid_hardware_failure.mdx",
"chars": 2593,
"preview": "---\ntitle: Avoid hardware failure\n---\n\n## Physically secure your server\n\nVery often people who self-host don't have prop"
},
{
"path": "docs/admin/40.backups/25.include_exclude_files.mdx",
"chars": 4483,
"preview": "---\ntitle: Include or exclude files\n---\n\n## Include files\n\nYunoHost usually already knows what needs to be backed up. Ho"
},
{
"path": "docs/admin/40.backups/30.custom_backup_methods.mdx",
"chars": 1196,
"preview": "---\ntitle: Custom backup methods\n---\n\nIt is possible to create your own backup method and link it to YunoHost's backup f"
},
{
"path": "docs/admin/40.backups/35.migrate_or_merge_servers.mdx",
"chars": 670,
"preview": "---\ntitle: Migrate or merge servers\n---\n\n\n## Migrate a server\n\nIf YunoHost's archive system is not convenient enough to "
},
{
"path": "docs/admin/40.backups/index.mdx",
"chars": 7015,
"preview": "---\ntitle: 🚑 Backups\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nIn the context of self-"
},
{
"path": "docs/admin/42.security.mdx",
"chars": 8263,
"preview": "---\ntitle: 🔒 Security\n---\n\n:::info\nWhen thinking and discussing security — whether in the context of YunoHost or any oth"
},
{
"path": "docs/admin/43.upgrade/11.0-bullseye.mdx",
"chars": 6138,
"preview": "---\ntitle: Migrating from 4.x to 11.x\n---\n\nThis page is dedicated to help you migrating an instance from YunoHost 4.4.x "
},
{
"path": "docs/admin/43.upgrade/12.0-bookworm/05.issues_faq.mdx",
"chars": 3366,
"preview": "---\ntitle: Migration isues FAQ\n---\n\nThis page lists all the known issues encountered after a migration from YunoHost 11 "
},
{
"path": "docs/admin/43.upgrade/12.0-bookworm/index.mdx",
"chars": 3947,
"preview": "---\ntitle: Migrating from 11.x to 12.x\n---\n\nThis page is dedicated to help you migrating an instance from YunoHost 11.x "
},
{
"path": "docs/admin/43.upgrade/index.mdx",
"chars": 611,
"preview": "---\ntitle: ✨ Upgrades\n---\n\n## From the webadmin\n\nOn the administraton panel, click on Upgrade the system. YunoHost will "
},
{
"path": "docs/admin/45.tutorials/05.domains/_category_.yaml",
"chars": 68,
"preview": "label: \"Domains\"\nlink:\n type: \"generated-index\"\n title: \"Domains\"\n"
},
{
"path": "docs/admin/45.tutorials/05.domains/dns_dynamicip.mdx",
"chars": 2959,
"preview": "---\ntitle: DNS with a dynamic IP\n---\n\n:::warning\nBefore going further, make sure your global IP address is dynamic with:"
},
{
"path": "docs/admin/45.tutorials/05.domains/dns_local_network.mdx",
"chars": 1905,
"preview": "---\ntitle: Local network access to your server\n---\n\nAfter completing your server installation, it is possible that your "
},
{
"path": "docs/admin/45.tutorials/05.domains/dns_nohost_me.mdx",
"chars": 3166,
"preview": "---\ntitle: Nohost.me domains\n---\n\nIn order to make self-hosting as accessible as possible, the YunoHost Project provides"
},
{
"path": "docs/admin/45.tutorials/05.domains/dns_subdomains.mdx",
"chars": 2466,
"preview": "---\ntitle: DNS and subdomains for the applications\n---\n\n### Subdomains\n\nYunoHost allows the use of subdomains. If one ow"
},
{
"path": "docs/admin/45.tutorials/10.theming.mdx",
"chars": 1593,
"preview": "---\nsidebar_label: Theme the portal\ntitle: Customize the appearance of the user portal\n---\n\nThe portal is customizable f"
},
{
"path": "docs/admin/45.tutorials/15.filezilla.mdx",
"chars": 3857,
"preview": "---\nsidebar_label: Transfer files\ntitle: Exchange files with your server using a graphical interface\n---\n\nThis page expl"
},
{
"path": "docs/admin/45.tutorials/25.external_storage.mdx",
"chars": 11005,
"preview": "---\nsidebar_label: Add external storage\ntitle: Adding an external storage to your server\n---\n\n## Introduction\n\nApart fro"
},
{
"path": "docs/admin/45.tutorials/35.email_configure_relay.mdx",
"chars": 7187,
"preview": "---\ntitle: Configure SMTP relay\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nIf your ISP "
},
{
"path": "docs/admin/45.tutorials/55.moving_app_folder.mdx",
"chars": 1253,
"preview": "---\ntitle: Moving an app folder to a different storage location\n---\n\nApplications folder are (*usually*) located in `/va"
},
{
"path": "docs/admin/45.tutorials/65.sftp_on_apps.mdx",
"chars": 1634,
"preview": "---\nsidebar_label: Access apps via SFTP\ntitle: Give SFTP permission to edit an app\n---\n\nIn YunoHost permission managemen"
},
{
"path": "docs/admin/45.tutorials/90.freebox_storage.mdx",
"chars": 1768,
"preview": "---\ntitle: Use Freebox's storage (French ISP)\n---\n\nThis page is only relevant if you're using french ISP's « [Free](http"
},
{
"path": "docs/admin/45.tutorials/_category_.yaml",
"chars": 76,
"preview": "label: \"📜 Tutorials\"\nlink:\n type: \"generated-index\"\n title: \"📜 Tutorials\"\n"
},
{
"path": "docs/admin/50.troubleshooting/03.cleanup.mdx",
"chars": 803,
"preview": "---\ntitle: Cleaning up space\nhide_table_of_contents: true\n---\n\nIf your system runs out of space, you may an emergency op"
},
{
"path": "docs/admin/50.troubleshooting/05.fail2ban.mdx",
"chars": 2763,
"preview": "---\ntitle: IP address unban\nhide_table_of_contents: true\n---\n\n**Fail2Ban** is an intrusion prevention software that prot"
},
{
"path": "docs/admin/50.troubleshooting/10.change_root_password.mdx",
"chars": 903,
"preview": "---\ntitle: Changing root's password\nhide_table_of_contents: true\n---\n\nIn the past, YunoHost had a special \"`admin`\" user"
},
{
"path": "docs/admin/50.troubleshooting/15.noaccess.mdx",
"chars": 8796,
"preview": "---\ntitle: Get access back into YunoHost\n---\n\nThere are several reasons that could lead to one administrator's access be"
},
{
"path": "docs/admin/50.troubleshooting/20.ipv6.mdx",
"chars": 2052,
"preview": "---\ntitle: Setting up IPv6\nhide_table_of_contents: true\n---\n\nIPv6 may work out of the box in many cases. But in some cas"
},
{
"path": "docs/admin/50.troubleshooting/25.blacklist_forms.mdx",
"chars": 4329,
"preview": "---\ntitle: Removing your server’s IP/domain from antispam listings\n---\n\nFor various reasons, your IP or domain may end u"
},
{
"path": "docs/admin/50.troubleshooting/index.mdx",
"chars": 286,
"preview": "---\ntitle: 🐞 Troubleshooting\n---\n\nThis section contains specific tips to troubleshoot common issues.\n\nIf you are looking"
},
{
"path": "docs/admin/80.advanced/40.torhiddenservice.mdx",
"chars": 1374,
"preview": "---\nsidebar_label: Configure Tor Hidden Service\ntitle: Using YunoHost as a Tor Hidden Service\n---\n\n:::warning\nThis tuto "
},
{
"path": "docs/admin/80.advanced/45.certificate_custom.mdx",
"chars": 4713,
"preview": "---\ntitle: Custom certificates\n---\n\n:::warning\nSince version 2.5, YunoHost integrates Let's Encrypt certificates automat"
},
{
"path": "docs/admin/80.advanced/70.chatons.mdx",
"chars": 313,
"preview": "---\ntitle: Create a CHATONS ↗\ndescription: \"See the tutorial on chatons.org\"\n---\n\nimport {DocumentedHardRedirect} from '"
},
{
"path": "docs/admin/80.advanced/_category_.yaml",
"chars": 75,
"preview": "label: \"👾 Advanced\"\nlink:\n type: \"generated-index\"\n title: \"👾 Advanced\"\n\n"
},
{
"path": "docs/admin/_category_.yaml",
"chars": 175,
"preview": "label: Administration guide\nlink:\n type: generated-index\n title: Administration guide\n slug: admin\n description: Lea"
},
{
"path": "docs/admin/index.mdx",
"chars": 1979,
"preview": "---\ntitle: \"Welcome!\"\nsidebar_position: 0\nhide_title: true\nhide_table_of_contents: true\n---\n\n#\n\n<div style={{marginRight"
},
{
"path": "docs/community/05.faq.mdx",
"chars": 7258,
"preview": "---\ntitle: Frequently Asked Questions\ndescription: \"Informations about the project\"\n---\n\n### Under which license is Yuno"
},
{
"path": "docs/community/10.help.mdx",
"chars": 5810,
"preview": "---\ntitle: Looking for help?\n---\n\nimport ReactPlayer from 'react-player'\n\n## How to ask for help\n\nCome on [the forum](/c"
},
{
"path": "docs/community/15.forum.mdx",
"chars": 237,
"preview": "---\ntitle: Forum ↗\ndescription: \"The Forum for support and news\"\n---\n\nimport {DocumentedHardRedirect} from '@site/src/co"
},
{
"path": "docs/community/20.chat_rooms.mdx",
"chars": 2358,
"preview": "---\ntitle: Chat rooms\ndescription: Chat rooms on Matrix for support and development\n---\n\nAmong other communication tools"
},
{
"path": "docs/community/25.yunohost_project_organization.mdx",
"chars": 318,
"preview": "---\ntitle: Project organisation ↗\ndescription: \"The human organization behind the code\"\n---\n\nimport {DocumentedHardRedir"
},
{
"path": "docs/community/30.project_budget.mdx",
"chars": 841,
"preview": "---\ntitle: Project budget\ndescription: \"How is money handled\"\n---\n\n# Estimated budget for 2020/2021\n\n## Expected revenue"
},
{
"path": "docs/community/35.security_team.mdx",
"chars": 641,
"preview": "---\ntitle: Security team\ndescription: \"Did you find a vulnerability?\"\n---\n\nContact the security team by mail: `security@"
},
{
"path": "docs/community/40.press_kit.mdx",
"chars": 7113,
"preview": "---\ntitle: Media\ndescription: \"Media and conferences\"\n---\n\n{/* \n:::note\nTODO: Add logo and kakemono file \nTODO: Add kak"
},
{
"path": "docs/community/40.sponsors_partners.mdx",
"chars": 1844,
"preview": "---\ntitle: Sponsors and partners\ndescription: \"Friends of YunoHost\"\n---\n\nIn order to advance and make the project works,"
},
{
"path": "docs/community/90.terms_of_services.mdx",
"chars": 24300,
"preview": "---\ntitle: Terms and conditions\ndescription: General and Specific Conditions of Services\n---\n\n# General and Specific Con"
},
{
"path": "docs/community/index.mdx",
"chars": 359,
"preview": "---\ntitle: Community\ndescription: YunoHost community description\nsidebar_position: 1\n---\n\nimport SidebarDocCardList from"
},
{
"path": "docs/dev/05.git.mdx",
"chars": 1310,
"preview": "---\ntitle: 🛠️ Working with Git / Github\nhide_table_of_contents: true\n---\n\nThe YunoHost project extensively uses Git and "
},
{
"path": "docs/dev/10.doc.mdx",
"chars": 3641,
"preview": "---\ntitle: 📝 Working on the documentation\n---\n\nThe YunoHost documentation is managed through [this Git repository](https"
},
{
"path": "docs/dev/20.translation.mdx",
"chars": 7050,
"preview": "---\ntitle: 🌐 Working on translations\n---\n\nTranslating YunoHost — not just the software, but also the documentation and a"
},
{
"path": "docs/dev/50.packaging/05.structure.mdx",
"chars": 1211,
"preview": "---\ntitle: App structure\nsidebar_position: 1\n---\n\nA Yunohost app package is a Git repository with such a structure:\n\n```"
},
{
"path": "docs/dev/50.packaging/10.manifest.mdx",
"chars": 14054,
"preview": "---\ntitle: manifest.toml\n---\n\nThe app's `manifest.toml` can be seen as the ID card of the app. It declares various basic"
},
{
"path": "docs/dev/50.packaging/15.resources.mdx",
"chars": 25241,
"preview": "---\ntitle: App resources\ntoc_max_heading_level: 2\n# custom_edit_link: 'https://github.com/YunoHost/yunohost/blob/dev/src"
},
{
"path": "docs/dev/50.packaging/20.scripts/20.helpers_v2.0.mdx",
"chars": 71963,
"preview": "---\ntitle: App helpers (v2)\ntoc_max_heading_level: 4\n# custom_edit_link: 'https://github.com/YunoHost/yunohost/tree/dev/"
},
{
"path": "docs/dev/50.packaging/20.scripts/20.helpers_v2.1.mdx",
"chars": 58615,
"preview": "---\ntitle: App helpers (v2.1)\ntoc_max_heading_level: 4\n# custom_edit_link: 'https://github.com/YunoHost/yunohost/tree/de"
},
{
"path": "docs/dev/50.packaging/20.scripts/_category_.yaml",
"chars": 17,
"preview": "collapsed: false\n"
},
{
"path": "docs/dev/50.packaging/20.scripts/index.mdx",
"chars": 7527,
"preview": "---\ntitle: App scripts\n---\n\nApp scripts are the essential logic defining what happens when an app is `install`ed, `remov"
},
{
"path": "docs/dev/50.packaging/30.doc.mdx",
"chars": 5012,
"preview": "---\ntitle: Documenting apps\n---\n\nProperly documenting your app is important for user experience ;). \nYunoHost provides "
},
{
"path": "docs/dev/50.packaging/40.test.mdx",
"chars": 7669,
"preview": "---\ntitle: Testing your app\n---\n\nOnce you're done writing you app package, you'll want to check that everything works co"
},
{
"path": "docs/dev/50.packaging/50.publish.mdx",
"chars": 1164,
"preview": "---\ntitle: Publishing your app on the catalog\n---\n\nThe official YunoHost's app catalog is maintained [in this repository"
},
{
"path": "docs/dev/50.packaging/60.advanced/20.config_panels.mdx",
"chars": 15716,
"preview": "---\ntitle: Config Panels\ndescription: ' '\n---\n\nFrom a practical point of view, one of the main purpose of config panel i"
},
{
"path": "docs/dev/50.packaging/60.advanced/30.sso_ldap_integration.mdx",
"chars": 7588,
"preview": "---\ntitle: SSO/LDAP integration\ndescription: ' '\n---\n\nOne powerful aspect of YunoHost is that apps are meant to be integ"
},
{
"path": "docs/dev/50.packaging/60.advanced/50.hooks.mdx",
"chars": 16933,
"preview": "---\ntitle: Hooks\ndescription: ' '\n---\n\nYunoHost includes a hook mechanism triggered on a lot of operation changing the s"
},
{
"path": "docs/dev/50.packaging/60.advanced/60.advanced_packagers.mdx",
"chars": 7198,
"preview": "---\ntitle: Advanced packagers\ndescription: ' '\n---\n\nHere comes the time:\n\n- you masterise [apps packaging](/dev/packagin"
},
{
"path": "docs/dev/50.packaging/60.advanced/70.packaging_v2.mdx",
"chars": 7743,
"preview": "---\ntitle: Packaging v2\ndescription: ' '\n---\n\nPackaging v2 is a major improvement for the packaging introduced in YunoHo"
},
{
"path": "docs/dev/50.packaging/60.advanced/_category_.yaml",
"chars": 92,
"preview": "label: Advanced\nlink:\n type: generated-index\n title: Advanced\n slug: /packaging/advanced\n"
},
{
"path": "docs/dev/50.packaging/80.misc/_category_.yaml",
"chars": 76,
"preview": "label: Misc resources\nlink:\n type: generated-index\n title: Misc resources\n"
},
{
"path": "docs/dev/50.packaging/80.misc/packaging_apps_git.mdx",
"chars": 11360,
"preview": "---\ntitle: Use Git to package apps\n---\n\nGit... Our dear beloved Git, which can be described also as \"Goddamn Idiotic Tru"
},
{
"path": "docs/dev/50.packaging/80.misc/packaging_apps_virtualbox.mdx",
"chars": 5479,
"preview": "---\ntitle: Create a development environment with VirtualBox\n---\n\nThis documentation page aims at explaining how to setup"
},
{
"path": "docs/dev/50.packaging/80.misc/shell_variables_scope.mdx",
"chars": 5516,
"preview": "---\ntitle: General scope of variables\ntemplate: docs\ntaxonomy:\n category: docs\nroutes:\n default: '/shell_variables_s"
},
{
"path": "docs/dev/50.packaging/90.policy.mdx",
"chars": 3517,
"preview": "---\nsidebar_label: Catalog policy\ntitle: YunoHost's policy regarding the apps included in the official catalog\n---\n\n### "
},
{
"path": "docs/dev/50.packaging/index.mdx",
"chars": 4761,
"preview": "---\ntitle: 📦 Application packaging\n---\n\nYunoHost relies on applications, and so, on their packagers. This documentation\n"
},
{
"path": "docs/dev/80.core/05.architecture.mdx",
"chars": 2584,
"preview": "---\ntitle: YunoHost architecture\n---\n\nThe core of YunoHost is built in Python around the `yunohost` server, but is compo"
},
{
"path": "docs/dev/80.core/10.devenv.mdx",
"chars": 3010,
"preview": "---\ntitle: Development environment\n---\n\nThe recommended development tool is `ynh-dev`, and is based on Incus.\n\nThis page"
},
{
"path": "docs/dev/80.core/20.ynh_core.mdx",
"chars": 1775,
"preview": "---\ntitle: Working on the API and CLI\n---\n\n\nWhen using `ynh-dev`, run in the container:\n\n```\n./ynh-dev use-git yunohost\n"
},
{
"path": "docs/dev/80.core/25.ynh_admin.mdx",
"chars": 2073,
"preview": "---\ntitle: Working on the YunoHost web admin\n---\n\nWhen using `ynh-dev`, run in the container:\n\n```\n./ynh-dev use-git yun"
},
{
"path": "docs/dev/80.core/forms.mdx",
"chars": 19417,
"preview": "---\ntitle: Technical details for config panel structure and form option types\n---\n\nDoc auto-generated by [this script](h"
},
{
"path": "docs/dev/80.core/index.mdx",
"chars": 1489,
"preview": "---\ntitle: ⚙️ Core development\n---\n\nYou have found a bug or want to work on a new feature in the Yunohost core?\nWell, th"
},
{
"path": "docs/dev/80.core/maindomain.mdx",
"chars": 1510,
"preview": "---\ntitle: How is used the main domain\n---\n\nHere is a list of situations in which we use the main domain concept:\n\n- to "
},
{
"path": "docs/dev/index.mdx",
"chars": 4089,
"preview": "---\nsidebar_position: 0\ntitle: Contributing to YunoHost\nhide_table_of_contents: true\n---\n\nLet's go through the different"
},
{
"path": "docusaurus.config.ts",
"chars": 4290,
"preview": "import {themes as prismThemes} from 'prism-react-renderer';\nimport type {Config} from '@docusaurus/types';\nimport type *"
},
{
"path": "footer.ts",
"chars": 2372,
"preview": "import { MultiColumnFooter, } from '@docusaurus/theme-common';\n\nconst footer: MultiColumnFooter = {\n logo: {\n alt: '"
},
{
"path": "i18n/de/code.json",
"chars": 14701,
"preview": "{\n \"theme.NotFound.title\": {\n \"message\": \"Seite nicht gefunden\",\n \"description\": \"The title of the 404 page\"\n },"
},
{
"path": "i18n/de/docusaurus-plugin-content-blog/options.json",
"chars": 318,
"preview": "{\n \"title\": {\n \"message\": \"Blog\",\n \"description\": \"The title for the blog used in SEO\"\n },\n \"description\": {\n "
},
{
"path": "i18n/de/docusaurus-plugin-content-docs/current/community/05.faq.mdx",
"chars": 7549,
"preview": "---\ntitle: Häufig gestellte Fragen\n---\n\n#### Unter welcher Lizenz wird YunoHost angeboten ?\n\nYunoHost steht unter der fr"
},
{
"path": "i18n/de/docusaurus-plugin-content-docs/current.json",
"chars": 7700,
"preview": "{\n \"version.label\": {\n \"message\": \"Next\",\n \"description\": \"The label for version current\"\n },\n \"sidebar.admin.c"
},
{
"path": "i18n/de/docusaurus-theme-classic/footer.json",
"chars": 4227,
"preview": "{\n \"link.title.Community\": {\n \"message\": \"Community\",\n \"description\": \"The title of the footer links column with "
},
{
"path": "i18n/de/docusaurus-theme-classic/navbar.json",
"chars": 1059,
"preview": "{\n \"title\": {\n \"message\": \"Docs\",\n \"description\": \"The title in the navbar\"\n },\n \"logo.alt\": {\n \"message\": \""
},
{
"path": "i18n/docs/admin/01.about_self_hosting/ar.po",
"chars": 2243,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/ca.po",
"chars": 2168,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/de.po",
"chars": 3611,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/en.pot",
"chars": 2093,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/es.po",
"chars": 3325,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/eu.po",
"chars": 2168,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/fr.po",
"chars": 3495,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/gl.po",
"chars": 3386,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/id.po",
"chars": 2163,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/it.po",
"chars": 3318,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/kab.po",
"chars": 2183,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/nn.po",
"chars": 2168,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/pl.po",
"chars": 2212,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/pt_BR.po",
"chars": 2170,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/ru.po",
"chars": 3261,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/tr.po",
"chars": 3553,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/uk.po",
"chars": 2245,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/uz.po",
"chars": 2168,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/01.about_self_hosting/zh_Hans.po",
"chars": 2371,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/ar.po",
"chars": 2719,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/ca.po",
"chars": 2644,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/de.po",
"chars": 3926,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/en.pot",
"chars": 2569,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/es.po",
"chars": 2835,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/eu.po",
"chars": 2644,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/fr.po",
"chars": 4220,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/gl.po",
"chars": 4280,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/id.po",
"chars": 2639,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/it.po",
"chars": 4242,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/kab.po",
"chars": 2659,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/nn.po",
"chars": 2644,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/pl.po",
"chars": 2688,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/pt_BR.po",
"chars": 2646,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/ru.po",
"chars": 2720,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/tr.po",
"chars": 4226,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/uk.po",
"chars": 2721,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/uz.po",
"chars": 2644,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__10.structure/zh_Hans.po",
"chars": 2869,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/ar.po",
"chars": 2497,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/ca.po",
"chars": 2422,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/de.po",
"chars": 2681,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/en.pot",
"chars": 2347,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/es.po",
"chars": 2561,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/eu.po",
"chars": 2422,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/fr.po",
"chars": 3220,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/gl.po",
"chars": 3139,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/id.po",
"chars": 2417,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/it.po",
"chars": 2561,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/kab.po",
"chars": 2774,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/nn.po",
"chars": 2422,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/pl.po",
"chars": 2466,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/pt_BR.po",
"chars": 2424,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/ru.po",
"chars": 2610,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/tr.po",
"chars": 3129,
"preview": "# Copyright (C) 2026 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/uk.po",
"chars": 2499,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/uz.po",
"chars": 2422,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
},
{
"path": "i18n/docs/admin/02.what_is_yunohost__20.demo/zh_Hans.po",
"chars": 2629,
"preview": "# Copyright (C) 2025 YunoHost Contributors\n# This file is distributed under the same license as the YunoHost documentati"
}
]
// ... and 1552 more files (download for full content)
About this extraction
This page contains the full source code of the YunoHost/doc GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1752 files (10.8 MB), approximately 2.9M tokens, and a symbol index with 59 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.