系统是Ubuntu 20.04,会用cerbot处理SSL证书。
参考官方指引:https://directus.io/docs/self-hosting/deploying#docker-compose-examples
安装Nginx参考:
安装Docker参考:
Docker部分
假设当前是在用户目录,创建文件夹:
mkdir -p directus/data/database
cd directus/
mkdir extenisons uploads
创建配置文件docker-compose.yml及环境变量文件.env:
touch docker-compose.yml .env
编辑docker-compose.yml:
nano docker-compose.yml
编辑内容:
services:
database:
image: postgis/postgis:13-master
volumes:
- ./data/database:/var/lib/postgresql/data
environment:
POSTGRES_USER: "${POSTGRES_USER}"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
POSTGRES_DB: "${POSTGRES_DB}"
healthcheck:
test: ["CMD", "pg_isready", "--host=localhost", "--username=${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
start_interval: 5s
start_period: 30s
restart: unless-stopped
cache:
image: redis:6
healthcheck:
test: ["CMD-SHELL", "[ $$(redis-cli ping) = 'PONG' ]"]
interval: 10s
timeout: 5s
retries: 5
start_interval: 5s
start_period: 30s
restart: unless-stopped
directus:
image: directus/directus:11.7.2
ports:
- 8055:8055
volumes:
- ./uploads:/directus/uploads
- ./extensions:/directus/extensions
depends_on:
database:
condition: service_healthy
cache:
condition: service_healthy
environment:
SECRET: "${SECRET}"
DB_CLIENT: "pg"
DB_HOST: "database"
DB_PORT: "5432"
DB_DATABASE: "${POSTGRES_DB}"
DB_USER: "${POSTGRES_USER}"
DB_PASSWORD: "${POSTGRES_PASSWORD}"
CACHE_ENABLED: "true"
CACHE_AUTO_PURGE: "true"
CACHE_STORE: "redis"
REDIS: "redis://cache:6379"
ADMIN_EMAIL: "${ADMIN_EMAIL}"
ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
PUBLIC_URL: "https://example.com"
restart: unless-stopped
高亮部分类似${POSTGRES_USER}
这种是引用环境变量,稍后在.env里定义,PUBLIC_URL这是设置要绑定的域名https://example.com,改成自己的域名,提前做好解析。
注意如果服务器是arm64架构(比如甲骨文云的A1 Flex),数据库的镜像要改成postgres:13-alpine:
services:
database:
image: postgres:13-alpine
...
按ctrl+o、回车、ctrl+x保存退出。然后编辑.env:
nano .env
写入:
POSTGRES_USER=directus
POSTGRES_PASSWORD=0S5Hs7K3o5iBGW9Qz3e2Dg!!
POSTGRES_DB=directus
ADMIN_EMAIL=username@example.com
ADMIN_PASSWORD=w9Qz3e2Dg!
SECRET=a7aed3179fe8fac059d9cdc026e50c86d28c47cf1170b59ba1090f607e28f42c
高亮部分自行修改,ADMIN_EMAIL和ADMIN_PASSWORD分别设置的管理员用户登录邮箱和密码,密码和SECRET可以在终端运行下面的命令生成随机密码:
# 生成16位密码,生成后可手动添加一些特殊符号
openssl rand -base64 16
# 生成32位长SECRET
openssl rand -hex 32
编辑完保存退出后,运行:
docker compose up -d
查看:
docker ps
如果有报错,查看日志:
docker logs <container_name>
Nginx部分
省事的话直接在/etc/nginx/conf.d/目录下新建一个配置文件:
cd /etc/nginx/conf.d/
sudo nano example.com.conf
编辑内容:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8055;
proxy_http_version 1.1;
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;
}
}
ctrl+o、回车、ctrl+x,保存退出。
测试:
sudo nginx -t
使用certbot申请SSL证书:
# 没安装certbot的话运行
sudo apt install certbot python3-certbot-nginx
# 申请证书
sudo certbot --nginx -d example.com
申请过程中会让选择是否强制使用https,一般是y,顺利的话会自动更新nginx配置,更新后类似下面这样:
server {
server_name example.com;
location / {
proxy_pass http://localhost:8055;
proxy_http_version 1.1;
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;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name example.com;
return 404; # managed by Certbot
}
然后就可以通过https://example.com访问了。