Archive of

Apache Guacamole + PopOS RDP Setup Tutorial

A quick guide to set up clientless remote desktop access via web browser using Apache Guacamole and PopOS.

Overview

  • Guacamole: Web-based remote desktop gateway (HTML5, no client software needed)
  • Target: PopOS with xrdp server
  • Access: Any device with a web browser
  • Supports: RDP, VNC, SSH, Telnet, Kubernetes connections

1. PopOS RDP Server Setup

Install and Configure xrdp

# Install xrdp (more reliable than GNOME Remote Desktop)
sudo apt update
sudo apt install xrdp

# Start and enable service
sudo systemctl enable xrdp
sudo systemctl start xrdp

# Verify service
sudo systemctl status xrdp
sudo netstat -tlnp | grep 3389

Fix PolicyKit Permission Issues

Create /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla:

[Allow Colord All Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.*
ResultAny=no
ResultInactive=no
ResultActive=yes

[Allow PackageKit All Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.*
ResultAny=no
ResultInactive=no
ResultActive=yes

Optional: Firewall Configuration

# Usually NOT needed if using Docker with LAN IP
# Only open if external access required
sudo ufw allow 3389

2. Guacamole Docker Setup

Updated Docker Compose Configuration

services:
  guacdb:
    container_name: guacamoledb
    image: mariadb:10.11
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'MariaDBRootPass2024'
      MYSQL_DATABASE: 'guacamole_db'
      MYSQL_USER: 'guacamole_user'
      MYSQL_PASSWORD: 'MariaDBUserPass2024'
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - guacamole-network

  guacd:
    container_name: guacd
    image: guacamole/guacd:1.6.0
    restart: unless-stopped
    networks:
      - guacamole-network

  guacamole:
    container_name: guacamole
    image: guacamole/guacamole:1.6.0
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      GUACD_HOSTNAME: "guacd"
      MYSQL_HOSTNAME: "guacdb"
      MYSQL_DATABASE: "guacamole_db"
      MYSQL_USER: "guacamole_user"
      MYSQL_PASSWORD: "MariaDBUserPass2024"
      TOTP_ENABLED: "true"
      WEBAPP_CONTEXT: "ROOT"  # Access via http://localhost:8080
    depends_on:
      - guacdb
      - guacd
    networks:
      - guacamole-network

networks:
  guacamole-network:
    driver: bridge

volumes:
  db-data:

Database Initialization (Correct Method)

# 1. Create directory and setup
mkdir guacamole
cd guacamole

# 2. Generate database initialization file
docker run --rm guacamole/guacamole:1.6.0 /opt/guacamole/bin/initdb.sh --mysql > initdb.sql

# 3. Start services
docker-compose up -d

# 4. Wait for database to be ready
sleep 30

# 5. Import database schema (no docker cp needed!)
docker exec -i guacamoledb mysql -u root -pMariaDBRootPass2024 guacamole_db < initdb.sql

# 6. Verify tables created
docker exec -it guacamoledb mysql -u root -pMariaDBRootPass2024 -e "USE guacamole_db; SHOW TABLES;"

3. Guacamole Configuration

Initial Setup

  1. Access Guacamole: http://localhost:8080 (note: no /guacamole suffix!)
  2. Default login: guacadmin / guacadmin
  3. Important: Change default password immediately

Create RDP Connection

  1. Go to SettingsConnectionsNew Connection

  2. Edit Connection:

    • Name: PopOS Desktop (or any name)
    • Protocol: RDP
  3. Parameters:

    • Hostname: Use actual LAN IP (e.g., 192.168.1.100)
    • Port: 3389
    • Username: Your PopOS username
    • Password: Your PopOS password
  4. Optional Settings:

    • Security mode: any or rdp
    • Ignore server certificate: ✓ (check)
    • Disable authentication: ✓ (if needed)

Guacamole Proxy Parameters

  • Usually leave empty (Hostname, Port, Encryption fields)
  • Only configure if guacd runs on different server

4. Critical Network Configuration Notes

⚠️ Docker Networking Gotchas

  • Use IP addresses, not domain names in connection hostname
  • If using Tailscale/VPN: Use physical network IP, not VPN IP
  • Container DNS resolution may point to unreachable networks
  • Docker can access host ports via LAN IP without firewall rules

Example IP Discovery

# Find your PopOS IP
ip addr show | grep "inet 192"
# Use this IP in Guacamole connection, not localhost or domain names

5. Testing

Verify RDP Service

# On PopOS, test local RDP
telnet localhost 3389

Test Guacamole Connection

  1. Login to Guacamole web interface
  2. Click your connection
  3. Should see PopOS desktop in browser

Troubleshooting

Common Issues

  • "Non-numeric character in element length": Version mismatch or network issue
  • "Connection refused": Check xrdp service and firewall
  • PolicyKit password prompts: Add polkit configuration above
  • Black screen: Try different security mode settings
  • Slow performance: Normal on high-latency networks, excellent on LAN

Debug Commands

# Check xrdp status
sudo systemctl status xrdp

# Check port listening
sudo netstat -tlnp | grep 3389

# Check Guacamole logs
docker logs guacamole
docker logs guacd

# Restart PolicyKit (if needed)
sudo systemctl restart polkitd
# Or simply reboot
sudo reboot

Production Enhancements

Nginx Reverse Proxy (Optional)

Add HTTPS and custom domain access:

server {
    listen 443 ssl;
    server_name your-domain.com;
    
    location / {
        proxy_pass http://localhost:8080;
		proxy_buffering off;
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection $http_connection;
		access_log off;
    }
}

Performance Notes

  • Excellent for: Office work, programming, system administration
  • Good for: General desktop use on LAN
  • Not ideal for: High-framerate gaming, video streaming
  • Best on: Local network with low latency

Supported Protocols

  • RDP: Windows/Linux remote desktop
  • VNC: Cross-platform graphical access
  • SSH: Terminal access with file transfer
  • Telnet: Legacy terminal protocol
  • Kubernetes: Container orchestration access

Security Considerations

  • Change default Guacamole passwords
  • Use HTTPS in production (add reverse proxy)
  • Consider VPN access for external connections
  • Regularly update Docker images
  • PolicyKit configuration limits privilege escalation

Setup tested on PopOS 22.04 with Guacamole 1.6.0 via Docker

Key Sources:

网友语录 - 第41期 - 虽然有车有伞,但总有猝不及防的雨要淋

这里记录我的一周分享,通常在周六发布。


当两极分化不仅带来了在实际问题上的意见分歧,还形成了人们之间的情感鸿沟时,就被称为情感或情绪两极化。

比如,人们会认为凡是共和党人,或者相反,凡是民主党人,就是坏人。

阿洛伊斯·斯图策认为,“当一个人在明知‘自己’政党的政客行为不妥时依然会坚持再次选举他们时”,就比较成问题了。

与瑞士不同的是,美国的情感两极分化已大大加剧。施图策说:”在美国,‘我们反对你’这种情绪很容易出现。这是两党制带来的后果,因为没有一个第三方出来制衡,因此“贬低另一方的政治宣传就成了一种有效的手段。”

根据斯图策的观察,“认同自己的党派并与其他党派的支持者划清界限”这种做法已经日益表现在人们的私人生活中。例如,如今一位异教的女婿已经不再是很大的问题,但如果“党派不同问题就大得多了。”


我喜欢我的东西有使用痕迹,一种独特的不完美的美丽。(饱经风霜有饱经风霜的美?我不知道)


你唯一的机会就是在一个方向不停地挖。当然这样做会比较辛苦,而且挖一辈子也不一定能找到金子,但是不管怎样,你至少留下了一个大坑。(你当然可以挖着挖着拐个弯儿,再拐个弯儿... --今天,16年之后的我说)


王海鹏Seal: 验收标准是一种有效的沟通手段。


碧螺姑娘 虽然有车有伞,但总有猝不及防的雨要淋。人生之事常如是。


除非你知道自己想要些什么,否则永远不会确定会得到什么样的结果。

如果雇用其他人来帮助自己开发,你就需要向他们描述你的构想。这种描述就叫做问题陈述或需求集合,这也正是本书所要探讨的主题。显然,需求是非常重要的,因为如果连你自己都不知道或者说不清自己的需要,那么你获得成功的机会自然会降低不少。

几年前,我们曾做过实验来测定那些计算机程序员是怎样被别人要求他们做的事所影响的。这些实验很简单,但它们却揭示了那潜藏在所有需求工作下的原动力:

如果你阐明了你的需要,你就很可能获得它。

如果你没有说清楚你的需要,你就很可能得不到它。

《探索需求》


viviyo “无所求必满载而归”。凡你想控制的,其实都控制了你。当你什么都不想要的时候,天地万物都是你的


这个世界有两种人:一种人用电脑来工作,另一种人看到电脑,会忘了工作,一心先摆弄电脑,把能改的都改完,直到完全顺手为止。(我至少得先改到自己比较顺手比止,工欲善其事,必得利其器)


米饭 有的学生,适合老师指点。有的学生,适合反转课堂(费曼学习法)。有的学生,你指点他不听,你让他讲给你听更是没门,他在这个领域上的任何时间都是浪费,但是也许在别的领域发挥很好。作为父母,在找到适合孩子的方法和领域之前,都在未知的海洋里,无法宣称自己是正确的


他们(Medium.com)原来有一支高级编辑团队,负责制作高质量的内容。但是现实是,优质内容看的人并不多

"我们平台上点击最多的文章,标题都是点击诱饵,它们的制胜策略是:找一篇维基百科文章,作为知识点,配上一个病毒式传播的标题,再加一些夸张的个人情感故事,然后从我们这里领取流量奖金。最高的一篇赚到了2万美元。"

他们别无选择,取消了高级编辑团队,调整了文章奖励。(不知道是不是这届人类不行还是人类本来就不行:低级趣味总是能够战胜高级趣味。书都没有人读了)


人们不应该互相发送文件副本。副本下载后就无法自动更新,也没有任何保护措施,谁都可以打开,而且永远无法撤销。

(这是胡说八道。有副本才有历史,副本是feature,不是bug


假定 AI 每一步的正确率是95%,那么使用20步后,整个项目的正确率将只有36%。

(所以AI需要和人协作。至少是现阶段。)

Rime install on Linux (Arch)

WiFi Driver Fix for Mid-2010 MacBook Pro on Pop!_OS 22.04

# Remove conflicting B43 driver
sudo apt remove firmware-b43-installer

# Install Broadcom wireless driver
sudo apt install bcmwl-kernel-source

# Reset wireless modules
sudo modprobe -r b43 ssb wl
sudo modprobe wl

Troubleshooting

  • If WiFi doesn't work, reboot your system
  • Ensure you have the latest system updates

Note: This method resolves WiFi issues for my mid-2010 MacBook Pro. By the way, this driver has very good performance! I love this solution!!!

网友语录 - 第40期 - 想法不会改变你,但行为会改变你的想法

这里记录我的一周分享,通常在周六发布。


宁可做错,拒绝无为


不要因为自己“运气”不好而责备他人。命运女神唯一控制不了的东西就是你的行为


不再玩耍的孩子就会停止成长。


"我比你强," 自由说。“因为我比你聪明” “你错了,我比你力气大。” 棍棒回答道。他们争执不休,终于打了起来。棍棒痛打了自由。


米饭 取可得的,而非可能得的,可免患得患失


米饭 不要想着向别人证明自己。我想做只是因为我想做。就可以活的更自在。


星期五离星期一是那么近,而星期一离星期五是那么远。(星期五喜欢星期一,遗憾的是星期一不喜欢星期五)


Marskay 这些年我一直记得一个叔叔跟我说过的比喻,他说我们日常总以为自己生活在“文明”里,这“文明”就是马桶里的那层水,我们是水面上自以为安享太平的浮游生物,但其实马桶只要一抽水,你就会被瞬间吸进漩涡,底下是万丈黑洞。在热搜上看到的一些新闻,就是那个漩涡启动的瞬间


那天早上穿过草坪时,道格拉斯.斯波尔丁用脸撞破了一张蜘蛛网。空中一条看不见的丝线碰触他的额头,悄无声息地断了。

由于这件最微妙的事情,他知道这一天定然有所不同。父亲开车带道格拉斯和十岁的弟弟汤姆出城去乡下,路上他向孩子们解释了这一天不同于往日的另一个原因。有些日子完全是由臭味混合成的,整个世界都得捏着鼻子小心呼吸。而另一些日子,他继续说道,你能听见宇宙吹响号角,发出颤音。有些日子尝起来不错,有些摸起来很好。而还有一些日子能让你的所有感官都舒畅。比如今天,他点点头,闻起来就像山岭那一侧有座无名的巨大果园一夜之间长成了,使眼前的所有土地都充满了温热的新鲜气息。空气的触感像是雨,但天上并没有云。偶尔,林中会传出陌生人的笑声,然后重归寂静••••

《蒲公英酒》


小青 “我之前没想过这个角度,挺有启发性的。”
“我理解你的感受,但我看法不太一样。”
“谢谢你的分享,我需要点时间消化消化。”
“你这么一说,我对这个问题好像有了新的认识。”
“你刚才那句我不太明白,能再解释下吗?”
“你的观点有什么依据吗?我很想了解。”
“你说XX,具体是指哪方面呢?能展开说说吗?”
“你觉得我们最大的分歧在哪儿?”
“除了你提到的,还有哪些因素会影响这个问题?”
“咱们有没有什么共识,能作为进一步讨论的基础?”
“你觉得这次对话,最终想达成什么?”
“这话有点冲,但我知道你没恶意,咱们换个说法?”
“当我听到XX时,我感觉有点困惑/不舒服,因为……”
“我感觉咱们陷入僵局了,要不这话题先放放?”
“今天的讨论就到这里吧,感谢你的参与。”
“我们可能需要一个中场休息,或者换个轻松的话题。”
“这次交流好像已经达到我的预期/偏离了目标,就到这儿吧。”

没有生僻字,没有艰深的典故和语法,是普普通通的中文,但我不得不说这不是我的“母语”,因为我从来没有这么密集地听过这么性感的汉语啊哈哈哈哈哈。天呐,如果我们现在开始学,五年之后流利掌握,我们会变成多么迷人的老姐姐?!


为什么三次元衣服会占空间 用自己不喜欢的方式吸引来的人也会是自己不喜欢的


李龙龙 巴菲特分享过汤姆·墨菲的两句话,一句是“如果你想发火,那就等到明天”,另一句是“表扬要公开,批评要私下”。


由美国社会学家安妮特·拉鲁撰写的《不平等的童年》里提到,她观察到不缺吃穿的中产家庭,父母越肯下力气培养子女,子女之间的亲情纽带越弱。


Dora’s diary

想法不会改变你,但行为会改变你的想法

原本我们以为思想有多远 就能走多远。

现在我觉得是走了多远,思想就有多远。

当我们行为禁锢在一口井里,我们的思维也在井口观看。

打开行为,打开思想。

Let the action lead your thoughts!


瑞士资讯 一项汇总220万人数据的最新研究发现,坚持“可持续性饮食”可使癌症死亡率显著下降。以植物性食物为主的膳食不仅有助健康,也减轻环境负担,但当前人们摄入比例仍偏低。