样例可见 轴伊Joi的提问箱
创建一个配置文件 config.json,最简单的配置示例(使用 SQLite):
{
"db_type": "sqlite",
"sqlite": "/work/db/jask.db",
"server": {
"host": "0.0.0.0",
"port": 8080
},
"storage_type": "local"
}docker run -d --restart always \
--name joiask \
-p 80:80 \
-v $(pwd)/config.json:/work/config/config.json \
-v $(pwd)/data:/work/db \
-v $(pwd)/uploads:/work/frontend/public/upload-img \
ghcr.io/xinrea/joiask:latest容器只暴露一个端口(80),内部 Nginx 自动处理路由:
- 前端提问箱:
http://localhost/ - 管理后台:
http://localhost/admin - 后端 API:
http://localhost/api/
默认管理员账号: admin / admin
docker build -t joiask .构建完成后运行:
docker run -d --restart always \
--name joiask \
-p 80:80 \
-v $(pwd)/config.json:/work/config/config.json \
-v $(pwd)/data:/work/db \
-v $(pwd)/uploads:/work/frontend/public/upload-img \
joiaskSQLite 是单文件数据库,无需额外安装数据库服务。
{
"db_type": "sqlite",
"sqlite": "/work/db/jask.db",
"server": {
"host": "0.0.0.0",
"port": 8080
},
"storage_type": "local"
}挂载数据目录:
-v $(pwd)/data:/work/db{
"db_type": "mysql",
"mysql": {
"host": "192.168.1.100",
"port": 3306,
"user": "root",
"pass": "your_password",
"name": "jask"
},
"server": {
"host": "0.0.0.0",
"port": 8080
},
"storage_type": "local"
}图片存储在容器的 /work/frontend/public/upload-img/ 目录。
{
"storage_type": "local"
}挂载存储目录:
-v $(pwd)/uploads:/work/frontend/public/upload-img使用阿里云 OSS 存储图片,适合大规模部署。
{
"storage_type": "oss",
"oss": {
"address": "https://your-domain.com",
"endpoint": "oss-cn-beijing.aliyuncs.com",
"access_key": "your_access_key",
"secret_key": "your_secret_key",
"bucket": "your-bucket-name"
}
}如果需要使用 HTTPS,可以在宿主机上配置 Nginx 反向代理:
server {
listen 443 ssl;
server_name ask.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}{
"db_type": "sqlite",
"sqlite": "/work/db/jask.db",
"server": {
"host": "0.0.0.0",
"port": 8080
},
"storage_type": "local"
}{
"db_type": "mysql",
"mysql": {
"host": "192.168.1.100",
"port": 3306,
"user": "joiask",
"pass": "secure_password",
"name": "joiask"
},
"server": {
"host": "0.0.0.0",
"port": 8080
},
"storage_type": "oss",
"oss": {
"address": "https://cdn.example.com",
"endpoint": "oss-cn-beijing.aliyuncs.com",
"access_key": "your_access_key",
"secret_key": "your_secret_key",
"bucket": "joiask-images"
}
}创建 docker-compose.yml:
version: '3.8'
services:
joiask:
image: ghcr.io/xinrea/joiask:latest
container_name: joiask
restart: always
ports:
- "80:80"
volumes:
- ./config.json:/work/config/config.json
- ./data:/work/db
- ./uploads:/work/frontend/public/upload-img启动:
docker-compose up -d# 停止并删除旧容器
docker stop joiask && docker rm joiask
# 拉取最新镜像
docker pull ghcr.io/xinrea/joiask:latest
# 启动新容器
docker run -d --restart always \
--name joiask \
-p 80:80 \
-v $(pwd)/config.json:/work/config/config.json \
-v $(pwd)/data:/work/db \
-v $(pwd)/uploads:/work/frontend/public/upload-img \
ghcr.io/xinrea/joiask:latestdocker logs joiaskdocker exec -it joiask bashQ: 容器启动后无法访问?
- 检查端口是否被占用:
netstat -tlnp | grep 80 - 检查防火墙设置
- 查看容器日志:
docker logs joiask
Q: 图片上传失败?
- 检查存储目录是否正确挂载
- 如果使用 OSS,检查 access_key 和 bucket 配置
- 查看后端日志确认错误信息
Q: 数据丢失?
- 确保数据库文件和上传目录已正确挂载到宿主机
- 使用
-v参数挂载目录,避免数据随容器删除而丢失
