diff --git a/webapp/app.py b/webapp/app.py index 2ffb02c..e5ce408 100644 --- a/webapp/app.py +++ b/webapp/app.py @@ -872,6 +872,8 @@ def register_routes(app: Flask) -> None: username_error=username_error, server_host=Config.SERVER_HOST, server_hostname=Config.SERVER_HOSTNAME, + ssh_alias=Config.SSH_ALIAS, + ssh_key=Config.SSH_KEY, bootstrap_yaml=bootstrap_yaml, telegram_status=telegram_status, desktop_status=desktop_status, diff --git a/webapp/templates/dashboard.html b/webapp/templates/dashboard.html index d78df46..226a395 100644 --- a/webapp/templates/dashboard.html +++ b/webapp/templates/dashboard.html @@ -2428,34 +2428,35 @@ var serverHostname = {{ server_hostname | tojson }}; var webappUrl = serverHostname ? 'http://' + serverHostname : ''; - var sshHost = 'data-analyst'; + var sshAlias = {{ ssh_alias | tojson }}; + var sshKey = {{ ssh_key | tojson }}; var instructions = 'Set up my AI Data Analyst local environment.\n\n' + 'Connection details:\n' + ' Server IP: ' + serverHost + '\n' + ' Webapp: ' + webappUrl + '\n' + ' My username: ' + username + '\n' - + ' SSH key: ~/.ssh/data_analyst_server (already generated)\n\n' + + ' SSH key: ' + sshKey + ' (already generated)\n\n' + 'Steps:\n\n' + '1. SSH config\n' - + ' Check ~/.ssh/config - if a Host entry named "' + sshHost + '" already exists\n' + + ' Check ~/.ssh/config - if a Host entry named "' + sshAlias + '" already exists\n' + ' with a DIFFERENT server, ask me what name to use instead.\n' + ' Otherwise add:\n' - + ' Host ' + sshHost + '\n' + + ' Host ' + sshAlias + '\n' + ' HostName ' + serverHost + '\n' + ' User ' + username + '\n' - + ' IdentityFile ~/.ssh/data_analyst_server\n' + + ' IdentityFile ' + sshKey + '\n' + ' StrictHostKeyChecking accept-new\n' - + ' Then test: ssh ' + sshHost + ' echo ok\n\n' + + ' Then test: ssh ' + sshAlias + ' echo ok\n\n' + '2. Create project folders (use explicit mkdir, not brace expansion):\n' + ' mkdir -p server/docs server/scripts server/parquet server/metadata server/examples\n' + ' mkdir -p user/duckdb user/notifications user/artifacts user/scripts user/parquet user/sessions\n\n' + '3. Download from server via rsync (use --no-perms --no-group to avoid macOS permission errors).\n' + ' Skip directories that don\'t exist on the server (rsync exit code 23 = missing source).\n' - + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/scripts/ ./server/scripts/\n' - + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/docs/ ./server/docs/\n' - + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/examples/ ./server/examples/\n' - + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/metadata/ ./server/metadata/\n' - + ' rsync -avz --no-perms --no-group --progress ' + sshHost + ':server/parquet/ ./server/parquet/\n' + + ' rsync -avz --no-perms --no-group ' + sshAlias + ':server/scripts/ ./server/scripts/\n' + + ' rsync -avz --no-perms --no-group ' + sshAlias + ':server/docs/ ./server/docs/\n' + + ' rsync -avz --no-perms --no-group ' + sshAlias + ':server/examples/ ./server/examples/\n' + + ' rsync -avz --no-perms --no-group ' + sshAlias + ':server/metadata/ ./server/metadata/\n' + + ' rsync -avz --no-perms --no-group --progress ' + sshAlias + ':server/parquet/ ./server/parquet/\n' + ' Note: some folders may be empty if data sync hasn\'t run on the server yet. That\'s OK.\n\n' + '4. Set up Python venv:\n' + ' python3 -m venv .venv\n'