Top Related Projects
FreeRDP is a free remote desktop protocol library and clients
VNC client web application
xrdp: an open source RDP server
High performance, multi-platform VNC client and server
LibVNCServer/LibVNCClient are cross-platform C libraries that allow you to easily implement VNC server or client functionality in your program.
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Quick Overview
Apache Guacamole Server is the server-side component of Apache Guacamole, a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH, allowing users to access their desktops and applications through a web browser without requiring any plugins or client software.
Pros
- Cross-platform compatibility, accessible from any device with a web browser
- Supports multiple remote desktop protocols (VNC, RDP, SSH)
- Highly scalable and suitable for enterprise environments
- Extensible architecture allowing for custom authentication and connection methods
Cons
- Requires server-side setup and maintenance
- Performance may be slightly lower compared to native clients
- Limited support for advanced features of some protocols
- Learning curve for configuration and customization
Getting Started
To set up Guacamole Server:
-
Install dependencies:
sudo apt-get install libcairo2-dev libjpeg-turbo8-dev libpng-dev libtool-bin libossp-uuid-dev
-
Clone the repository:
git clone https://github.com/apache/guacamole-server.git cd guacamole-server
-
Build and install:
autoreconf -fi ./configure --with-init-dir=/etc/init.d make sudo make install sudo ldconfig
-
Start the Guacamole server:
sudo /etc/init.d/guacd start
Note: This is a basic setup. For production use, additional configuration and security measures are recommended.
Competitor Comparisons
FreeRDP is a free remote desktop protocol library and clients
Pros of FreeRDP
- Native RDP client implementation with broader protocol support
- Cross-platform compatibility (Windows, macOS, Linux, iOS, Android)
- More active development and frequent updates
Cons of FreeRDP
- Requires client-side installation and configuration
- Limited web-based access options
- Steeper learning curve for end-users
Code Comparison
FreeRDP (client-side connection):
freerdp_connect(instance);
Guacamole Server (server-side connection handling):
guac_client_plugin_handle_connection(client, socket);
Summary
FreeRDP is a comprehensive RDP client implementation offering native support across multiple platforms, while Guacamole Server focuses on providing remote desktop access through web browsers. FreeRDP excels in protocol support and performance but requires client-side installation. Guacamole Server offers easier deployment and management through its web-based approach but may have limitations in advanced RDP features. The choice between the two depends on specific use cases, deployment requirements, and user preferences.
VNC client web application
Pros of noVNC
- Pure HTML5/JavaScript implementation, requiring no plugins or additional software on the client-side
- Lightweight and easily embeddable in web applications
- Supports a wide range of browsers and devices
Cons of noVNC
- Limited protocol support (primarily VNC)
- May have higher latency compared to native clients
- Lacks some advanced features found in Guacamole, such as file transfer and printing
Code Comparison
noVNC (JavaScript):
var rfb = new RFB(document.getElementById('noVNC_canvas'), 'ws://example.com:port');
rfb.scaleViewport = true;
rfb.resizeSession = true;
Guacamole Server (C):
guac_client* client = guac_client_alloc();
guac_client_load_plugin(client, "libguac-client-vnc.so");
guac_client_init(client, GUAC_VNC_DEFAULT_ARGS);
Both projects aim to provide remote access solutions, but noVNC focuses on VNC protocol support in a browser-based environment, while Guacamole Server offers a more comprehensive remote desktop gateway with support for multiple protocols and advanced features.
xrdp: an open source RDP server
Pros of xrdp
- Native RDP protocol support, allowing direct connections from Windows Remote Desktop clients
- Generally lower latency and better performance for LAN connections
- Easier integration with existing Windows-based remote desktop infrastructure
Cons of xrdp
- Limited cross-platform support compared to Guacamole's browser-based approach
- Less flexibility in terms of supported protocols (primarily focused on RDP)
- May require more complex firewall configurations for remote access
Code Comparison
xrdp (C):
static int
xrdp_mm_process_login_response(struct xrdp_mm *self, struct stream *s)
{
int ok;
int display;
char text[256];
in_uint32_be(s, ok);
in_uint32_be(s, display);
in_uint8s(s, 4); /* pad */
Guacamole (C):
int guac_client_handle_instruction(guac_client* client, guac_instruction* instruction) {
/* Call handler, if defined */
if (client->handle_instruction != NULL)
return client->handle_instruction(client, instruction);
/* Otherwise, ignore */
return 0;
}
Both projects use C for their core implementations, but xrdp focuses on RDP-specific functionality, while Guacamole provides a more abstract approach to handle various remote desktop protocols.
High performance, multi-platform VNC client and server
Pros of TigerVNC
- Native VNC implementation with better performance for direct connections
- Supports a wider range of platforms, including Windows and macOS
- More lightweight and easier to set up for simple remote desktop scenarios
Cons of TigerVNC
- Lacks built-in web-based access without additional software
- Does not provide the same level of security features and encryption as Guacamole
- Limited support for protocols other than VNC
Code Comparison
TigerVNC (C++):
rfb::VNCServerST::VNCServerST(const char* name, rfb::SDesktop* desktop)
: desktop(desktop), name(name), clients(&updateScheduler),
pointerClient(0), comparer(0), encoder(0), encodeManager(0),
network(0), auth(0), lastConnectionTime(0), disableclients(false)
{
srand(time(0));
}
Guacamole Server (C):
guac_client* guac_client_alloc() {
guac_client* client = calloc(1, sizeof(guac_client));
if (client == NULL)
return NULL;
client->state = GUAC_CLIENT_RUNNING;
return client;
}
The code snippets show different approaches: TigerVNC focuses on VNC-specific implementation, while Guacamole Server provides a more abstract client allocation, supporting multiple protocols.
LibVNCServer/LibVNCClient are cross-platform C libraries that allow you to easily implement VNC server or client functionality in your program.
Pros of libvncserver
- Lightweight and focused solely on VNC protocol implementation
- Longer development history and wider adoption in various projects
- More flexible for integration into custom applications
Cons of libvncserver
- Limited to VNC protocol support only
- Lacks built-in web-based client interface
- Requires additional components for a complete remote access solution
Code Comparison
libvncserver:
rfbScreenInfoPtr screen = rfbGetScreen(&argc, argv, width, height, 8, 3, bpp);
screen->frameBuffer = (char*)malloc(width * height * bpp);
rfbInitServer(screen);
rfbRunEventLoop(screen, -1, FALSE);
guacamole-server:
guac_client* client = guac_client_alloc();
guac_client_init(client, GUAC_VNC_CLIENT_ID, argc, argv);
guac_client_plugin_handle* plugin = guac_client_plugin_open(GUAC_VNC_LIBRARY);
guac_client_plugin_init_client(plugin, client, argc, argv);
Summary
While libvncserver focuses on providing a lightweight VNC implementation, guacamole-server offers a more comprehensive remote access solution with support for multiple protocols and a web-based interface. libvncserver is better suited for projects requiring direct VNC integration, while guacamole-server is ideal for building full-featured remote access applications with broader protocol support.
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Pros of RustDesk
- Written in Rust, offering better performance and memory safety
- Standalone application, easier to set up and use without additional server components
- Cross-platform support for Windows, macOS, Linux, iOS, and Android
Cons of RustDesk
- Newer project with potentially less mature codebase and fewer features
- Limited enterprise-level features compared to Guacamole's extensive protocol support
- Smaller community and ecosystem around the project
Code Comparison
RustDesk (Rust):
let mut stream = TcpStream::connect(addr).await?;
stream.set_nodelay(true)?;
let mut msg_out = Message::new();
msg_out.set_login_request(lr);
send_message(&mut stream, msg_out).await?;
Guacamole Server (C):
guac_client* client = guac_client_alloc();
client->socket = socket;
client->state = GUAC_CLIENT_RUNNING;
guac_client_plugin_init(client, argc, argv);
guac_client_start(client);
Both projects aim to provide remote desktop functionality, but RustDesk focuses on being a standalone application with modern language benefits, while Guacamole Server offers a more comprehensive, server-based solution with broader protocol support. RustDesk may be easier for individual users, while Guacamole Server caters to enterprise environments with its extensibility and integration capabilities.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
About this README
This README is intended to provide quick and to-the-point documentation for technical users intending to compile parts of Apache Guacamole themselves.
Source archives are available from the downloads section of the project website:
http://guacamole.apache.org/
A full manual is available as well:
http://guacamole.apache.org/doc/gug/
What is guacamole-server?
The guacamole-server package is a set of software which forms the basis of the Guacamole stack. It consists of guacd, libguac, and several protocol support libraries.
guacd is the Guacamole proxy daemon used by the Guacamole web application and framework. As JavaScript cannot handle binary protocols (like VNC and remote desktop) efficiently, a new text-based protocol was developed which would contain a common superset of the operations needed for efficient remote desktop access, but would be easy for JavaScript programs to process. guacd is the proxy which translates between arbitrary protocols and the Guacamole protocol.
Required dependencies
All software within guacamole-server is built using the popular GNU Automake, and thus provides the standard configure script. Before compiling, at least the following required dependencies must already be installed:
1) Cairo (http://cairographics.org/)
2) libjpeg-turbo (http://libjpeg-turbo.virtualgl.org/)
OR libjpeg (http://www.ijg.org/)
3) libpng (http://www.libpng.org/pub/png/libpng.html)
4) OSSP UUID (http://www.ossp.org/pkg/lib/uuid/)
Optional dependencies
In addition, the following optional dependencies may be installed in order to enable optional features of Guacamole. Note that while the various supported protocols are technically optional, you will no doubt wish to install the dependencies of at least ONE supported protocol, as Guacamole would be useless otherwise.
RDP:
* FreeRDP (http://www.freerdp.com/)
SSH:
* libssh2 (http://www.libssh2.org/)
* OpenSSL (https://www.openssl.org/)
* Pango (http://www.pango.org/)
Telnet:
* libtelnet (https://github.com/seanmiddleditch/libtelnet)
* Pango (http://www.pango.org/)
VNC:
* libVNCserver (http://libvnc.github.io/)
Support for audio within VNC:
* PulseAudio (http://www.freedesktop.org/wiki/Software/PulseAudio/)
Support for SFTP file transfer for VNC or RDP:
* libssh2 (http://www.libssh2.org/)
* OpenSSL (https://www.openssl.org/)
Support for WebP image compression:
* libwebp (https://developers.google.com/speed/webp/)
"guacenc" video encoding utility:
* FFmpeg (https://ffmpeg.org/)
Compiling and installing guacd, libguac, etc.
All software within guacamole-server is built using the popular GNU Automake, and thus provides the standard configure script.
-
Run configure
$ ./configure
Assuming all dependencies have been installed, this should succeed without errors. If you wish to install the init script as well, you need to specify the location where your system init scripts are located (typically /etc/init.d):
$ ./configure --with-init-dir=/etc/init.d
Running configure in this manner will cause the "make install" step to install an init script to the specified directory, which you can then activate using the service management mechanism provided by your distribution).
-
Run make
$ make
guacd, libguac, and any available protocol support libraries will now compile.
-
Install (as root)
make install
All software that was just built, including documentation, will be installed.
guacd will install to your /usr/local/sbin directory by default. You can change the install location by using the --prefix option for configure.
Running guacd
If you installed the init script during compile and install, you should be able to start guacd through the service management utilities provided by your distribution (if any) or by running the init script directly (as root):
# /etc/init.d/guacd start
Root access is needed to write the pidfile /var/run/guacd.pid. You can also run guacd itself directly without the init script (as any user):
$ guacd
guacd currently takes several command-line options:
-b HOST
Changes the host or address that guacd listens on.
-l PORT
Changes the port that guacd listens on (the default is port 4822).
-p PIDFILE
Causes guacd to write the PID of the daemon process to the specified
file. This is useful for init scripts and is used by the provided init
script.
-L LEVEL
Sets the maximum level at which guacd will log messages to syslog and,
if running in the foreground, the console. Legal values are debug,
info, warning, and error. The default value is info.
-f
Causes guacd to run in the foreground, rather than automatically
forking into the background.
Additional information can be found in the guacd man page:
$ man guacd
Reporting problems
Please report any bugs encountered by opening a new issue in the JIRA system hosted at:
https://issues.apache.org/jira/browse/GUACAMOLE
Top Related Projects
FreeRDP is a free remote desktop protocol library and clients
VNC client web application
xrdp: an open source RDP server
High performance, multi-platform VNC client and server
LibVNCServer/LibVNCClient are cross-platform C libraries that allow you to easily implement VNC server or client functionality in your program.
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot