Redash 本身不是一个单容器应用,它至少需要:
- Redash Server
- Redash Scheduler
- Redash Worker
- PostgreSQL:存 Redash 自己的配置、用户、查询等元数据
- Redis:任务队列
- Nginx:可选,但官方 Compose 带了
官方当前 Compose 也特意把 PostgreSQL 固定到了 17,避免 PostgreSQL 18 的数据目录变化带来兼容问题。
一、先确认 Docker Desktop
如果你之前已经在 Windows 上用过 Docker,先在 PowerShell 执行:
powershell
docker --version
docker compose version
正常应该类似:
text
Docker version 28.x.x
Docker Compose version v2.x.x
再测试:
powershell
docker run --rm hello-world
如果 hello-world 可以正常运行,就可以直接部署,如果不行,先装docker desktop。
二、创建 Redash 目录
建议不要乱放,直接:
powershell
mkdir D:\redash
cd D:\redash
目录结构会是:
text
D:\redash
│
├── compose.yaml
├── .env
│
└── postgres-data
创建 PostgreSQL 数据目录:
powershell
mkdir postgres-data
三、生成 Redash 密钥
Redash 官方要求你自己设置:
text
REDASH_SECRET_KEY
REDASH_COOKIE_SECRET
(Redash)
Windows PowerShell 可以直接生成随机值:
powershell
$secret = -join ((48..57)+(65..90)+(97..122) | Get-Random -Count 64 | ForEach-Object {[char]$_})
$cookie = -join ((48..57)+(65..90)+(97..122) | Get-Random -Count 64 | ForEach-Object {[char]$_})
$secret
$cookie
你会得到两串类似:
text
Xsdf83jsdfk...
W9dkd83ksld...
先记下来。
powershell
PS C:\Users\20201> docker --version
Docker version 29.6.1, build 8900f1d
PS C:\Users\20201> docker compose version
Docker Compose version v5.2.0
PS C:\Users\20201> d:
PS D:\> mkdir redash
目录: D:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2026/8/27 11:42 redash
PS D:\> cd redash
PS D:\redash> mkdir postgres-data
目录: D:\redash
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2026/8/27 11:42 postgres-data
PS D:\redash> $secret = -join ((48..57)+(65..90)+(97..122) | Get-Random -Count 64 | ForEach-Object {[char]$_})
PS D:\redash> $cookie = -join ((48..57)+(65..90)+(97..122) | Get-Random -Count 64 | ForEach-Object {[char]$_})
PS D:\redash> $secret
AT80gp9BLIdlqwerxckRUwVoEmszqKftj6eJSWnaGObiNPCQuH5D213yrh4FvM
PS D:\redash> $cookie
qYLGTRh5aXOlab32wJ8IfgV1dU9DbE06NQvxPetSKmCBrsMpyik4zjAFZnHW7u
四、创建 .env
在:
text
D:\redash\.env
写入:
env
PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
REDASH_SECRET_KEY=这里换成你刚生成的第一串密钥
REDASH_COOKIE_SECRET=这里换成你刚生成的第二串密钥
POSTGRES_PASSWORD=qwerty #设置postgresql密码
REDASH_DATABASE_URL=postgresql://postgres:qwerty@postgres/postgres
REDASH_ENFORCE_CSRF=true
REDASH_GUNICORN_TIMEOUT=60
例如:
env
REDASH_SECRET_KEY=APj3K8asjDD82ksla...
REDASH_COOKIE_SECRET=kdj92JSkd8DKs...
这里的 PostgreSQL 密码你也可以自己修改。
五、创建 compose.yaml
在:
text
D:\redash\compose.yaml
写下面这份。
这是按照 Redash 当前官方 Compose 结构改成适合 Windows Docker Desktop 使用的版本。官方目前也是 Server + Scheduler + 三类 Worker + Redis + PostgreSQL + Nginx 这样的结构。
yaml
name: redash
x-redash-service: &redash-service
image: redash/redash:26.3.0
env_file:
- .env
depends_on:
- postgres
- redis
restart: unless-stopped
services:
server:
<<: *redash-service
command: server
ports:
- "5000:5000"
environment:
REDASH_WEB_WORKERS: 4
scheduler:
<<: *redash-service
command: scheduler
depends_on:
- server
scheduled_worker:
<<: *redash-service
command: worker
depends_on:
- server
environment:
QUEUES: "scheduled_queries,schemas"
WORKERS_COUNT: 1
adhoc_worker:
<<: *redash-service
command: worker
depends_on:
- server
environment:
QUEUES: "queries"
WORKERS_COUNT: 2
worker:
<<: *redash-service
command: worker
environment:
QUEUES: "periodic,emails,default"
WORKERS_COUNT: 1
redis:
image: redis:7-alpine
restart: unless-stopped
postgres:
image: pgautoupgrade/pgautoupgrade:17-alpine
env_file:
- .env
volumes:
- ./postgres-data:/var/lib/postgresql/data
restart: unless-stopped
nginx:
image: redash/nginx:latest
ports:
- "8080:80"
depends_on:
- server
links:
- server:redash
restart: unless-stopped
这里做了一个和官方略有区别的处理:
yaml
ports:
- "8080:80"
也就是说我们最终访问:
text
http://localhost:8080
而不是抢占 Windows 的 80 端口。
这能避免 IIS、Nginx、Apache 或其他开发工具占用 80。
六、检查 Compose
进入目录:
powershell
cd D:\redash
执行:
powershell
docker compose config
如果没有报错,说明 YAML 和 .env 基本没问题。
七、拉取镜像
执行:
powershell
docker compose pull
这一步会下载:
text
redash/redash:26.3.0
redis:7-alpine
pgautoupgrade/pgautoupgrade:17-alpine
redash/nginx:latest
Redash 镜像本身比较大,当前 26.3.0 的 amd64 镜像压缩后大约 1 GB。(Docker Hub)
八、先启动 PostgreSQL 和 Redis
不要一上来全部启动。
先:
powershell
docker compose up -d postgres redis
查看:
powershell
docker compose ps
应该看到:
text
redash-postgres-1
redash-redis-1
状态:
text
Up
九、初始化 Redash 数据库
这是第一次部署最关键的一步。
执行:
powershell
docker compose run --rm server create_db
官方安装脚本第一次部署时做的就是这个操作。(GitHub)
成功时一般会看到数据库表创建、migration 等日志。
最后不应该有 traceback。
十、启动 Redash
现在执行:
powershell
docker compose up -d
然后:
powershell
docker compose ps
理想状态大概是:
text
NAME STATUS
redash-server-1 Up
redash-scheduler-1 Up
redash-scheduled_worker-1 Up
redash-adhoc_worker-1 Up
redash-worker-1 Up
redash-postgres-1 Up
redash-redis-1 Up
redash-nginx-1 Up
十一、访问 Redash
浏览器打开:
text
http://localhost:8080
第一次启动可能会稍微慢一点,官方也特别说明第一次 Web 页面加载时 Python 后台代码需要初始化,后续启动会快很多。(GitHub)
正常的话,你会看到:
Create your Redash Admin Account
然后设置:
text
Name
Email
Password
Organization Name
创建管理员。
到这里 Redash 就部署成功了。
十二、如果打不开,先看这三个日志
Redash Server
powershell
docker compose logs server
持续查看:
powershell
docker compose logs -f server
PostgreSQL
powershell
docker compose logs postgres
Nginx
powershell
docker compose logs nginx
也可以一次:
powershell
docker compose logs --tail=100
十三、你还可以直接绕过 Nginx 测试(可以跳,如果你并不在意,建议跳)
我们的 Server 本身暴露了:
yaml
5000:5000
所以还可以直接打开:
text
http://localhost:5000
如果:
text
localhost:5000
能开,而:
text
localhost:8080
不能开,
那么 Redash 本身没问题,只是 Nginx 有问题。
这是以后排查非常好用的方法。
十四、你的架构其实是这样的
text
浏览器
│
▼
localhost:8080
│
▼
Nginx
│
▼
Redash Server
localhost:5000
│ │
┌────────┘ └─────────┐
▼ ▼
PostgreSQL Redis
Redash 元数据库 任务队列
│
┌───────────────┼───────────────┐
▼ ▼ ▼
Worker Adhoc Worker Scheduler
│
▼
Scheduled Worker
所以要注意一个概念:
这个 PostgreSQL 并不是你将来拿来分析业务数据的 PostgreSQL。
它主要是:
text
Redash 自己的数据库
里面存:
text
用户
Dashboard
Query
Data Source 配置
Visualization
Alert
查询历史
以后你要分析 MySQL / PostgreSQL / SQL Server / ClickHouse 等数据库,是进去:
text
Settings
→ Data Sources
→ New Data Source
再连接你的业务数据库。
十五、一个非常常见的 Docker 坑
例如你的业务 MySQL / PostgreSQL 也是 Docker 容器。
很多人会在 Redash 里填:
text
localhost
这是错的。
因为:
text
Redash container 的 localhost
表示:
text
Redash container 自己
不是你的 Windows。
如果数据库运行在 Windows 主机,例如:
text
Windows PostgreSQL
localhost:5432
Redash 里面应该写:
text
host.docker.internal
比如:
text
Host:
host.docker.internal
Port:
5432
这个对 Windows Docker Desktop 非常重要。
十六、打开测试
最开始会让你设置用户名和密码,名字自己起就行

你可以点击settings,创建新的数据源



十七、 关于连接的一点疑惑
Redash 跑在 Docker 容器里,所以它不能用 127.0.0.1 去访问你 Windows 本机的数据库。
对 Redash 容器来说:
text
127.0.0.1
localhost
都代表 Redash 容器自己。
你要让 Redash 访问 Windows 本机上的数据库,通常应该把 Host 填成:
text
host.docker.internal
这个地址在 Docker Desktop for Windows 里就是"宿主机"。
比如你本机安装了 PostgreSQL:
text
Host: host.docker.internal
Port: 5432
User: postgres
Password: 你的密码
Database: 你的数据库名
如果是 MySQL:
text
Host: host.docker.internal
Port: 3306
User: root
Password: 你的密码
Database: your_db
如果是 SQL Server:
text
Host: host.docker.internal
Port: 1433
User: sa
Password: 你的密码
Database: your_db
但这里还有一个关键点:你的本机数据库必须允许"非 localhost"连接。
比如 PostgreSQL 如果只监听:
text
127.0.0.1
那 Redash 容器依然连不上。
PostgreSQL 里通常要检查 postgresql.conf:
conf
listen_addresses = '*'
然后 pg_hba.conf 里允许 Docker 网段访问,例如测试环境可以先写:
conf
host all all 172.16.0.0/12 scram-sha-256
或者更宽泛一点用于本机测试:
conf
host all all 0.0.0.0/0 scram-sha-256
不过第二种范围太大,不建议长期使用。
MySQL 也是类似,需要确保:
text
bind-address
不是只绑定:
text
127.0.0.1
通常可以改成:
text
0.0.0.0
同时用户权限也要允许非 localhost 登录。
你可以先用一个很简单的判断方式。
如果你的数据库在 Windows 本机:
text
Redash Host = host.docker.internal
如果数据库在另一个 Docker 容器:
text
Redash Host = 那个容器名/Compose 服务名
如果数据库在远程服务器:
text
Redash Host = 对方服务器 IP 或域名
例如:
text
192.168.1.100
db.company.local
你现在这个场景其实可以记成:
text
Redash 容器
|
| 访问 Windows
v
host.docker.internal
|
+--> PostgreSQL :5432
+--> MySQL :3306
+--> SQL Server :1433
**所以,想连接本机其它数据库就需要注意,如果用的是docker中运行的数据库容器就需要如下操作 **
现在是:
text
Redash 容器
+
PostgreSQL 容器
最推荐的方式不是 host.docker.internal,而是让这两个容器加入同一个 Docker 网络 ,然后 Redash 直接用 PostgreSQL 的容器名 或 Compose service 名访问。
假设你的 PostgreSQL 容器叫:
text
pg-web
先看它现在在哪个网络:
powershell
docker inspect pg-web
或者简洁一点:
powershell
docker inspect pg-web --format "{{json .NetworkSettings.Networks}}"
你的 Redash 现在在这个网络:
text
redash_default
因为之前 docker compose up 时自动创建了它。
所以最简单的做法就是把 pg-web 加进 Redash 的网络:
powershell
docker network connect redash_default pg-web
然后检查:
powershell
docker inspect pg-web --format "{{json .NetworkSettings.Networks}}"
正常应该能同时看到它原来的网络,以及:
text
redash_default
powershell
PS C:\Users\20201> docker inspect my_db --format "{{json .NetworkSettings.Networks}}"
{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"DriverOpts":null,"GwPriority":0,"NetworkID":"78b9bb0bcf0ef352a60ec1c9b999c03ae78247431fd7c5e07855b373406e521f","EndpointID":"e5ffbbf55cfdfbc78359ceb5abc9a44222cb1e4aafe329192d2fd1757852a5a4","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","MacAddress":"56:22:81:5f:d9:5a","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"DNSNames":null},"redash_default":{"IPAMConfig":{},"Links":null,"Aliases":[],"DriverOpts":{},"GwPriority":0,"NetworkID":"44ed159fb3e354205df5f4a1b0957a030be98dd03da7b42453d082dc9412ba5c","EndpointID":"82b3907ef94908143039cb111680fbef5228f9b69669d8bb1c993f97001c83a3","Gateway":"172.18.0.1","IPAddress":"172.18.0.10","MacAddress":"82:f8:54:35:64:1c","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"DNSNames":["my_db","9ab70de6e6d2"]}}
接下来在 Redash 的 PostgreSQL Data Source 页面里填:
text
Name:
demo2
Host:
my_db
Port:
5432
User:
postgres
Password:
123456
Database Name:
my_db
这里最关键的是:
text
Host = pg-web
不是:
text
127.0.0.1
也不是:
text
localhost
因为 Docker 同一网络中的容器可以通过容器名互相解析。
整体就是:
text
redash-server-1
|
| Docker network: redash_default
|
v
pg-web
|
v
PostgreSQL :5432
你甚至不一定需要给 PostgreSQL 暴露:
text
-p 5432:5432
如果它只是给 Redash 和其他 Docker 容器访问的话,同网络内部直接走:
text
pg-web:5432
就够了。
不过你如果还想让 Beekeeper Studio、DBeaver 之类 Windows 本机软件访问,就保留:
powershell
-p 5432:5432
这样两种访问方式同时存在:
text
Redash 容器
→ pg-web:5432
Windows 软件
→ localhost:5432
你现在可以直接执行这两条:
powershell
docker network connect redash_default pg-web
docker inspect pg-web --format "{{json .NetworkSettings.Networks}}"
然后 Redash 里把 Host 改成:
text
pg-web
再点 Test Connection。
如果还是失败,看两个输出:
powershell
docker ps
docker inspect pg-web --format "{{json .NetworkSettings.Networks}}"
就可以直接判断网络和容器名有没有接对。
shell
PS C:\Users\20201> docker inspect my_db --format "{{json .NetworkSettings.Networks}}"
{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"DriverOpts":null,"GwPriority":0,"NetworkID":"78b9bb0bcf0ef352a60ec1c9b999c03ae78247431fd7c5e07855b373406e521f","EndpointID":"e5ffbbf55cfdfbc78359ceb5abc9a44222cb1e4aafe329192d2fd1757852a5a4","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","MacAddress":"56:22:81:5f:d9:5a","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"DNSNames":null}}
很好,这个输出说明你的 PostgreSQL 容器 my_db 现在只在 Docker 默认的:
text
bridge
网络里。
而你的 Redash 容器在:
text
redash_default
所以它们现在不在同一个 Docker 网络 ,Redash 不能直接用 my_db:5432 访问它。
你现在只需要执行:
powershell
docker network connect redash_default my_db
然后再检查一次:
powershell
docker inspect my_db --format "{{json .NetworkSettings.Networks}}"
正常应该能同时看到:
text
bridge
redash_default
类似这样:
json
{
"bridge": {
...
},
"redash_default": {
...
}
}
然后回 Redash 的 Data Source 配置页,把 PostgreSQL 参数填成:
text
Host: my_db
Port: 5432
User: postgres
Password: 你的 PostgreSQL 密码
Database Name: 你的数据库名
注意:
text
Host = my_db
这里的 my_db 是你的容器名。
你可以先确认容器真正叫什么:
powershell
docker ps
看 NAMES 那一列。
另外还有一个容易混淆的点:你的容器名叫 my_db,但数据库名不一定也叫 my_db。
可以执行:
powershell
docker exec -it my_db psql -U postgres -l
它会列出数据库,例如:
text
Name
--------
postgres
my_db
test_db
Redash 的:
text
Database Name
要填这里真正存在的数据库名。
如果你想进一步确认 PostgreSQL 用户,也可以:
powershell
docker exec -it my_db psql -U postgres
进去以后执行:
sql
\du
查看用户。
你现在的网络关系改完后就是:
text
redash-server-1
|
| redash_default
|
+-------------------+
|
v
my_db
PostgreSQL:5432
这时 Redash 就可以直接通过 Docker 内部 DNS 找到 my_db。



可以尝试一些查询操作了

这里选我自己的数据库,下面就直接出数据表了

为了展示制图功能,选择内置的demo1测试
query栏输入
sql
SELECT
1 AS id,
'Apple' AS product,
12.5 AS price,
20 AS quantity
UNION ALL
SELECT
2,
'Banana',
6.8,
35
UNION ALL
SELECT
3,
'Orange',
9.9,
18;

可以看到上方测试数据已经生成,下面点击table右侧的add visualization按钮

然后就会进入到此页面,可以设置可视化类型,名称,以及通用设置



点击dashboard,创建新看板



因为要看图所以选择刚才NewQuery发布的图



十八、退出
powershell
PS D:\redash> docker compose down
[+] down 9/9
✔ Container redash-scheduler-1 Removed 3.0s
✔ Container redash-adhoc_worker-1 Removed 5.8s
✔ Container redash-scheduled_worker-1 Removed 7.2s
✔ Container redash-nginx-1 Removed 0.4s
✔ Container redash-worker-1 Removed 8.0s
✔ Container redash-server-1 Removed 3.8s
✔ Container redash-redis-1 Removed 0.3s
✔ Container redash-postgres-1 Removed 0.4s
! Network redash_default Resource is still in use 0.0s
PS D:\redash>