|
@@ -0,0 +1,161 @@
|
|
|
|
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
|
|
+ <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
|
|
|
+ <head>
|
|
|
|
+ <title>Running Apache Guacamole in Docker</title>
|
|
|
|
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
|
|
+ <script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
|
|
|
|
+ <script type="text/javascript">
|
|
|
|
+ $(function(){
|
|
|
|
+ $('textarea').each(function(i,e){
|
|
|
|
+ theTextarea = $(this);
|
|
|
|
+ theTextarea.height((theTextarea[0].scrollHeight-5) +'px');
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ $('li').each(function(i,e){
|
|
|
|
+ if(!$(this).hasClass('noCheckbox')){
|
|
|
|
+ var uuid = 'li_' + Math.floor(Math.random() * Math.floor(1000000)).toString() + '_' + i.toString();
|
|
|
|
+ $(this).contents().wrap('<span id="'+ uuid +'"><label for="cb_'+ uuid +'"></label></span>');
|
|
|
|
+ $(this).prepend('<input type="checkbox" class="completeBox" id="cb_' + uuid +'" rel="'+ uuid +'" />')
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ $('code,div.codeBlock,textarea.codeBlock').each(function(i,e){
|
|
|
|
+ theElement = $(this);
|
|
|
|
+ var lines = theElement.html().split("\n");
|
|
|
|
+ theElement.empty();
|
|
|
|
+ for(l=0;l<lines.length;l++){
|
|
|
|
+ if($.trim(lines[l]) != '' && $.trim(lines[l]).substr(0,1) != '#' && $.trim(lines[l]).indexOf(' #') == -1 && lines[l].substr(0, 4).toUpperCase() != 'REM '){
|
|
|
|
+ theElement.append('<input type="image" src="images/clipboard.png" value="" class="copy-text" rel="copy_'+ i +'_'+ l +'" data-clipboard-text="'+ $.trim(lines[l].replace(/"/g, '"')) +'" /><span id="copy_'+ i +'_'+ l +'">'+ lines[l] +'</span>');
|
|
|
|
+ } else {
|
|
|
|
+ theElement.append(lines[l]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ $(document).on('click','input.copy-text',function(){
|
|
|
|
+ theButton = $(this);
|
|
|
|
+ $('input.copy-text').attr('src','images/clipboard.png');
|
|
|
|
+ $('span.copy-animation,span.copy-animation-ps').removeClass('copy-animation copy-animation-ps');
|
|
|
|
+ try {
|
|
|
|
+ if($('#'+ theButton.attr('rel')).parent('div').hasClass('PS')){
|
|
|
|
+ $('#'+ theButton.attr('rel')).addClass('copy-animation-ps');
|
|
|
|
+ } else if($('#'+ theButton.attr('rel')).parent('div').hasClass('CMD')){
|
|
|
|
+ $('#'+ theButton.attr('rel')).addClass('copy-animation-cmd');
|
|
|
|
+ } else {
|
|
|
|
+ $('#'+ theButton.attr('rel')).addClass('copy-animation');
|
|
|
|
+ }
|
|
|
|
+ navigator.clipboard.writeText(theButton.data('clipboard-text').replace(/<[^>]*>?/gm, ''));
|
|
|
|
+ theButton.attr('src','images/clipboard_active.png');
|
|
|
|
+ } catch(err) {
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ $(document).on('click','input.completeBox',function(){
|
|
|
|
+ theBox = $(this);
|
|
|
|
+ $('#'+ theBox.attr('rel')).addClass('strikethrough');
|
|
|
|
+ theBox.prop('disabled',true);
|
|
|
|
+ theBox.parent('li').prevAll().each(function(i,e){
|
|
|
|
+ theLI = $(this);
|
|
|
|
+ if(theLI.find('input[type=checkbox]').not(':checked')){
|
|
|
|
+ $('#'+ theLI.find('input[type=checkbox]').attr('rel')).addClass('strikethrough');
|
|
|
|
+ theLI.find('input[type=checkbox]').prop('checked',true).prop('disabled',true);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ if(window.self !== window.top){
|
|
|
|
+ window.parent.$('iframe.stepsFrame').height((this['scrollingElement']['scrollHeight']+20) +'px');
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ </script>
|
|
|
|
+ <link href="css/steps.css" rel="stylesheet" type="text/css" />
|
|
|
|
+ </head>
|
|
|
|
+ <body>
|
|
|
|
+ <div id="gridContainer">
|
|
|
|
+ <div class="topMargin"></div>
|
|
|
|
+ <div id="listName" class="topMargin">
|
|
|
|
+ <h1>Running Apache Guacamole in Docker</h1>
|
|
|
|
+ </div>
|
|
|
|
+ <div></div>
|
|
|
|
+ <div id="content">
|
|
|
|
+ <h2>What is Apache Guacamole?</h2>
|
|
|
|
+
|
|
|
|
+<blockquote><em>Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH. We call it clientless because no plugins or client software are required. Thanks to HTML5, once Guacamole is installed on a server, all you need to access your desktops is a web browser.</em> - <a href="https://guacamole.apache.org/" target="_blank">https://guacamole.apache.org/</a></blockquote>
|
|
|
|
+
|
|
|
|
+<h2>Installing Docker</h2>
|
|
|
|
+
|
|
|
|
+<ol>
|
|
|
|
+ <li>Log into the Linux host</li>
|
|
|
|
+ <li>Run the following commands in a terminal window
|
|
|
|
+ <div class="codeBlock"># install prerequisites<br />
|
|
|
|
+ sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y<br />
|
|
|
|
+ # add docker gpg key<br />
|
|
|
|
+ curl -fsSL https://download.docker.com/linux/$(awk -F'=' '/^ID=/{ print $NF }' /etc/os-release)/gpg | sudo apt-key add -<br />
|
|
|
|
+ # add docker software repository<br />
|
|
|
|
+ sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/$(awk -F'=' '/^ID=/{ print $NF }' /etc/os-release) $(lsb_release -cs) stable"<br />
|
|
|
|
+ # install docker<br />
|
|
|
|
+ sudo apt install docker-ce docker-compose containerd.io -y<br />
|
|
|
|
+ # enable and start docker service<br />
|
|
|
|
+ sudo systemctl enable docker && sudo systemctl start docker<br />
|
|
|
|
+ # add the current user to the docker group<br />
|
|
|
|
+ sudo usermod -aG docker $USER<br />
|
|
|
|
+ # reauthenticate for the new group membership to take effect<br />
|
|
|
|
+ su - $USER</div>
|
|
|
|
+ </li>
|
|
|
|
+</ol>
|
|
|
|
+
|
|
|
|
+<h2>Running Apache Guacamole</h2>
|
|
|
|
+
|
|
|
|
+<ol>
|
|
|
|
+ <li>Continue with the following commands in terminal to setup and run Guacamole
|
|
|
|
+ <div class="codeBlock"># create working directories<br />
|
|
|
|
+ mkdir ~/docker/mariadb -p<br />
|
|
|
|
+ # set owner of docker directory<br />
|
|
|
|
+ sudo chown "$USER":"$USER" /home/"$USER"/docker -R<br />
|
|
|
|
+ # download the guacamole container<br />
|
|
|
|
+ docker pull guacamole/guacamole<br />
|
|
|
|
+ # run the mariadb docker container<br />
|
|
|
|
+ docker run -d --name mariadb -e MYSQL_ROOT_PASSWORD=r00tp@ss -v ~/docker/mariadb:/var/lib/mysql --restart=unless-stopped mariadb:latest<br />
|
|
|
|
+ # create database init script<br />
|
|
|
|
+ docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > ~/docker/mariadb/guacamole_db.sql<br />
|
|
|
|
+ # connect to mariadb container shell<br />
|
|
|
|
+ docker exec -ti mariadb /bin/bash<br />
|
|
|
|
+ # connect to mariadb as root user<br />
|
|
|
|
+ mysql -uroot -pr00tp@ss<br />
|
|
|
|
+ # create the database<br />
|
|
|
|
+ create database guacamole;<br />
|
|
|
|
+ # create and configure the database user<br />
|
|
|
|
+ GRANT ALL ON guacamole.* TO 'guacamole_rw'@'%' IDENTIFIED BY 'Guac@m0le!';<br />
|
|
|
|
+ # flush mariadb privileges<br />
|
|
|
|
+ flush privileges;<br />
|
|
|
|
+ # exit mariadb cli<br />
|
|
|
|
+ quit<br />
|
|
|
|
+ # import the guacamole schema<br />
|
|
|
|
+ cat /var/lib/mysql/guacamole_db.sql | mysql -uroot -pr00tp@ss -Dguacamole<br />
|
|
|
|
+ # exit the maridb container shell<br />
|
|
|
|
+ exit<br />
|
|
|
|
+ # run the guacd container<br />
|
|
|
|
+ docker run -d --name guacd guacamole/guacd<br />
|
|
|
|
+ # run the guacamole container<br />
|
|
|
|
+ docker run -d --name guacamole --link guacd --link mariadb -e MYSQL_HOSTNAME=mariadb -e MYSQL_DATABASE=guacamole -e MYSQL_USER=guacamole_rw -e MYSQL_PASSWORD=Guac@m0le! -p 8080:8080 guacamole/guacamole</div>
|
|
|
|
+ </li>
|
|
|
|
+ <li>Open a web browser and navigate to http://DNS-or-IP:8080/guacamole/</li>
|
|
|
|
+ <li>Log in with guacadmin/guacadmin</li>
|
|
|
|
+ <li>Go to Settings > Users</li>
|
|
|
|
+ <li>Create a new user and grant all permissions</li>
|
|
|
|
+ <li>Log out and log in as the new user</li>
|
|
|
|
+ <li>Go to Settings > Users > Delete the guacadmin user</li>
|
|
|
|
+ <li>Go to Settings > Connections > New Connection</li>
|
|
|
|
+ <li>Setup a test connection to a known working host</li>
|
|
|
|
+ <li>Click Save</li>
|
|
|
|
+ <li>Go to Home > Click on the created connection</li>
|
|
|
|
+ <li>Enjoy browser based SSH, VNC, RDP and more</li>
|
|
|
|
+</ol>
|
|
|
|
+
|
|
|
|
+<p>Documentation: <a href="https://guacamole.apache.org/doc/gug/guacamole-docker.html" target="_blank">https://guacamole.apache.org/doc/gug/guacamole-docker.html</a></p>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </body>
|
|
|
|
+ </html>
|
|
|
|
+
|