<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.cs.vt.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bbradner</id>
	<title>Computer Science Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.cs.vt.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bbradner"/>
	<link rel="alternate" type="text/html" href="http://wiki.cs.vt.edu/index.php/Special:Contributions/Bbradner"/>
	<updated>2026-06-04T01:36:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>http://wiki.cs.vt.edu/index.php?title=HowTo:CS_Launch&amp;diff=4894</id>
		<title>HowTo:CS Launch</title>
		<link rel="alternate" type="text/html" href="http://wiki.cs.vt.edu/index.php?title=HowTo:CS_Launch&amp;diff=4894"/>
		<updated>2025-02-07T13:31:21Z</updated>

		<summary type="html">&lt;p&gt;Bbradner: Added secondary examples about the discovery ingress as students are skipping the note at the top about the difference between the endeavour and discovery ingress formats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
This is a quick start guide for using the CS Launch website and kubernetes resources.  It will walk you through setting up a basic website with database support.  There is a separate guide that describes how to do all these steps using a command line terminal at [[HowTo:CS Launch Terminal]]&lt;br /&gt;
&lt;br /&gt;
== Clusters ==&lt;br /&gt;
The https://launch.cs.vt.edu site manages multiple clusters.  Here is a list of clusters available for use by Computer Science members:&lt;br /&gt;
* &#039;&#039;Endeavour&#039;&#039;&lt;br /&gt;
** This cluster is meant for long term teaching projects, and specialty projects that require GPU resources.&lt;br /&gt;
** Creation of projects on this cluster is limited to CS Faculty and Staff.&lt;br /&gt;
** Projects can be shared with any CS member, including students. &lt;br /&gt;
** Ingress: *.endeavour.cs.vt.edu&lt;br /&gt;
* &#039;&#039;Discovery&#039;&#039;&lt;br /&gt;
** This cluster is meant for general teaching projects.&lt;br /&gt;
** Creation of projects on this cluster is limited to CS Faculty, Staff, graduate students, and CS majors.&lt;br /&gt;
** Projects can be shared with any VT member with a CS account, including non-CS students.&lt;br /&gt;
** Ingress: *.discovery.cs.vt.edu&lt;br /&gt;
** Ingresses on this cluster are limited to campus and VPN IPs by default, but can be opened further using annotations.  See: [[CS Launch Ingress]]&lt;br /&gt;
&lt;br /&gt;
== Create a New Project ==&lt;br /&gt;
Access to CS Launch is made through projects.  A project is a collection of kubernetes namespaces and resources.  You can have access to multiple projects.  Projects can be shared with other CS members.&lt;br /&gt;
&lt;br /&gt;
* Go to CS Launch website: &#039;&#039;&#039;https://launch.cs.vt.edu&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Click the login button&#039;&#039;&#039; to use your CS username and password to log in&lt;br /&gt;
* The main screen will show a list of kubernetes clusters you have access to, if the list is blank then you don&#039;t have access to any clusters&lt;br /&gt;
* &#039;&#039;&#039;Click on the cluster name&#039;&#039;&#039; where you want to create the new project&lt;br /&gt;
* This is your &#039;&#039;&#039;Cluster Dashboard&#039;&#039;&#039;&lt;br /&gt;
* From the menu on the left &#039;&#039;&#039;Click on &#039;&#039;Projects/Namespaces&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create Project&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Name&#039;&#039; field&#039;&#039;&#039; with a cluster unique name for your project  Example: &amp;lt;code&amp;gt;test-project&amp;lt;/code&amp;gt;&lt;br /&gt;
* You add additional project members now or later after the project is created&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
[[Image:Project_create.png]]&lt;br /&gt;
&lt;br /&gt;
== Create a New Namespace ==&lt;br /&gt;
Kubernetes uses namespaces to separate resources.  The CS Launch resources groups namespaces into projects for access control.  A project can contain multiple namespaces.  At least one namespace is required before resources can be created in a project.  To access a namespace you must be a member of the project the namespace is associated with.  A namespace can only be associated with a single project.&lt;br /&gt;
* Navigate to the list of projects&lt;br /&gt;
** &#039;&#039;&#039;Click on &#039;&#039;Projects/Namespaces&#039;&#039;&#039;&#039;&#039; from the cluster dashboard&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create Namespace&#039;&#039; button&#039;&#039;&#039; that is associated with the project you want to assign the namespace to&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Name&#039;&#039; field&#039;&#039;&#039; with a cluster unique name.  Example: &amp;lt;code&amp;gt;test-namespace&amp;lt;/code&amp;gt; The namespace name can be the same as the project name as long as it follows the naming rules and is not already in use.  Kubernetes namespace names must following DNS name rules: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
[[Image:Create_namespace.png]]&lt;br /&gt;
&lt;br /&gt;
== Launching a Database Using Helm==&lt;br /&gt;
Kubernetes supports Helm charts to automate deployment of software.  There are existing Helm charts for many popular software projects, such as databases.  Using a Helm chart can make setting up and updating complex software much easier.  This guide will walk you through deploying MariaDB using a Helm chart from Bitnami.&lt;br /&gt;
* Navigate to your &#039;&#039;&#039;Cluster Dashboard&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Apps&#039;&#039;&#039;&#039;&#039; from the menu on the left&lt;br /&gt;
* We need to add the helm chart repository:&lt;br /&gt;
** &#039;&#039;&#039;Click on &#039;&#039;Repositories&#039;&#039;&#039;&#039;&#039; underneath &#039;&#039;Apps&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
** Fill in &#039;&#039;&#039;Name&#039;&#039;&#039; with &amp;lt;code&amp;gt;bitnami&amp;lt;/code&amp;gt;&lt;br /&gt;
** Fill in &#039;&#039;&#039;Index URL&#039;&#039;&#039; with &amp;lt;code&amp;gt;https://charts.bitnami.com/bitnami&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Charts&#039;&#039;&#039;&#039;&#039; underneath &#039;&#039;Apps&#039;&#039;&lt;br /&gt;
* We need to find the MariaDB chart&lt;br /&gt;
** Make sure to &#039;&#039;&#039;select &#039;&#039;Bitnami&#039;&#039; &#039;&#039;&#039;in the first drop down list&lt;br /&gt;
** &#039;&#039;&#039;Select &#039;&#039;Database&#039;&#039; &#039;&#039;&#039;from the catagories drop down list&lt;br /&gt;
** &#039;&#039;&#039;Click on the &#039;&#039;MariaDB&#039;&#039; tile&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Install&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Select the namespace from the drop down list&#039;&#039;&#039; where you want the database deployed to&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Next&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
* You will be presented with a long list of options and their default values in yaml format&lt;br /&gt;
* For our example, &#039;&#039;&#039;change the following options&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth:&lt;br /&gt;
  database: test-db&lt;br /&gt;
  username: test&lt;br /&gt;
  password: Insecure&lt;br /&gt;
primary:&lt;br /&gt;
  persistence:&lt;br /&gt;
    size: 1Gi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Install&#039;&#039; button&#039;&#039;&#039;&lt;br /&gt;
* It will take a minute or two for the deployment to complete.  The site will give you a window to watch the progress, and report any errors that might occur.&lt;br /&gt;
* You should now have a running database, but no real way to access it yet&lt;br /&gt;
* Other pods in the same namespace will be able to connect to this database using the hostname &amp;lt;code&amp;gt;mariadb&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Launch an App Using a Public Image ==&lt;br /&gt;
Next we will launch a web app called &#039;&#039;Adminer&#039;&#039; that will allow us to interact with our running database, and assign it a URL.&lt;br /&gt;
* Navigate to your &#039;&#039;&#039;Cluster Dashboard&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Workloads&#039;&#039;&#039;&#039;&#039; from the menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Select the &#039;&#039;Deployment&#039;&#039; tile&#039;&#039;&#039; as this type of deployment is best suited for our &#039;&#039;Adminer&#039;&#039; web app.&lt;br /&gt;
* Make sure to &#039;&#039;&#039;select the same namespace as the database&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Name&#039;&#039;&#039;&#039;&#039; with a project unique name.  Example: &amp;lt;code&amp;gt;test-adminer&amp;lt;/code&amp;gt;  The name must following DNS naming rules.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Container Image&#039;&#039;&#039;&#039;&#039; with the value &amp;lt;code&amp;gt;adminer:latest&amp;lt;/code&amp;gt;  This is a path to a docker image, and it resolves to the latest image from the &#039;&#039;adminer&#039;&#039; project on https://docker.io.&lt;br /&gt;
* We need to tell kubernetes how this deployment will interact with the network by giving it a cluster IP.&lt;br /&gt;
** &#039;&#039;&#039;Click on the &#039;&#039;Add Port or Service&#039;&#039; button&#039;&#039;&#039; under &#039;&#039;Networking&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;Select &#039;&#039;ClusterIP&#039;&#039; under the &#039;&#039;Service Type&#039;&#039; drop down list&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Fill in &#039;&#039;Name&#039;&#039;&#039;&#039;&#039; with &amp;lt;code&amp;gt;tcp8080&amp;lt;/code&amp;gt; under &#039;&#039;Networking&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;Fill in &#039;&#039;Private Container Port&#039;&#039;&#039;&#039;&#039; with &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.  TCP port 8080 is the port that the &#039;&#039;Adminer&#039;&#039; web app listens to.&lt;br /&gt;
* Many public docker images use environment variables to effect how the deployment runs.  &#039;&#039;Adminer&#039;&#039; has several environment variables you can set.  For our example, we will set some default values for convenience.&lt;br /&gt;
** &#039;&#039;&#039;Click on &#039;&#039;Add Variable&#039;&#039;&#039;&#039;&#039; under &#039;&#039;Environment Variables&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;&#039;Fill in &#039;&#039;Variable Name&#039;&#039; with the value &amp;lt;code&amp;gt;ADMINER_DEFAULT_SERVER&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;Fill in &#039;&#039;Value&#039;&#039; with the value &amp;lt;code&amp;gt;mariadb&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* The rest of the options can be left on their default settings.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* The web app will start running, but we won&#039;t have a way to access it until we map a URL to the container, this is called an ingress in kubernetes.&lt;br /&gt;
&lt;br /&gt;
== Create Ingress to a Workload ==&lt;br /&gt;
Creating an ingress in kubernetes allows you to map an external URL to your running container so it can be accessed from anywhere on the Internet.&lt;br /&gt;
* &#039;&#039;&#039;Navigate to your &#039;&#039;Cluster Dashboard&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Service Discovery&#039;&#039;&#039;&#039;&#039; from the menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Ingresses&#039;&#039;&#039;&#039;&#039; from the sub-menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* Make sure to &#039;&#039;&#039;select the same namespace as the web app&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Name&#039;&#039;&#039;&#039;&#039; with a project unique name.  Example: &amp;lt;code&amp;gt;test-ingress&amp;lt;/code&amp;gt;  The name must follow DNS naming rules.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Request Host&#039;&#039;&#039;&#039;&#039; with the hostname of the URL you want to map to.  Example: &amp;lt;code&amp;gt;testdb.endeavour.cs.vt.edu&amp;lt;/code&amp;gt;  The Endeavour cluster on CS Launch allows you to map any *.endeavour.cs.vt.edu hostname to your ingress.  Example 2: &amp;lt;code&amp;gt;testdb.discovery.cs.vt.edu&amp;lt;/code&amp;gt;  The Discovery cluster on CS Launch allows you to map any *.discovery.cs.vt.edu hostname to your ingress.  Additionally, a TLS certificate is used to automatically encrypt your ingress traffic.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Path&#039;&#039;&#039;&#039;&#039; with &#039;&#039;Prefix&#039;&#039; value of &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;  Using &#039;&#039;/&#039;&#039; will map the top level path, and all sub-paths of the URL to this deployment.  You can create multiple sub-paths to the same hostname to different deployments allowing you to flesh out a URL running as multiple containers.  Example: mapping /api/* to a deployment that runs the backend of your website.&lt;br /&gt;
* &#039;&#039;&#039;Select your application deployment from the &#039;&#039;Target Service&#039;&#039; drop down list&#039;&#039;&#039;.  Example: &amp;lt;code&amp;gt;test-adminer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Select &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt; from the &#039;&#039;Port&#039;&#039; drop down list&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* Once created you should have a working URL to your web application, and a link on the &#039;&#039;Ingresses&#039;&#039; tabs.&lt;br /&gt;
* For our example, you should be able to go to the URL and login using the password set earlier in the database deployment.  Server name is &amp;lt;code&amp;gt;mariadb&amp;lt;/code&amp;gt;&lt;br /&gt;
* See &#039;&#039;&#039;[[CS Launch Ingress]]&#039;&#039;&#039; for additional information about CS Launch Ingresses&lt;br /&gt;
&lt;br /&gt;
== Create a Custom Web Application ==&lt;br /&gt;
You can do more than just launch pre-built docker images on CS Launch.  You can create your own custom docker images allowing you to host just about any kind of app on kubernetes.  This will walk you through an example of that process.&lt;br /&gt;
* &#039;&#039;&#039;Build your custom docker image&#039;&#039;&#039;  Refer to [[HowTo:Docker]] for an example of building and hosting your own custom docker image.&lt;br /&gt;
* &#039;&#039;&#039;Optional:&#039;&#039;&#039; If your docker image is not public, then you will need to &#039;&#039;&#039;import an access token&#039;&#039;&#039; to be able to download and use your custom docker image.&lt;br /&gt;
** Refer to [[HowTo:Docker#Use_a_Token_to_Access_Registry]] to &#039;&#039;&#039;create an access token&#039;&#039;&#039; for your registry.&lt;br /&gt;
** &#039;&#039;&#039;Copy the contents of your access token&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Navigate to your &#039;&#039;Cluster Dashboard&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Click on &#039;&#039;Storage&#039;&#039;&#039;&#039;&#039; from the menu on the left.&lt;br /&gt;
** &#039;&#039;&#039;Click on &#039;&#039;Secrets&#039;&#039;&#039;&#039;&#039; from the sub-menu on the left.&lt;br /&gt;
** &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
** Make sure to &#039;&#039;&#039;select the same namespace as the web app&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;Select the &#039;&#039;Registry&#039;&#039; tile&#039;&#039;&#039;.&lt;br /&gt;
** &#039;&#039;&#039;Fill in the &#039;&#039;Name&#039;&#039; field&#039;&#039;&#039; with a project unique name.  Example: &amp;lt;code&amp;gt;test-regstry&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;Fill in the &#039;&#039;Registry Domain Name&#039;&#039;&#039;&#039;&#039; field with the hostname of your Docker registry.  Example: &amp;lt;code&amp;gt;container.cs.vt.edu&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;Fill in the &#039;&#039;Username&#039;&#039; field&#039;&#039;&#039; with the &#039;&#039;Name&#039;&#039; from when you created your access token.  Example: &amp;lt;code&amp;gt;test-chatbot&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;Fill in the &#039;&#039;Password&#039;&#039; field&#039;&#039;&#039; with the &#039;&#039;contents of your access token&#039;&#039;  Example: &amp;lt;code&amp;gt;glpat-FqgNwpWtZJT-sfapguRv&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Create a ConfigMap ===&lt;br /&gt;
Kubernetes has a special storage option called a &#039;&#039;ConfigMap&#039;&#039;.  ConfigMaps can be used to create custom config files that can be directly mounted into the Docker image to localize your deployment.  For example, use a ConfigMap to create a database configuration file instead of embedding that config inside of the docker image itself.  For this example, we will create a &#039;&#039;config.php&#039;&#039; ConfigMap file and mount it under the /var/www/html/dbconfig directory inside the running container.&lt;br /&gt;
* &#039;&#039;&#039;Navigate to your &#039;&#039;Cluster Dashboard&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Storage&#039;&#039;&#039;&#039;&#039; from the menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;ConfigMaps&#039;&#039;&#039;&#039;&#039; from the sub-menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* Make sure to &#039;&#039;&#039;select the same namespace as the web app&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Name&#039;&#039; field&#039;&#039;&#039; with a project unique name.  The name must following DNS naming rules.  Example: &amp;lt;code&amp;gt;test-config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Binary Data&#039;&#039;&#039;&#039;&#039; on the left.&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Key&#039;&#039; field&#039;&#039;&#039; with the value &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;File in the &#039;&#039;Value&#039;&#039; field&#039;&#039;&#039; with contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
declare(strict_types=1);&lt;br /&gt;
&lt;br /&gt;
define(&amp;quot;HOST&amp;quot;, &amp;quot;mariadb&amp;quot;);&lt;br /&gt;
define(&amp;quot;DB_NAME&amp;quot;, &amp;quot;test-db&amp;quot;);&lt;br /&gt;
define(&amp;quot;DB_USER&amp;quot;, &amp;quot;test&amp;quot;);&lt;br /&gt;
define(&amp;quot;PASS&amp;quot;, &amp;quot;Insecure&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$host = HOST;&lt;br /&gt;
$db_name = DB_NAME;&lt;br /&gt;
&lt;br /&gt;
$dsn = &amp;quot;mysql:host=$host;dbname=$db_name&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
	$db = new PDO ($dsn, DB_USER, PASS);&lt;br /&gt;
	$db-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);&lt;br /&gt;
} catch (PDOException $e) {&lt;br /&gt;
	throw new PDOException($e-&amp;gt;getMessage());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Create Database Tables ===&lt;br /&gt;
Most dynamic web apps will require a database to be created before use.  For our example, you need to import a SQL dump to create tables and data.&lt;br /&gt;
* &#039;&#039;&#039;Navigate to your Adminer Ingress URL&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Log in using your database credentials&#039;&#039;&#039;&lt;br /&gt;
* Download the database dump from https://raw.githubusercontent.com/AaravRajSIngh/Chatbot/main/database.sql&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Import&#039;&#039; button&#039;&#039;&#039; to the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Browse...&#039;&#039; button&#039;&#039;&#039; and &#039;&#039;&#039;locate the downloaded sql dump&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Execute&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Launch a Custom Application using a ConfigMap ===&lt;br /&gt;
We are ready to launch the custom built web app.&lt;br /&gt;
* &#039;&#039;&#039;Navigate to your &#039;&#039;Cluster Dashboard&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Workloads&#039;&#039;&#039;&#039;&#039; from the menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Deployment&#039;&#039; tile&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
* Make sure to &#039;&#039;&#039;select the same namespace as the database&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Pod&#039;&#039; tab&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Storage&#039;&#039; menu&#039;&#039;&#039; under the &#039;&#039;Pod&#039;&#039; tab.&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Volume Name&#039;&#039; field&#039;&#039;&#039; with a pod unique name.  Example: &amp;lt;code&amp;gt;dbconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Select &#039;&#039;ConfigMap&#039;&#039; from the &#039;&#039;Add Volume&#039;&#039; drop down list&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Select your custom ConfigMap from the &#039;&#039;ConfigMap&#039;&#039; drop down list&#039;&#039;&#039;.  Example: &amp;lt;code&amp;gt;test-config&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;container-0&#039;&#039; tab&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Name&#039;&#039; field&#039;&#039;&#039; with a project unique name.  The name must following DNS naming rules.  Example: &amp;lt;code&amp;gt;test-chatbot&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Container Image&#039;&#039; field&#039;&#039;&#039; with your personal Docker image URL.  Example: &amp;lt;code&amp;gt;container.cs.vt.edu/carnold/chatbot:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Add Port or Service&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Select &#039;&#039;ClusterIP&#039;&#039; from the &#039;&#039;Service Type&#039;&#039; drop down list&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Name&#039;&#039; field&#039;&#039;&#039; under &#039;&#039;Networking&#039;&#039; with the value: &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Fill in the &#039;&#039;Private Container Port&#039;&#039; field&#039;&#039;&#039; under &#039;&#039;Networking&#039;&#039; with the value: &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Storage&#039;&#039;&#039;&#039;&#039; under the &#039;&#039;container-0&#039;&#039; tab.&lt;br /&gt;
* &#039;&#039;&#039;Select your pod volume from the &#039;&#039;Select Volume&#039;&#039; drop down list&#039;&#039;&#039;.  Example: &amp;lt;code&amp;gt;dbconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Mount Point&#039;&#039;&#039;&#039;&#039; with the value: &amp;lt;code&amp;gt;/var/www/html/dbconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Create an Ingress to a Custom Application ===&lt;br /&gt;
We need to create another ingress to access this new web application.&lt;br /&gt;
* &#039;&#039;&#039;Navigate to your &#039;&#039;Cluster Dashboard&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Service Discovery&#039;&#039;&#039;&#039;&#039; from the menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on &#039;&#039;Ingresses&#039;&#039;&#039;&#039;&#039; from the sub-menu on the left.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* Make sure to &#039;&#039;&#039;select the same namespace as the web app&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Name&#039;&#039;&#039;&#039;&#039; with a project unique name.  Example: &amp;lt;code&amp;gt;chatbot-ingress&amp;lt;/code&amp;gt;  The name must follow DNS naming rules.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Request Host&#039;&#039;&#039;&#039;&#039; with the hostname of the URL you want to map to.  Example: &amp;lt;code&amp;gt;chatbot.endeavour.cs.vt.edu&amp;lt;/code&amp;gt;  The Endeavour cluster on CS Launch allows you to map any *.endeavour.cs.vt.edu hostname to your ingress.  Example 2: &amp;lt;code&amp;gt;chatbot.discovery.cs.vt.edu&amp;lt;/code&amp;gt;  The Discovery cluster on CS Launch allows you to map any *.discovery.cs.vt.edu hostname to your ingress.  Additionally, a TLS certificate is used to automatically encrypt your ingress traffic.&lt;br /&gt;
* &#039;&#039;&#039;Fill in &#039;&#039;Path&#039;&#039;&#039;&#039;&#039; with &#039;&#039;Prefix&#039;&#039; value of &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;  Using &#039;&#039;/&#039;&#039; will map the top level path, and all sub-paths of the URL to this deployment.  You can create multiple sub-paths to the same hostname to different deployments allowing you to flesh out a URL running as multiple containers.  Example: mapping /api/* to a deployment that runs the backend of your website.&lt;br /&gt;
* &#039;&#039;&#039;Select your application deployment from the &#039;&#039;Target Service&#039;&#039; drop down list&#039;&#039;&#039;.  Example: &amp;lt;code&amp;gt;test-chatbot&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Select &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt; from the &#039;&#039;Port&#039;&#039; drop down list&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Click on the &#039;&#039;Create&#039;&#039; button&#039;&#039;&#039;.&lt;br /&gt;
* Once created you should have a working URL to your web application, and a link on the &#039;&#039;Ingresses&#039;&#039; tabs.&lt;br /&gt;
&lt;br /&gt;
== Notes on Storage ==&lt;br /&gt;
* Persistent volumes (PVs) can be used for storage on your workloads&lt;br /&gt;
* PVs can be created on demand using the default storage class&lt;br /&gt;
* The default storage class PVs can only be mounted on a single pod at a time&lt;br /&gt;
* If you need larger storage (&amp;gt; 1TB) or read/write from multiple pods, then consider using the CS central storage service: [[HowTo:CS_Stash]]&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
* Using GPU enabled containers on &#039;&#039;Endeavour&#039;&#039; cluster see [[HowTo:CS_Launch_GPU]]&lt;/div&gt;</summary>
		<author><name>Bbradner</name></author>
	</entry>
	<entry>
		<id>http://wiki.cs.vt.edu/index.php?title=Contact_Techstaff&amp;diff=4891</id>
		<title>Contact Techstaff</title>
		<link rel="alternate" type="text/html" href="http://wiki.cs.vt.edu/index.php?title=Contact_Techstaff&amp;diff=4891"/>
		<updated>2024-12-06T18:59:00Z</updated>

		<summary type="html">&lt;p&gt;Bbradner: Updated Office Locations from KW II&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== techstaff@cs.vt.edu ==&lt;br /&gt;
&lt;br /&gt;
* The quickest and easiest way to contact us is through email to [mailto:techstaff@cs.vt.edu techstaff@cs.vt.edu]&lt;br /&gt;
&lt;br /&gt;
== Individually ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Rich Charles (Technical lead)&#039;&#039;&#039;&lt;br /&gt;
** 4309 A Gilbert Place&lt;br /&gt;
** [mailto:rich08@cs.vt.edu rich08@cs.vt.edu]&lt;br /&gt;
** (540) 231-7227&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mike Thompson (Desktop Support)&#039;&#039;&#039;&lt;br /&gt;
** 4309 Gilbert Place&lt;br /&gt;
** [mailto:miket@vt.edu miket@vt.edu]&lt;br /&gt;
**(540) 231-3167&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chris Arnold (Dept/Teaching Resources)&#039;&#039;&#039;&lt;br /&gt;
** 4309 Gilbert Place&lt;br /&gt;
** [mailto:carnold@cs.vt.edu carnold@cs.vt.edu]&lt;br /&gt;
** (540) 231-5464&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Rob Hunter (Research Resources)&#039;&#039;&#039;&lt;br /&gt;
** 4309 Gilbert Place&lt;br /&gt;
** [mailto:rhunter@vt.edu rhunter@vt.edu]&lt;br /&gt;
** (540) 231-6470&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ben Stein (DevOps)&#039;&#039;&#039;&lt;br /&gt;
** 4309 Gilbert Place&lt;br /&gt;
** [mailto:bbradner@vt.edu bbradner@vt.edu]&lt;br /&gt;
** (540) 231-0048&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Michael Davis (Inventory/Supplies)&#039;&#039;&#039;&lt;br /&gt;
** 4309 Gilbert Place&lt;br /&gt;
** [mailto:michd91@vt.edu michd91@vt.edu]&lt;br /&gt;
** (540) 231-7618&lt;/div&gt;</summary>
		<author><name>Bbradner</name></author>
	</entry>
	<entry>
		<id>http://wiki.cs.vt.edu/index.php?title=Poster_Printing&amp;diff=4702</id>
		<title>Poster Printing</title>
		<link rel="alternate" type="text/html" href="http://wiki.cs.vt.edu/index.php?title=Poster_Printing&amp;diff=4702"/>
		<updated>2023-12-04T19:58:43Z</updated>

		<summary type="html">&lt;p&gt;Bbradner: Told users to email their poster to us, so it can get printed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As a provided service the techstaff will print posters for departmental use at no charge.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: This service requires the approval of your professor.&#039;&#039;&#039;&lt;br /&gt;
==Specifications==&lt;br /&gt;
&#039;&#039;&#039;Paper Size:&#039;&#039;&#039; 24&amp;quot;, 36&amp;quot; 42&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;As long as one of the edges of the poster shares a common length with these three paper sizes, the poster can be printed without any scaling or margins. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File Type:&#039;&#039;&#039; PDF &amp;amp; PPT&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lead Time:&#039;&#039;&#039; 24 Hours&lt;br /&gt;
&amp;lt;br&amp;gt;Your poster may be finished before this time but for best results the sooner you can have the finished poster to the techstaff the better. Printer issues and other projects may cause a delay.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How to Submit a Poster for Printing:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;Email techstaff@cs.vt.edu with your preferred paper size dimensions, the date you need the poster by, and attach your poster file (if sharing a google drive link or similar ensure anyone with a link can access).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Where &amp;amp; when can I pick up my poster?&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt; The TechStaff offices are located on the 4th floor of Gilbert place (Suite 4309). Your poster will be left in the hallway outside of our suite when completed. The building is open to the public between 8am-5pm, Monday - Friday. After 5pm building access requires authenticated Hokie passports.&lt;/div&gt;</summary>
		<author><name>Bbradner</name></author>
	</entry>
</feed>