SSH Key¶
Here’s how to generate an SSH key, copy it to a remote server, and log in without relying on PubkeyAuthentication
during the initial setup.
1. Generate an SSH Key:
Open your terminal.
Run the following command, replacing
"your_email@example.com"
with your email address and/path/to/your/key
with the desired path and filename for your key (e.g.,~/.ssh/pitt
):ssh-keygen -t ed25519 -C "your_email@example.com" -f /path/to/your/key
You’ll be prompted to enter a passphrase. You can leave it blank for no passphrase (not recommended for production).
This will create two files:
/path/to/your/key
(private key) and/path/to/your/key.pub
(public key).
2. Copy the Public Key to the Remote Server:
Use the
ssh-copy-id
command with the-o PubkeyAuthentication=no
option to force password-based authentication during the key copy process. Replaceusername
andremote_host
with the appropriate values, and/path/to/your/key.pub
with the path to your public key:ssh-copy-id -i /path/to/your/key.pub -o PubkeyAuthentication=no username@gazetteer.crcd.pitt.edu
You’ll be prompted for the remote server’s password.
This command adds your public key to the
~/.ssh/authorized_keys
file on the remote server.
3. Log in to the Remote Server:
Once the key is copied, you can log in using the following command, replacing
username
andremote_host
with your values. The inclusion of-o PubkeyAuthentication=no
is not needed for subsequent logins, only for the ssh-copy-id command.ssh -i /path/to/your/key username@gazetteer.crcd.pitt.edu
The
-i /path/to/your/key
can be omitted if you have only a few keys in your~/.ssh
directory.If you set a passphrase, you’ll be prompted to enter it. Otherwise, you’ll be logged in directly.
If you encounter a prompt regarding RedHat insights, that is normal, and is related to the operating system of the remote server.
You can simplify login by adding the following to your
~/.ssh/config
file, following which you can log in with justssh pitt
:Host pitt User username IdentityFile /path/to/your/key IdentitiesOnly yes
4. Automatically Switch to the gazetteer
Account (Using vi):
After logging in, edit your
.bashrc
file usingvi
:vi ~/.bashrc
Navigate to the end of the file: Press
G
(capital G).Navigate up one line: Press
k
. This ensures the new lines are inserted right beforeunset rc
.Enter insert mode: Press
o
(lowercase o) to insert a new line below the current line.Add the following lines: Replace
username
with your actual username on the remote server.# Automatically switch to the gazetteer account on login if [[ $USER == "username" && $- == *i* ]]; then sudo su - gazetteer fi
Exit insert mode: Press
Esc
.Save and exit: Type
:wq
and press Enter.The next time you log in, you will be automatically switched to the
gazetteer
account.
5. Check Kubernetes Nodes:
After logging in and being switched to the
gazetteer
account, run the following command to check the status of your Kubernetes nodes:kubectl get nodes
This will display a list of nodes and their status. A
Ready
status indicates that the node is functioning correctly.If no nodes are listed, you may need to start Minikube first. You can do this by running:
minikube start --nodes=4 --driver=podman --container-runtime=containerd --cpus=2 --memory=6144 --disk-size=8g --mount-string='/ix1/whcdh:/minikube-whcdh' --mount
Enabling Kubernetes Dashboard and other Addons¶
Enable the required Minikube addons: First, log in to the VM and run the following commands to enable the metrics-server, Kubernetes dashboard, and other components:
for addon in csi-hostpath-driver dashboard metallb metrics-server volumesnapshots; do minikube addons enable "$addon" done
Start the kubectl proxy in the background: Run the following command to start the Kubernetes proxy. Use
nohup
to keep it running even after you log out:nohup kubectl proxy --address=0.0.0.0 --port=8001 --disable-filter=true > kubectl_proxy.log 2>&1 &
Forward the proxy port to your local machine: After starting the proxy, exit the VM and establish an SSH tunnel from your local machine to forward the proxy port:
ssh -L 8010:127.0.0.1:8001 <username>@gazetteer.crcd.pitt.edu
Access the Kubernetes dashboard by visiting
http://localhost:8010/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/workloads?namespace=_all
in your browser.
Secrets Management¶
Passwords and certificates for the Gazetteer services are stored in the private WHG
secrets
GitHub repository. These are retrieved automatically during the deployment process, but a GitHub Personal Access Token must first be set as an environment variable. See here for instructions (you must be a member of the World Historical Gazetteer GitHub repository organization to do this).Log in to the
gazetteer
service account on the VM, and add your Personal Access Token to the~/.bashrc
file:export GITHUB_TOKEN=<github-pat>
After adding the token, run the following command to apply the changes:
source ~/.bashrc
A script will be run during the deployment process to bundle the variable into a Kubernetes secret, which will be used by the management pod to access the private repository.
Deploy Management Pod¶
bash <(curl -s "https://raw.githubusercontent.com/WorldHistoricalGazetteer/place/main/deployment/deploy.sh")
To force redeployment of the management pod, delete the existing pod:
MANAGEMENT_POD=$(kubectl get pods -n management -l app=gazetteer-management -o jsonpath='{.items[0].metadata.name}')
kubectl delete pod $MANAGEMENT_POD -n management
Prepare Storage using create-sync-storage.sh
¶
Note: This is to be deprecated in favour of a per-Deployment method in management pod API.
The script prepares persistent storage on the Pitt VM under the /ix1/whcdh/
root directory, ensuring correct
directory structure, ownership, and permissions expected by the Kubernetes pods. Anticipating future provision of
additional nodes, it selectively includes only those directories relevant to the current environment (K8S_ID=PITT
).
If remote syncing is enabled via environment variables (CLONE_DB
, CLONE_TILES
), the script uses SSH keys stored in
the whg-secret
to fetch selected files and directories — including the latest PostgreSQL backup, static/media files,
and map tiles — from the legacy DigitalOcean hosts.
The host-mounted base directory used for persistent storage at /ix1/whcdh
is expected to be:
Physically attached or otherwise reliably accessible on the VM.
Writable by Minikube and Kubernetes via a hostPath volume mount.
Backed up externally.
Each subdirectory under /ix1/whcdh
corresponds to a Kubernetes volume mount for a specific service, such as:
postgres/ for database files
django-media/ for user-uploaded content
tiles/ and tileserver/ for map tiles
vespa-config/ and vespa-ingestion/ for Vespa deployment files
Run this script after logging in to the gazetteer
service account on the Pitt VM:
# Wait for the Pod to be ready
MANAGEMENT_POD=$(kubectl get pods -n management -l app=gazetteer-management -o jsonpath='{.items[0].metadata.name}')
kubectl wait --for=condition=containersready pod/"$MANAGEMENT_POD" -n management --timeout=60s
# Connect to the management pod and make create-sync-storage.sh executable, then run it
kubectl exec -it "$MANAGEMENT_POD" -n management -c helm -- /bin/sh -c "
cd /apps/repository/deployment &&
ls -l &&
chmod +x create-sync-storage.sh &&
./create-sync-storage.sh --clone-db true --clone-tiles true"
Deploy Services¶
Access the management API service by visiting
http://localhost:8010/api/v1/namespaces/management/services/http:management-chart-service:8000/proxy/
in your browser.To use the helm installation API, visit
http://localhost:8010/api/v1/namespaces/management/services/http:management-chart-service:8000/proxy/install/<chart-name>
in your browser.