diff --git a/webapp/templates/dashboard.html b/webapp/templates/dashboard.html index 98eaa19..90f711c 100644 --- a/webapp/templates/dashboard.html +++ b/webapp/templates/dashboard.html @@ -2468,27 +2468,43 @@ var serverHostname = {{ server_hostname | tojson }}; var webappUrl = serverHostname ? 'http://' + serverHostname : ''; + var sshHost = 'data-analyst'; var instructions = 'Set up my AI Data Analyst local environment.\n\n' - + 'Server: ' + serverHost + '\n' - + 'Webapp: ' + webappUrl + '\n' - + 'My username: ' + username + '\n' - + 'SSH key: ~/.ssh/data_analyst_server (already generated)\n\n' - + 'Please do the following:\n' - + '1. Add SSH config entry: Host data-analyst, HostName ' + serverHost - + ', User ' + username + ', IdentityFile ~/.ssh/data_analyst_server\n' - + '2. Test SSH connection (ssh data-analyst echo ok)\n' - + '3. Create project folders: server/ (docs, scripts, parquet, metadata, examples) ' - + 'and user/ (duckdb, notifications, artifacts, scripts, parquet, sessions)\n' - + '4. Download everything from server via rsync:\n' - + ' rsync -avz data-analyst:server/scripts/ ./server/scripts/\n' - + ' rsync -avz data-analyst:server/docs/ ./server/docs/\n' - + ' rsync -avz data-analyst:server/examples/ ./server/examples/\n' - + ' rsync -avz data-analyst:server/metadata/ ./server/metadata/\n' - + ' rsync -avz --progress data-analyst:server/parquet/ ./server/parquet/\n' - + '5. Set up Python venv (.venv) with: pandas, pyarrow, duckdb, pyyaml, python-dotenv\n' - + '6. Run bash server/scripts/setup_views.sh to initialize DuckDB\n' - + '7. Create CLAUDE.md from server/docs/setup/claude_md_template.txt ' - + '(substitute {username} with my username)\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' + + 'Steps:\n\n' + + '1. SSH config\n' + + ' Check ~/.ssh/config - if a Host entry named "' + sshHost + '" already exists\n' + + ' with a DIFFERENT server, ask me what name to use instead.\n' + + ' Otherwise add:\n' + + ' Host ' + sshHost + '\n' + + ' HostName ' + serverHost + '\n' + + ' User ' + username + '\n' + + ' IdentityFile ~/.ssh/data_analyst_server\n' + + ' StrictHostKeyChecking accept-new\n' + + ' Then test: ssh ' + sshHost + ' 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' + + ' 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' + + ' source .venv/bin/activate\n' + + ' pip install pandas pyarrow duckdb pyyaml python-dotenv\n\n' + + '5. Initialize DuckDB (only if server/scripts/setup_views.sh exists):\n' + + ' bash server/scripts/setup_views.sh\n\n' + + '6. Create CLAUDE.md (only if server/docs/setup/claude_md_template.txt exists):\n' + + ' Copy the template, replace {username} with ' + username + '\n'; var button = btn || document.getElementById('bootstrapCopyBtn'); var origText = button.textContent;