Add Group 02 LaTeX manual source for peer review #8
@@ -0,0 +1,15 @@
|
||||
This draft updates Group 02's living manual for Assignment \AssignmentNumber,
|
||||
\AssignmentTitle, with a new Gitea chapter organized into the eight required
|
||||
rubric sections. The chapter records the supplied deployment and verification
|
||||
evidence and identifies remaining workflow and documentation gaps.
|
||||
The following material is retained from earlier work.
|
||||
|
||||
Group 02 completed Assignment \#3 by deploying a two-button website in a
|
||||
Docker container on a DigitalOcean Droplet. The website uses class-based
|
||||
JavaScript, and the report includes its UML class diagram, deployment
|
||||
commands, and public website links. The group also built and ran a TeX Live
|
||||
Docker container that compiled a sample LaTeX document into
|
||||
\texttt{hello.pdf}. Finally, this report proposes Stevens SmartPark, a
|
||||
campus parking information system that may use simulated activity to show
|
||||
parking availability, hours, rules, accessible spaces, and electric-vehicle
|
||||
charging information.
|
||||
@@ -0,0 +1,367 @@
|
||||
%%
|
||||
%% This is file `cornell.cls',
|
||||
%% generated with the docstrip utility.
|
||||
%%
|
||||
%% The original source files were:
|
||||
%%
|
||||
%% cornell.dtx (with options: `class')
|
||||
%%
|
||||
%% IMPORTANT NOTICE:
|
||||
%%
|
||||
%% For the copyright see the source file.
|
||||
%%
|
||||
%% Any modified versions of this file must be renamed
|
||||
%% with new filenames distinct from cornell.cls.
|
||||
%%
|
||||
%% For distribution of the original source see the terms
|
||||
%% for copying and modification in the file cornell.dtx.
|
||||
%%
|
||||
%% This generated file may be distributed as long as the
|
||||
%% original source files, as listed above, are part of the
|
||||
%% same distribution. (The sources need not necessarily be
|
||||
%% in the same archive or directory.)
|
||||
%% Document class `cornell' to use with LaTeX 2e.
|
||||
%% Based on `crnlphd' class. The following is from the file `crnlphd.dtx':
|
||||
%% Based loosely on old cuphdthesis style file.
|
||||
%% Found to give good results, according to the thesis secretary.
|
||||
%% File: crnlphd.dtx Copyright (C) 1994 Sergio Gelato
|
||||
%% Made available without any warranty, express or implied.
|
||||
%% Modifications
|
||||
%% 03/26/98 Mike Heisler
|
||||
%% Conform to Eric's final version. Margins are subject to
|
||||
%% The whim of the printer.
|
||||
%% 10/10/97 Mike Heisler and Eric Dahl
|
||||
%% Altered footnotesize and changed the Acknowledgement and
|
||||
%% Biographical titles per thesis secretary guideline that
|
||||
%% they must match the rest of the document, i.e. flush left
|
||||
%% and capitalized rather than all caps
|
||||
%% 05/21/97 Mike Heisler
|
||||
%% Added a 'papers' option to handle bibliographis as sections
|
||||
%% at the end of each chapter. Reduced top margin.
|
||||
%%
|
||||
%% $Id$
|
||||
%% \CharacterTable
|
||||
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
|
||||
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
|
||||
%% Digits \0\1\2\3\4\5\6\7\8\9
|
||||
%% Exclamation \! Double quote \" Hash (number) \#
|
||||
%% Dollar \$ Percent \% Ampersand \&
|
||||
%% Acute accent \' Left paren \( Right paren \)
|
||||
%% Asterisk \* Plus \+ Comma \,
|
||||
%% Minus \- Point \. Solidus \/
|
||||
%% Colon \: Semicolon \; Less than \<
|
||||
%% Equals \= Greater than \> Question mark \?
|
||||
%% Commercial at \@ Left bracket \[ Backslash \\
|
||||
%% Right bracket \] Circumflex \^ Underscore \_
|
||||
%% Grave accent \` Left brace \{ Vertical bar \|
|
||||
%% Right brace \} Tilde \~}
|
||||
%%
|
||||
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
|
||||
\ProvidesClass{cornell}
|
||||
[1998/03/26 v2.0
|
||||
Cornell University thesis class]
|
||||
\newif\ifphd
|
||||
\DeclareOption{phd}{\phdtrue}
|
||||
\DeclareOption{master}{\phdfalse}
|
||||
\ExecuteOptions{phd}
|
||||
\newif\ifpapers
|
||||
\DeclareOption{papers}{\paperstrue}
|
||||
\DeclareOption{10pt}{%
|
||||
\OptionNotUsed%
|
||||
\ClassWarningNoLine{cornell}{Font size 10pt not allowed; using 12pt}%
|
||||
}
|
||||
\DeclareOption{11pt}{%
|
||||
\OptionNotUsed%
|
||||
\ClassWarningNoLine{cornell}{Font size 11pt not allowed; using 12pt}%
|
||||
}
|
||||
\newcommand{\prelim@contents}[1]{}
|
||||
\DeclareOption{tocprelim}{%
|
||||
\renewcommand{\prelim@contents}[1]{\addcontentsline{toc}{section}{#1}}
|
||||
}
|
||||
\DeclareOption*{%
|
||||
\PassOptionsToClass{\CurrentOption}{report}%
|
||||
}
|
||||
\ProcessOptions
|
||||
|
||||
\LoadClass[12pt]{report}[1994/06/01]
|
||||
\renewcommand{\defaultscriptratio}{.75}
|
||||
\renewcommand{\defaultscriptscriptratio}{.6}
|
||||
\setlength\headsep{25\p@}
|
||||
\if@twocolumn
|
||||
\else
|
||||
\setlength\oddsidemargin{0in}
|
||||
\setlength\evensidemargin{0in}
|
||||
\setlength\textwidth{6.5in}
|
||||
\setlength\topmargin{-0.5in}
|
||||
\setlength\headheight{0.2in}
|
||||
\setlength\headsep{0.35in}
|
||||
\setlength\textheight{8.85in}
|
||||
\setlength\footskip{0.5in}
|
||||
\setlength\marginparwidth{0.85in}
|
||||
\setlength\marginparsep{0.125in}
|
||||
\fi
|
||||
\if@compatibility
|
||||
\setlength\topmargin{0\p@}
|
||||
\else
|
||||
\fi
|
||||
\newcommand{\ps@cornell}{%
|
||||
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
|
||||
\def\@oddfoot{}%
|
||||
\def\@evenhead{\thepage\hfil{\slshape\leftmark}}%
|
||||
\def\@evenfoot{}%
|
||||
\def\chaptermark##1{}%
|
||||
\def\sectionmark##1{}%
|
||||
}
|
||||
\newcommand{\ps@cornellc}{%
|
||||
\def\@oddhead{\hfil\thepage\hfil}%
|
||||
\def\@oddfoot{}%
|
||||
\def\@evenhead{\@oddhead}%
|
||||
\def\@evenfoot{}%
|
||||
\def\chaptermark##1{}%
|
||||
\def\sectionmark##1{}%
|
||||
}
|
||||
\raggedbottom
|
||||
\newcommand{\@prolformat}[1]{{\begin{flushleft} \Huge #1 \end{flushleft}} }
|
||||
\newcommand{\ackname}{\@prolformat{Acknowledgements}}
|
||||
\newcommand{\bioname}{\@prolformat{Biographical Sketch}}
|
||||
\renewcommand{\contentsname}{\@prolformat{Table of Contents}}
|
||||
\renewcommand{\listtablename}{\@prolformat{List of Tables}}
|
||||
\renewcommand{\listfigurename}{\@prolformat{List of Figures}}
|
||||
\renewcommand{\l@figure}{\@dottedtocline{1}{1.5em}{2.6em}}
|
||||
\let\l@table\l@figure
|
||||
|
||||
\renewenvironment{thebibliography}[1]
|
||||
{\ifpapers \clearpage \section*{\bibname%
|
||||
\@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}%
|
||||
\else%
|
||||
\chapter*{\bibname%
|
||||
\@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}%
|
||||
\fi%
|
||||
\list{\@biblabel{\arabic{enumiv}}}%
|
||||
{\settowidth\labelwidth{\@biblabel{#1}}%
|
||||
\leftmargin\labelwidth
|
||||
\advance\leftmargin\labelsep
|
||||
\@openbib@code
|
||||
\usecounter{enumiv}%
|
||||
\let\p@enumiv\@empty
|
||||
\renewcommand\theenumiv{\arabic{enumiv}}}%
|
||||
\sloppy\clubpenalty4000\widowpenalty4000%
|
||||
\sfcode`\.\@m\relax
|
||||
\ifpapers%
|
||||
\addcontentsline{toc}{section}{\bibname}%
|
||||
\else%
|
||||
\addcontentsline{toc}{chapter}{\bibname}%
|
||||
\fi
|
||||
\singlespacing}
|
||||
{\def\@noitemerr
|
||||
{\@latex@warning{Empty `thebibliography' environment}}%
|
||||
\normalspacing
|
||||
\endlist}
|
||||
|
||||
\newcommand{\@titlesize}{\Large}
|
||||
\newcommand{\@subtitlesize}{\large}
|
||||
\newcommand{\@authorsize}{\normalsize} % No Pharaoh he.
|
||||
\newcommand{\@conferralmonth}{January}
|
||||
\newcommand{\@conferralyear}{}
|
||||
|
||||
\newcommand{\titlesize}[1]{\renewcommand{\@titlesize}{#1}}
|
||||
\newcommand{\subtitlesize}[1]{\renewcommand{\@subtitlesize}{#1}}
|
||||
\newcommand{\authorsize}[1]{\renewcommand{\@authorsize}{#1}}
|
||||
\newcommand{\conferraldate}[2]{%
|
||||
\renewcommand{\@conferralmonth}{#1}
|
||||
\renewcommand{\@conferralyear}{#2}
|
||||
}
|
||||
\newcommand{\@degreefield}{Master of Science} %CHANGED
|
||||
\newcommand{\degreefield}[1]{\renewcommand{\@degreefield}{#1}} %CHANGED
|
||||
|
||||
\renewcommand{\maketitle}{%
|
||||
\begin{titlepage}%
|
||||
\vspace*{-0.24in}
|
||||
\begin{center}%
|
||||
\@titlesize \@title
|
||||
\end{center}
|
||||
\vfill
|
||||
%\begin{center}
|
||||
%\@subtitlesize
|
||||
%A \ifphd Dissertation \else Thesis \fi \\ %CHANGED
|
||||
%Presented to the Faculty of the Graduate School \\
|
||||
%of Cornell University \\
|
||||
%in Partial Fulfillment of the Requirements for the Degree of \\
|
||||
%\ifphd Doctor of Philosophy \else \@degreefield \fi %CHANGED
|
||||
%\end{center}
|
||||
\vfill
|
||||
\begin{center}
|
||||
\@authorsize
|
||||
by \\
|
||||
\@author \\
|
||||
\@conferralmonth\ \@conferralyear
|
||||
\end{center}
|
||||
\vspace*{0.26in}
|
||||
\end{titlepage}
|
||||
}
|
||||
|
||||
\renewenvironment{titlepage}{%
|
||||
\typeout{Title page}
|
||||
\pagestyle{empty}
|
||||
\doublespacing
|
||||
}{%
|
||||
\normalspacing\clearpage
|
||||
}
|
||||
|
||||
|
||||
\newenvironment{copyrightpage}{%
|
||||
\typeout{Copyleft page}
|
||||
\pagestyle{empty}
|
||||
\null\vfil
|
||||
\begin{center}
|
||||
}{%
|
||||
\end{center}
|
||||
\vfil\null
|
||||
\clearpage
|
||||
}
|
||||
|
||||
\newcommand{\makecopyright}{%
|
||||
\begin{copyrightpage}
|
||||
\copyright\ \@copyrightholder\ \@copyrightyear \\
|
||||
ALL RIGHTS RESERVED \\[.5in]
|
||||
\end{copyrightpage}
|
||||
}
|
||||
\newcommand{\@copyrightholder}{\@author}
|
||||
\newcommand{\@copyrightyear}{\@conferralyear}
|
||||
|
||||
\newcommand{\copyrightholder}[1]{\renewcommand{\@copyrightholder}{#1}}
|
||||
\newcommand{\copyrightyear}[1]{\renewcommand{\@copyrightyear}{#1}}
|
||||
|
||||
|
||||
\newlength{\@abhdskip}
|
||||
\renewenvironment{abstract}{%
|
||||
\typeout{Abstract}
|
||||
\singlespacing
|
||||
\ifphd %CHANGED
|
||||
\setlength{\@abhdskip}{.25in}
|
||||
\addtolength{\@abhdskip}{-\topmargin}
|
||||
\vspace*{\@abhdskip}
|
||||
\begin{center}
|
||||
\@abstracttitle \\
|
||||
\ \\
|
||||
\@author \\
|
||||
\@conferralyear
|
||||
\end{center}
|
||||
\vspace{.25in}
|
||||
\else %CHANGED
|
||||
\chapter*{%
|
||||
\begin{center}
|
||||
\normalsize
|
||||
ABSTRACT
|
||||
\end{center}
|
||||
}
|
||||
\par
|
||||
\fi %CHANGED
|
||||
\pagestyle{empty}
|
||||
\thispagestyle{empty}
|
||||
}{%
|
||||
\clearpage
|
||||
}
|
||||
|
||||
\newcommand{\@abstracttitle}{\@title}
|
||||
\newcommand{\abstracttitle}[1]{\renewcommand{\@abstracttitle}{#1}}
|
||||
|
||||
|
||||
\newenvironment{biosketch}{%
|
||||
\typeout{Vita}
|
||||
\pagestyle{plain}
|
||||
\pagenumbering{roman}
|
||||
\setcounter{page}{3}
|
||||
\prelim@contents{Biographical Sketch}
|
||||
\chapter*{%
|
||||
\bioname
|
||||
}
|
||||
\par
|
||||
}{%
|
||||
\clearpage
|
||||
}
|
||||
|
||||
\newenvironment{dedication}{%
|
||||
\prelim@contents{Dedication}
|
||||
\null\vfil
|
||||
\begin{center}
|
||||
}{
|
||||
\end{center}
|
||||
\vfil\null
|
||||
\clearpage
|
||||
}
|
||||
|
||||
\newenvironment{acknowledgements}{%
|
||||
\prelim@contents{Acknowledgments}
|
||||
\chapter*{%
|
||||
\ackname
|
||||
}
|
||||
\par
|
||||
}{%
|
||||
\cleardoublepage
|
||||
}
|
||||
|
||||
\newcommand{\contentspage}{%
|
||||
\singlespacing
|
||||
\label{toc}
|
||||
\prelim@contents{\contentsname}
|
||||
\tableofcontents
|
||||
\normalspacing
|
||||
\clearpage
|
||||
}
|
||||
|
||||
\newcommand{\tablelistpage}{%
|
||||
\singlespacing
|
||||
\label{lot}
|
||||
\prelim@contents{\listtablename}
|
||||
\listoftables
|
||||
\normalspacing
|
||||
\clearpage
|
||||
}
|
||||
|
||||
\newcommand{\figurelistpage}{%
|
||||
\singlespacing
|
||||
\label{lof}
|
||||
\prelim@contents{\listfigurename}
|
||||
\listoffigures
|
||||
\normalspacing
|
||||
\clearpage
|
||||
}
|
||||
\newcommand{\abbrlist}{%
|
||||
\singlespacing
|
||||
\prelim@contents{List of Abbreviations}
|
||||
\chapter*{List of Abbreviations}
|
||||
}
|
||||
|
||||
\newcommand{\symlist}{%
|
||||
\singlespacing
|
||||
\prelim@contents{List of Symbols}
|
||||
\chapter*{List of Symbols}
|
||||
}
|
||||
|
||||
\newcommand{\preface}{%
|
||||
\singlespacing
|
||||
\prelim@contents{Preface}
|
||||
\chapter*{Preface}
|
||||
}
|
||||
|
||||
\newcommand{\singlespacing}{%
|
||||
\let\CS=\@currsize\renewcommand{\baselinestretch}{1.0}\tiny\CS}
|
||||
\newcommand{\singlespacingplus}{%
|
||||
\let\CS=\@currsize\renewcommand{\baselinestretch}{1.25}\tiny\CS}
|
||||
\newcommand{\doublespacing}{%
|
||||
\let\CS=\@currsize\renewcommand{\baselinestretch}{1.75}\tiny\CS}
|
||||
\newcommand{\realdoublespacing}{%
|
||||
\let\CS=\@currsize\renewcommand{\baselinestretch}{2}\tiny\CS}
|
||||
\newcommand{\normalspacing}{\doublespacing}
|
||||
\newcommand{\footnotespacing}{\singlespacing}
|
||||
\newcommand{\changespacing}[2]{%
|
||||
\renewcommand{#1}{%
|
||||
\let\CS=\@currsize\renewcommand{\baselinestretch}{#2}\tiny\CS}%
|
||||
}
|
||||
\newcommand{\changenormalspacing}[1]{\renewcommand{\normalspacing}{#1}}
|
||||
\normalspacing
|
||||
|
||||
\endinput
|
||||
%%
|
||||
%% End of file `cornell.cls'.
|
||||
@@ -0,0 +1,107 @@
|
||||
\chapter{AI Agent Usage Guide}
|
||||
\ChapterLabel{AIAgentGuide}
|
||||
\index{AI agent}
|
||||
\index{AI agent!DevOps workflow}
|
||||
\index{Appendix!AI Agent Usage Guide}
|
||||
|
||||
\section{How to Use This Appendix}
|
||||
An AI agent that creates, reviews, or maintains an assignment shall read this
|
||||
file first. It shall identify the task in the routing table, read the minimum
|
||||
authoritative sources, and expand context only for a discovered dependency or
|
||||
inconsistency. This guide is maintained in LaTeX so it is visible, versioned,
|
||||
and reviewable with the assignment.
|
||||
|
||||
\section{Governing Principles}
|
||||
The authored LaTeX files, versioned automation, and approved assignment
|
||||
materials are authoritative. The PDF is a review artifact and shall not be
|
||||
edited directly. AI may draft, explain, analyze, check consistency, and assist
|
||||
with builds. It shall not invent completion, evidence, access, costs, grades,
|
||||
approvals, command output, security posture, or operational results.
|
||||
|
||||
\section{Chapter File Convention}
|
||||
\index{AI agent!chapter file convention}
|
||||
Every assignment chapter shall be stored in exactly one file named with the
|
||||
\texttt{devops} prefix, a PascalCase chapter name, and the \texttt{.tex}
|
||||
suffix. For example, Chapter~2 is fully contained in
|
||||
\path{devopsExampleAssignment.tex}. A chapter file shall begin with its
|
||||
\texttt{\string\chapter\{...\}} command and contain all of that chapter's
|
||||
sections and subsections. Do not split one chapter across files, create
|
||||
section-only \texttt{.tex} files, or use \texttt{\string\input} or
|
||||
\texttt{\string\include} to assemble a chapter from smaller fragments.
|
||||
|
||||
Supporting non-chapter files may use a different name only when they are not
|
||||
chapter content: \texttt{prologue.tex}, \texttt{abstract.tex},
|
||||
\texttt{devopsGlossary.tex}, and \texttt{devopsReferences.bib} are examples.
|
||||
Appendix chapters follow the same chapter-file convention.
|
||||
|
||||
\section{AI Quick Start}
|
||||
\begin{enumerate}
|
||||
\item Read this guide and identify the requested outcome.
|
||||
\item Select the closest task below and load only its listed sources.
|
||||
\item Inspect supplied facts and report consequential gaps or assumptions.
|
||||
\item Make narrowly scoped changes; preserve stable IDs, glossary terms, and history.
|
||||
\item Never request, print, store, or commit credentials, tokens, personal data, or production data.
|
||||
\item Build the complete PDF, inspect the log, visually inspect affected pages, and record material AI use in \ChapterRef{AIPromptLog}.
|
||||
\end{enumerate}
|
||||
|
||||
\section{Task Routing}
|
||||
\small
|
||||
\begin{tabularx}{\linewidth}{L{4.0cm}Y}
|
||||
\caption{AI Task-Routing Table\label{Table:AITaskRouting}}\\
|
||||
\toprule \textbf{Task} & \textbf{Minimum authoritative sources}\\ \midrule
|
||||
Initialize an assignment & \texttt{devopsAssignment.tex}, \texttt{prologue.tex}, \texttt{devopsIntroduction.tex}, \texttt{devopsExampleAssignment.tex}, and the instructor's assignment facts.\\
|
||||
Develop a workflow & \texttt{devopsExampleAssignment.tex}, source repository materials, and authorized environment constraints.\\
|
||||
Define evidence & \texttt{devopsExampleAssignment.tex} and controlled execution outputs.\\
|
||||
Review a retrospective & \texttt{devopsExampleAssignment.tex} and the submitted workflow or runbook.\\
|
||||
Edit AI guidance & \texttt{devopsAIAgentGuide.tex}, \texttt{devopsAIPromptLog.tex}, \texttt{devopsDocumentGuide.tex}, and \texttt{devopsAssignment.tex}.\\
|
||||
Compile or troubleshoot & \texttt{devopsAssignment.tex}, \texttt{devopsDocumentGuide.tex}, the affected chapter, and the build log.\\ \bottomrule
|
||||
\end{tabularx}
|
||||
\normalsize
|
||||
|
||||
\section{DevOps-Specific Rules}
|
||||
\begin{enumerate}
|
||||
\item Prefer versioned, repeatable automation over undocumented manual steps.
|
||||
\item Treat deployment output, monitoring data, and screenshots as evidence only when they reflect an actual execution.
|
||||
\item Design failure exercises to be isolated, reversible, and authorized.
|
||||
\item Apply least privilege and never place secrets in LaTeX, source control, prompts, screenshots, or logs.
|
||||
\item State expected cloud cost, cleanup action, and resource ownership for each remote-environment activity.
|
||||
\item Identify whether a recommendation is a proposal, an instructor directive, or demonstrated evidence.
|
||||
\end{enumerate}
|
||||
|
||||
\section{Example AI Requests}
|
||||
\subsection{Create an Assignment Brief}
|
||||
\begin{verbatim}
|
||||
Read devopsAIAgentGuide.tex and use the Initialize an Assignment context.
|
||||
From the supplied SSW 590 objective and constraints, fill only supported
|
||||
placeholders in the introduction and activity brief. Propose clear, observable
|
||||
completion criteria, a safe cleanup action, and a rubric. Do not invent cloud
|
||||
access, due dates, policy, costs, or approved tools. Update history, compile,
|
||||
and report instructor decisions still needed.
|
||||
\end{verbatim}
|
||||
|
||||
\subsection{Review a Student Workflow}
|
||||
\begin{verbatim}
|
||||
Read devopsAIAgentGuide.tex and the workflow, evidence, and retrospective
|
||||
chapters. Review the supplied repository and sanitized evidence for
|
||||
reproducibility, least privilege, observability, rollback, and cleanup.
|
||||
Separate verified facts from gaps and recommendations. Do not claim that an
|
||||
unexecuted command passed, and do not request credentials or operate resources.
|
||||
\end{verbatim}
|
||||
|
||||
\section{Human Decisions and Information Boundaries}
|
||||
The instructor retains authority over assignment scope, grading, due dates,
|
||||
approved tooling, access, budgets, security posture, exceptions, and policy.
|
||||
An AI agent shall surface alternatives and evidence, not represent a decision
|
||||
as approved. Record material prompts, assumptions, corrections, and unresolved
|
||||
issues in \ChapterRef{AIPromptLog}.
|
||||
|
||||
\section{Completion Checklist}
|
||||
\begin{itemize}
|
||||
\item Scope, deliverables, environment, constraints, and cleanup are clear.
|
||||
\item Activity identifiers and evidence references are valid and unique.
|
||||
\item Examples contain no secrets, personal data, or unsafe production actions.
|
||||
\item New controlled terms are added to the glossary and indexed.
|
||||
\item The newest approved change is recorded in document history.
|
||||
\item The complete build succeeds with no unresolved references or missing files.
|
||||
\item A human reviews all decisions requiring instructional or operational authority.
|
||||
\end{itemize}
|
||||
@@ -0,0 +1,129 @@
|
||||
\chapter{AI Prompt Log}
|
||||
\ChapterLabel{AIPromptLog}
|
||||
\index{AI prompt log}
|
||||
|
||||
\section{Assignment 4: Merge of the Team's Current Gitea Text}
|
||||
Date: \textit{September 30, 2026};
|
||||
Tool: \textit{OpenAI Codex};
|
||||
Task: \textit{Use the user's pasted chapter as the current source for
|
||||
Sections 6.1--6.4 and append the supported Sections 6.5--6.8};
|
||||
Output used: \textit{Merged the supplied content into the existing chapter,
|
||||
corrected contradictory pending-approval wording, repaired the reference
|
||||
to the optional restore section, and prepared full-file copies for Overleaf};
|
||||
Human review: \textit{Pending. Student Pack approval and benefit timing are
|
||||
team-reported; no account or live deployment verification was performed};
|
||||
Unresolved information: \textit{The missing operational and workflow evidence
|
||||
listed for Sections 6.5--6.8 still applies. Full PDF validation remains pending}.
|
||||
|
||||
\section{Assignment 4: Gitea Sections 6.5--6.8}
|
||||
Date: \textit{September 30, 2026};
|
||||
Tool: \textit{OpenAI Codex};
|
||||
Task: \textit{Prepare Gitea rubric sections 5--8 from the supplied Markdown
|
||||
records and assignment manual, omitting unsupported details};
|
||||
Inputs: \textit{The current Gitea draft, team handoff, evidence ledger,
|
||||
operations guide, four firewall/team screenshots, and the supplied
|
||||
assignment manual, version 1.12};
|
||||
Output used: \textit{Checked the existing draft against recorded facts,
|
||||
retained dated evidence tables and figures, completed supporting citations
|
||||
and index/glossary definitions, and updated version/history. Hosts entries
|
||||
record known infrastructure; Passwords entries contain no secrets and
|
||||
identify unverified management details};
|
||||
Human review: \textit{Pending. No live cloud changes or new service tests
|
||||
were performed};
|
||||
Unresolved information: \textit{Remaining firewall records, both completed
|
||||
peer-review trails, final README/backlog evidence, account-management hints,
|
||||
and costs/cleanup are listed in GITEA\_MISSING\_INFORMATION.md.
|
||||
Full compilation and visual layout verification remain pending}.
|
||||
|
||||
\section{Assignment 4: Gitea Chapter Outline}
|
||||
Date: \textit{September 30, 2026};
|
||||
Tool: \textit{OpenAI Codex};
|
||||
Task: \textit{Update the assignment number and title and add Chapter 6,
|
||||
Gitea, with the eight numbered headings from Section 2.6 of
|
||||
\texttt{dosManual-V1.12.pdf}};
|
||||
Output used: \textit{Updated assignment metadata, abstract and introduction, added
|
||||
\texttt{devopsGitea.tex} to the main document, and recorded the version 1.6
|
||||
history entry. The new chapter contains headings and source comments only;
|
||||
no implementation results were invented};
|
||||
Human review: \textit{Pending};
|
||||
Unresolved assumptions: \textit{The Assignment 4 deadline has not been supplied.
|
||||
The built-in compiler failed with ``Unable to find standard directories for
|
||||
platform.'' Source inspection confirmed eight section headings and the new
|
||||
chapter's position after the five existing chapters. Complete project
|
||||
compilation and final layout verification remain pending in Overleaf}.
|
||||
|
||||
\section{Linux Commands Assignment Record}
|
||||
Scope: \textit{The existing record below covers the earlier Linux Commands formatting work; the separate record for Questions 31--40 documents Vincent Penalosa's AI use.};
|
||||
|
||||
Date: \textit{September 2026};
|
||||
Tool and model: \textit{OpenAI Codex};
|
||||
Task: \textit{Format documented Linux command results into LaTeX for inclusion in the Overleaf report};
|
||||
|
||||
Inputs: \textit{After completing the assigned Linux command problems, the terminal outputs and brief result descriptions were documented in a Google Document. The documented material for the assigned sections was then provided to Codex with a request to format the content in LaTeX consistent with the existing assignment template.};
|
||||
|
||||
Output used: \textit{Codex generated LaTeX formatting for the Linux Commands chapter, including section and subsection structure and figure placement for terminal screenshots.};
|
||||
|
||||
Human review and corrections: \textit{The generated LaTeX was reviewed before being added to Overleaf. The terminal commands, screenshots, and outputs were produced independently in the Linux environment and were not generated by AI. Formatting, wording, image references, and section organization were checked and adjusted as needed to match the assignment requirements and group document structure.};
|
||||
|
||||
Unresolved assumptions: \textit{None}.
|
||||
|
||||
\section{Questions 1--20: Environment Setup, Interpretation, and Verification Assistance}
|
||||
|
||||
Date: \textit{September 16, 2026};
|
||||
|
||||
Tool and model: \textit{OpenAI ChatGPT};
|
||||
|
||||
Task: \textit{Assist with setting up the Linux environment, explain the intent of Questions 1--20, and provide a secondary verification reference for independently completed Linux commands};
|
||||
|
||||
Inputs: \textit{Jacob Radzieta began without a Linux environment installed on the Windows computer. ChatGPT was used to provide step-by-step setup guidance, including installation of Windows Subsystem for Linux (WSL), installation and initialization of Ubuntu, creation of the Unix user account, navigation into the Linux home directory, and preparation of the assignment working directory and required test files. The Linux Command Proficiency problem set for Questions 1--20 was also provided so that each question could be explained in plain language and the expected type of command or result could be clarified.};
|
||||
|
||||
Output used: \textit{ChatGPT provided setup instructions for the Linux environment and explanations of what each assigned question was asking. It also provided example commands and expected forms of output that were used as a reference while completing the work. After independently working through each question in the Linux terminal, Jacob compared his own commands and results against the guidance as a safety check to confirm that the approach and interpretation were reasonable. ChatGPT was also used afterward to format the completed Questions 1--20 into LaTeX consistent with the existing Linux Commands chapter.};
|
||||
|
||||
Human review and corrections: \textit{All terminal commands were entered and executed by Jacob in the Linux environment, and all screenshots and command outputs used as evidence were produced from those executions. ChatGPT did not execute the assignment commands or generate the terminal evidence. The AI guidance was treated as a secondary reference rather than as a substitute for completing the work. Jacob reviewed his own commands and outputs, compared them with the provided explanations, and used the comparison to identify potential mistakes or misunderstandings before documenting the final results. The generated LaTeX wording and image references were reviewed before being added to Overleaf.};
|
||||
|
||||
Unresolved assumptions: \textit{None}.
|
||||
|
||||
\section{Questions 31--40: Answer Assistance and LaTeX Formatting}
|
||||
Follow-up formatting request: \textit{Vincent supplied the original question titles, and Codex replaced the Question 31--40 subsection titles with that wording and added the Debian/Ubuntu qualifier to section I. Question 38's title preserves the supplied text ``prints: : .''; the accompanying explanation describes the filename and line count shown in the screenshot.};
|
||||
|
||||
Date: \textit{September 16, 2026};
|
||||
Tools and models: \textit{Anthropic Claude (model not specified) and OpenAI Codex};
|
||||
Task: \textit{Generate answers for Questions 32--40 and format Questions 31--40 in the Linux Commands chapter to match Questions 21--30};
|
||||
|
||||
Inputs: \textit{Vincent Penalosa reported completing Question 31 independently and using Claude to generate answers for Questions 32--40. Codex received the terminal screenshots for Questions 31--40 and the existing LaTeX chapter, with instructions to place Questions 31--34 in section H, Questions 35--37 in section I, and Questions 38--40 in section J.};
|
||||
|
||||
Output used: \textit{Claude-assisted answers for Questions 32--40, as reported by Vincent. Codex added question headings, task descriptions, screenshot figures, and result explanations based on the supplied screenshots, and updated the AI usage record. Question 31's answer was completed independently; Codex assisted with its report wording and formatting.};
|
||||
|
||||
Human review and corrections: \textit{Review of the newly formatted sections in Overleaf remains pending. Codex inspected the supplied screenshots but did not execute the Linux commands.};
|
||||
|
||||
Unresolved assumptions: \textit{The exact Claude model and prompt were not supplied. A local LaTeX compiler was unavailable, so PDF compilation and final layout verification remain to be completed in Overleaf.}.
|
||||
|
||||
|
||||
\section{Stevens SmartPark Project Proposal Assistance}
|
||||
Date: \textit{September 24, 2026};
|
||||
Tool and model: \textit{OpenAI ChatGPT};
|
||||
|
||||
Task: \textit{Assist with organizing and formatting the Stevens SmartPark Project Proposal chapter and troubleshoot a LaTeX compilation error};
|
||||
|
||||
Inputs: \textit{Nica Saoi provided the Project Proposal assignment requirements, the Stevens SmartPark project description, and the current Overleaf project. ChatGPT was asked to help organize the chapter, and format the simplified application design and deployment process using minted.};
|
||||
|
||||
Output used: \textit{ChatGPT helped format the Project Proposal chapter, including the proposed tools, sample tasks, and simplified application architecture. It also formatted the application design and deployment flow as text diagrams using minted.};
|
||||
|
||||
Human review and corrections: \textit{Nica Saoi reviewed and edited the generated material before adding it to Overleaf. During compilation, a tabularx table produced a LaTeX error because several rows ended with a single backslash instead of the required double backslash. ChatGPT helped identify the table formatting problem and provided the corrected row endings.};
|
||||
|
||||
Unresolved assumptions: \textit{The proposed tools and project design may change as Stevens SmartPark is implemented.};
|
||||
|
||||
|
||||
|
||||
%\section{How to Use This Appendix}
|
||||
%Use this log when AI assistance materially affects assignment wording,
|
||||
%automation, evidence interpretation, troubleshooting, or feedback. Record
|
||||
%enough context for an instructor or reviewer to understand the input, output,
|
||||
%assumptions, and human corrections. Do not record credentials or personal data.
|
||||
|
||||
%\section{Example Record}
|
||||
%Date: \textit{[timestamp]}; Tool and model: \textit{[name]}; Task:
|
||||
%\textit{[requested outcome]}; Inputs: \textit{[sanitized constraints and
|
||||
%evidence]}; Output used: \textit{[summary]}; Human review and corrections:
|
||||
%\textit{[summary]}; Unresolved assumptions: \textit{[list or none]}.
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
% SSW 590 DevOps Assignment Template
|
||||
% Developed by Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code.
|
||||
% AI agents: read devopsAIAgentGuide.tex before editing this template.
|
||||
\documentclass[12pt]{cornell}
|
||||
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage{xspace}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{amsmath,amssymb}
|
||||
\usepackage{array}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{longtable}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{ltablex}
|
||||
\keepXColumns
|
||||
\usepackage{enumitem}
|
||||
\usepackage{listings}
|
||||
\usepackage{tcolorbox}
|
||||
\usepackage{makeidx}
|
||||
\usepackage[colorlinks=true,citecolor=blue,linkcolor=blue,urlcolor=blue]{hyperref}
|
||||
\usepackage[acronym,toc]{glossaries}
|
||||
\usepackage{float}
|
||||
\usepackage{listings}
|
||||
\usepackage{minted}
|
||||
\usepackage{tikz}
|
||||
\usepackage{tcolorbox}
|
||||
|
||||
\makeindex
|
||||
\makeglossaries
|
||||
\input{devopsGlossary.tex}
|
||||
|
||||
\definecolor{devopsBlue}{RGB}{31,78,121}
|
||||
\definecolor{devopsGreen}{RGB}{46,125,50}
|
||||
\definecolor{devopsRed}{RGB}{183,28,28}
|
||||
\definecolor{devopsGray}{RGB}{90,90,90}
|
||||
\definecolor{devopsLightBlue}{RGB}{232,240,247}
|
||||
|
||||
% Replace these values for each assignment.
|
||||
\newcommand{\AssignmentTitle}{Domain Names, SSL, and Versioning}
|
||||
\newcommand{\AssignmentNumber}{\#4}
|
||||
\newcommand{\DocumentVersion}{1.8}
|
||||
\newcommand{\DocumentStatus}{Draft}
|
||||
\newcommand{\CourseNumber}{SSW 590}
|
||||
\newcommand{\CourseName}{DevOps}
|
||||
\newcommand{\Instructor}{Vincent Penalosa, Jacob Radzieta, Nica Saoi}
|
||||
\newcommand{\Organization}{Stevens Institute of Technology}
|
||||
\newcommand{\DocumentDate}{September 30, 2026}
|
||||
\newcommand{\DueDate}{To be confirmed from the course assignment page}
|
||||
\newcommand{\VERSION}{Version \DocumentVersion}
|
||||
|
||||
\hypersetup{
|
||||
pdftitle={\CourseNumber\ --- Assignment \AssignmentNumber: \AssignmentTitle},
|
||||
pdfauthor={\Instructor},
|
||||
pdfcreator={Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code},
|
||||
pdfsubject={Reusable DevOps course assignment template},
|
||||
pdfkeywords={DevOps, automation, delivery pipeline, infrastructure as code, evidence}
|
||||
}
|
||||
|
||||
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
|
||||
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
|
||||
\setlength{\tabcolsep}{4pt}
|
||||
\renewcommand{\arraystretch}{1.12}
|
||||
\setlength{\LTpre}{6pt}
|
||||
\setlength{\LTpost}{6pt}
|
||||
|
||||
% Stable IDs make activity, evidence, and artifact references durable.
|
||||
\newcommand{\ArtifactLabel}[2]{\phantomsection\label{#1:#2}}
|
||||
\newcommand{\ArtifactID}[2]{\texttt{#2}\ArtifactLabel{#1}{#2}\index{#1!#2}}
|
||||
\newcommand{\ArtifactRef}[2]{\hyperref[#1:#2]{\texttt{#2}}}
|
||||
\newcommand{\ActivityID}[1]{\ArtifactID{Activity}{#1}}
|
||||
\newcommand{\ActivityRef}[1]{\ArtifactRef{Activity}{#1}}
|
||||
\newcommand{\EvidenceID}[1]{\ArtifactID{Evidence}{#1}}
|
||||
\newcommand{\EvidenceRef}[1]{\ArtifactRef{Evidence}{#1}}
|
||||
\newcommand{\ChapterLabel}[1]{\label{Chapter:#1}}
|
||||
\newcommand{\ChapterRef}[1]{\hyperref[Chapter:#1]{Chapter~\ref*{Chapter:#1}}}
|
||||
\newcommand{\StatusPass}{\textbf{\footnotesize\textcolor{devopsGreen}{PASS}}}
|
||||
\newcommand{\StatusPending}{\textbf{\footnotesize\textcolor{devopsGray}{PENDING}}}
|
||||
\newcommand{\StatusFail}{\textbf{\footnotesize\textcolor{devopsRed}{FAIL}}}
|
||||
|
||||
\newtcolorbox{devopsNote}[1][]{
|
||||
colback=devopsLightBlue, colframe=devopsBlue, boxrule=0.6pt, arc=1mm, title=#1
|
||||
}
|
||||
|
||||
\lstset{
|
||||
backgroundcolor=\color{white}, basicstyle=\ttfamily\footnotesize,
|
||||
breaklines=true, frame=single, keywordstyle=\color{blue},
|
||||
commentstyle=\color{devopsGreen}, numbers=left, numbersep=6pt,
|
||||
numberstyle=\tiny\color{devopsGray}, showstringspaces=false,
|
||||
stringstyle=\color{devopsRed}, tabsize=2
|
||||
}
|
||||
|
||||
\changenormalspacing{\singlespacing}
|
||||
\begin{document}
|
||||
\pagenumbering{roman}
|
||||
\singlespacing
|
||||
\include{prologue}
|
||||
|
||||
\setcounter{page}{1}
|
||||
\pagenumbering{arabic}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
|
||||
\lhead{\small Assignment \AssignmentNumber}
|
||||
\chead{\small\nouppercase{\leftmark}}
|
||||
\rhead{\small\thepage}
|
||||
\lfoot{\small\CourseNumber}
|
||||
\cfoot{\small\copyright\ \Organization}
|
||||
\rfoot{\small\VERSION}
|
||||
\renewcommand{\headrulewidth}{0.4pt}
|
||||
\renewcommand{\footrulewidth}{0.4pt}
|
||||
|
||||
\include{devopsIntroduction}
|
||||
\include{devopsLinuxCommands}
|
||||
%\include{devopsExampleAssignment}
|
||||
\include{devopsDigitalOceanDockerDeployment}
|
||||
\include{devopsLaTeXDocker}
|
||||
\include{devopsProjectProposal}
|
||||
\include{devopsGitea}
|
||||
|
||||
|
||||
|
||||
\bibliographystyle{IEEEtran}
|
||||
\bibliography{devopsReferences}
|
||||
|
||||
\appendix
|
||||
\include{devopsDocumentGuide}
|
||||
\include{devopsAIAgentGuide}
|
||||
\include{devopsAIPromptLog}
|
||||
|
||||
\glsaddall
|
||||
\printglossaries
|
||||
\cleardoublepage
|
||||
\phantomsection
|
||||
\ChapterLabel{Index}
|
||||
\addcontentsline{toc}{chapter}{Index}
|
||||
\markboth{Index}{Index}
|
||||
\printindex
|
||||
\end{document}
|
||||
@@ -0,0 +1,139 @@
|
||||
\chapter{Digital Ocean Docker Deployment}
|
||||
\ChapterLabel{DigitalOceanDockerDeployment}
|
||||
|
||||
This chapter documents the deployment of the Two Buttons Node/Express website
|
||||
to a DigitalOcean Droplet using Docker, and the updated class-based JavaScript.
|
||||
|
||||
\section{Create the Droplet and Deploy Docker}
|
||||
|
||||
The Droplet was created using DigitalOcean's Docker 1-Click image on Ubuntu in the New York region. The Basic Regular plan provides one virtual CPU,
|
||||
1 GiB of RAM, and 25 GiB of SSD storage. The server has a public IPv4 address,
|
||||
\texttt{137.184.97.250}, and uses SSH key authentication. No additional storage
|
||||
or automated backups were configured. The Docker image supplies the Docker
|
||||
environment used to build and run the application.
|
||||
|
||||
The website is available at the following deployment addresses:
|
||||
\begin{itemize}
|
||||
\item HTTPS: \url{https://137-184-97-250.nip.io/}
|
||||
\item HTTP: \url{http://137.184.97.250/}
|
||||
\end{itemize}
|
||||
|
||||
\section{Deployment Steps and Commands}
|
||||
|
||||
\subsection{Upload the Project and Connect to the Droplet}
|
||||
The following commands were run in Windows PowerShell. The first command
|
||||
selects the original project directory, the second copies the application
|
||||
folder to the Droplet, and the third opens an SSH session. The local directory
|
||||
is specific to the computer used for the original deployment.
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{powershell}
|
||||
Set-Location 'D:\Self Projects\SSW590-Docker-Assignment'
|
||||
scp -r .\color-buttons-app root@137.184.97.250:/root/
|
||||
ssh root@137.184.97.250
|
||||
\end{minted}
|
||||
|
||||
\subsection{Build and Run the Application Container}
|
||||
After connecting to the Droplet, Docker was checked and the uploaded project
|
||||
was built into an image tagged \texttt{color-buttons-app:class-based}.
|
||||
The image was then started as the container \texttt{color-buttons-site}.
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{bash}
|
||||
docker --version
|
||||
cd /root/color-buttons-app
|
||||
docker build -t color-buttons-app:class-based .
|
||||
docker run -d --name color-buttons-site --restart unless-stopped -p 80:3000 color-buttons-app:class-based
|
||||
docker ps
|
||||
curl -I http://127.0.0.1/
|
||||
docker logs --tail 20 color-buttons-site
|
||||
\end{minted}
|
||||
|
||||
The \texttt{-d} option runs the container in the background. The
|
||||
\texttt{-p 80:3000} mapping sends traffic received on the Droplet's HTTP port 80
|
||||
to Express on port 3000 inside the container. The restart policy restarts the
|
||||
container after a Droplet reboot unless it was explicitly stopped.
|
||||
The remaining commands inspect the running container, request the local
|
||||
website's HTTP response headers, and display recent application logs.
|
||||
|
||||
\subsection{Enable HTTPS with Caddy}
|
||||
The hostname \texttt{137-184-97-250.nip.io} resolves to the Droplet's public IP
|
||||
address. Caddy acts as a reverse proxy: it receives HTTPS requests and forwards
|
||||
them to the application over a shared Docker network. The project's
|
||||
\texttt{Caddyfile} configures that proxy. The following commands create the
|
||||
network, download Caddy, validate the configuration, connect the app, and start
|
||||
the HTTPS container.
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{bash}
|
||||
docker network create color-net
|
||||
docker pull caddy:2-alpine
|
||||
docker run --rm -v /root/color-buttons-app/Caddyfile:/etc/caddy/Caddyfile:ro caddy:2-alpine caddy validate --config /etc/caddy/Caddyfile
|
||||
docker network connect color-net color-buttons-site
|
||||
docker run -d --name color-buttons-caddy --restart unless-stopped --network color-net -p 443:443 -v /root/color-buttons-app/Caddyfile:/etc/caddy/Caddyfile:ro -v caddy_data:/data -v caddy_config:/config caddy:2-alpine
|
||||
\end{minted}
|
||||
|
||||
Caddy publishes HTTPS on port 443 and obtains and renews a publicly trusted
|
||||
certificate. The \texttt{caddy\_data} volume preserves certificate data, while
|
||||
the configuration file is mounted read-only. HTTP on the numeric IP address
|
||||
continues to reach the original application container on port 80.
|
||||
|
||||
\subsection{Deployment Verification}
|
||||
The handoff records the following successful checks from the deployment:
|
||||
\begin{itemize}
|
||||
\item Both Blue and Red click handlers passed a local behavior check.
|
||||
\item \texttt{docker ps} showed the application container running with port 80
|
||||
mapped to container port 3000.
|
||||
\item The local HTTP check and a public website request returned
|
||||
\texttt{HTTP/1.1 200 OK}.
|
||||
\item The public site served \path{public/app.js} containing the new class
|
||||
and both button handlers.
|
||||
\item The HTTPS website returned \texttt{HTTP/1.1 200 OK} with normal certificate
|
||||
verification, without bypassing certificate checks.
|
||||
\item The student opened the HTTPS website and confirmed that both buttons
|
||||
changed the background to the corresponding color.
|
||||
\end{itemize}
|
||||
These are the results recorded in the handoff, rather than new checks performed
|
||||
while preparing this chapter. Website screenshots were not included in the
|
||||
handoff and have not been added as evidence.
|
||||
|
||||
\section{Class-Based JavaScript and UML Design}
|
||||
|
||||
The updated website uses the \texttt{BackgroundColorController} class in
|
||||
\path{public/app.js} to organize its button behavior. The class holds references
|
||||
to both buttons and the page element being updated. Its constructor accepts
|
||||
these three elements, and its \texttt{setBackgroundColor} method provides the
|
||||
shared operation for changing the page's background. Class-based JavaScript
|
||||
still uses methods; the change groups the relevant data and behavior inside
|
||||
a class instead of leaving the behavior in separate standalone functions.
|
||||
|
||||
The supplied UML class diagram identifies these public attributes:
|
||||
\begin{itemize}
|
||||
\item \texttt{blueButton: HTMLButtonElement}: the Blue button element.
|
||||
\item \texttt{redButton: HTMLButtonElement}: the Red button element.
|
||||
\item \texttt{page: HTMLElement}: the element whose background is changed.
|
||||
\end{itemize}
|
||||
It also identifies two public operations:
|
||||
\begin{itemize}
|
||||
\item \texttt{constructor(blueButton, redButton, page)} initializes the controller
|
||||
with the three elements.
|
||||
\item \texttt{setBackgroundColor(color: string): void} accepts a color string
|
||||
and changes the background without returning a value.
|
||||
\end{itemize}
|
||||
|
||||
The Blue and Red click handlers use the controller to apply their respective
|
||||
colors. In the UML notation, a plus sign denotes public visibility, the type
|
||||
after a colon describes an attribute or parameter, and \texttt{void} denotes
|
||||
an operation with no return value. Figure~\ref{Figure:BackgroundColorController}
|
||||
shows the supplied updated design.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/UML.png}
|
||||
\caption{UML class diagram for the updated Two Buttons website.}
|
||||
\label{Figure:BackgroundColorController}
|
||||
\end{figure}
|
||||
|
||||
\section{Handoff Notes}
|
||||
The \texttt{nip.io} hostname is provided by a third party; the handoff recommends
|
||||
an owned domain for a long-term project. The handoff does not specify the
|
||||
account owner, billed cost, or cleanup date. Before retiring the deployment,
|
||||
the group should identify the resource owner and preserve any needed files;
|
||||
that owner can then remove the Droplet when it is no longer required.
|
||||
@@ -0,0 +1,142 @@
|
||||
\chapter{Document Authoring Guide}
|
||||
\ChapterLabel{DocumentGuide}
|
||||
\index{LaTeX}
|
||||
\index{document conventions}
|
||||
\index{Appendix!Document Authoring Guide}
|
||||
|
||||
\section{How to Use This Appendix}
|
||||
Use this appendix to maintain the template's file conventions, build process,
|
||||
and review rules. Update it when the document structure or toolchain changes.
|
||||
|
||||
\section{Template Provenance}
|
||||
This template was developed by \textbf{Darian Muresan, Ph.D.}, in conjunction
|
||||
with \textbf{OpenAI Codex} and \textbf{Anthropic Claude Code}. Keep this
|
||||
attribution distinct from the assignment-specific instructor metadata.
|
||||
|
||||
\section{File Naming and Responsibilities}
|
||||
Every chapter file shall use the \texttt{devops} prefix, a PascalCase chapter
|
||||
name, and the \texttt{.tex} suffix. Each such file shall contain one complete
|
||||
chapter, beginning with \texttt{\string\chapter\{...\}}, and all of its
|
||||
sections and subsections. Do not split one chapter into section-level
|
||||
\texttt{.tex} files. For example, all of Chapter~2 is contained in
|
||||
\path{devopsExampleAssignment.tex}. Do not add requirements or
|
||||
architecture-design chapters; this template records a DevOps learning activity
|
||||
and its operational evidence.
|
||||
|
||||
\section{Synonyms and Controlled Terms}
|
||||
\index{synonyms}
|
||||
Use one preferred term for each important concept. If an assignment uses
|
||||
equivalent terms, record them here before release. For example, state whether
|
||||
``continuous delivery'' refers to \gls{cd} generally or specifically excludes
|
||||
automatic production deployment. Add important terms to
|
||||
\texttt{devopsGlossary.tex} and index them where used.
|
||||
|
||||
\section{Building the PDF}
|
||||
The template requires a LaTeX distribution with \texttt{pdflatex},
|
||||
\texttt{bibtex}, \texttt{makeglossaries}, and \texttt{makeindex}.
|
||||
Install the tools using the platform instructions below, then run one of the
|
||||
following platform builds.
|
||||
|
||||
\subsection{macOS and Linux Build}
|
||||
\begin{verbatim}
|
||||
make -f makefileMacLinux pdf
|
||||
\end{verbatim}
|
||||
|
||||
\subsection{Windows PowerShell Build}
|
||||
\begin{verbatim}
|
||||
.\makefilePowerShell.ps1 -Action pdf
|
||||
\end{verbatim}
|
||||
The completed build regenerates references, bibliography, glossary, and index.
|
||||
Review the log and visually inspect affected PDF pages. Do not edit generated
|
||||
auxiliary files or the PDF directly.
|
||||
|
||||
\section{Install LaTeX Tools on macOS}
|
||||
\index{macOS}
|
||||
\index{MacTeX}
|
||||
\subsection{Recommended Installation}
|
||||
Install the current full \href{https://www.tug.org/mactex/}{MacTeX}
|
||||
distribution. It includes TeX Live, \texttt{pdflatex}, \texttt{bibtex},
|
||||
\texttt{latexmk}, \texttt{makeglossaries}, \texttt{makeindex}, and useful
|
||||
applications such as TeXShop and TeX Live Utility. The full distribution is the
|
||||
least troublesome choice for this template because it includes the packages
|
||||
used by the glossary, table, listing, color, and hyperlink features.
|
||||
|
||||
Either download the signed installer from the MacTeX web site and complete the
|
||||
macOS installation dialog, or, if Homebrew is already installed, run:
|
||||
\begin{verbatim}
|
||||
brew install --cask mactex
|
||||
\end{verbatim}
|
||||
Close and reopen Terminal after installation. If the TeX commands are not
|
||||
found, add the MacTeX binary directory to the current shell session:
|
||||
\begin{verbatim}
|
||||
export PATH="/Library/TeX/texbin:$PATH"
|
||||
\end{verbatim}
|
||||
Do not place this command in a shell profile until it has been verified on the
|
||||
local computer.
|
||||
|
||||
\subsection{Verification and Compilation}
|
||||
From the template directory, verify the tools:
|
||||
\begin{verbatim}
|
||||
command -v pdflatex bibtex latexmk makeglossaries makeindex
|
||||
\end{verbatim}
|
||||
Each command should print a path. Then create the PDF:
|
||||
\begin{verbatim}
|
||||
make -f makefileMacLinux pdf
|
||||
\end{verbatim}
|
||||
To remove generated intermediate files while keeping the PDF, run:
|
||||
\begin{verbatim}
|
||||
make -f makefileMacLinux clean
|
||||
\end{verbatim}
|
||||
|
||||
\section{Install LaTeX Tools on Windows}
|
||||
\index{Windows}
|
||||
\index{MiKTeX}
|
||||
\subsection{Recommended Installation}
|
||||
Install the current Basic MiKTeX distribution using the official
|
||||
\href{https://miktex.org/howto/install-miktex}{MiKTeX Windows installation
|
||||
guide}. During installation, choose a per-user installation when appropriate
|
||||
and set missing-package installation to \emph{Ask me first} or \emph{Yes}.
|
||||
The latter is convenient for a student machine with Internet access; the former
|
||||
makes each package installation explicit.
|
||||
|
||||
Open MiKTeX Console after installation, apply available updates, and install
|
||||
the \texttt{latexmk} package if the verification command below cannot find it.
|
||||
On an organization-managed computer, obtain approval before installing software
|
||||
or changing execution policy.
|
||||
|
||||
\subsection{Verification and Compilation}
|
||||
Open a new PowerShell window in the template directory and verify:
|
||||
\begin{verbatim}
|
||||
Get-Command pdflatex,bibtex,latexmk,makeglossaries,makeindex
|
||||
\end{verbatim}
|
||||
Each command should display a command record. Build the PDF with:
|
||||
\begin{verbatim}
|
||||
.\makefilePowerShell.ps1 -Action pdf
|
||||
\end{verbatim}
|
||||
If PowerShell blocks the script under a managed execution policy, ask the
|
||||
system administrator for the approved procedure. Do not bypass institutional
|
||||
security policy. To remove intermediate build files, run:
|
||||
\begin{verbatim}
|
||||
.\makefilePowerShell.ps1 -Action clean
|
||||
\end{verbatim}
|
||||
|
||||
\section{Common Build Problems}
|
||||
\begin{tabularx}{\linewidth}{L{3.0cm}Y}
|
||||
\toprule \textbf{Symptom} & \textbf{Resolution}\\ \midrule
|
||||
Command not found & Close and reopen the terminal. On macOS, verify the TeX
|
||||
binary path; on Windows, verify MiKTeX completed installation and is on the user PATH.\\
|
||||
Missing LaTeX package & Use MiKTeX Console or its approved on-the-fly package
|
||||
installation prompt on Windows. On macOS, install the full MacTeX distribution
|
||||
or use TeX Live Utility to add the missing package.\\
|
||||
References or glossary incomplete & Run the supplied platform build instead of
|
||||
a single \texttt{pdflatex} command; it runs BibTeX, the glossary tool, and the
|
||||
index tool in the required order.\\
|
||||
Script is blocked & Follow the institution's approved PowerShell policy or run
|
||||
the documented build commands with an approved administrator.\\ \bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\section{Authoring and Review Rules}
|
||||
Replace bracketed placeholders with assignment facts. Keep operational examples
|
||||
safe, bounded, and free of credentials. Link activities to evidence, retain
|
||||
history, and state unknowns or instructor decisions explicitly. Rebuild after
|
||||
structural, cross-reference, table, glossary, or index changes.
|
||||
@@ -0,0 +1,83 @@
|
||||
\chapter*{Document History}
|
||||
\addcontentsline{toc}{chapter}{Document History}
|
||||
\index{document history}
|
||||
|
||||
\section*{How to Use This Chapter}
|
||||
Add the newest approved change at the top. Retain every approved entry and
|
||||
link each entry to the changed chapter, table, figure, or controlled artifact.
|
||||
|
||||
\begin{tabularx}{\linewidth}{L{3.1cm}L{2.2cm}YL{2.0cm}}
|
||||
\caption{Document Update History\label{Table:DocumentHistory}}\\
|
||||
\toprule
|
||||
\textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\
|
||||
\midrule
|
||||
\endfirsthead
|
||||
|
||||
\multicolumn{4}{l}{\small\itshape Document Update History (continued)}\\
|
||||
\toprule
|
||||
\textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\
|
||||
\midrule
|
||||
\endhead
|
||||
|
||||
\bottomrule
|
||||
\endlastfoot
|
||||
|
||||
September 30, 2026 / 1.8 & NS, VP, CDX &
|
||||
Merged the team's supplied Gitea Sections 6.1--6.4 with the documented
|
||||
Sections 6.5--6.8. Preserved the reported Student Pack approval and pending
|
||||
benefit access; corrected stale pending-approval wording and the reference
|
||||
to the not-yet-added extra-credit subsection. Hosts and Passwords tables
|
||||
retain the previous draft's known facts and unresolved fields. &
|
||||
\ChapterRef{Gitea}\\
|
||||
|
||||
September 30, 2026 / 1.7 & VP, CDX &
|
||||
Reviewed and completed the supported Gitea Sections 6.5--6.8 using the
|
||||
September 29 handoff, evidence ledger, operations guide, and assignment
|
||||
rubric. Included firewall and team screenshots, external-test results,
|
||||
architecture and restart guidance. Recorded Hosts table facts and a
|
||||
partial Passwords account inventory; storage hints and MFA/rotation
|
||||
details remain pending. Added supporting citations, index terms and
|
||||
a list of missing evidence. Full PDF validation remains pending. &
|
||||
\ChapterRef{Gitea}, Tables~\ref{Table:GiteaHosts} and~\ref{Table:GiteaPasswords}\\
|
||||
|
||||
September 30, 2026 / 1.6 & VP, CDX &
|
||||
Updated the assignment number to 4 and title to ``Domain Names, SSL, and
|
||||
Versioning.'' Added Chapter 6, ``Gitea,'' with the eight numbered sections
|
||||
from the assignment manual, Section 2.6. Set the document to draft and left
|
||||
the new deadline unconfirmed. Hosts and Passwords tables were not changed
|
||||
in this outline update; their assignment updates remain pending. &
|
||||
\ChapterRef{Gitea}\\
|
||||
|
||||
September 24, 2026 / 1.5 & JR, CDX &
|
||||
Documented the DigitalOcean Docker deployment, live website, class-based
|
||||
JavaScript, and UML diagram. Built and ran the TeX Live Docker container,
|
||||
which produced \texttt{hello.pdf}, and documented its Dockerfile, sample
|
||||
document, commands, and result. &
|
||||
\ChapterRef{DigitalOceanDockerDeployment}, \ChapterRef{LaTeXDocker}\\
|
||||
|
||||
September 24, 2026 / 1.5 & NS, CDX &
|
||||
Added information to the ``Project Proposal'' chapter for Stevens SmartPark. Documented the proposed campus parking information system, sample project tasks, application design, proposed DevSecOps tools, source control, database, testing, Docker deployment approach, and expected project results. Also updated the AI Prompt Log to document AI assistance with formatting the simplified application design and deployment process using minted, and troubleshooting the LaTeX table compilation error. &
|
||||
\ChapterRef{ProjectProposal}, \ChapterRef{AIPromptLog}\\
|
||||
|
||||
September 24, 2026 / 1.5 & VP, CDX &
|
||||
Updated the document to Assignment \#3, ``Digital Ocean Docker + Project Proposal.'' Added two empty chapters after the existing main chapters: ``Digital Ocean Docker Deployment'' and ``LaTeX Docker.'' Retained the existing main chapters, front matter, and appendices. &
|
||||
\ChapterRef{DigitalOceanDockerDeployment}, \ChapterRef{LaTeXDocker}\\
|
||||
|
||||
September 16, 2026 / 1.4 & JR, CDX &
|
||||
Completed Problems A--D, Questions 1--20, in the Linux Commands chapter with documented terminal evidence, task descriptions, and result explanations. Added a corresponding AI Prompt Log record documenting the use of ChatGPT for WSL/Ubuntu environment setup, question interpretation, command verification, and LaTeX formatting assistance. &
|
||||
\ChapterRef{LinuxCommands}, \ChapterRef{AIPromptLog}\\
|
||||
|
||||
September 16, 2026 / 1.4 & VP, CDX &
|
||||
Updated Question 31--40 subsection titles to the supplied question wording and added Debian/Ubuntu to the section I heading. &
|
||||
\ChapterRef{LinuxCommands}\\
|
||||
|
||||
September 16, 2026 / 1.4 & VP, CLD &
|
||||
Added Questions 31--40 to sections H--J using the Question 21--30 format. Recorded independent work on Question 31 and Claude assistance for Questions 32--40. &
|
||||
\ChapterRef{LinuxCommands}, \ChapterRef{AIPromptLog}\\
|
||||
|
||||
September 16, 2026 / 1.4 & NS, VP, CDX &
|
||||
Made Linux Commands Chapter. Added Problems A--J with terminal evidence, result explanations, and AI usage documentation. &
|
||||
\ChapterRef{LinuxCommands}, \ChapterRef{AIPromptLog}\\
|
||||
|
||||
|
||||
\end{tabularx}
|
||||
@@ -0,0 +1,126 @@
|
||||
\chapter{Example Assignment}
|
||||
\ChapterLabel{ExampleAssignment}
|
||||
\index{activity brief}
|
||||
\index{workflow}
|
||||
\index{automation}
|
||||
\index{infrastructure as code}
|
||||
\index{evidence}
|
||||
\index{observability}
|
||||
\index{rollback}
|
||||
\index{retrospective}
|
||||
\index{continuous improvement}
|
||||
\index{submission}
|
||||
\index{cleanup}
|
||||
|
||||
\section{Activity Brief}
|
||||
\subsection{Scenario}
|
||||
Describe the operational scenario and why it matters. Use a bounded,
|
||||
non-production system. \textit{Example: A team must deploy a small service
|
||||
reliably to a remote Linux host and recover from a failed release.}
|
||||
|
||||
\subsection{Activities}
|
||||
Assign stable IDs to each assessed activity. Add rows as needed.
|
||||
\begin{tabularx}{\linewidth}{L{2.1cm}L{3.1cm}Y}
|
||||
\caption{Activity Register\label{Table:ActivityRegister}}\\
|
||||
\toprule \textbf{ID} & \textbf{Activity} & \textbf{Completion criterion}\\ \midrule
|
||||
\ActivityID{ACT-01} & \textit{[Prepare environment]} & \textit{[repeatable environment baseline is present]}\\
|
||||
\ActivityID{ACT-02} & \textit{[Automate workflow]} & \textit{[workflow runs from documented inputs]}\\
|
||||
\ActivityID{ACT-03} & \textit{[Observe and recover]} & \textit{[evidence shows monitoring and recovery]}\\ \bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\subsection{Success Criteria}
|
||||
State observable outcomes, not implementation prescriptions. Include security,
|
||||
cost, cleanup, and reproducibility criteria where applicable.
|
||||
|
||||
\subsection{Assessment Rubric}
|
||||
\begin{tabularx}{\linewidth}{L{3.2cm}L{2.0cm}Y}
|
||||
\toprule \textbf{Criterion} & \textbf{Weight} & \textbf{Evidence expected}\\ \midrule
|
||||
Reproducible workflow & \textit{[points]} & \textit{[automation and clean-run proof]}\\
|
||||
Operational quality & \textit{[points]} & \textit{[observability, rollback, security]}\\
|
||||
Evidence and explanation & \textit{[points]} & \textit{[commands, outputs, rationale]}\\
|
||||
Reflection & \textit{[points]} & \textit{[failure analysis and improvement]}\\ \bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\section{Workflow and Implementation}
|
||||
\subsection{Environment Baseline}
|
||||
Specify the authorized environment, prerequisites, access model, versioned
|
||||
inputs, and teardown procedure. Record commands in a repository script or
|
||||
infrastructure-as-code definition; do not rely on a sequence of undocumented
|
||||
console clicks.
|
||||
|
||||
\subsection{Procedure}
|
||||
For each activity, state the goal, input, command or automation entry point,
|
||||
expected result, and rollback or cleanup action. Link the corresponding
|
||||
activity identifier and evidence identifier.
|
||||
|
||||
\begin{lstlisting}[language=bash,caption={Replace with a safe, repeatable workflow entry point.}]
|
||||
# ./scripts/provision.sh --environment sandbox
|
||||
# ./scripts/deploy.sh --version <tag>
|
||||
# ./scripts/destroy.sh --environment sandbox
|
||||
\end{lstlisting}
|
||||
|
||||
\subsection{Operational Controls}
|
||||
Describe least-privilege access, secret handling, logging, monitoring, change
|
||||
control, budget guardrails, backup or rollback, and resource cleanup. A secret
|
||||
shall be referenced by its approved storage location, never pasted into this
|
||||
document or committed to the repository.
|
||||
|
||||
\subsection{Failure Exercise}
|
||||
Define one safe failure or degradation scenario. State the trigger, expected
|
||||
signal, diagnosis path, recovery action, and evidence required. Never direct
|
||||
students to disrupt shared or production infrastructure.
|
||||
|
||||
\section{Evidence Register}
|
||||
\subsection{How to Use This Section}
|
||||
Evidence demonstrates an actual execution; an expected result is not evidence.
|
||||
Use sanitized command output, logs, screenshots, links to versioned files, or
|
||||
recorded metrics. Redact secrets and personal information.
|
||||
|
||||
\begin{tabularx}{\linewidth}{L{1.7cm}L{2.2cm}L{2.6cm}Y}
|
||||
\caption{Evidence Register\label{Table:EvidenceRegister}}\\
|
||||
\toprule \textbf{ID} & \textbf{Activity} & \textbf{Evidence type} & \textbf{Location and interpretation}\\ \midrule
|
||||
\EvidenceID{EVD-01} & \ActivityRef{ACT-01} & \textit{[log / script / image]} & \textit{[repository path or sanitized URL; what it demonstrates]}\\
|
||||
\EvidenceID{EVD-02} & \ActivityRef{ACT-02} & \textit{[pipeline output]} & \textit{[location; result and relevant timestamp]}\\
|
||||
\EvidenceID{EVD-03} & \ActivityRef{ACT-03} & \textit{[monitoring / recovery output]} & \textit{[location; failure signal and recovery result]}\\ \bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\subsection{Evidence Quality Checks}
|
||||
Evidence should identify the executed version, environment, time, command or
|
||||
automation entry point, outcome, and any deviation from the expected result.
|
||||
State failures plainly; they are valuable inputs to the retrospective.
|
||||
|
||||
\section{Retrospective}
|
||||
\subsection{Outcome}
|
||||
Summarize what happened, including completed work, gaps, and unexpected
|
||||
behavior. Distinguish facts from interpretation.
|
||||
|
||||
\subsection{Flow and Feedback}
|
||||
Identify queues, handoffs, manual steps, slow feedback, and sources of rework.
|
||||
Explain which changes improved delivery flow or made failures visible sooner.
|
||||
This emphasis on flow, feedback, and continual learning is consistent with the
|
||||
DevOps framing introduced in \cite{PhoenixProject}.
|
||||
|
||||
\subsection{Improvement Experiments}
|
||||
Propose one or more small, testable improvements. State the hypothesis, change,
|
||||
measurement, expected result, and risk. Do not represent a proposal as an
|
||||
approved production change.
|
||||
|
||||
\subsection{Team Contributions}
|
||||
For team assignments, concisely identify each member's meaningful contribution
|
||||
and any collaboration constraints.
|
||||
|
||||
\section{Submission and Cleanup}
|
||||
\subsection{Submission Checklist}
|
||||
\begin{itemize}
|
||||
\item Versioned automation, configuration, and runbook are committed.
|
||||
\item Evidence links resolve and contain no secrets or personal data.
|
||||
\item The retrospective is complete and distinguishes results from proposals.
|
||||
\item Remote resources have been destroyed or explicitly transferred as directed.
|
||||
\item The repository identifies the final commit or release tag.
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Academic Integrity and Responsible Use}
|
||||
Follow the course policy for collaboration and AI assistance. Cite external
|
||||
code, tutorials, and AI-generated material as required by the instructor.
|
||||
Students remain responsible for understanding, testing, and explaining all
|
||||
submitted work.
|
||||
@@ -0,0 +1,561 @@
|
||||
\chapter{Gitea}
|
||||
\ChapterLabel{Gitea}
|
||||
\index{Gitea}
|
||||
|
||||
% Chapter outline follows dosManual-V1.12.pdf, Section 2.6.
|
||||
% Add the team's implementation and evidence beneath each heading.
|
||||
% These comments are authoring notes, not claims of completed work.
|
||||
|
||||
The chapter follows the eight-part rubric in Section 2.6 of the assignment
|
||||
manual~\cite{DosManual112}. Recorded deployment tests refer to September 29,
|
||||
2026; times are UTC. The domain-benefit status reflects the team's later
|
||||
update. Historical evidence is not a new live-service verification.
|
||||
|
||||
\section{Student Pack Domain and DNS}
|
||||
\label{Section:GiteaDomainDNS}
|
||||
% Identify offer, eligibility, first-year and renewal costs, expiration,
|
||||
% hostname, DNS record, independent lookup, HTTPS link, and renewal tracking.
|
||||
|
||||
The team applied for access to the GitHub Student Developer Pack domain offer and was approved. However, access to the benefits of the developer pack will become available 3 days after the day of approval. Therefore, the team did not claim that the Student Pack domain
|
||||
criterion was completed.
|
||||
|
||||
For the working Gitea deployment, the team used the temporary hostname
|
||||
\url{https://git.137-184-97-250.nip.io/}. The hostname resolves to the DigitalOcean Droplet used for the Gitea service and allows the team to
|
||||
verify HTTPS and the remaining deployment requirements while access to the approved Student Developer Pack benefits is pending.
|
||||
|
||||
The temporary \texttt{nip.io} hostname is not presented as a replacement for the required Student Pack domain. Once the approved Student Developer Pack benefits become available, the team will claim an eligible domain offer, record the offer and renewal terms, create a dedicated Gitea DNS record, and update the HTTPS configuration accordingly.
|
||||
|
||||
\section{Pinned Gitea Deployment}
|
||||
\label{Section:GiteaDeployment}
|
||||
% Record Droplet/image versions, official image source, deployment commands,
|
||||
% restart policy, persistent mounts, proxy connection, redacted Compose,
|
||||
% versioned non-secret file links, and repeatable installation instructions.
|
||||
|
||||
The SmartPark team deployed Gitea on a DigitalOcean Droplet using Docker Compose and the official version-pinned Gitea image \texttt{docker.gitea.com/gitea:1.27.3}. The deployment was checked on September 29, 2026, with Docker Compose version \texttt{v5.4.0}.
|
||||
|
||||
Gitea is attached to the private Docker network \texttt{color-net}, which is shared with the Caddy reverse proxy. Gitea does not publish its
|
||||
application port directly to the host. Instead, Caddy forwards requests privately to \texttt{gitea:3000}. The public HTTPS endpoint therefore terminates at Caddy rather than at the Gitea container.
|
||||
|
||||
Persistent Gitea application data is stored in the named Docker volume \\
|
||||
\texttt{gitea-foundation\_gitea\_data}, mounted at \texttt{/data}. This volume stores both the Git repositories and the SQLite database and remains in place when the disposable Gitea container is recreated.
|
||||
|
||||
The service is managed from \texttt{/root/gitea-foundation}. The deployment and basic verification commands are:
|
||||
|
||||
\begin{verbatim}
|
||||
cd /root/gitea-foundation
|
||||
docker compose config --quiet
|
||||
docker compose up -d
|
||||
docker compose ps
|
||||
docker logs --tail 50 gitea-foundation-gitea-1
|
||||
\end{verbatim}
|
||||
|
||||
The Gitea restart procedure is:
|
||||
|
||||
\begin{verbatim}
|
||||
cd /root/gitea-foundation
|
||||
docker compose restart gitea
|
||||
docker compose ps
|
||||
docker logs --tail 100 gitea-foundation-gitea-1
|
||||
\end{verbatim}
|
||||
|
||||
Private proxy connectivity can be checked from the Caddy container with:
|
||||
|
||||
\begin{verbatim}
|
||||
docker exec color-buttons-caddy wget -S -O /dev/null http://gitea:3000/
|
||||
\end{verbatim}
|
||||
|
||||
The version-controlled deployment files include
|
||||
\texttt{compose.yaml}, \texttt{.env.example}, \\
|
||||
\texttt{Caddyfile.example}, and
|
||||
\texttt{docs/gitea-operations.md}. The live \texttt{.env}, credentials,
|
||||
SSH keys, database file, and backup archive are not stored in the repository
|
||||
or included in this report.
|
||||
|
||||
\section{Database and Persistence}
|
||||
\label{Section:GiteaPersistence}
|
||||
% Document the chosen database, private connection/file path, volumes and
|
||||
% secret handling. Include repository/issue IDs, container-replacement command,
|
||||
% before/after evidence, and conclusion; PostgreSQL health check if applicable.
|
||||
|
||||
The team selected SQLite as the Gitea database because the deployment is intended for a small student team and does not require a separate database service. Gitea stores the SQLite database at \texttt{/data/gitea/gitea.db}. Git repositories are also stored under the persistent \texttt{/data} path. Because this data is stored in the named Docker volume rather than in the disposable container filesystem, it remains available when the Gitea container is replaced.
|
||||
|
||||
Before the persistence test on September 29, 2026, the operator verified that \\ \texttt{/data/gitea/gitea.db} existed inside the running Gitea container. At that time, the SQLite database file was 2,183,168 bytes.
|
||||
|
||||
The team used the existing SmartPark product repository and Issue~\#1 as the
|
||||
persistence test records:
|
||||
|
||||
\begin{itemize}
|
||||
\item Repository:
|
||||
\url{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app}
|
||||
\item Issue~\#1:
|
||||
\url{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/1}
|
||||
\end{itemize}
|
||||
|
||||
Before container replacement, both URLs returned HTTP 200 over HTTPS. The repository page displayed the SmartPark repository, and Issue~\#1 displayed the ``Document Gitea deployment and operations'' issue.
|
||||
|
||||
The Gitea container was then replaced without deleting its persistent volume. The exact command was run from \texttt{/root/gitea-foundation}:
|
||||
|
||||
\begin{verbatim}
|
||||
docker compose up -d --force-recreate gitea
|
||||
\end{verbatim}
|
||||
|
||||
Docker Compose recreated only the Gitea container. The service continued to use the pinned image \texttt{docker.gitea.com/gitea:1.27.3}. Gitea exposed only its internal container ports and did not publish the application backend directly to the host.
|
||||
|
||||
After the replacement, the same SmartPark repository and Issue~\#1 were checked again. Both returned HTTP 200 with normal TLS verification, and the same repository and issue content remained available. This verified that the repository data and issue metadata survived replacement of the disposable Gitea container because the SQLite database and Git repositories were stored in the persistent named volume.
|
||||
|
||||
SQLite requires no network database service or public database port. The database file is accessed locally by Gitea inside the persistent data volume, so there is no PostgreSQL-style port such as TCP 5432 to publish for this deployment.
|
||||
|
||||
This container-replacement test verifies \emph{persistence}; it is not a backup-and-restore test. Backup recoverability was tested separately using an isolated restored Gitea instance and is documented in the optional
|
||||
recovery summary in Section~\ref{Section:GiteaOperation}. The separate optional extra-credit evidence subsection remains to be added.
|
||||
|
||||
\section{HTTPS and Certificate Renewal}
|
||||
\label{Section:GiteaHTTPS}
|
||||
% Compare two certificate options and justify the choice. Identify TLS
|
||||
% termination, hostname certificate/issuer/expiry, redirect, renewal automation,
|
||||
% successful renewal test or dry run, redacted proxy config, and test output.
|
||||
|
||||
Caddy is used as the public reverse proxy for the SmartPark Gitea deployment. TLS terminates at Caddy, and Caddy forwards traffic privately to
|
||||
\texttt{gitea:3000} over the Docker network \texttt{color-net}. Gitea does not publish its web backend directly to the public Internet.
|
||||
|
||||
The team considered two certificate-management approaches: manually obtaining and installing a TLS certificate, or using Caddy's automatic HTTPS support with Let's Encrypt. Manual certificate management would require the team to track certificate installation, expiration, and renewal procedures directly. The team selected Caddy with Let's Encrypt because Caddy integrates certificate issuance, HTTP-to-HTTPS redirection, certificate storage, and automatic renewal with the reverse proxy.
|
||||
|
||||
The public Gitea service is available at:
|
||||
|
||||
\begin{center}
|
||||
\url{https://git.137-184-97-250.nip.io/}
|
||||
\end{center}
|
||||
|
||||
A verified TLS connection to this hostname presented a certificate whose subject and DNS Subject Alternative Name matched \texttt{git.137-184-97-250.nip.io}. The certificate was issued by Let's Encrypt using intermediate \texttt{YE2}. When checked on September 29, 2026, its expiration time was:
|
||||
|
||||
\begin{verbatim}
|
||||
2026-12-28 19:17:55 UTC
|
||||
\end{verbatim}
|
||||
|
||||
HTTP is used only for redirection to HTTPS. After TCP port 80 was moved to the Caddy reverse proxy and allowed through the DigitalOcean Cloud Firewall, an external HTTP request to the Gitea hostname returned HTTP 308 with the expected HTTPS Location header. Following the redirect reached the Gitea service with HTTP 200 and normal TLS certificate verification.
|
||||
|
||||
Caddy stores its ACME certificate state in persistent Docker storage. The named volumes \texttt{caddy\_data} and \texttt{caddy\_config} preserve Caddy's certificate and configuration state across container replacement. The live
|
||||
Caddyfile is mounted read-only from the Droplet at \texttt{/root/color-buttons-app/Caddyfile}. This allows Caddy to manage future certificate renewal without relying on the disposable container filesystem.
|
||||
|
||||
A successful renewal of the live production certificate was not observed during this assignment. Instead, the team performed an ACME staging issuance dry run on September 29, 2026 at approximately 21:24 UTC to verify the configured certificate automation path.
|
||||
|
||||
The temporary staging hostname
|
||||
|
||||
\begin{verbatim}
|
||||
renewal-check.git.137-184-97-250.nip.io
|
||||
\end{verbatim}
|
||||
|
||||
was first verified to resolve to the Droplet IPv4 address. The operator backed up the live Caddyfile and added a separate temporary site using Let's Encrypt's staging ACME directory. The modified Caddy configuration was validated and reloaded successfully.
|
||||
|
||||
An external request to the staging hostname returned HTTP 200 when certificate trust verification was bypassed for that staging test host only. Certificate inspection showed a matching certificate with issuer:
|
||||
|
||||
\begin{verbatim}
|
||||
CN=(STAGING) Artificial Amaranth YE1,
|
||||
O=Let's Encrypt,
|
||||
C=US
|
||||
\end{verbatim}
|
||||
|
||||
The staging certificate had the expiration time:
|
||||
|
||||
\begin{verbatim}
|
||||
2026-12-28 20:25:07 UTC
|
||||
\end{verbatim}
|
||||
|
||||
Normal trust verification rejected the staging certificate, which was expected because Let's Encrypt's staging certificate authority is intentionally not publicly trusted.
|
||||
|
||||
During the staging test, external checks of the production Gitea site continued to return HTTP 200 with normal certificate verification. After the dry run, the operator restored the original Caddyfile, validated the restored configuration,
|
||||
and reloaded Caddy. A local request to the Gitea HTTP hostname returned the expected HTTP 308 redirect, and follow-up external HTTPS checks again returned HTTP 200 with normal certificate verification. The temporary staging route was
|
||||
removed from the restored Caddyfile.
|
||||
|
||||
This staging test demonstrates that the configured Caddy/ACME challenge and certificate-issuance path functions correctly with the Let's Encrypt staging service. It is a certificate issuance dry run and does not claim that a renewal of the live production certificate was directly observed.
|
||||
|
||||
A sanitized summary of the relevant reverse-proxy configuration is shown below:
|
||||
|
||||
\begin{verbatim}
|
||||
git.137-184-97-250.nip.io {
|
||||
reverse_proxy gitea:3000
|
||||
}
|
||||
\end{verbatim}
|
||||
|
||||
The production Caddy configuration and non-secret example configuration are maintained separately from credentials and private certificate material. Passwords, tokens, private keys, and live secret configuration are not included in this manual or committed to the product repository.
|
||||
|
||||
\section{Firewall and External Exposure}
|
||||
\label{Section:GiteaFirewall}
|
||||
\index{firewall}
|
||||
\index{network exposure}
|
||||
The DigitalOcean Cloud Firewall \texttt{ssw590-gitea} was attached to
|
||||
\texttt{marketplace-s-1vcpu-1gb-nyc1}. The team's deployment records identify one
|
||||
attached Droplet with IPv4 address \texttt{137.184.97.250}. The recorded
|
||||
inbound rules are shown in Table~\ref{Table:GiteaFirewallRules}. These
|
||||
configuration details describe the infrastructure managed by Jacob
|
||||
(\texttt{jjradzz}); no Cloud Firewall screenshot or rule export is included
|
||||
in the five images accompanying this chapter.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\caption{Recorded inbound Cloud Firewall rules, September 29, 2026.}
|
||||
\label{Table:GiteaFirewallRules}
|
||||
\begin{tabularx}{\linewidth}{L{1.7cm}L{3.5cm}Y}
|
||||
\toprule
|
||||
\textbf{TCP port} & \textbf{Allowed source} & \textbf{Purpose}\\
|
||||
\midrule
|
||||
443 & All IPv4 & Public HTTPS through Caddy.\\
|
||||
80 & All IPv4 & HTTP redirect and certificate handling.\\
|
||||
22 & \texttt{71.127.212.247/32} & Administrator SSH from the approved address.\\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\end{table}
|
||||
|
||||
Outbound ICMP, TCP, and UDP allow all IPv4 and IPv6 destinations. This permits
|
||||
outbound access needed for image/package downloads, DNS, time, and
|
||||
certificate services. No global IPv6 address was observed on the Droplet;
|
||||
the recorded public ingress rules therefore cover its IPv4 interface.
|
||||
An overlapping-firewall check and detailed host firewall inventory are not
|
||||
present in the supplied evidence.
|
||||
|
||||
The operator initially found that the firewall had zero attached Droplets.
|
||||
That configuration was corrected before the final tests. Earlier blocked-port
|
||||
observations cannot be attributed to the unattached firewall. After attachment,
|
||||
tests from the approved external Windows environment produced the results in
|
||||
Table~\ref{Table:GiteaExternalTests}~\cite{SmartParkEvidence}.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\caption{Post-attachment external checks, September 29, 2026, about 21:51 UTC; source: approved Windows environment.}
|
||||
\label{Table:GiteaExternalTests}
|
||||
\begin{tabularx}{\linewidth}{L{2.3cm}L{3.3cm}Y}
|
||||
\toprule
|
||||
\textbf{Endpoint} & \textbf{Expected} & \textbf{Recorded actual result}\\
|
||||
\midrule
|
||||
Gitea TCP 443 & Working HTTPS & HTTP 200.\\
|
||||
Gitea TCP 80 & HTTPS redirect & HTTP 308 to HTTPS.\\
|
||||
Admin TCP 22 & Approved source allowed & Operator reported fresh login success; an external probe returned an SSH banner.\\
|
||||
Backend TCP 3000 & Public access blocked & Connection timed out after about three seconds.\\
|
||||
TCP 5432 & No public database service & Connection timed out; deployed database is SQLite, not PostgreSQL.\\
|
||||
Admin TCP 22 from unapproved source & Access denied & Not retested after attachment; no pass is claimed.\\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\end{table}
|
||||
|
||||
The final Docker port summary records Caddy publishing TCP 80 and 443,
|
||||
while Gitea and the Two Buttons application expose only internal application
|
||||
ports. This supersedes the earlier Two Buttons deployment instructions that
|
||||
published the application directly on host port 80. The first private probe
|
||||
after replacing that application container returned connection refused during
|
||||
startup; a later probe returned HTTP 200. HTTPS protects traffic, whereas
|
||||
the firewall and container mappings restrict which network services can be
|
||||
reached. Figure~\ref{Figure:GiteaArchitecture} shows these boundaries.
|
||||
% Omitted: raw Docker port-map output, host firewall inventory, overlapping
|
||||
% Cloud Firewall check, and a post-attachment unapproved-source SSH test.
|
||||
|
||||
\section{Startup Team Workflow}
|
||||
\label{Section:GiteaWorkflow}
|
||||
\index{peer review}
|
||||
The team uses the
|
||||
\href{https://git.137-184-97-250.nip.io/stevens-smartpark}{Stevens SmartPark organization}
|
||||
and the public
|
||||
\href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app}{smartpark-app repository}
|
||||
for product and operations work. The team records identify
|
||||
\texttt{nicasaoi} and \texttt{vincentpenalosa} as Developers team members
|
||||
with configured Write access to Code, Issues, and Pull Requests.
|
||||
The repository assignments were corrected to include \texttt{smartpark-app}
|
||||
and \\ \texttt{backup-restore-proof}. The supplied
|
||||
screenshots show actual contributions, review and merge activity, but do
|
||||
not include the team permission settings page.
|
||||
|
||||
The five screenshots in this section were supplied for this report on
|
||||
September 30, 2026. Their interfaces display relative times rather than
|
||||
absolute timestamps, so exact capture and event times are not established.
|
||||
The issue and PR list views show an earlier open state; the individual
|
||||
merge and closure views show the later results.
|
||||
|
||||
\subsection{Group Member Contributions}
|
||||
The group divided the work between infrastructure and operations,
|
||||
product documentation, and peer review. The contributions below distinguish
|
||||
authorship from review and merge activity.
|
||||
|
||||
\paragraph{Jacob Radzieta (\texttt{jjradzz}).}
|
||||
Jacob managed the DigitalOcean/Gitea infrastructure and documented its
|
||||
deployment and operations. His work covered the Docker deployment,
|
||||
persistent SQLite storage, Caddy HTTPS route, firewall configuration,
|
||||
and the recorded persistence and isolated recovery checks. In Gitea,
|
||||
\texttt{jjradzz} created the five product and operations issues and authored
|
||||
PR \#6 from \texttt{issue-1-gitea-operations}. That contribution added the
|
||||
operations guide and non-secret deployment examples. The issue and PR list
|
||||
screenshots identify his backlog and PR authorship.
|
||||
|
||||
\paragraph{Nica Saoi (\texttt{nicasaoi}).}
|
||||
Nica expanded the product README through PR \#7 from
|
||||
\texttt{issue-2-smartpark-readme}. Her recorded commits added the README
|
||||
expansion, clarified the current project status, and corrected spacing
|
||||
after review. This contribution connected Issue \#2 to a versioned change
|
||||
and demonstrated responding to a teammate's feedback before merge.
|
||||
|
||||
\paragraph{Vincent Penalosa (\texttt{vincentpenalosa}).}
|
||||
Vincent inspected Jacob's operations changes and recorded file-specific
|
||||
review notes in the PR \#6 merge commit. He merged that contribution and
|
||||
closed Issue \#1. For Nica's PR \#7, he submitted a review identifying a
|
||||
spacing issue, approved the corrected changes, and merged the three commits
|
||||
into \texttt{main}. These records show his contribution as a peer reviewer
|
||||
and integrator of both teammates' changes; they do not establish that he
|
||||
personally reran the infrastructure tests.
|
||||
|
||||
\subsection{Product and Operations Backlog}
|
||||
The issue list shows five concrete work items created by \texttt{jjradzz}:
|
||||
\begin{enumerate}
|
||||
\item \href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/1}{Document Gitea deployment and operations}.
|
||||
\item \href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/2}{Expand the SmartPark product README}.
|
||||
\item \href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/3}{Add sample parking-location data}.
|
||||
\item \href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/4}{Document the SmartPark architecture}.
|
||||
\item \href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/5}{Add an operations verification checklist}.
|
||||
\end{enumerate}
|
||||
Figure~\ref{Figure:GiteaBacklog} shows all five titles. The supplied Issue
|
||||
\#1 detail view also defines the requested operations document and its
|
||||
completion condition: teammate review and merge. The other four issue
|
||||
bodies are not visible in these images.
|
||||
|
||||
\begin{figure}[p]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth,height=0.72\textheight,keepaspectratio]{png/actionable_items.png}
|
||||
\caption{Five product and operations issues, shown in the earlier open state. Image supplied September 30, 2026; exact capture time is not displayed.}
|
||||
\label{Figure:GiteaBacklog}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[p]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth,height=0.72\textheight,keepaspectratio]{png/pull_requests.png}
|
||||
\caption{Two issue-linked PRs before merging: PR \#6 by jjradzz from issue-1-gitea-operations, and PR \#7 by nicasaoi from issue-2-smartpark-readme, both targeting main. Image supplied September 30, 2026.}
|
||||
\label{Figure:GiteaPullRequests}
|
||||
\end{figure}
|
||||
|
||||
\subsection{Issue 1: Operations Documentation}
|
||||
\href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/1}{Issue \#1}
|
||||
requested \path{docs/gitea-operations.md}, including the HTTPS address,
|
||||
architecture, image version, persistent storage, restart procedure,
|
||||
verified HTTPS/firewall results and troubleshooting steps. The work was
|
||||
proposed by \texttt{jjradzz} in
|
||||
\href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/pulls/6}{PR \#6}
|
||||
from \\ \texttt{issue-1-gitea-operations} into \texttt{main}.
|
||||
|
||||
Figure~\ref{Figure:GiteaOperationsMerge} shows merge commit
|
||||
\texttt{9a5897e4a5} attributed to \texttt{vincentpenalosa}, with a link
|
||||
back to PR \#6. Its message records file-by-file inspection notes about
|
||||
secret exclusion, image/storage/network settings, the Caddy route, volume
|
||||
persistence and the ACME dry run. This provides a written peer-inspection
|
||||
record by a different account from the PR author. The image is a merge
|
||||
commit view; it does not separately display a formal Gitea review event.
|
||||
Review notes are not treated as additional executed infrastructure tests.
|
||||
|
||||
Figure~\ref{Figure:GiteaIssueClosure} shows Issue \#1 closed by
|
||||
\texttt{vincentpenalosa}, with references to the operations branch and
|
||||
PR \#6. The displayed closure action is recorded as such; automatic closure
|
||||
by the merge is not inferred.
|
||||
|
||||
\begin{figure}[p]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth,height=0.76\textheight,keepaspectratio]{png/PR_issue1.png}
|
||||
\caption{PR \#6 merge commit and Vincent's file-inspection notes; commit 9a5897e4a5. Image supplied September 30, 2026. Statements in review notes do not establish an instructor waiver or independently verified test results.}
|
||||
\label{Figure:GiteaOperationsMerge}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[p]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth,height=0.76\textheight,keepaspectratio]{png/closure_issue1.png}
|
||||
\caption{Issue \#1's requested work, branch/PR references, and Closed state attributed to vincentpenalosa. Image supplied September 30, 2026.}
|
||||
\label{Figure:GiteaIssueClosure}
|
||||
\end{figure}
|
||||
|
||||
\subsection{Issue 2: Product README}
|
||||
\texttt{nicasaoi} proposed the README expansion in
|
||||
\href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/pulls/7}{PR \#7},
|
||||
using branch \\ \texttt{issue-2-smartpark-readme}. Its description contains
|
||||
\texttt{Closes \#2}, linking it to
|
||||
\href{https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/issues/2}{Issue \#2}.
|
||||
The screenshot shows the following sequence:
|
||||
\begin{enumerate}
|
||||
\item \texttt{nicasaoi} added the README expansion (\texttt{b7aaebc7d6})
|
||||
and a current-project-status update (\texttt{fa8fb79b63}).
|
||||
\item \texttt{vincentpenalosa} reviewed the change and identified an extra
|
||||
space before ``Planned Parking Information.''
|
||||
\item \texttt{nicasaoi} committed the spacing correction
|
||||
(\texttt{d601968d32}).
|
||||
\item \texttt{vincentpenalosa} approved the changes and merged the three
|
||||
commits into \texttt{main}.
|
||||
\end{enumerate}
|
||||
Figure~\ref{Figure:GiteaReadmeReview} therefore demonstrates review,
|
||||
correction, approval and merge by separate contributor/reviewer accounts.
|
||||
It does not show the final README text or Issue \#2's resulting Closed
|
||||
state. The closing directive is visible, but the issue closure remains
|
||||
unconfirmed by the supplied screenshots. Both PR merges are documented;
|
||||
the complete second issue-closure trail still requires that final evidence.
|
||||
|
||||
\begin{figure}[p]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth,height=0.76\textheight,keepaspectratio]{png/PR_issue2.png}
|
||||
\caption{PR \#7: issue link, Nica's commits, Vincent's review, spacing correction, approval and Merged state. Image supplied September 30, 2026; Issue \#2's closed state is not shown.}
|
||||
\label{Figure:GiteaReadmeReview}
|
||||
\end{figure}
|
||||
|
||||
\section{Architecture and Operation}
|
||||
\label{Section:GiteaOperation}
|
||||
\index{Gitea!architecture}
|
||||
\index{Gitea!restart procedure}
|
||||
Figure~\ref{Figure:GiteaArchitecture} shows the recorded request and data
|
||||
paths. Public browser traffic crosses the cloud firewall to Caddy. Caddy
|
||||
terminates TLS and reaches Gitea over the private Docker network. Gitea
|
||||
stores both SQLite and repository data in the named volume. Administrator
|
||||
SSH is a separate path limited to the approved source. The Caddy volumes
|
||||
\path{caddy_data} and \path{caddy_config} preserve certificate and
|
||||
configuration state; its Caddyfile is mounted read-only from
|
||||
\path{/root/color-buttons-app/Caddyfile}~\cite{SmartParkOperations}.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\begin{tikzpicture}[
|
||||
every node/.style={font=\small},
|
||||
box/.style={draw,rounded corners,align=center,text width=5.6cm,
|
||||
minimum height=0.9cm,inner sep=6pt},
|
||||
adminbox/.style={draw,align=center,text width=2.8cm,inner sep=6pt}
|
||||
]
|
||||
% Position each box from the previous box's edge so wrapped text cannot
|
||||
% consume the gap between boxes.
|
||||
\node[box] (browser) {Team browser};
|
||||
\node[box,anchor=north,yshift=-10mm] (firewall) at (browser.south)
|
||||
{DigitalOcean Cloud Firewall\\Public TCP 443 and TCP 80};
|
||||
\node[box,anchor=north,yshift=-10mm] (proxy) at (firewall.south)
|
||||
{Caddy: TLS termination\\HTTP redirect\\Persistent certificate and\\configuration volumes};
|
||||
\node[box,anchor=north,yshift=-14mm] (gitea) at (proxy.south)
|
||||
{Gitea: private TCP 3000\\Docker network: color-net};
|
||||
\node[box,anchor=north,yshift=-10mm] (data) at (gitea.south)
|
||||
{Persistent /data volume\\Git repositories and SQLite database};
|
||||
\node[adminbox,anchor=west,xshift=20mm] (admin) at (firewall.east)
|
||||
{Approved admin\\Source restricted to /32\\SSH TCP 22};
|
||||
\node[adminbox,anchor=north,yshift=-16mm] (host) at (admin.south)
|
||||
{Droplet SSH\\administration};
|
||||
\draw[->] (browser.south) -- (firewall.north);
|
||||
\draw[->] (firewall.south) -- (proxy.north);
|
||||
\draw[->] (proxy.south) -- node[midway,right=3pt,fill=white,inner sep=2pt,font=\footnotesize]
|
||||
{private HTTP} (gitea.north);
|
||||
\draw[->] (gitea.south) -- (data.north);
|
||||
\draw[->] (admin.west) -- (firewall.east);
|
||||
\draw[->] (firewall.south east) -- (host.west);
|
||||
\end{tikzpicture}
|
||||
\caption{Recorded Gitea topology, September 29, 2026. The public hostname uses temporary nip.io DNS; the Student Pack domain requirement remains unmet. SSH is a separate administrative path.}
|
||||
\label{Figure:GiteaArchitecture}
|
||||
\end{figure}
|
||||
|
||||
\subsection{Restart and Troubleshooting}
|
||||
Jacob (\texttt{jjradzz}) is responsible for the infrastructure. His operations
|
||||
documentation provides this restart and diagnostic procedure for the administrator:
|
||||
\begin{lstlisting}[caption={Gitea restart and diagnostic procedure; not a newly executed test.},label={Listing:GiteaRestart}]
|
||||
cd /root/gitea-foundation
|
||||
docker compose restart gitea
|
||||
docker compose ps
|
||||
docker logs --tail 100 gitea-foundation-gitea-1
|
||||
docker exec color-buttons-caddy wget -S -O /dev/null http://gitea:3000/
|
||||
docker exec color-buttons-caddy caddy validate --config /etc/caddy/Caddyfile
|
||||
\end{lstlisting}
|
||||
|
||||
If the private request fails, inspect Gitea's logs, state, and network
|
||||
membership. If private access succeeds but public HTTPS fails, inspect
|
||||
Caddy's status and configuration, DNS, and firewall rules. Validate Caddy
|
||||
configuration before reload. Preserve named volumes during routine restart
|
||||
and container replacement; \texttt{docker compose down -v} is not a routine
|
||||
restart command~\cite{SmartParkOperations}.
|
||||
|
||||
\subsection{Persistence and Recoverability}
|
||||
Container replacement retains the existing data volume, while recovery
|
||||
requires a usable copy of lost or damaged data. The separate September 29
|
||||
restore test used an archive of the stopped Gitea volume, including SQLite,
|
||||
configuration, and Git repositories. It restored into a separate volume and
|
||||
instance bound to Droplet loopback, leaving the live service online.
|
||||
The restored repository and issue returned HTTP 200, the issue retained
|
||||
marker \texttt{SSW590-RESTORE-20260929}, and the restored Git endpoint
|
||||
returned the expected commit. The temporary instance was stopped after
|
||||
screenshots were saved~\cite{SmartParkEvidence}.
|
||||
|
||||
The backup remains root-only on the Droplet and contains secrets. The
|
||||
stopped test container and separate test volume were retained. This summary
|
||||
distinguishes recoverability from persistence; it does not replace the
|
||||
separate logs and four screenshots required for the optional extra-credit
|
||||
submission. A cost and final cleanup plan is omitted pending operator details.
|
||||
|
||||
\section{Manual Quality and Controls}
|
||||
\label{Section:GiteaControls}
|
||||
\index{Hosts register}
|
||||
\index{Passwords register}
|
||||
This draft is version \DocumentVersion{} of the team's existing manual. The history records
|
||||
the Gitea outline and this evidence-based chapter update, and the AI Prompt
|
||||
Log records the writing assistance. Historical observations, configured
|
||||
permissions, and pending work are distinguished throughout the chapter.
|
||||
Jacob's deployment and test records describe the infrastructure results.
|
||||
Nica's commit history and Vincent's review and merge activity document the
|
||||
product-documentation and peer-review contributions. Planned work is
|
||||
distinguished from completed actions visible in those records.
|
||||
|
||||
\subsection{Hosts Register}
|
||||
Table~\ref{Table:GiteaHosts} adds the known Gitea host and service facts.
|
||||
The existing Two Buttons application shares the same Droplet and remains
|
||||
a separate exercise.
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\caption{Hosts register: Gitea deployment as recorded September 29, 2026.}
|
||||
\label{Table:GiteaHosts}
|
||||
\begin{tabularx}{\linewidth}{L{3.0cm}Y}
|
||||
\toprule
|
||||
\textbf{Field} & \textbf{Recorded value}\\
|
||||
\midrule
|
||||
Provider / environment & DigitalOcean; student team deployment.\\
|
||||
Host / owner & \texttt{marketplace-s-1vcpu-1gb-nyc1}; Jacob, infrastructure owner.\\
|
||||
Public address & \texttt{137.184.97.250}; no global IPv6 observed.\\
|
||||
Service / HTTPS & Gitea source-control and issue hub; \url{https://git.137-184-97-250.nip.io/}.\\
|
||||
Public exposure & Caddy TCP 80/443; admin SSH TCP 22 limited to approved IPv4 /32.\\
|
||||
Private data path & \texttt{color-net} to Gitea TCP 3000; SQLite and repositories in persistent \path{/data}.\\
|
||||
Backup / monitoring & Isolated backup/restore tested September 29; ongoing backup schedule and monitoring configuration not supplied.\\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\end{table}
|
||||
|
||||
\subsection{Passwords Register: Non-Secret Account Inventory}
|
||||
Table~\ref{Table:GiteaPasswords} records only known account ownership and
|
||||
privileges. Actual vault references, non-revealing recovery hints, and
|
||||
MFA/rotation status have not been supplied, so those fields are left
|
||||
unverified. This table is incomplete for final submission. No passwords,
|
||||
tokens, recovery codes, or private keys should be added to it.
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\caption{Passwords register: non-secret account inventory; management details pending confirmation.}
|
||||
\label{Table:GiteaPasswords}
|
||||
\begin{tabularx}{\linewidth}{L{3.2cm}L{2.0cm}Y}
|
||||
\toprule
|
||||
\textbf{Service/account} & \textbf{Owner} & \textbf{Recorded access / missing controls}\\
|
||||
\midrule
|
||||
Droplet administration & Jacob & SSH key authentication; key-storage hint and rotation status not supplied.\\
|
||||
Gitea administration & Jacob & Repository owner account \texttt{jjradzz}; instance-level privilege confirmation, vault hint and MFA/rotation status not supplied.\\
|
||||
Gitea \texttt{vincentpenalosa} & Vincent & Developers team Write access; personal storage hint and MFA/rotation status not supplied.\\
|
||||
Gitea \texttt{nicasaoi} & Nica & Developers team Write access; personal storage hint and MFA/rotation status not supplied.\\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\end{table}
|
||||
|
||||
\subsection{Evidence and Submission Controls}
|
||||
The five embedded screenshots show the backlog, issue-linked branches/PRs,
|
||||
the operations merge and Issue \#1 closure, and the README review/merge.
|
||||
Captions state the date the images were supplied; exact capture times are
|
||||
not visible. Earlier open-list views are distinguished from later merge
|
||||
and closure evidence. Infrastructure results remain attributed to the
|
||||
team's September 29 deployment and test records; the provided screenshots do not independently
|
||||
show firewall settings or the team permission configuration.
|
||||
|
||||
The test tables distinguish expected and observed outcomes, and missing
|
||||
tests are not marked as passed. Remaining evidence includes Issue \#2's
|
||||
closed state, the final README, a separate formal review event for PR \#6
|
||||
if available, and the missing infrastructure/control records. The four
|
||||
original/restored images required for optional backup/restore credit are
|
||||
not included in the supplied image set.
|
||||
|
||||
The final delivery is the compiled PDF of this manual, with evidence
|
||||
embedded, working repository links, and checked figures and citations.
|
||||
LaTeX source, screenshots, database files, and backup archives are not
|
||||
separate submission artifacts~\cite{DosManual112}. Full PDF compilation,
|
||||
page-layout inspection, and final review remain pending; this chapter does
|
||||
not claim submission readiness.
|
||||
@@ -0,0 +1,14 @@
|
||||
\newacronym{ai}{AI}{artificial intelligence}
|
||||
\newacronym{ci}{CI}{continuous integration}
|
||||
\newacronym{cd}{CD}{continuous delivery or continuous deployment}
|
||||
\newacronym{iac}{IaC}{infrastructure as code}
|
||||
\newacronym{slo}{SLO}{service-level objective}
|
||||
\newglossaryentry{automation}{name={automation},description={A repeatable, version-controlled procedure executed by software rather than undocumented manual steps}}
|
||||
\newglossaryentry{deployment}{name={deployment},description={The controlled delivery of a versioned change to an environment}}
|
||||
\newglossaryentry{evidence}{name={evidence},description={A retained record of an actual execution, observation, or review}}
|
||||
\newglossaryentry{observability}{name={observability},description={The ability to infer system behavior from signals such as logs, metrics, traces, and health checks}}
|
||||
\newglossaryentry{pipeline}{name={pipeline},description={An automated sequence that builds, tests, packages, and/or deploys a change}}
|
||||
\newglossaryentry{rollback}{name={rollback},description={A controlled return to a known acceptable version or state after a failed or harmful change}}
|
||||
\newglossaryentry{runbook}{name={runbook},description={A documented operational procedure for a repeatable task or incident response}}
|
||||
\newglossaryentry{synonyms}{name={synonyms},description={Equivalent terms used in this assignment; record preferred terms to avoid ambiguity in instructions and evidence}}
|
||||
\newglossaryentry{reverseproxy}{name={reverse proxy},description={A service that receives client requests and forwards them to an internal application; it may terminate HTTPS}}
|
||||
@@ -0,0 +1,46 @@
|
||||
\chapter{Introduction}
|
||||
\ChapterLabel{Introduction}
|
||||
\index{DevOps}
|
||||
\index{Docker}
|
||||
\index{DigitalOcean}
|
||||
|
||||
\section{Assignment Overview}
|
||||
This report is Group 02's living manual for Assignment \AssignmentNumber,
|
||||
\AssignmentTitle. Chapter~\ref{Chapter:Gitea} provides the eight required
|
||||
Gitea sections using the team's supplied text and recorded evidence;
|
||||
remaining verification and workflow gaps are identified in the draft.
|
||||
The retained chapters record prior assignments: the group deployed a two-button website in a
|
||||
Docker container on a DigitalOcean Droplet, updated the website to use a
|
||||
JavaScript class, and documented its UML class diagram. The group also used
|
||||
a separate Docker container with TeX Live to compile a simple LaTeX
|
||||
document.
|
||||
|
||||
The Project Proposal chapter proposes Stevens SmartPark, a campus parking
|
||||
information system. SmartPark is a proposed future application; the
|
||||
deployed two-button website is the demonstration application from the
|
||||
earlier assignment.
|
||||
|
||||
\section{DigitalOcean Docker Deployment}
|
||||
The Digital Ocean Docker Deployment chapter records the Droplet setup,
|
||||
application upload, Docker build and run commands, HTTPS setup, and links
|
||||
to the deployed website. It also explains how the updated JavaScript class
|
||||
handles the two buttons and includes the UML class diagram.
|
||||
|
||||
\section{LaTeX Docker Demonstration}
|
||||
The LaTeX Docker chapter documents the Dockerfile, sample LaTeX source,
|
||||
build and run commands, and observed result. The TeX Live container
|
||||
compiled the sample source into \texttt{hello.pdf} on the Droplet.
|
||||
|
||||
\section{Project Proposal}
|
||||
The Project Proposal chapter describes Stevens SmartPark and its planned
|
||||
features, including parking availability, hours, parking rules, accessible
|
||||
spaces, and electric-vehicle charging information. Because live parking
|
||||
data may not be available, the proposed application may simulate vehicles
|
||||
entering and leaving parking areas. The chapter identifies possible
|
||||
development, testing, database, source-control, container, and deployment
|
||||
tools.
|
||||
|
||||
\section{Submission}
|
||||
The group submits this report as a PDF through the course learning
|
||||
management system. The current deadline must be confirmed from the course
|
||||
assignment page.
|
||||
@@ -0,0 +1,89 @@
|
||||
\chapter{LaTeX Docker}
|
||||
\ChapterLabel{LaTeXDocker}
|
||||
|
||||
\section{Purpose}
|
||||
This activity uses a Docker container with TeX Live to compile a simple LaTeX
|
||||
document in a repeatable environment. The work was performed on the group's
|
||||
DigitalOcean Droplet.
|
||||
|
||||
\section{Project Files}
|
||||
The demonstration used two files in the
|
||||
\texttt{/root/latex-docker-demo} directory:
|
||||
|
||||
\begin{itemize}
|
||||
\item \texttt{Dockerfile} defines the TeX Live container image.
|
||||
\item \texttt{hello.tex} contains the sample LaTeX document.
|
||||
\end{itemize}
|
||||
|
||||
\section{Dockerfile}
|
||||
The following Dockerfile starts with Ubuntu, installs the TeX Live LaTeX
|
||||
package, and sets \texttt{pdflatex} as the container's default command.
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{dockerfile}
|
||||
FROM ubuntu:24.04
|
||||
|
||||
RUN apt-get update \
|
||||
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
||||
--no-install-recommends texlive-latex-base \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /work
|
||||
|
||||
CMD ["pdflatex", "-interaction=nonstopmode", "-halt-on-error", "hello.tex"]
|
||||
\end{minted}
|
||||
|
||||
\section{Sample LaTeX Document}
|
||||
The following source was saved as \texttt{hello.tex}. It creates a short PDF
|
||||
with a title and one sentence.
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single,escapeinside=||]{latex}
|
||||
|\textbackslash|documentclass[12pt]{article}
|
||||
|
||||
\title{LaTeX Docker Demonstration}
|
||||
\author{SSW 590 Group 02}
|
||||
\date{\today}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
|
||||
This PDF was compiled by TeX Live inside a Docker container.
|
||||
|
||||
\end{document}
|
||||
\end{minted}
|
||||
|
||||
\section{Building the Docker Image}
|
||||
At the Droplet prompt, the following commands selected the demonstration
|
||||
directory and built the image:
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{bash}
|
||||
cd /root/latex-docker-demo
|
||||
docker build -t ssw590-latex-demo .
|
||||
\end{minted}
|
||||
|
||||
\section{Compiling the LaTeX Document}
|
||||
The image was run as a temporary container. A bind mount saved the generated
|
||||
files in the Droplet directory, where they remained after the container
|
||||
stopped.
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{bash}
|
||||
docker run --rm \
|
||||
--mount type=bind,source="$PWD",target=/work \
|
||||
ssw590-latex-demo
|
||||
|
||||
ls -lh hello.pdf
|
||||
\end{minted}
|
||||
|
||||
\section{Results}
|
||||
The container ran the LaTeX compiler and reported that its transcript was
|
||||
written to \texttt{hello.log}. The file check showed \texttt{hello.pdf} in
|
||||
the demonstration directory with a size of approximately 27 KB. This
|
||||
confirmed that the sample document was compiled into a PDF on the Droplet.
|
||||
|
||||
\section{Cleanup}
|
||||
The \texttt{--rm} option removed the container after it stopped. The image
|
||||
and demonstration files were retained. If the image is no longer needed,
|
||||
it can be removed with:
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{bash}
|
||||
docker image rm ssw590-latex-demo
|
||||
\end{minted}
|
||||
@@ -0,0 +1,651 @@
|
||||
\chapter{Linux Commands}
|
||||
\ChapterLabel{LinuxCommands}
|
||||
|
||||
\index{Linux}
|
||||
\index{command line}
|
||||
\index{file operations}
|
||||
\index{processes}
|
||||
\index{networking}
|
||||
\index{archiving}
|
||||
\index{shell scripting}
|
||||
|
||||
\section{Activity Brief}
|
||||
|
||||
\subsection{Scenario}
|
||||
This activity develops proficiency with common Linux command-line tools. The exercises were completed in an Ubuntu Linux environment using Windows Subsystem for Linux (WSL). The problem set covers navigation and file operations, viewing and searching, text processing, permissions, symbolic links, process control, archiving, networking, package management, services, and Bash scripting.
|
||||
|
||||
\subsection{Activities}
|
||||
|
||||
The Linux Command Proficiency problem set consists of ten sections, labeled A through J. The work was divided among the three group members as follows:
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Jacob Radzieta}: Problems A, B, C, and D
|
||||
\item \textbf{Nica Saoi}: Problems E, F, and G
|
||||
\item \textbf{Vincent Penalosa}: Problems H, I, and J
|
||||
\end{itemize}
|
||||
|
||||
Each group member was responsible for executing the commands in their assigned sections and documenting the corresponding terminal input and output for inclusion in the final report.
|
||||
|
||||
\subsection{Success Criteria}
|
||||
The activity is complete when each required Linux command has been executed successfully and the corresponding terminal input and output have been documented.
|
||||
|
||||
%--------------------------------------------
|
||||
%Jacob
|
||||
|
||||
\section{A) Navigation \& File Ops}
|
||||
|
||||
\subsection{Question 1: Show your present working directory path only}
|
||||
|
||||
This task displays the absolute path of the current working directory using the
|
||||
\texttt{pwd} command.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q1.png}
|
||||
\caption{Terminal input and output for Question 1.}
|
||||
\end{figure}
|
||||
|
||||
The output displays the current working directory and confirms that the Linux
|
||||
Commands activity was performed from the designated \texttt{lx-test} working
|
||||
directory.
|
||||
|
||||
|
||||
\subsection{Question 2: List all entries in the current directory, one per line, including dotfiles}
|
||||
|
||||
This task lists all entries in the current working directory, including hidden
|
||||
entries, with one entry displayed per line.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q2.png}
|
||||
\caption{Terminal input and output for Question 2.}
|
||||
\end{figure}
|
||||
|
||||
The output lists the contents of the working directory one entry per line.
|
||||
The use of the option that includes hidden files also displays the special
|
||||
dot entries along with the files and directories created for the activity.
|
||||
|
||||
|
||||
\subsection{Question 3: Copy src/file1.txt to tmp/ only if tmp exists; do it verbosely}
|
||||
|
||||
This task first verifies that the \texttt{tmp/} directory exists and then
|
||||
copies \texttt{src/file1.txt} into it using verbose output.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q3.png}
|
||||
\caption{Terminal input and output for Question 3.}
|
||||
\end{figure}
|
||||
|
||||
The output confirms that \texttt{tmp/} existed and that
|
||||
\texttt{src/file1.txt} was successfully copied into the directory. The
|
||||
verbose copy output identifies both the source and destination paths.
|
||||
|
||||
|
||||
\subsection{Question 4: Move old.txt into archive/ and keep its original timestamp}
|
||||
|
||||
This task moves \texttt{old.txt} into the \texttt{archive/} directory while
|
||||
preserving the file's existing timestamp.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q4.png}
|
||||
\caption{Terminal input and output for Question 4.}
|
||||
\end{figure}
|
||||
|
||||
The output confirms that \texttt{old.txt} was moved into
|
||||
\texttt{archive/}. The file information verifies that the timestamp assigned
|
||||
during the initial environment setup was retained after the move.
|
||||
|
||||
|
||||
\subsection{Question 5: Create a new empty file notes.md only if it doesn't already exist}
|
||||
|
||||
This task conditionally creates an empty file named \texttt{notes.md} only
|
||||
when a file with that name does not already exist.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q5.png}
|
||||
\caption{Terminal input and output for Question 5.}
|
||||
\end{figure}
|
||||
|
||||
The resulting directory information confirms that \texttt{notes.md} exists.
|
||||
The conditional command prevents an existing copy of the file from being
|
||||
unnecessarily modified.
|
||||
|
||||
|
||||
\subsection{Question 6: Show disk usage (human-readable) for the src directory only}
|
||||
|
||||
This task displays the disk usage of the \texttt{src/} directory in a
|
||||
human-readable format without displaying usage information for the entire
|
||||
filesystem.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q6.png}
|
||||
\caption{Terminal input and output for Question 6.}
|
||||
\end{figure}
|
||||
|
||||
The output reports the amount of disk space used by the \texttt{src/}
|
||||
directory in a human-readable unit, providing a concise summary for that
|
||||
directory only.
|
||||
|
||||
|
||||
\section{B) Viewing \& Searching}
|
||||
|
||||
\subsection{Question 7: Print line numbers while displaying sys.log}
|
||||
|
||||
This task displays the contents of \texttt{sys.log} while adding a line
|
||||
number to each displayed record.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q7.png}
|
||||
\caption{Terminal input and output for Question 7.}
|
||||
\end{figure}
|
||||
|
||||
The output displays all four entries in \texttt{sys.log} with corresponding
|
||||
line numbers, making the location of each log entry easy to identify.
|
||||
|
||||
|
||||
\subsection{Question 8: Show only the lines in sys.log that contain ERROR}
|
||||
|
||||
This task searches \texttt{sys.log} for the case-sensitive text
|
||||
\texttt{ERROR} and displays only matching lines.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q8.png}
|
||||
\caption{Terminal input and output for Question 8.}
|
||||
\end{figure}
|
||||
|
||||
The output displays the log entry containing \texttt{ERROR} and excludes the
|
||||
other informational and warning entries. This confirms that the search was
|
||||
performed using the required case-sensitive match.
|
||||
|
||||
|
||||
\subsection{Question 9: Count how many distinct words appear in words.txt}
|
||||
|
||||
This task converts the contents of \texttt{words.txt} to a common case,
|
||||
removes duplicate entries, and counts the number of distinct words.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q9.png}
|
||||
\caption{Terminal input and output for Question 9.}
|
||||
\end{figure}
|
||||
|
||||
The output reports three distinct case-insensitive words. The values
|
||||
\texttt{Gamma} and \texttt{gamma} are treated as the same word, and the
|
||||
duplicate occurrences of \texttt{beta} are counted only once.
|
||||
|
||||
|
||||
\subsection{Question 10: From words.txt, show lines that start with g or G}
|
||||
|
||||
This task searches \texttt{words.txt} for lines beginning with the letter
|
||||
\texttt{g}, using a case-insensitive match so that both uppercase and
|
||||
lowercase forms are included.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q10.png}
|
||||
\caption{Terminal input and output for Question 10.}
|
||||
\end{figure}
|
||||
|
||||
The output displays the lines containing \texttt{Gamma} and
|
||||
\texttt{gamma}, confirming that both uppercase and lowercase matches at the
|
||||
beginning of a line were selected.
|
||||
|
||||
|
||||
\subsection{Question 11: Display the first 2 lines of people.csv without using an editor}
|
||||
|
||||
This task displays only the first two lines of \texttt{people.csv} directly
|
||||
from the terminal.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q11.png}
|
||||
\caption{Terminal input and output for Question 11.}
|
||||
\end{figure}
|
||||
|
||||
The output displays the CSV header followed by the first data record. This
|
||||
confirms that only the requested first two lines were read without opening
|
||||
the file in an editor.
|
||||
|
||||
|
||||
\subsection{Question 12: Show the last 3 lines of sys.log and keep following if the file grows}
|
||||
|
||||
This task displays the final three lines of \texttt{sys.log} and keeps the
|
||||
command active so that newly appended log entries would be displayed as they
|
||||
are written.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q12.png}
|
||||
\caption{Terminal input and output for Question 12.}
|
||||
\end{figure}
|
||||
|
||||
The initial output displays the final three log entries. The follow option
|
||||
keeps the command attached to the file so that additional lines would appear
|
||||
automatically if the log were updated.
|
||||
|
||||
|
||||
\section{C) Text Processing}
|
||||
|
||||
\subsection{Question 13: From people.csv, print only the name column, excluding the header}
|
||||
|
||||
This task processes \texttt{people.csv} and displays only the second column,
|
||||
which contains each person's name, while excluding the CSV header.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q13.png}
|
||||
\caption{Terminal input and output for Question 13.}
|
||||
\end{figure}
|
||||
|
||||
The output lists the four names from the CSV data without displaying the
|
||||
header or the ID and department columns.
|
||||
|
||||
|
||||
\subsection{Question 14: Sort words.txt case-insensitively and remove duplicates}
|
||||
|
||||
This task sorts the contents of \texttt{words.txt} without regard to letter
|
||||
case and removes duplicate values from the resulting output.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q14.png}
|
||||
\caption{Terminal input and output for Question 14.}
|
||||
\end{figure}
|
||||
|
||||
The output contains one entry for each distinct case-insensitive word. The
|
||||
duplicate occurrences of \texttt{beta} and the case variants of
|
||||
\texttt{gamma} are reduced to single entries.
|
||||
|
||||
|
||||
\subsection{Question 15: Replace every three with 3 in all files under src/ in-place, creating .bak backups}
|
||||
|
||||
This task replaces every occurrence of the word \texttt{three} with the
|
||||
number \texttt{3} in the text files under \texttt{src/}. The files are
|
||||
modified in place while backup copies with the \texttt{.bak} extension are
|
||||
created.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q15.png}
|
||||
\caption{Terminal input and output for Question 15.}
|
||||
\end{figure}
|
||||
|
||||
The output verifies that the active text files now contain \texttt{3} in
|
||||
place of \texttt{three}. The directory listing also confirms that backup
|
||||
copies of the original files were retained using the \texttt{.bak}
|
||||
extension.
|
||||
|
||||
|
||||
\subsection{Question 16: Print the number of lines, words, and bytes for every *.txt file in src/}
|
||||
|
||||
This task uses a word-count operation to report the number of lines, words,
|
||||
and bytes for every file matching \texttt{*.txt} in the \texttt{src/}
|
||||
directory.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q16.png}
|
||||
\caption{Terminal input and output for Question 16.}
|
||||
\end{figure}
|
||||
|
||||
The output reports line, word, and byte counts for each matching text file
|
||||
and includes a combined total. This provides a concise summary of the
|
||||
contents of the text files in \texttt{src/}.
|
||||
|
||||
|
||||
\section{D) Permissions \& Ownership}
|
||||
|
||||
\subsection{Question 17: Make tmp/ readable, writable, and searchable only by the owner}
|
||||
|
||||
This task changes the permissions of \texttt{tmp/} so that only the owner
|
||||
has read, write, and execute permissions.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q17.png}
|
||||
\caption{Terminal input and output for Question 17.}
|
||||
\end{figure}
|
||||
|
||||
The resulting permissions show that the owner has full access to the
|
||||
directory while group members and other users have no permissions. This
|
||||
corresponds to an octal permission value of \texttt{700}.
|
||||
|
||||
|
||||
\subsection{Question 18: Give group execute permission to src/lib recursively without touching others/owner bits}
|
||||
|
||||
This task recursively adds execute permission for the group to
|
||||
\texttt{src/lib} without replacing or otherwise modifying the existing owner
|
||||
or other permission bits.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q18.png}
|
||||
\caption{Terminal input and output for Question 18.}
|
||||
\end{figure}
|
||||
|
||||
The resulting permission information confirms that group execute permission
|
||||
was added to \texttt{src/lib}. Using a symbolic permission change preserves
|
||||
the existing owner and other permission settings.
|
||||
|
||||
|
||||
\subsection{Question 19: Show the numeric permissions of src/file2.txt}
|
||||
|
||||
This task displays the permissions of \texttt{src/file2.txt} using their
|
||||
numeric, or octal, representation.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q19.png}
|
||||
\caption{Terminal input and output for Question 19.}
|
||||
\end{figure}
|
||||
|
||||
The output provides the numeric permission value currently assigned to
|
||||
\texttt{src/file2.txt}, allowing the owner, group, and other permission bits
|
||||
to be interpreted directly.
|
||||
|
||||
|
||||
\subsection{Question 20: Make notes.md append-only via file attributes}
|
||||
|
||||
This task applies the append-only file attribute to \texttt{notes.md} and
|
||||
then displays the file's attributes to verify the change.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{png/Q20.png}
|
||||
\caption{Terminal input and output for Question 20.}
|
||||
\end{figure}
|
||||
|
||||
The attribute information shows that the append-only attribute is enabled
|
||||
for \texttt{notes.md}. With this attribute active, existing contents cannot
|
||||
be overwritten through normal file operations and new data may only be
|
||||
appended to the file.
|
||||
|
||||
% ----------------------------------------------------------------------- Jacob
|
||||
|
||||
%--------------------------------------------
|
||||
% Nica
|
||||
|
||||
%E---------------------
|
||||
\section{E) Links \& Find}
|
||||
|
||||
\subsection{Question 21: Verify a symbolic link}
|
||||
|
||||
The purpose of this task was to verify that \texttt{link-to-file1} is a symbolic link and display its target path.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q21.png}
|
||||
\caption{Terminal input and output for Question 21.}
|
||||
\label{fig:q21}
|
||||
\end{figure}
|
||||
|
||||
The output confirms that \texttt{link-to-file1} is a symbolic link and shows that it points to \texttt{src/file1.txt}.
|
||||
|
||||
\subsection{Question 22: Find files larger than 40 KiB}
|
||||
|
||||
This task used the \texttt{find} command to locate all regular files under the current directory tree that were larger than 40 KiB.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q22.png}
|
||||
\caption{Terminal input and output for Question 22.}
|
||||
\label{fig:q22}
|
||||
\end{figure}
|
||||
|
||||
The output shows that \texttt{blob.bin} is the only regular file in the current directory tree larger than 40 KiB.
|
||||
|
||||
\subsection{Question 23: Find recently modified files}
|
||||
|
||||
This task searched the \texttt{tmp/} directory for files modified within the last 10 minutes and displayed their sizes.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q23.png}
|
||||
\caption{Terminal input and output for Question 23.}
|
||||
\label{fig:q23}
|
||||
\end{figure}
|
||||
|
||||
No output was produced because there were no files in \texttt{tmp/} that matched the search conditions at the time the command was run.
|
||||
|
||||
%F---------------------
|
||||
\section{F) Processes \& Job Control}
|
||||
|
||||
\subsection{Question 24: Show processes in a tree view}
|
||||
|
||||
This task displays the processes owned by the current user in a tree structure so that parent-child process relationships can be observed.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q24.png}
|
||||
\caption{Terminal input and output for Question 24.}
|
||||
\label{fig:q24}
|
||||
\end{figure}
|
||||
|
||||
The output displays the processes owned by the current user in a tree structure. The indentation shows the parent-child relationships between the running processes.
|
||||
|
||||
\subsection{Question 25: Start a background process and show its PID}
|
||||
|
||||
This task starts \texttt{sleep 120} as a background process and displays the process ID assigned to that background job.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q25.png}
|
||||
\caption{Terminal input and output for Question 25.}
|
||||
\label{fig:q25}
|
||||
\end{figure}
|
||||
|
||||
The output shows that \texttt{sleep 120} was started as a background process. The displayed process ID identifies the newly created background job.
|
||||
|
||||
\subsection{Question 26: Send a TERM signal to sleep processes}
|
||||
|
||||
This task sends a TERM signal to all \texttt{sleep} processes owned by the current user without using the forceful \texttt{kill -9} signal.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q26.png}
|
||||
\caption{Terminal input and output for Question 26.}
|
||||
\label{fig:q26}
|
||||
\end{figure}
|
||||
|
||||
The output confirms that a TERM signal was sent to the current user's \texttt{sleep} process, causing the background process to terminate.
|
||||
|
||||
\subsection{Question 27: Show the top five processes by memory usage}
|
||||
|
||||
This task displays the five processes owned by the current user that are using the highest percentage of system memory.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q27.png}
|
||||
\caption{Terminal input and output for Question 27.}
|
||||
\label{fig:q27}
|
||||
\end{figure}
|
||||
|
||||
The output lists the five processes owned by the current user with the highest memory usage. The processes are sorted in descending order by their percentage of memory usage.
|
||||
|
||||
%G---------------------
|
||||
\section{G) Archiving \& Compression}
|
||||
|
||||
\subsection{Question 28: Create a gzipped tar archive}
|
||||
|
||||
This task creates a gzip-compressed tar archive named \texttt{src.tgz} from the \texttt{src/} directory while preserving relative paths.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q28.png}
|
||||
\caption{Terminal input and output for Question 28.}
|
||||
\label{fig:q28}
|
||||
\end{figure}
|
||||
|
||||
The command creates the archive \texttt{src.tgz} containing the \texttt{src/} directory. There is no output when the archive is created successfully.
|
||||
|
||||
\subsection{Question 29: List the contents of the archive}
|
||||
|
||||
This task lists the contents of \texttt{src.tgz} without extracting any of the files stored inside the archive.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q29.png}
|
||||
\caption{Terminal input and output for Question 29.}
|
||||
\label{fig:q29}
|
||||
\end{figure}
|
||||
|
||||
The output lists the files and directories stored inside \texttt{src.tgz} without extracting them. This confirms that the \texttt{src/} directory and its contents were successfully archived.
|
||||
|
||||
\subsection{Question 30: Extract file2.txt into tmp}
|
||||
|
||||
This task extracts only \texttt{file2.txt} from the compressed archive and places it into the \texttt{tmp/} directory.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q30.png}
|
||||
\caption{Terminal input and output for Question 30.}
|
||||
\label{fig:q30}
|
||||
\end{figure}
|
||||
|
||||
The output confirms that only \texttt{file2.txt} was extracted from the archive into the \texttt{tmp/} directory. The extracted file can then be checked to verify that the correct file was recovered.
|
||||
|
||||
|
||||
%--------------------------------------------
|
||||
%Vincent
|
||||
|
||||
\section{H) Networking \& System Info}
|
||||
|
||||
\subsection{Question 31: Show all listening TCP sockets with associated PIDs (no root assumptions).}
|
||||
|
||||
This task uses \texttt{sudo ss -ltnp} to display listening TCP sockets with numeric addresses and ports, along with the associated processes.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q31.png}
|
||||
\caption{Terminal input and output for Question 31.}
|
||||
\label{fig:q31}
|
||||
\end{figure}
|
||||
|
||||
The output shows listening TCP sockets on ports 53 and 6379. Process information identifies \texttt{systemd-resolve} and \texttt{redis-server} for the sockets where process details are available.
|
||||
|
||||
\subsection{Question 32: Print your default route (gateway) in a concise form.}
|
||||
|
||||
This task uses \texttt{ip route} with \texttt{grep default} to display the system's default network route.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q32.png}
|
||||
\caption{Terminal input and output for Question 32.}
|
||||
\label{fig:q32}
|
||||
\end{figure}
|
||||
|
||||
The output shows that the default route uses gateway \texttt{172.31.48.1} through the \texttt{eth0} network interface.
|
||||
|
||||
\subsection{Question 33: Display kernel name, release, and machine architecture.}
|
||||
|
||||
This task uses \texttt{uname -srm} to display the kernel name, kernel release, and machine architecture.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q33.png}
|
||||
\caption{Terminal input and output for Question 33.}
|
||||
\label{fig:q33}
|
||||
\end{figure}
|
||||
|
||||
The output identifies the kernel as Linux, the kernel release as \texttt{6.18.33.2-microsoft-standard-WSL2}, and the machine architecture as \texttt{x86\_64}.
|
||||
|
||||
\subsection{Question 34: Show the last 5 successful logins (or last sessions) on the system.}
|
||||
|
||||
This task uses \texttt{last -n 5} to display the five most recent entries in the system's login history.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q34.png}
|
||||
\caption{Terminal input and output for Question 34.}
|
||||
\label{fig:q34}
|
||||
\end{figure}
|
||||
|
||||
The five entries shown are system boot records labeled \texttt{reboot}, rather than individual user login sessions. The most recent entry is marked as still running.
|
||||
|
||||
\section{I) Package \& Services (Debian/Ubuntu)}
|
||||
|
||||
\subsection{Question 35: Show the installed version of package coreutils.}
|
||||
|
||||
This task queries the installed \texttt{coreutils} package using \texttt{dpkg -s} and filters the result to display its version.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q35.png}
|
||||
\caption{Terminal input and output for Question 35.}
|
||||
\label{fig:q35}
|
||||
\end{figure}
|
||||
|
||||
The output shows that the installed version of \texttt{coreutils} is \texttt{9.4-3ubuntu6}.
|
||||
|
||||
\subsection{Question 36: Search available packages whose names contain ripgrep.}
|
||||
|
||||
This task uses \texttt{apt-cache search ripgrep} to search the local package cache for packages matching \texttt{ripgrep}.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q36.png}
|
||||
\caption{Terminal input and output for Question 36.}
|
||||
\label{fig:q36}
|
||||
\end{figure}
|
||||
|
||||
The output includes \texttt{ripgrep}, described as a tool that recursively searches directories for a regular expression pattern, along with other matching packages. This command searches package information without installing a package.
|
||||
|
||||
\subsection{Question 37: Check whether service cron is active and print its status line only.}
|
||||
|
||||
This task uses \texttt{systemctl is-active cron} to check the current activity state of the \texttt{cron} service.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q37.png}
|
||||
\caption{Terminal input and output for Question 37.}
|
||||
\label{fig:q37}
|
||||
\end{figure}
|
||||
|
||||
The output returns \texttt{active}, confirming that the \texttt{cron} service was running when the command was executed.
|
||||
|
||||
\section{J) Bash \& Scripting}
|
||||
|
||||
\subsection{Question 38: Write a one-liner that loops over *.txt in src/ and prints: : .}
|
||||
|
||||
This task uses a Bash \texttt{for} loop to process each \texttt{.txt} file in \texttt{src/} and display its filename and line count using \texttt{wc -l}.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q38.png}
|
||||
\caption{Terminal input and output for Question 38.}
|
||||
\label{fig:q38}
|
||||
\end{figure}
|
||||
|
||||
The output shows that \texttt{src/file1.txt} and \texttt{src/file2.txt} each contain one line.
|
||||
|
||||
\subsection{Question 39: Write a command that exports CSV rows where dept == "CS" to cs.txt (exclude header).}
|
||||
|
||||
This task uses \texttt{awk} to locate the \texttt{dept} column in the header of \texttt{people.csv}, select records whose department is \texttt{CS}, and save the matching records to \texttt{cs.txt} without the header.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q39.png}
|
||||
\caption{Terminal input and output for Question 39.}
|
||||
\label{fig:q39}
|
||||
\end{figure}
|
||||
|
||||
Displaying \texttt{cs.txt} with \texttt{cat} shows the two matching records: \texttt{2,Linus,CS} and \texttt{4,Dennis,CS}.
|
||||
|
||||
\subsection{Question 40: Create a variable X with value 42, print it, then remove it from the environment.}
|
||||
|
||||
This task exports the variable \texttt{X} with the value \texttt{42}, displays its value, and then removes the variable using \texttt{unset}.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{png/Q40.png}
|
||||
\caption{Terminal input and output for Question 40.}
|
||||
\label{fig:q40}
|
||||
\end{figure}
|
||||
|
||||
The first \texttt{echo} command displays \texttt{42}. After \texttt{unset X}, the second \texttt{echo} command produces a blank line because the variable is no longer set.
|
||||
@@ -0,0 +1,230 @@
|
||||
\chapter{Project Proposal}
|
||||
\ChapterLabel{ProjectProposal}
|
||||
\index{project proposal}
|
||||
|
||||
\section{Project Title}
|
||||
|
||||
\begin{center}
|
||||
\Large
|
||||
\textbf{Stevens SmartPark: Campus Parking Information System}
|
||||
\end{center}
|
||||
|
||||
\section{Project Description}
|
||||
|
||||
Stevens SmartPark is a proposed web application that will provide students with information about parking availability at major Stevens Institute of Technology
|
||||
parking locations. The goal of the project is to make it easier for students to quickly see the status of campus parking areas before deciding where to park.
|
||||
|
||||
The application will focus on locations such as Babbio Garage, River Lot, 8th Street Lot, Castle Point Hall Lot, and Howe Center Lot.
|
||||
|
||||
For each parking location, the system may display information such as:
|
||||
|
||||
\begin{itemize}
|
||||
\item the number of available parking spaces;
|
||||
\item the total number of parking spaces;
|
||||
\item whether the parking location is open or closed;
|
||||
\item opening and closing times;
|
||||
\item whether overnight parking is allowed;
|
||||
\item handicapped parking availability;
|
||||
\item whether electric-vehicle charging is available; and
|
||||
\item EV charger availability and pricing when applicable.
|
||||
\end{itemize}
|
||||
|
||||
Since real-time parking data may not be available, the project can use simulated parking activity. The simulation would represent vehicles entering and leaving parking areas and would update the number of available spaces.
|
||||
|
||||
For example, if a simulated vehicle enters Babbio Garage, the number of available spaces would decrease by one. When a vehicle leaves, the number of
|
||||
available spaces would increase.
|
||||
|
||||
This will allow the group to build and demonstrate a working application without requiring access to actual parking sensors or private Stevens parking
|
||||
systems.
|
||||
|
||||
\section{Main Project Tasks}
|
||||
|
||||
The project will be divided into several basic tasks.
|
||||
|
||||
\begin{enumerate}
|
||||
\item Create a web interface that displays the Stevens parking locations.
|
||||
\item Store information about each parking location.
|
||||
\item Display the number of available and total parking spaces.
|
||||
\item Display parking hours and whether a parking location is currently open or closed.
|
||||
\item Display handicapped and EV parking information.
|
||||
\item Create a simple simulation for vehicles entering and leaving parking areas.
|
||||
\item Update parking availability when simulated activity occurs.
|
||||
\item Test the application to make sure parking counts remain valid.
|
||||
\item Store the application and its configuration in source control.
|
||||
\item Package the application using Docker.
|
||||
\item Deploy the application to a DigitalOcean environment.
|
||||
\end{enumerate}
|
||||
|
||||
\section{Proposed Application Design}
|
||||
|
||||
The application will likely contain three main parts: a web interface, an application server, and a database.
|
||||
|
||||
A simplified design is shown below.
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{text}
|
||||
Student Browser
|
||||
|
|
||||
v
|
||||
Stevens SmartPark Software
|
||||
|
|
||||
v
|
||||
Node.js / Express Application
|
||||
|
|
||||
v
|
||||
PostgreSQL Database
|
||||
\end{minted}
|
||||
|
||||
The web interface will display parking information to the user. The application server will handle parking data and simulated parking activity. The database
|
||||
will store information about the parking locations.
|
||||
|
||||
\section{Proposed DevSecOps Tools}
|
||||
|
||||
Because the project is still in the proposal stage, the final tools may change. The following tools are currently being considered.
|
||||
|
||||
\begin{tabularx}{\linewidth}{L{3.3cm}L{3.8cm}Y}
|
||||
\caption{Proposed Stevens SmartPark Tools
|
||||
\label{Table:SmartParkTools}}\\
|
||||
\toprule
|
||||
\textbf{Area} & \textbf{Tool} & \textbf{Purpose}\\
|
||||
\midrule
|
||||
|
||||
Source Control & Git and GitHub &
|
||||
Store the source code, track changes, and allow the group to collaborate on the
|
||||
project.\\
|
||||
|
||||
Application & Node.js and Express &
|
||||
Build the server-side portion of the SmartPark web application.\\
|
||||
|
||||
Database & PostgreSQL &
|
||||
Store parking locations, parking rules, capacity, and simulated availability
|
||||
information.\\
|
||||
|
||||
Testing & Jest &
|
||||
Test application logic such as parking-space calculations and simulated
|
||||
vehicle activity.\\
|
||||
|
||||
Containerization & Docker &
|
||||
Package the SmartPark application so that it can run in a consistent
|
||||
environment.\\
|
||||
|
||||
Deployment & DigitalOcean &
|
||||
Host the containerized SmartPark application in a sandbox cloud environment.\\
|
||||
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
These tools were selected because they cover the main parts of the development process without making the initial project unnecessarily complicated.
|
||||
|
||||
\section{Source Control}
|
||||
|
||||
Git and GitHub will be used for source control. The project repository will contain the application code, Docker configuration, database-related files, and
|
||||
documentation.
|
||||
|
||||
Using source control will allow the group to track changes and work on separate parts of the application without relying on a single copy of the project.
|
||||
|
||||
Typical Git commands may include:
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{bash}
|
||||
git status
|
||||
git add .
|
||||
git commit -m "Update SmartPark application"
|
||||
git push
|
||||
\end{minted}
|
||||
|
||||
\section{Database}
|
||||
|
||||
PostgreSQL is being considered for storing the SmartPark data.
|
||||
|
||||
The database may contain information such as:
|
||||
|
||||
\begin{itemize}
|
||||
\item parking location name;
|
||||
\item total parking capacity;
|
||||
\item currently available spaces;
|
||||
\item opening time;
|
||||
\item closing time;
|
||||
\item overnight parking rules;
|
||||
\item handicapped parking spaces; and
|
||||
\item EV charging information.
|
||||
\end{itemize}
|
||||
|
||||
A parking location could conceptually contain data similar to:
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{text}
|
||||
Parking Location: Babbio Garage
|
||||
Total Spaces: 120
|
||||
Available Spaces: 42
|
||||
Open: Yes
|
||||
Opening Time: 7:00 AM
|
||||
Closing Time: 11:00 PM
|
||||
Overnight Parking: No
|
||||
EV Charging: Available
|
||||
\end{minted}
|
||||
|
||||
\section{Testing}
|
||||
|
||||
Testing will be used to make sure that the simulated parking information remains valid.
|
||||
|
||||
Possible tests include:
|
||||
|
||||
\begin{itemize}
|
||||
\item a vehicle entering decreases the available-space count by one;
|
||||
\item a vehicle leaving increases the available-space count by one;
|
||||
\item the number of available spaces cannot become negative;
|
||||
\item the number of available spaces cannot become greater than the total
|
||||
capacity; and
|
||||
\item the correct parking information is returned for each location.
|
||||
\end{itemize}
|
||||
|
||||
Jest is being considered as the testing tool because it can be used with the proposed Node.js application.
|
||||
|
||||
A typical test command would be:
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{bash}
|
||||
npm test
|
||||
\end{minted}
|
||||
|
||||
\section{Docker and Deployment}
|
||||
|
||||
Docker will be used to package the SmartPark application and its dependencies into a container. This will help make the application easier to run in a
|
||||
consistent environment.
|
||||
|
||||
A simple deployment process may include:
|
||||
|
||||
\begin{minted}[fontsize=\small,breaklines,frame=single]{text}
|
||||
Application Source Code
|
||||
|
|
||||
v
|
||||
Docker Image
|
||||
|
|
||||
v
|
||||
DigitalOcean Droplet
|
||||
|
|
||||
v
|
||||
Stevens SmartPark Software
|
||||
\end{minted}
|
||||
|
||||
DigitalOcean is currently being considered as the deployment environment because it is already being used in the course for Docker deployment activities.
|
||||
|
||||
|
||||
\section{Expected Result}
|
||||
|
||||
The proposed result is a simple working Stevens SmartPark software that allows a student to view parking information for several campus locations.
|
||||
|
||||
The initial project is expected to demonstrate:
|
||||
|
||||
\begin{itemize}
|
||||
\item a working web application;
|
||||
\item multiple Stevens parking locations;
|
||||
\item simulated parking availability;
|
||||
\item parking hours and rules;
|
||||
\item handicapped and EV parking information;
|
||||
\item source-controlled project files;
|
||||
\item automated tests;
|
||||
\item stored parking data;
|
||||
\item a Dockerized application; and
|
||||
\item deployment to a sandbox environment such as DigitalOcean.
|
||||
\end{itemize}
|
||||
|
||||
The exact design and tools may change as the project develops. At this stage, the purpose of the proposal is to establish the project idea and identify the
|
||||
main technologies that may be required to build it.
|
||||
@@ -0,0 +1,40 @@
|
||||
@book{PhoenixProject,
|
||||
author = {Kim, Gene and Behr, Kevin and Spafford, George},
|
||||
title = {The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win},
|
||||
publisher = {IT Revolution Press},
|
||||
year = {2018}
|
||||
}
|
||||
|
||||
@manual{DosManual112,
|
||||
author = {Muresan, Darian},
|
||||
title = {{DevOpsStartup: A Startup DevSecOps Assignment Manual}},
|
||||
organization = {Stevens Institute of Technology},
|
||||
year = {2026},
|
||||
month = sep,
|
||||
note = {Student Edition, version 1.12, September 24. Chapter 2, Section 2.6, and Appendix A}
|
||||
}
|
||||
|
||||
@misc{SmartParkHandoff,
|
||||
author = {{Stevens SmartPark Team}},
|
||||
title = {{Gitea Assignment Handoff}},
|
||||
year = {2026},
|
||||
month = sep,
|
||||
note = {Internal team record: OVERLEAF\_HANDOFF.md, prepared September 29; assignment audit added September 30}
|
||||
}
|
||||
|
||||
@misc{SmartParkEvidence,
|
||||
author = {{Stevens SmartPark Team}},
|
||||
title = {{Gitea Assignment Evidence Ledger}},
|
||||
year = {2026},
|
||||
month = sep,
|
||||
note = {Internal team record: EVIDENCE.md. Tests and observations recorded September 29; times in UTC}
|
||||
}
|
||||
|
||||
@misc{SmartParkOperations,
|
||||
author = {{Stevens SmartPark Team}},
|
||||
title = {{Stevens SmartPark Gitea Operations}},
|
||||
year = {2026},
|
||||
month = sep,
|
||||
note = {Internal team record: SMARTPARK\_GITEA\_OPERATIONS.md, September 29. Non-secret guide proposed in Gitea PR 6},
|
||||
url = {https://git.137-184-97-250.nip.io/stevens-smartpark/smartpark-app/pulls/6}
|
||||
}
|
||||
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 154 KiB |
|
After Width: | Height: | Size: 152 KiB |
|
After Width: | Height: | Size: 127 KiB |
@@ -0,0 +1,17 @@
|
||||
\title{\CourseNumber\ --- \CourseName\\[0.5em]\large Assignment \AssignmentNumber: \AssignmentTitle\\[1.5em]\normalsize\VERSION\\\DocumentStatus}
|
||||
\author{\Instructor\\\Organization}
|
||||
\conferraldate{}{\DocumentDate}
|
||||
\copyrightholder{\Organization}
|
||||
\copyrightyear{2026}
|
||||
\maketitle
|
||||
\makecopyright
|
||||
|
||||
\cleardoublepage
|
||||
\phantomsection
|
||||
|
||||
\clearpage
|
||||
\begin{abstract}\input{abstract.tex}\end{abstract}
|
||||
\input{devopsDocumentHistory.tex}
|
||||
\contentspage
|
||||
\tablelistpage
|
||||
\figurelistpage
|
||||