wordpress / Dockerfile
CatPtain's picture
Upload 2 files
e902072 verified
raw
history blame
7.38 kB
FROM wordpress:latest
# 安装必要工具和SQLite支持
RUN apt-get update && apt-get install -y \
sqlite3 \
libsqlite3-dev \
curl \
wget \
unzip \
git \
jq \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-install pdo_sqlite
# 下载并安装SQLite Integration插件
RUN cd /tmp && \
wget --timeout=30 --tries=3 https://downloads.wordpress.org/plugin/sqlite-integration.zip && \
unzip sqlite-integration.zip && \
mv sqlite-integration /var/www/html/wp-content/plugins/ && \
rm sqlite-integration.zip
# 复制PHP配置
COPY config/wp_php.ini /usr/local/etc/php/conf.d/conf.ini
# 创建SQLite数据库目录
RUN mkdir -p /var/www/html/wp-content/database
# 配置Apache监听7860端口
RUN sed -i 's/Listen 80/Listen 7860/' /etc/apache2/ports.conf && \
sed -i 's/:80>/:7860>/' /etc/apache2/sites-available/000-default.conf
# 创建必要的目录
RUN mkdir -p /var/www/html/wp-content/mu-plugins
RUN mkdir -p /var/www/html/wp-content/backup
RUN mkdir -p /var/www/html/wp-content/uploads
# 创建SQLite数据库配置文件
RUN echo "<?php\n\
define('USE_MYSQL', false);\n\
define('DB_DIR', '/var/www/html/wp-content/database/');\n\
define('DB_FILE', 'wordpress.db');\n" > /var/www/html/wp-content/db.php
# 创建SQLite Integration必须使用插件加载器
RUN echo "<?php\n\
// SQLite Integration Must Use Plugin Loader\n\
if ( ! defined( 'ABSPATH' ) ) {\n\
exit;\n\
}\n\
\n\
// 加载SQLite Integration插件\n\
if ( file_exists( WP_CONTENT_DIR . '/plugins/sqlite-integration/load.php' ) ) {\n\
require_once WP_CONTENT_DIR . '/plugins/sqlite-integration/load.php';\n\
}\n" > /var/www/html/wp-content/mu-plugins/sqlite-integration-loader.php
# 创建wp-config.php用于SQLite
RUN echo "<?php\n\
define('DB_NAME', 'wordpress');\n\
define('DB_USER', 'root');\n\
define('DB_PASSWORD', '');\n\
define('DB_HOST', '');\n\
define('DB_CHARSET', 'utf8');\n\
define('DB_COLLATE', '');\n\
define('FS_METHOD', 'direct');\n\
define('WP_DEBUG', false);\n\
define('SQLITE_INTEGRATION_PLUGIN_PATH', '/var/www/html/wp-content/plugins/sqlite-integration/');\n\
\$table_prefix = 'wp_';\n\
if ( ! defined( 'ABSPATH' ) ) {\n\
define( 'ABSPATH', __DIR__ . '/' );\n\
}\n\
require_once ABSPATH . 'wp-settings.php';\n" > /var/www/html/wp-config.php
# 创建GitHub备份脚本
RUN echo '#!/bin/bash\n\
set -e\n\
\n\
echo "=== WordPress GitHub Backup Loader ==="\n\
\n\
# 检查环境变量\n\
if [ -z "$GITHUB_TOKEN" ] || [ -z "$GITHUB_REPO" ]; then\n\
echo "警告: GITHUB_TOKEN 或 GITHUB_REPO 环境变量未设置,跳过GitHub备份加载"\n\
else\n\
echo "开始从GitHub加载备份数据..."\n\
\n\
# 设置GitHub API URL\n\
GITHUB_API="https://api.github.com/repos/$GITHUB_REPO"\n\
\n\
# 获取最近30天的备份文件\n\
THIRTY_DAYS_AGO=$(date -d "30 days ago" +%Y-%m-%d)\n\
\n\
echo "查找 $THIRTY_DAYS_AGO 之后的备份文件..."\n\
\n\
# 获取备份文件列表\n\
BACKUP_FILES=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \\\n\
"$GITHUB_API/contents/backups" | jq -r ".[] | select(.name | test(\"backup-[0-9]{4}-[0-9]{2}-[0-9]{2}\")) | .name" | sort -r)\n\
\n\
if [ -z "$BACKUP_FILES" ]; then\n\
echo "未找到备份文件"\n\
else\n\
# 获取最新的备份文件\n\
LATEST_BACKUP=$(echo "$BACKUP_FILES" | head -n 1)\n\
echo "找到最新备份: $LATEST_BACKUP"\n\
\n\
# 下载并解压备份\n\
DOWNLOAD_URL=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \\\n\
"$GITHUB_API/contents/backups/$LATEST_BACKUP" | jq -r ".download_url")\n\
\n\
if [ "$DOWNLOAD_URL" != "null" ]; then\n\
echo "下载备份文件..."\n\
cd /var/www/html/wp-content/backup\n\
curl -L -o "$LATEST_BACKUP" "$DOWNLOAD_URL"\n\
\n\
# 解压备份\n\
if [[ "$LATEST_BACKUP" == *.tar.gz ]]; then\n\
echo "解压备份文件..."\n\
tar -xzf "$LATEST_BACKUP"\n\
\n\
# 恢复数据库\n\
if [ -f "wordpress.db" ]; then\n\
echo "恢复SQLite数据库..."\n\
cp wordpress.db /var/www/html/wp-content/database/\n\
fi\n\
\n\
# 恢复上传文件\n\
if [ -d "uploads" ]; then\n\
echo "恢复上传文件..."\n\
cp -r uploads/* /var/www/html/wp-content/uploads/\n\
fi\n\
\n\
echo "备份恢复完成"\n\
fi\n\
fi\n\
fi\n\
fi\n\
\n\
echo "=== 启动Apache ===\"\n\
# 设置权限 (跳过chown,在HF Spaces中不需要)\n\
chmod -R 755 /var/www/html 2>/dev/null || true\n\
\n\
# 启动Apache\n\
exec apache2-foreground' > /usr/local/bin/start-wordpress.sh && \
chmod +x /usr/local/bin/start-wordpress.sh
# 创建备份脚本
RUN echo '#!/bin/bash\n\
set -e\n\
\n\
echo "=== WordPress GitHub Backup ==="\n\
\n\
# 检查环境变量\n\
if [ -z "$GITHUB_TOKEN" ] || [ -z "$GITHUB_REPO" ]; then\n\
echo "错误: GITHUB_TOKEN 或 GITHUB_REPO 环境变量未设置"\n\
exit 1\n\
fi\n\
\n\
# 创建备份目录\n\
BACKUP_DIR="/tmp/wordpress-backup"\n\
DATE=$(date +%Y-%m-%d-%H%M%S)\n\
BACKUP_NAME="backup-$DATE"\n\
\n\
mkdir -p "$BACKUP_DIR/$BACKUP_NAME"\n\
\n\
echo "创建备份: $BACKUP_NAME"\n\
\n\
# 备份SQLite数据库\n\
if [ -f "/var/www/html/wp-content/database/wordpress.db" ]; then\n\
echo "备份SQLite数据库..."\n\
cp /var/www/html/wp-content/database/wordpress.db "$BACKUP_DIR/$BACKUP_NAME/"\n\
fi\n\
\n\
# 备份上传文件\n\
if [ -d "/var/www/html/wp-content/uploads" ]; then\n\
echo "备份上传文件..."\n\
cp -r /var/www/html/wp-content/uploads "$BACKUP_DIR/$BACKUP_NAME/"\n\
fi\n\
\n\
# 创建压缩包\n\
cd "$BACKUP_DIR"\n\
tar -czf "$BACKUP_NAME.tar.gz" "$BACKUP_NAME"\n\
\n\
# 上传到GitHub\n\
echo "上传备份到GitHub..."\n\
\n\
# 将文件转换为base64\n\
FILE_CONTENT=$(base64 -w 0 "$BACKUP_NAME.tar.gz")\n\
\n\
# 上传到GitHub\n\
curl -X PUT \\\n\
-H "Authorization: token $GITHUB_TOKEN" \\\n\
-H "Content-Type: application/json" \\\n\
-d "{\\\"message\\\": \\\"WordPress backup $DATE\\\", \\\"content\\\": \\\"$FILE_CONTENT\\\"}" \\\n\
"https://api.github.com/repos/$GITHUB_REPO/contents/backups/$BACKUP_NAME.tar.gz"\n\
\n\
echo "备份完成: $BACKUP_NAME.tar.gz"\n\
\n\
# 清理临时文件\n\
rm -rf "$BACKUP_DIR"\n\
\n\
echo "备份上传到GitHub完成"' > /usr/local/bin/backup-wordpress.sh && \
chmod +x /usr/local/bin/backup-wordpress.sh
# 设置权限 (跳过chown,在HF Spaces中不需要)
# 创建日志目录
RUN mkdir -p /var/log && \
touch /var/log/php_errors.log && \
chmod 644 /var/log/php_errors.log
# 启用Apache模块
RUN a2enmod rewrite && \
a2enmod headers && \
a2enmod expires
# 设置Apache配置
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# 设置最终权限 (跳过chown,在HF Spaces中不需要)
RUN chmod -R 755 /var/www/html
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:7860/ || exit 1
# 暴露端口
EXPOSE 7860
# 启动WordPress
CMD ["/usr/local/bin/start-wordpress.sh"]