CluPilotCloud/lang/en/integrations.php

99 lines
6.6 KiB
PHP

<?php
return [
'title' => 'Integrations',
'subtitle' => 'Connected services, grouped by purpose — credentials and settings side by side, not on separate pages by storage mechanism.',
'payments_title' => 'Payments (Stripe)',
'payments_body' => 'The secret key used to accept payments and verify webhooks.',
'dns_title' => 'DNS (Hetzner)',
'dns_body' => 'The API token, the zone, and where Traefik expects its dynamic configuration.',
'dns_zone' => 'DNS zone',
'dns_zone_hint' => 'For example clupilot.com — customer instances get <subdomain>.<zone>.',
'traefik_path' => 'Traefik dynamic config path',
'traefik_path_hint' => 'Directory on the traffic host that routes get written into.',
'monitoring_title' => 'Monitoring',
'monitoring_body' => 'The API token and where the Kuma bridge is reachable.',
'monitoring_url' => 'Monitoring bridge URL',
'monitoring_url_hint' => 'For example http://kuma-bridge:8080. Leave blank to leave monitoring off.',
'vpn_title' => 'VPN/WireGuard',
'vpn_body' => 'How a new host reaches CluPilot as the VPN hub. The private hub key stays in the server file — only the public half and the address live here.',
'wg_endpoint' => 'Hub endpoint',
'wg_endpoint_hint' => 'Publicly reachable address and port, e.g. vpn.clupilot.com:51820.',
'wg_hub_pubkey' => 'Hub public key',
'wg_hub_pubkey_hint' => 'Output of wg pubkey < /etc/wireguard/privatekey on this server.',
'ssh_title' => 'SSH identity',
'ssh_body' => 'The key deployed to every fresh host — its public and private halves, together in one place.',
'ssh_public_key' => 'SSH key (public)',
'ssh_public_key_hint' => 'Written into authorized_keys during host onboarding.',
'save_settings' => 'Save settings',
'settings_saved' => 'Saved. The new value applies immediately.',
// .env editor (Part B).
'env_title' => 'Advanced: server file (.env)',
'env_subtitle' => 'Everything above with no field of its own — raw, as it sits on the server. Without this editor, that still needs a shell.',
'env_locked' => 'Locked. Unlock above to see the server file.',
'env_danger_title' => 'These lines can lock you out of the console itself',
'env_danger_body' => 'A wrong value on one of these lines makes the console unreachable for you too: APP_KEY, DB_* (the database connection), REDIS_* (sessions, cache, queue), SESSION_*. Not blocked — full control was the decision — but these lines are worth a second look.',
'env_vault_title' => 'Managed by credential storage',
'env_vault_body' => 'SecretVault::get() prefers a value stored there and only falls back to the server file when none is stored. While a value is stored above, the matching line below changes nothing — otherwise the console would contradict itself.',
'env_vault_active' => 'stored — this line has no effect',
'env_vault_inactive' => 'not stored — this line applies',
'env_label' => 'Contents of .env',
'env_save' => 'Save',
'env_backup_title' => 'Backup',
'env_backup_body' => 'A copy is placed beside .env before every save (filename .env.bak-timestamp). Nothing deletes them automatically.',
// queue, queue-provisioning, scheduler and reverb only read .env at
// their own startup. Until here that was homework — "go restart that
// yourself" — the same complaint as the update button before it: working
// back over the command line what the console already knew. Saving now
// triggers that itself (App\Livewire\Admin\Integrations::saveEnv()):
// clearing the config cache (immediately, no host agent needed for that)
// and asking the agent for the restart
// (App\Services\Deployment\UpdateChannel::requestRestart()).
'env_restart_title' => 'What happens automatically on save',
'env_restart_body' => 'queue, queue-provisioning, scheduler and reverb only read .env at their own startup. Saving here therefore triggers this automatically: the configuration cache is cleared, and these four services are restarted. This console itself (app) is never touched — it is serving the very request that triggered this, and its PHP reads .env fresh on every request anyway.',
'env_restarting' => 'Restarting services …',
'env_restart_done' => 'Services restarted.',
'env_save_title' => 'Really overwrite .env?',
'env_save_body' => 'It holds every credential in the system. A backup is made first, and the affected services are restarted automatically after saving.',
'env_save_confirm' => 'Overwrite',
// Three outcomes after writing, never a glossed-over success message: the
// restart was requested, or it could not be — because the host agent is
// not running, or because something else is already in flight — and then
// the manual command is shown here instead of a promise.
'env_saved_restarting' => 'Saved. Backup: :backup. Configuration cache cleared — queue, queue-provisioning, scheduler and reverb are restarting now.',
'env_saved_restart_busy' => 'Saved. Backup: :backup. Another request to the update service is already in flight — the restart does not happen automatically this time. Please run manually: docker compose restart queue queue-provisioning scheduler reverb.',
'env_saved_no_agent' => 'Saved. Backup: :backup. The server-side update service is not running — queue, queue-provisioning, scheduler and reverb still hold the old values. Please run manually: docker compose restart queue queue-provisioning scheduler reverb.',
// Only when no .env existed before — then there is nothing to back up.
'env_no_previous_file' => 'none, no file existed before this',
'env_invalid' => 'Line :line is neither blank, a comment, nor KEY=value. Nothing was saved.',
'env_empty' => 'An empty file would erase every setting. Nothing was saved.',
'inbound_title' => 'Support mailbox (inbox)',
'inbound_body' => 'Where CluPilot fetches customer mail from, shown under Operations → Inbox. IMAP, not the mailcow API: the API administers domains and mailboxes, reading one is IMAP. The password is kept encrypted in the vault.',
'inbound_host' => 'IMAP server',
'inbound_port' => 'Port',
'inbound_port_hint' => '993 is IMAP over TLS. Anything else is unencrypted — and this connection carries a password and your customers own words.',
'inbound_username' => 'Mailbox',
'inbound_folder' => 'Folder',
// The tabs. Split by what a section is for — not by which storage
// mechanism happens to hold a given value.
'tab' => [
'services' => 'Services',
'platform' => 'Platform',
'env' => 'Environment (.env)',
],
];