kiron
Published on 2025-03-23 / 7 Visits
0

docker一键化部署solo

前言

今天尝试了好几种博客的一键化部署,最后个人感觉用起来最舒服的还是halo。在这里正好把一键部署的方式记录一下

没用solo的原因是:部署完后初始化管理员账户,居然需要用第三方的什么平台去登录,有点嫌麻烦就算了

系统:ubuntu22.04 server

目录结构

├── docker-compose.yml

├── .env

├── solo/

├── latke.properties

├── log4j2.xml/

├── logs/

└── nginx/

├── nginx.conf

└── ssl/

├── www.yourdomain.crt.pem

└── www.yourdomain.key.pem

文件内容

docker-compose.yml文件

version: '3'

volumes:
  mysql_data:

services:
  mysql:
    image: mysql:8.0
    container_name: solo-mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql/conf.d:/etc/mysql/conf.d
    networks:
      - solo-network

  solo:
    image: b3log/solo:latest
    container_name: solo-blog
    restart: always
    ports:
      - "8080:8080"
    environment:
      # 基本配置
      - RUNTIME_DB=MYSQL
      - JDBC_USERNAME=${MYSQL_USER}
      - JDBC_PASSWORD=${MYSQL_PASSWORD}
      - JDBC_DRIVER=com.mysql.cj.jdbc.Driver
      - JDBC_URL=jdbc:mysql://mysql:3306/${MYSQL_DATABASE}?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
      # 服务器配置
      - SERVER_PORT=8080
      - SERVER_SCHEME=https
      - SERVER_HOST=www.yourdomain.com
      - SERVER_PATH=
      - STATIC_SERVER_SCHEME=https
      - STATIC_SERVER_HOST=www.yourdomain.com
      - STATIC_SERVER_PORT=443
      - STATIC_PATH=
      # 管理员初始配置
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=admin
      # 其他配置
      - RUNTIME_MODE=PRODUCTION
    depends_on:
      - mysql
    volumes:
      - ./solo/logs:/opt/solo/logs
      - ./solo/latke.properties:/opt/solo/latke.properties
    networks:
      - solo-network

  nginx:
    image: nginx:latest
    container_name: solo-nginx
    restart: always
    ports:
      - "${NGINX_PORT}:80"
      - "${NGINX_SSL_PORT}:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
      - ./nginx/html:/usr/share/nginx/html
    depends_on:
      - solo
    networks:
      - solo-network

networks:
  solo-network:
    driver: bridge 

nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    # 增加请求体大小限制
    client_max_body_size 10M;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    upstream solo_backend {
        server solo:8080;
    }

    server {
        listen 80;
        server_name www.yourdomain.com;
        return 301 https://$host$request_uri;  # HTTP强制跳转HTTPS
    }

    server {
        listen 443 ssl;
        server_name www.yourdomain.com;
        
        # SSL证书配置
        ssl_certificate /etc/nginx/ssl/www.yourdomain.com_bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/www.yourdomain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3; 
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers on;
        ssl_session_tickets on;

        # 强制HTTPS安全协议
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

        location / {
            proxy_pass http://solo_backend;
            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;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
} 

.env文件

# MySQL配置
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=solo
MYSQL_USER=solo
MYSQL_PASSWORD=your_solo_password

# Solo配置
SOLO_SERVER_PORT=8080
SOLO_RUNTIME_MODE=PRODUCTION
SOLO_JDBC_USERNAME=solo
SOLO_JDBC_PASSWORD=your_solo_password
SOLO_JDBC_DRIVER=com.mysql.cj.jdbc.Driver
SOLO_JDBC_URL=jdbc:mysql://mysql:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

# Solo Latke配置
SOLO_SERVE_PATH=/
SOLO_STATIC_SERVER_SCHEME=https
SOLO_STATIC_SERVER_HOST=www.yourdomain.com
SOLO_STATIC_SERVER_PORT=443
SOLO_STATIC_PATH=/
SOLO_STATIC_SERVE_PATH=/
SOLO_SERVER_SCHEME=https
SOLO_SERVER_HOST=www.yourdomain.com
SOLO_SERVER_PORT=443
SOLO_CONTEXT_PATH=

# Nginx配置
NGINX_PORT=80
NGINX_SSL_PORT=443 

latke.properties

#### 服务器配置 ####
# 伺服路径,如果有多个,用逗号分隔
serverServePath=/
# 静态服务地址
staticServerScheme=https
staticServerHost=www.yourdomain.com
staticServerPort=443
# 静态服务路径
staticServerPath=/
# 静态资源路径映射
staticResourcePath=/

#### 仓库配置 ####
# 仓库类型
repositoryType=mysql
# 数据库JDBC URL
jdbc.URL=jdbc:mysql://mysql:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
# 数据库用户名
jdbc.username=solo
# 数据库密码
jdbc.password=your_solo_password
# 数据库驱动
jdbc.driver=com.mysql.cj.jdbc.Driver

#### 运行模式 ####
# 开发模式:development,生产模式:production
runtimeMode=PRODUCTION

启动方式

docker-compose up -d