Upload 5 files
Browse files- Dockerfile +234 -0
- README.md +141 -100
- app.py +38 -0
- requirements.txt +6 -0
- spaces.yml +29 -0
Dockerfile
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM wordpress:latest
|
| 2 |
+
|
| 3 |
+
# 安装必要工具和SQLite支持
|
| 4 |
+
RUN apt-get update && apt-get install -y \
|
| 5 |
+
sqlite3 \
|
| 6 |
+
libsqlite3-dev \
|
| 7 |
+
curl \
|
| 8 |
+
wget \
|
| 9 |
+
unzip \
|
| 10 |
+
git \
|
| 11 |
+
jq \
|
| 12 |
+
&& rm -rf /var/lib/apt/lists/* \
|
| 13 |
+
&& docker-php-ext-install pdo_sqlite
|
| 14 |
+
|
| 15 |
+
# 下载并安装SQLite Integration插件
|
| 16 |
+
RUN cd /tmp && \
|
| 17 |
+
wget --timeout=30 --tries=3 https://downloads.wordpress.org/plugin/sqlite-integration.zip && \
|
| 18 |
+
unzip sqlite-integration.zip && \
|
| 19 |
+
mv sqlite-integration /var/www/html/wp-content/plugins/ && \
|
| 20 |
+
rm sqlite-integration.zip && \
|
| 21 |
+
chown -R www-data:www-data /var/www/html/wp-content/plugins/sqlite-integration
|
| 22 |
+
|
| 23 |
+
# 复制PHP配置
|
| 24 |
+
COPY config/wp_php.ini /usr/local/etc/php/conf.d/conf.ini
|
| 25 |
+
|
| 26 |
+
# 创建SQLite数据库目录
|
| 27 |
+
RUN mkdir -p /var/www/html/wp-content/database
|
| 28 |
+
|
| 29 |
+
# 配置Apache监听7860端口
|
| 30 |
+
RUN sed -i 's/Listen 80/Listen 7860/' /etc/apache2/ports.conf && \
|
| 31 |
+
sed -i 's/:80>/:7860>/' /etc/apache2/sites-available/000-default.conf
|
| 32 |
+
|
| 33 |
+
# 创建必要的目录
|
| 34 |
+
RUN mkdir -p /var/www/html/wp-content/mu-plugins
|
| 35 |
+
RUN mkdir -p /var/www/html/wp-content/backup
|
| 36 |
+
RUN mkdir -p /var/www/html/wp-content/uploads
|
| 37 |
+
|
| 38 |
+
# 创建SQLite数据库配置文件
|
| 39 |
+
RUN echo "<?php\n\
|
| 40 |
+
define('USE_MYSQL', false);\n\
|
| 41 |
+
define('DB_DIR', '/var/www/html/wp-content/database/');\n\
|
| 42 |
+
define('DB_FILE', 'wordpress.db');\n" > /var/www/html/wp-content/db.php
|
| 43 |
+
|
| 44 |
+
# 创建SQLite Integration必须使用插件加载器
|
| 45 |
+
RUN echo "<?php\n\
|
| 46 |
+
// SQLite Integration Must Use Plugin Loader\n\
|
| 47 |
+
if ( ! defined( 'ABSPATH' ) ) {\n\
|
| 48 |
+
exit;\n\
|
| 49 |
+
}\n\
|
| 50 |
+
\n\
|
| 51 |
+
// 加载SQLite Integration插件\n\
|
| 52 |
+
if ( file_exists( WP_CONTENT_DIR . '/plugins/sqlite-integration/load.php' ) ) {\n\
|
| 53 |
+
require_once WP_CONTENT_DIR . '/plugins/sqlite-integration/load.php';\n\
|
| 54 |
+
}\n" > /var/www/html/wp-content/mu-plugins/sqlite-integration-loader.php
|
| 55 |
+
|
| 56 |
+
# 创建wp-config.php用于SQLite
|
| 57 |
+
RUN echo "<?php\n\
|
| 58 |
+
define('DB_NAME', 'wordpress');\n\
|
| 59 |
+
define('DB_USER', 'root');\n\
|
| 60 |
+
define('DB_PASSWORD', '');\n\
|
| 61 |
+
define('DB_HOST', '');\n\
|
| 62 |
+
define('DB_CHARSET', 'utf8');\n\
|
| 63 |
+
define('DB_COLLATE', '');\n\
|
| 64 |
+
define('FS_METHOD', 'direct');\n\
|
| 65 |
+
define('WP_DEBUG', false);\n\
|
| 66 |
+
define('SQLITE_INTEGRATION_PLUGIN_PATH', '/var/www/html/wp-content/plugins/sqlite-integration/');\n\
|
| 67 |
+
\$table_prefix = 'wp_';\n\
|
| 68 |
+
if ( ! defined( 'ABSPATH' ) ) {\n\
|
| 69 |
+
define( 'ABSPATH', __DIR__ . '/' );\n\
|
| 70 |
+
}\n\
|
| 71 |
+
require_once ABSPATH . 'wp-settings.php';\n" > /var/www/html/wp-config.php
|
| 72 |
+
|
| 73 |
+
# 创建GitHub备份脚本
|
| 74 |
+
RUN echo '#!/bin/bash\n\
|
| 75 |
+
set -e\n\
|
| 76 |
+
\n\
|
| 77 |
+
echo "=== WordPress GitHub Backup Loader ==="\n\
|
| 78 |
+
\n\
|
| 79 |
+
# 检查环境变量\n\
|
| 80 |
+
if [ -z "$GITHUB_TOKEN" ] || [ -z "$GITHUB_REPO" ]; then\n\
|
| 81 |
+
echo "警告: GITHUB_TOKEN 或 GITHUB_REPO 环境变量未设置,跳过GitHub备份加载"\n\
|
| 82 |
+
else\n\
|
| 83 |
+
echo "开始从GitHub加载备份数据..."\n\
|
| 84 |
+
\n\
|
| 85 |
+
# 设置GitHub API URL\n\
|
| 86 |
+
GITHUB_API="https://api.github.com/repos/$GITHUB_REPO"\n\
|
| 87 |
+
\n\
|
| 88 |
+
# 获取最近30天的备份文件\n\
|
| 89 |
+
THIRTY_DAYS_AGO=$(date -d "30 days ago" +%Y-%m-%d)\n\
|
| 90 |
+
\n\
|
| 91 |
+
echo "查找 $THIRTY_DAYS_AGO 之后的备份文件..."\n\
|
| 92 |
+
\n\
|
| 93 |
+
# 获取备份文件列表\n\
|
| 94 |
+
BACKUP_FILES=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \\\n\
|
| 95 |
+
"$GITHUB_API/contents/backups" | jq -r ".[] | select(.name | test(\"backup-[0-9]{4}-[0-9]{2}-[0-9]{2}\")) | .name" | sort -r)\n\
|
| 96 |
+
\n\
|
| 97 |
+
if [ -z "$BACKUP_FILES" ]; then\n\
|
| 98 |
+
echo "未找到备份文件"\n\
|
| 99 |
+
else\n\
|
| 100 |
+
# 获取最新的备份文件\n\
|
| 101 |
+
LATEST_BACKUP=$(echo "$BACKUP_FILES" | head -n 1)\n\
|
| 102 |
+
echo "找到最新备份: $LATEST_BACKUP"\n\
|
| 103 |
+
\n\
|
| 104 |
+
# 下载并解压备份\n\
|
| 105 |
+
DOWNLOAD_URL=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \\\n\
|
| 106 |
+
"$GITHUB_API/contents/backups/$LATEST_BACKUP" | jq -r ".download_url")\n\
|
| 107 |
+
\n\
|
| 108 |
+
if [ "$DOWNLOAD_URL" != "null" ]; then\n\
|
| 109 |
+
echo "下载备份文件..."\n\
|
| 110 |
+
cd /var/www/html/wp-content/backup\n\
|
| 111 |
+
curl -L -o "$LATEST_BACKUP" "$DOWNLOAD_URL"\n\
|
| 112 |
+
\n\
|
| 113 |
+
# 解压备份\n\
|
| 114 |
+
if [[ "$LATEST_BACKUP" == *.tar.gz ]]; then\n\
|
| 115 |
+
echo "解压备份文件..."\n\
|
| 116 |
+
tar -xzf "$LATEST_BACKUP"\n\
|
| 117 |
+
\n\
|
| 118 |
+
# 恢复数据库\n\
|
| 119 |
+
if [ -f "wordpress.db" ]; then\n\
|
| 120 |
+
echo "恢复SQLite数据库..."\n\
|
| 121 |
+
cp wordpress.db /var/www/html/wp-content/database/\n\
|
| 122 |
+
chown www-data:www-data /var/www/html/wp-content/database/wordpress.db\n\
|
| 123 |
+
fi\n\
|
| 124 |
+
\n\
|
| 125 |
+
# 恢复上传文件\n\
|
| 126 |
+
if [ -d "uploads" ]; then\n\
|
| 127 |
+
echo "恢复上传文件..."\n\
|
| 128 |
+
cp -r uploads/* /var/www/html/wp-content/uploads/\n\
|
| 129 |
+
chown -R www-data:www-data /var/www/html/wp-content/uploads/\n\
|
| 130 |
+
fi\n\
|
| 131 |
+
\n\
|
| 132 |
+
echo "备份恢复完成"\n\
|
| 133 |
+
fi\n\
|
| 134 |
+
fi\n\
|
| 135 |
+
fi\n\
|
| 136 |
+
fi\n\
|
| 137 |
+
\n\
|
| 138 |
+
echo "=== 启动Apache ==="\n\
|
| 139 |
+
# 设置权限\n\
|
| 140 |
+
chown -R www-data:www-data /var/www/html\n\
|
| 141 |
+
chmod -R 755 /var/www/html\n\
|
| 142 |
+
\n\
|
| 143 |
+
# 启动Apache\n\
|
| 144 |
+
exec apache2-foreground' > /usr/local/bin/start-wordpress.sh && \
|
| 145 |
+
chmod +x /usr/local/bin/start-wordpress.sh
|
| 146 |
+
|
| 147 |
+
# 创建备份脚本
|
| 148 |
+
RUN echo '#!/bin/bash\n\
|
| 149 |
+
set -e\n\
|
| 150 |
+
\n\
|
| 151 |
+
echo "=== WordPress GitHub Backup ==="\n\
|
| 152 |
+
\n\
|
| 153 |
+
# 检查环境变量\n\
|
| 154 |
+
if [ -z "$GITHUB_TOKEN" ] || [ -z "$GITHUB_REPO" ]; then\n\
|
| 155 |
+
echo "错误: GITHUB_TOKEN 或 GITHUB_REPO 环境变量未设置"\n\
|
| 156 |
+
exit 1\n\
|
| 157 |
+
fi\n\
|
| 158 |
+
\n\
|
| 159 |
+
# 创建备份目录\n\
|
| 160 |
+
BACKUP_DIR="/tmp/wordpress-backup"\n\
|
| 161 |
+
DATE=$(date +%Y-%m-%d-%H%M%S)\n\
|
| 162 |
+
BACKUP_NAME="backup-$DATE"\n\
|
| 163 |
+
\n\
|
| 164 |
+
mkdir -p "$BACKUP_DIR/$BACKUP_NAME"\n\
|
| 165 |
+
\n\
|
| 166 |
+
echo "创建备份: $BACKUP_NAME"\n\
|
| 167 |
+
\n\
|
| 168 |
+
# 备份SQLite数据库\n\
|
| 169 |
+
if [ -f "/var/www/html/wp-content/database/wordpress.db" ]; then\n\
|
| 170 |
+
echo "备份SQLite数据库..."\n\
|
| 171 |
+
cp /var/www/html/wp-content/database/wordpress.db "$BACKUP_DIR/$BACKUP_NAME/"\n\
|
| 172 |
+
fi\n\
|
| 173 |
+
\n\
|
| 174 |
+
# 备份上传文件\n\
|
| 175 |
+
if [ -d "/var/www/html/wp-content/uploads" ]; then\n\
|
| 176 |
+
echo "备份上传文件..."\n\
|
| 177 |
+
cp -r /var/www/html/wp-content/uploads "$BACKUP_DIR/$BACKUP_NAME/"\n\
|
| 178 |
+
fi\n\
|
| 179 |
+
\n\
|
| 180 |
+
# 创建压缩包\n\
|
| 181 |
+
cd "$BACKUP_DIR"\n\
|
| 182 |
+
tar -czf "$BACKUP_NAME.tar.gz" "$BACKUP_NAME"\n\
|
| 183 |
+
\n\
|
| 184 |
+
# 上传到GitHub\n\
|
| 185 |
+
echo "上传备份到GitHub..."\n\
|
| 186 |
+
\n\
|
| 187 |
+
# 将文件转换为base64\n\
|
| 188 |
+
FILE_CONTENT=$(base64 -w 0 "$BACKUP_NAME.tar.gz")\n\
|
| 189 |
+
\n\
|
| 190 |
+
# 上传到GitHub\n\
|
| 191 |
+
curl -X PUT \\\n\
|
| 192 |
+
-H "Authorization: token $GITHUB_TOKEN" \\\n\
|
| 193 |
+
-H "Content-Type: application/json" \\\n\
|
| 194 |
+
-d "{\\\"message\\\": \\\"WordPress backup $DATE\\\", \\\"content\\\": \\\"$FILE_CONTENT\\\"}" \\\n\
|
| 195 |
+
"https://api.github.com/repos/$GITHUB_REPO/contents/backups/$BACKUP_NAME.tar.gz"\n\
|
| 196 |
+
\n\
|
| 197 |
+
echo "备份完成: $BACKUP_NAME.tar.gz"\n\
|
| 198 |
+
\n\
|
| 199 |
+
# 清理临时文件\n\
|
| 200 |
+
rm -rf "$BACKUP_DIR"\n\
|
| 201 |
+
\n\
|
| 202 |
+
echo "备份上传到GitHub完成"' > /usr/local/bin/backup-wordpress.sh && \
|
| 203 |
+
chmod +x /usr/local/bin/backup-wordpress.sh
|
| 204 |
+
|
| 205 |
+
# 设置权限
|
| 206 |
+
RUN chown www-data:www-data /var/www/html/wp-config.php
|
| 207 |
+
|
| 208 |
+
# 创建日志目录
|
| 209 |
+
RUN mkdir -p /var/log && \
|
| 210 |
+
touch /var/log/php_errors.log && \
|
| 211 |
+
chown www-data:www-data /var/log/php_errors.log && \
|
| 212 |
+
chmod 644 /var/log/php_errors.log
|
| 213 |
+
|
| 214 |
+
# 启用Apache模块
|
| 215 |
+
RUN a2enmod rewrite && \
|
| 216 |
+
a2enmod headers && \
|
| 217 |
+
a2enmod expires
|
| 218 |
+
|
| 219 |
+
# 设置Apache配置
|
| 220 |
+
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
|
| 221 |
+
|
| 222 |
+
# 设置最终权限
|
| 223 |
+
RUN chown -R www-data:www-data /var/www/html && \
|
| 224 |
+
chmod -R 755 /var/www/html
|
| 225 |
+
|
| 226 |
+
# 健康检查
|
| 227 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
| 228 |
+
CMD curl -f http://localhost:7860/ || exit 1
|
| 229 |
+
|
| 230 |
+
# 暴露端口
|
| 231 |
+
EXPOSE 7860
|
| 232 |
+
|
| 233 |
+
# 启动WordPress
|
| 234 |
+
CMD ["/usr/local/bin/start-wordpress.sh"]
|
README.md
CHANGED
|
@@ -1,159 +1,200 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
-
|
| 4 |
|
| 5 |
-
|
| 6 |
|
| 7 |
-
|
| 8 |
-
- [phpMyAdmin](https://hub.docker.com/r/phpmyadmin/phpmyadmin/)
|
| 9 |
-
- [MySQL](https://hub.docker.com/_/mysql/)
|
| 10 |
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
-
|
| 14 |
-
- [Configuration](#configuration)
|
| 15 |
-
- [Installation](#installation)
|
| 16 |
-
- [Usage](#usage)
|
| 17 |
-
|
| 18 |
-
## Requirements
|
| 19 |
-
|
| 20 |
-
Make sure you have the latest versions of **Docker** and **Docker Compose** installed on your machine.
|
| 21 |
-
|
| 22 |
-
Clone this repository or copy the files from this repository into a new folder. In the **docker-compose.yml** file you may change the IP address (in case you run multiple containers) or the database from MySQL to MariaDB.
|
| 23 |
-
|
| 24 |
-
Make sure to [add your user to the `docker` group](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user) when using Linux.
|
| 25 |
-
|
| 26 |
-
## Configuration
|
| 27 |
-
|
| 28 |
-
Copy the example environment into `.env`
|
| 29 |
|
|
|
|
| 30 |
```
|
| 31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
```
|
| 33 |
|
| 34 |
-
|
| 35 |
|
| 36 |
-
|
| 37 |
|
| 38 |
-
|
|
|
|
| 39 |
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
|
|
|
|
|
|
| 43 |
|
| 44 |
-
|
|
|
|
|
|
|
| 45 |
|
| 46 |
-
|
| 47 |
-
* `wp-app` – the location of your WordPress application
|
| 48 |
|
| 49 |
-
|
| 50 |
|
| 51 |
-
|
| 52 |
|
| 53 |
-
|
| 54 |
|
| 55 |
-
###
|
| 56 |
|
| 57 |
-
|
|
|
|
|
|
|
|
|
|
| 58 |
|
| 59 |
-
|
| 60 |
-
docker-compose
|
| 61 |
-
```
|
| 62 |
-
|
| 63 |
-
### Stopping containers
|
| 64 |
|
| 65 |
-
|
| 66 |
-
docker-compose
|
| 67 |
```
|
| 68 |
|
| 69 |
-
###
|
| 70 |
|
| 71 |
-
|
|
|
|
|
|
|
| 72 |
|
| 73 |
-
|
| 74 |
-
docker-
|
| 75 |
```
|
| 76 |
|
| 77 |
-
|
| 78 |
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
|
|
|
| 82 |
|
| 83 |
-
|
| 84 |
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
| 86 |
|
| 87 |
-
|
| 88 |
-
|
|
|
|
|
|
|
| 89 |
|
| 90 |
-
|
|
|
|
|
|
|
|
|
|
| 91 |
|
| 92 |
-
|
| 93 |
-
docker-compose up
|
| 94 |
-
```
|
| 95 |
|
| 96 |
-
|
| 97 |
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
```
|
| 102 |
|
| 103 |
-
|
|
|
|
|
|
|
| 104 |
|
| 105 |
-
|
| 106 |
-
./export.sh
|
| 107 |
-
```
|
| 108 |
|
| 109 |
-
|
|
|
|
|
|
|
|
|
|
| 110 |
|
| 111 |
-
|
| 112 |
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
|
|
|
|
|
|
| 116 |
```
|
| 117 |
|
| 118 |
-
|
| 119 |
|
| 120 |
-
|
|
|
|
|
|
|
|
|
|
| 121 |
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
|
| 127 |
-
###
|
|
|
|
|
|
|
|
|
|
| 128 |
|
| 129 |
-
|
|
|
|
|
|
|
| 130 |
|
| 131 |
-
|
| 132 |
|
| 133 |
```
|
| 134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
```
|
| 136 |
|
| 137 |
-
|
| 138 |
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
|
|
|
| 142 |
|
| 143 |
-
|
|
|
|
|
|
|
|
|
|
| 144 |
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
|
| 149 |
-
|
| 150 |
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
|
| 155 |
-
|
| 156 |
|
| 157 |
-
|
| 158 |
|
| 159 |
-
|
|
|
|
| 1 |
+
# WordPress with SQLite for Hugging Face Spaces
|
| 2 |
|
| 3 |
+
这是一个专为 Hugging Face Spaces 设计的 WordPress 项目,使用 SQLite 数据库和 GitHub 自动备份功能。
|
| 4 |
|
| 5 |
+
## 🚀 快速部署到 Hugging Face Space
|
| 6 |
|
| 7 |
+
### 1. 创建 Hugging Face Space
|
|
|
|
|
|
|
| 8 |
|
| 9 |
+
1. 访问 [Hugging Face Spaces](https://huggingface.co/spaces)
|
| 10 |
+
2. 点击 "Create new Space"
|
| 11 |
+
3. 选择以下配置:
|
| 12 |
+
- **SDK**: `Docker`
|
| 13 |
+
- **Hardware**: `CPU basic` (推荐) 或更高
|
| 14 |
+
- **Visibility**: 根据需要选择
|
| 15 |
|
| 16 |
+
### 2. 上传项目文件
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
+
将以下文件上传到你的 Space:
|
| 19 |
```
|
| 20 |
+
Dockerfile
|
| 21 |
+
app.py
|
| 22 |
+
requirements.txt
|
| 23 |
+
config/wp_php.ini
|
| 24 |
+
.dockerignore (可选)
|
| 25 |
+
spaces.yml (可选)
|
| 26 |
```
|
| 27 |
|
| 28 |
+
### 3. 配置环境变量 (可选 - 用于GitHub备份)
|
| 29 |
|
| 30 |
+
在 Space 的 Settings 页面添加以下环境变量:
|
| 31 |
|
| 32 |
+
- `GITHUB_TOKEN`: 你的 GitHub Personal Access Token
|
| 33 |
+
- `GITHUB_REPO`: GitHub 仓库路径 (格式: `username/repository-name`)
|
| 34 |
|
| 35 |
+
#### 创建 GitHub Token:
|
| 36 |
+
1. 访问 GitHub Settings > Developer settings > Personal access tokens
|
| 37 |
+
2. 创建新 token,需要以下权限:
|
| 38 |
+
- `repo` (完整仓库访问权限)
|
| 39 |
+
- `contents:write` (写入仓库内容)
|
| 40 |
|
| 41 |
+
#### 准备 GitHub 仓库:
|
| 42 |
+
1. 创建一个新的 GitHub 仓库用于存储备份
|
| 43 |
+
2. 在仓库中创建 `backups` 文件夹
|
| 44 |
|
| 45 |
+
### 4. 启动 Space
|
|
|
|
| 46 |
|
| 47 |
+
保存设置后,Space 会自动构建和启动。首次构建需要 5-10 分钟。
|
| 48 |
|
| 49 |
+
## 🏠 本地开发部署
|
| 50 |
|
| 51 |
+
如果你想在本地开发环境中运行此项目:
|
| 52 |
|
| 53 |
+
### 使用 Docker Compose
|
| 54 |
|
| 55 |
+
```bash
|
| 56 |
+
# 克隆或下载项目
|
| 57 |
+
git clone <your-repo-url>
|
| 58 |
+
cd wordpress-docker-compose-master
|
| 59 |
|
| 60 |
+
# 构建并启动
|
| 61 |
+
docker-compose up --build
|
|
|
|
|
|
|
|
|
|
| 62 |
|
| 63 |
+
# 或者在后台运行
|
| 64 |
+
docker-compose up -d --build
|
| 65 |
```
|
| 66 |
|
| 67 |
+
### 使用 Docker 直接构建
|
| 68 |
|
| 69 |
+
```bash
|
| 70 |
+
# 构建镜像
|
| 71 |
+
docker build -t wordpress-sqlite .
|
| 72 |
|
| 73 |
+
# 运行容器
|
| 74 |
+
docker run -p 7860:7860 wordpress-sqlite
|
| 75 |
```
|
| 76 |
|
| 77 |
+
### 本地开发配置
|
| 78 |
|
| 79 |
+
- 数据持久化:使用 Docker volumes 保存数据
|
| 80 |
+
- 主题开发:可以挂载本地主题目录
|
| 81 |
+
- 插件开发:可以挂载本地插件目录
|
| 82 |
+
- 配置文件:可以修改 `config/wp_php.ini`
|
| 83 |
|
| 84 |
+
## 🔧 功能特性
|
| 85 |
|
| 86 |
+
### ✅ SQLite 数据库
|
| 87 |
+
- 无需外部数据库服务
|
| 88 |
+
- 数据存储在 `/var/www/html/wp-content/database/`
|
| 89 |
+
- 自动配置 SQLite Integration 插件
|
| 90 |
|
| 91 |
+
### ✅ GitHub 自动备份
|
| 92 |
+
- **启动时恢复**: Space 重启时自动从 GitHub 加载最近 30 天的备份
|
| 93 |
+
- **手动备份**: 可以手动运行备份脚本
|
| 94 |
+
- **备份内容**: SQLite 数据库 + 上传文件
|
| 95 |
|
| 96 |
+
### ✅ Hugging Face Space 优化
|
| 97 |
+
- 端口 7860 (HF Space 标准端口)
|
| 98 |
+
- 内存优��配置
|
| 99 |
+
- 健康检查支持
|
| 100 |
|
| 101 |
+
## 📖 使用说明
|
|
|
|
|
|
|
| 102 |
|
| 103 |
+
### 访问 WordPress
|
| 104 |
|
| 105 |
+
**Hugging Face Space:**
|
| 106 |
+
- **前台**: `https://your-space-name.hf.space/`
|
| 107 |
+
- **后台**: `https://your-space-name.hf.space/wp-admin/`
|
|
|
|
| 108 |
|
| 109 |
+
**本地开发:**
|
| 110 |
+
- **前台**: `http://localhost:7860/`
|
| 111 |
+
- **后台**: `http://localhost:7860/wp-admin/`
|
| 112 |
|
| 113 |
+
### 初次设置
|
|
|
|
|
|
|
| 114 |
|
| 115 |
+
1. 访问你的 Space URL
|
| 116 |
+
2. 按照 WordPress 安装向导完成设置
|
| 117 |
+
3. 创建管理员账户
|
| 118 |
+
4. 开始使用 WordPress
|
| 119 |
|
| 120 |
+
### 手动备份到 GitHub
|
| 121 |
|
| 122 |
+
如果配置了 GitHub 环境变量,可以手动创建备份:
|
| 123 |
+
|
| 124 |
+
```bash
|
| 125 |
+
# 在 Space 的终端中运行
|
| 126 |
+
/usr/local/bin/backup-wordpress.sh
|
| 127 |
```
|
| 128 |
|
| 129 |
+
## 🔍 故障排除
|
| 130 |
|
| 131 |
+
### 1. Space 无法启动
|
| 132 |
+
- 检查 Dockerfile 语法
|
| 133 |
+
- 确认端口设置为 7860
|
| 134 |
+
- 查看构建日志中的错误信息
|
| 135 |
|
| 136 |
+
### 2. WordPress 显示 403 错误
|
| 137 |
+
- 等待容器完全启动 (1-2 分钟)
|
| 138 |
+
- 检查健康检查状态
|
| 139 |
+
- 确认 SQLite 插件正确安装
|
| 140 |
|
| 141 |
+
### 3. GitHub 备份失败
|
| 142 |
+
- 验证 `GITHUB_TOKEN` 和 `GITHUB_REPO` 环境变量
|
| 143 |
+
- 确认 GitHub Token 有正确权限
|
| 144 |
+
- 检查仓库中是否存在 `backups` 文件夹
|
| 145 |
|
| 146 |
+
### 4. 数据丢失
|
| 147 |
+
- Space 重启时会自动尝试从 GitHub 恢复备份
|
| 148 |
+
- 手动恢复:将备份文件解压到相应目录
|
| 149 |
|
| 150 |
+
## 📁 项目结构
|
| 151 |
|
| 152 |
```
|
| 153 |
+
.
|
| 154 |
+
├── Dockerfile # Docker 构建文件 (HF Space)
|
| 155 |
+
├── app.py # HF Space 入口文件
|
| 156 |
+
├── requirements.txt # Python 依赖 (HF Space)
|
| 157 |
+
├── spaces.yml # HF Space 配置
|
| 158 |
+
├── README.md # 项目说明
|
| 159 |
+
├── DEPLOYMENT_GUIDE.md # 部署指南
|
| 160 |
+
├── docker-compose.yml # Docker Compose (SQLite)
|
| 161 |
+
├── docker-compose.local.yml # 本地开发配置
|
| 162 |
+
├── docker-compose.mysql.yml # MySQL 版本 (备份)
|
| 163 |
+
├── config/
|
| 164 |
+
│ ├── wp_php.ini # PHP 配置
|
| 165 |
+
│ └── pma_php.ini # phpMyAdmin 配置 (MySQL版本)
|
| 166 |
+
├── .dockerignore # Docker 忽略文件
|
| 167 |
+
└── env.example # 环境变量示例 (MySQL版本)
|
| 168 |
```
|
| 169 |
|
| 170 |
+
## 🔒 安全注意事项
|
| 171 |
|
| 172 |
+
1. **GitHub Token 安全**:
|
| 173 |
+
- 使用最小权限原则
|
| 174 |
+
- 定期轮换 Token
|
| 175 |
+
- 不要在代码中硬编码 Token
|
| 176 |
|
| 177 |
+
2. **WordPress 安全**:
|
| 178 |
+
- 使用强密码
|
| 179 |
+
- 定期更新 WordPress 和插件
|
| 180 |
+
- 限制管理员访问
|
| 181 |
|
| 182 |
+
3. **备份安全**:
|
| 183 |
+
- 备份仓库设为私有
|
| 184 |
+
- 定期检查备份完整性
|
| 185 |
|
| 186 |
+
## 📝 更新日志
|
| 187 |
|
| 188 |
+
- **v1.0.0**: 初始版本,支持 SQLite 和 GitHub 备份
|
| 189 |
+
|
| 190 |
+
## 🤝 贡献
|
| 191 |
+
|
| 192 |
+
欢迎提交 Issue 和 Pull Request!
|
| 193 |
+
|
| 194 |
+
## 📄 许可证
|
| 195 |
|
| 196 |
+
本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。
|
| 197 |
|
| 198 |
+
---
|
| 199 |
|
| 200 |
+
**注意**: 这是一个为 Hugging Face Spaces 特别优化的 WordPress 部署方案。如果你需要在其他平台部署,可能需要调整配置。
|
app.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Hugging Face Space entry point for WordPress with SQLite
|
| 4 |
+
This file is required by Hugging Face Spaces to properly start the Docker container.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import os
|
| 8 |
+
import subprocess
|
| 9 |
+
import time
|
| 10 |
+
import sys
|
| 11 |
+
|
| 12 |
+
def main():
|
| 13 |
+
"""
|
| 14 |
+
Main entry point for the Hugging Face Space
|
| 15 |
+
This will start the WordPress container and keep it running
|
| 16 |
+
"""
|
| 17 |
+
print("🚀 Starting WordPress with SQLite for Hugging Face Space...")
|
| 18 |
+
|
| 19 |
+
# Check if we're running in a Docker container
|
| 20 |
+
if os.path.exists('/.dockerenv'):
|
| 21 |
+
print("✅ Running inside Docker container")
|
| 22 |
+
# If we're in Docker, the container should already be set up
|
| 23 |
+
# Just keep the process alive
|
| 24 |
+
try:
|
| 25 |
+
while True:
|
| 26 |
+
time.sleep(60)
|
| 27 |
+
# Optional: Add health check here
|
| 28 |
+
print("💓 WordPress container is running...")
|
| 29 |
+
except KeyboardInterrupt:
|
| 30 |
+
print("\n🛑 Shutting down WordPress...")
|
| 31 |
+
sys.exit(0)
|
| 32 |
+
else:
|
| 33 |
+
print("❌ This should run inside a Docker container")
|
| 34 |
+
print("Please deploy this to Hugging Face Spaces with Docker SDK")
|
| 35 |
+
sys.exit(1)
|
| 36 |
+
|
| 37 |
+
if __name__ == "__main__":
|
| 38 |
+
main()
|
requirements.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Requirements for Hugging Face Space
|
| 2 |
+
# This WordPress deployment primarily uses Docker,
|
| 3 |
+
# but this file is included for HF Space compatibility
|
| 4 |
+
|
| 5 |
+
# Basic Python dependencies (minimal)
|
| 6 |
+
requests>=2.25.0
|
spaces.yml
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
title: WordPress with SQLite
|
| 2 |
+
sdk: docker
|
| 3 |
+
app_port: 7860
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: purple
|
| 6 |
+
short_description: WordPress with SQLite database and GitHub backup support
|
| 7 |
+
description: |
|
| 8 |
+
A complete WordPress installation with SQLite database support, optimized for Hugging Face Spaces.
|
| 9 |
+
Features include:
|
| 10 |
+
- SQLite database (no external database required)
|
| 11 |
+
- GitHub automatic backup and restore
|
| 12 |
+
- Optimized for Hugging Face Spaces
|
| 13 |
+
- Easy deployment and management
|
| 14 |
+
|
| 15 |
+
tags:
|
| 16 |
+
- wordpress
|
| 17 |
+
- sqlite
|
| 18 |
+
- cms
|
| 19 |
+
- blog
|
| 20 |
+
- website
|
| 21 |
+
- backup
|
| 22 |
+
- github
|
| 23 |
+
|
| 24 |
+
license: mit
|
| 25 |
+
|
| 26 |
+
# Environment variables (optional)
|
| 27 |
+
# Users can set these in their Space settings:
|
| 28 |
+
# GITHUB_TOKEN: GitHub Personal Access Token for backup functionality
|
| 29 |
+
# GITHUB_REPO: GitHub repository path (username/repository-name) for backups
|