diff --git a/.dockerignore b/.dockerignore index 3f424f5..fb372a4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,81 +1,9 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - - -# PyCharm -# http://www.jetbrains.com/pycharm/webhelp/project.html -.idea -.iml - +bin/data/ # virtualenv venv/ - migrations/ !migrations/__init__.py collectedstatic/ DjangoBlog/whoosh_index/ -google93fd32dbd906620a.html -baidu_verify_FlHL7cUyC9.html -BingSiteAuth.xml -cb9339dbe2ff86a5aa169d28dba5f615.txt -werobot_session -django.jpg uploads/ settings_production.py -werobot_session.db diff --git a/.gitignore b/.gitignore index b507a4a..42272c4 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,4 @@ django.jpg uploads/ settings_production.py werobot_session.db +bin/datas/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7e4239e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3 +ENV PYTHONUNBUFFERED 1 +WORKDIR /code/DjangoBlog/ +RUN apt-get install default-libmysqlclient-dev -y && \ + ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +ADD requirements.txt requirements.txt +RUN pip install -Ur requirements.txt -i https://mirrors.aliyun.com/pypi/simple && \ + pip install gunicorn[gevent] -i https://mirrors.aliyun.com/pypi/simple +ADD . . +#ENTRYPOINT ["/code/DjangoBlog/bin/docker_start.sh"] \ No newline at end of file diff --git a/bin/blog.lylinux.org b/bin/blog.lylinux.org deleted file mode 100644 index eb32a97..0000000 --- a/bin/blog.lylinux.org +++ /dev/null @@ -1,24 +0,0 @@ -server { - server_name blog.lylinux.org; - root /var/www/DjangoBlog/; - listen 80; - keepalive_timeout 70; - - location /static/ { - expires max; - alias /var/www/DjangoBlog/collectedstatic/; - } - - location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $http_host; - proxy_set_header X-NginX-Proxy true; - proxy_redirect off; - if (!-f $request_filename) { - proxy_pass http://127.0.0.1:8000; - break; - } - } - -} diff --git a/bin/docker_start.sh b/bin/docker_start.sh index c6c3249..2d7f1a8 100644 --- a/bin/docker_start.sh +++ b/bin/docker_start.sh @@ -12,15 +12,15 @@ echo "Starting $NAME as `whoami`" # Activate the virtual environment cd $DJANGODIR -export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE + export PYTHONPATH=$DJANGODIR:$PYTHONPATH #pip install -Ur requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com && \ # pip install gunicorn -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com -python manage.py makemigrations -python manage.py migrate -python manage.py collectstatic --noinput -python manage.py compress --force -python manage.py build_index +python manage.py makemigrations && \ + python manage.py migrate && \ + python manage.py collectstatic --noinput && \ + python manage.py compress --force && \ + python manage.py build_index && \ # Start your Django Unicorn # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon) exec gunicorn ${DJANGO_WSGI_MODULE}:application \ diff --git a/bin/nginx.conf b/bin/nginx.conf new file mode 100644 index 0000000..24306ce --- /dev/null +++ b/bin/nginx.conf @@ -0,0 +1,50 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + 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; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + server { + root /code/DjangoBlog/collectedstatic/; + listen 80; + keepalive_timeout 70; + location /static/ { + expires max; + alias /code/DjangoBlog/collectedstatic/; + } + location / { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + proxy_redirect off; + if (!-f $request_filename) { + proxy_pass http://djangoblog:8000; + break; + } + } + } +} \ No newline at end of file diff --git a/blog/management/commands/build_index.py b/blog/management/commands/build_index.py index 39e4bce..1c5a5b1 100644 --- a/blog/management/commands/build_index.py +++ b/blog/management/commands/build_index.py @@ -11,10 +11,10 @@ @time: 2019-04-20 20:39 """ -from blog.documents import ElapsedTimeDocument, ArticleDocumentManager, ElaspedTimeDocumentManager +from blog.documents import ElapsedTimeDocument, ArticleDocumentManager, ElaspedTimeDocumentManager, \ + ELASTICSEARCH_ENABLED from django.core.management.base import BaseCommand -from blog.models import Article # TODO 参数化 @@ -22,9 +22,10 @@ class Command(BaseCommand): help = 'build search index' def handle(self, *args, **options): - manager = ElapsedTimeDocument() - ElaspedTimeDocumentManager.delete_index() - manager.init() - manager = ArticleDocumentManager() - manager.delete_index() - manager.rebuild() + if ELASTICSEARCH_ENABLED: + manager = ElapsedTimeDocument() + ElaspedTimeDocumentManager.delete_index() + manager.init() + manager = ArticleDocumentManager() + manager.delete_index() + manager.rebuild() diff --git a/blog/management/commands/create_testdata.py b/blog/management/commands/create_testdata.py index 24a578f..e979711 100644 --- a/blog/management/commands/create_testdata.py +++ b/blog/management/commands/create_testdata.py @@ -16,8 +16,7 @@ from django.core.management.base import BaseCommand from blog.models import Article, Tag, Category from django.contrib.auth import get_user_model -from django.core.exceptions import ObjectDoesNotExist -import datetime +from django.contrib.auth.hashers import make_password class Command(BaseCommand): @@ -25,7 +24,7 @@ class Command(BaseCommand): def handle(self, *args, **options): user = get_user_model().objects.get_or_create( - email='test@test.com', username='测试用户', password='test!q@w#eTYU')[0] + email='test@test.com', username='测试用户', password=make_password('test!q@w#eTYU'))[0] pcategory = Category.objects.get_or_create( name='我是父类目', parent_category=None)[0] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..42c75d6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,66 @@ +version: '3' + +services: + db: + image: mysql:latest + restart: always + command: + - mysqld + - --max_connections=3000 + - --wait_timeout=600 + - --interactive_timeout=600 + - --thread_cache_size=50 + - --default-authentication-plugin=mysql_native_password + - --character-set-server=utf8 + - --collation-server=utf8_general_ci + environment: + - MYSQL_DATABASE=djangoblog + - MYSQL_ROOT_PASSWORD=DjAnGoBlOg!2!Q@W#E + ports: + - 3306:3306 + volumes: + - ./bin/datas/mysql/:/var/lib/mysql + depends_on: + - memcached + container_name: db + + djangoblog: + build: . + restart: always + command: bash -c 'sh /code/DjangoBlog/bin/docker_start.sh' + ports: + - "8000:8000" + volumes: + - ./collectedstatic:/code/DjangoBlog/collectedstatic + environment: + - DJANGO_MYSQL_DATABASE=djangoblog + - DJANGO_MYSQL_USER=root + - DJANGO_MYSQL_PASSWORD=DjAnGoBlOg!2!Q@W#E + - DJANGO_MYSQL_HOST=db + - DJANGO_MYSQL_PORT=3306 + - DJANGO_MEMCACHED_LOCATION=memcached:11211 + links: + - db + - memcached + depends_on: + - db + container_name: djangoblog + nginx: + restart: always + image: nginx:latest + ports: + - "80:80" + - "443:443" + volumes: + - ./bin/nginx.conf:/etc/nginx/nginx.conf + - ./collectedstatic:/code/DjangoBlog/collectedstatic + links: + - djangoblog:djangoblog + container_name: nginx + + memcached: + restart: always + image: memcached:latest + container_name: memcached + ports: + - "11211:11211" diff --git a/docker-support/Dockerfile b/docker-support/Dockerfile deleted file mode 100644 index 4076955..0000000 --- a/docker-support/Dockerfile +++ /dev/null @@ -1,69 +0,0 @@ -FROM alpine:3.11 -WORKDIR /app - -COPY ./requirements.txt . - -RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.11/main" > /etc/apk/repositories \ -&& echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.11/community" >> /etc/apk/repositories \ -&& echo "https://mirror.tuna.tsinghua.edu.cn/alpine/edge/testing" >> /etc/apk/repositories - -RUN apk --update --no-cache add python3 py3-pip py-gunicorn nginx mariadb-connector-c \ - && apk --update --no-cache add --virtual .build-deps \ - tzdata \ - # mysqlclient dependencies - python3-dev \ - mariadb-connector-c-dev \ - gcc \ - musl-dev \ - # Pillow dependencies - jpeg-dev \ - zlib-dev \ - freetype-dev \ - lcms2-dev \ - openjpeg-dev \ - tiff-dev \ - tk-dev \ - tcl-dev \ - harfbuzz-dev \ - fribidi-dev \ - && pip3 install --upgrade pip \ - && mkdir -p /run/nginx \ - && pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \ - && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ - && echo "Asia/Shanghai" > /etc/timezone \ - && apk del .build-deps - -COPY . . -RUN python3 manage.py collectstatic --noinput \ - && python3 manage.py compress --force - -COPY ./docker-support/nginx.conf /etc/nginx/conf.d/default.conf - -ENV DJANGO_DEBUG False -ENV DJANGO_SECRET_KEY DJANGO_BLOG_CHANGE_ME - -ENV DJANGO_MYSQL_DATABASE djangoblog -ENV DJANGO_MYSQL_USER root -ENV DJANGO_MYSQL_PASSWORD djangoblog_123 -ENV DJANGO_MYSQL_HOST 127.0.0.1 -ENV DJANGO_MYSQL_PORT 3306 - -ENV DJANGO_MEMCACHED_ENABLE True -ENV DJANGO_MEMCACHED_LOCATION 127.0.0.1:11211 - -ENV DJANGO_BAIDU_NOTIFY_URL http://data.zz.baidu.com/urls?site=https://www.example.org&token=CHANGE_ME - -ENV DJANGO_EMAIL_TLS False -ENV DJANGO_EMAIL_SSL True -ENV DJANGO_EMAIL_HOST smtp.example.org -ENV DJANGO_EMAIL_PORT 465 -ENV DJANGO_EMAIL_USER SMTP_USER_CHANGE_ME -ENV DJANGO_EMAIL_PASSWORD SMTP_PASSWORD_CHANGE_ME - -ENV DJANGO_ADMIN_EMAIL admin@example.org - -ENV DJANGO_WXADMIN_PASSWORD DJANGO_BLOG_CHANGE_ME -ENV DJANGO_WEROBOT_TOKEN DJANGO_BLOG_CHANGE_ME - -EXPOSE 80 -ENTRYPOINT ["sh","./docker-support/entrypoint.sh"] diff --git a/docker-support/README.md b/docker-support/README.md deleted file mode 100644 index c3beec8..0000000 --- a/docker-support/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Docker 支持 - -## 使用 docker-compose 快速搭建开发环境(MySQL / Memcached) - -我们提供了 `dev-environment-setup.yml` 用于快速搭建开发环境。 - -```shell script -docker-compose -f ./docker-support/dev-environment-setup.yml up -``` - -运行这条命令后,可以快速搭建起以下环境: - -- MySQL 5.7 - 端口 `3306`,用户名 `root`,密码 `djangoblog_123`,自动以 UTF8MB4 编码创建 `djangoblog` 数据库 -- Memcached - 端口 `11211` - -## 构建镜像 - -```shell script -docker build -f .\docker-support\Dockerfile -t <你的 Docker Hub 用户名>/django_blog:latest . -``` - -## 运行自定义指令(例如数据库迁移) - -```shell script -docker run -it --rm <你的 Docker Hub 用户名>/django_blog:latest <指令> -``` -### DJANGO_MYSQL_HOST获取:宿主机输入 ifconfig 中的docker0的inet addr - -例如: - -```shell script -docker run -it --rm -e DJANGO_MYSQL_HOST=192.168.231.50 django_blog/django_blog:latest makemigrations -docker run -it --rm -e DJANGO_MYSQL_HOST=192.168.231.50 django_blog/django_blog:latest migrate -docker run -it --rm -e DJANGO_MYSQL_HOST=192.168.231.50 django_blog/django_blog:latest createsuperuser -``` - -## 环境变量清单 - -| 环境变量名称 | 默认值 | 备注 | -|---------------------------|----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| -| DJANGO_DEBUG | False | | -| DJANGO_SECRET_KEY | DJANGO_BLOG_CHANGE_ME | 请务必修改,建议[随机生成](https://www.random.org/passwords/?num=5&len=24&format=html&rnd=new) | -| DJANGO_MYSQL_DATABASE | djangoblog | | -| DJANGO_MYSQL_USER | root | | -| DJANGO_MYSQL_PASSWORD | djangoblog_123 | | -| DJANGO_MYSQL_HOST | 127.0.0.1 | | -| DJANGO_MYSQL_PORT | 3306 | | -| DJANGO_MEMCACHED_ENABLE | True | | -| DJANGO_MEMCACHED_LOCATION | 127.0.0.1:11211 | | -| DJANGO_BAIDU_NOTIFY_URL | http://data.zz.baidu.com/urls?site=https://www.example.org&token=CHANGE_ME | 请在[百度站长平台](https://ziyuan.baidu.com/linksubmit/index)获取接口地址 | -| DJANGO_EMAIL_TLS | False | | -| DJANGO_EMAIL_SSL | True | | -| DJANGO_EMAIL_HOST | smtp.example.org | | -| DJANGO_EMAIL_PORT | 465 | | -| DJANGO_EMAIL_USER | SMTP_USER_CHANGE_ME | | -| DJANGO_EMAIL_PASSWORD | SMTP_PASSWORD_CHANGE_ME | | -| DJANGO_ADMIN_EMAIL | admin@example.org | | -| DJANGO_WEROBOT_TOKEN | DJANGO_BLOG_CHANGE_ME | 请使用自己的微信公众号通信令牌(Token) | diff --git a/docker-support/dev-environment-setup.yml b/docker-support/dev-environment-setup.yml deleted file mode 100644 index cd9028d..0000000 --- a/docker-support/dev-environment-setup.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: '3' -services: - mysql: - image: mysql:5.7 - restart: always - environment: - MYSQL_ROOT_PASSWORD: djangoblog_123 - MYSQL_DATABASE: djangoblog - volumes: - - mysql:/var/lib/mysql - ports: - - '3306:3306' - command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci - memcached: - image: memcached:1.6-alpine - restart: always - ports: - - '11211:11211' - command: memcached -m 64 -volumes: - mysql: ~ diff --git a/docker-support/entrypoint.sh b/docker-support/entrypoint.sh deleted file mode 100644 index d2f64e0..0000000 --- a/docker-support/entrypoint.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -cd /app - -if [ $# -eq 0 ]; then - nginx - gunicorn DjangoBlog.wsgi:application \ - --name djangoblog \ - --user root \ - --group root \ - --bind 127.0.0.1:8000 \ - --log-level=debug \ - --log-file=- \ - --workers $(grep -c ^processor /proc/cpuinfo) \ - --worker-class gevent -else - python3 ./manage.py $1 -fi diff --git a/docker-support/nginx.conf b/docker-support/nginx.conf deleted file mode 100644 index 23e6673..0000000 --- a/docker-support/nginx.conf +++ /dev/null @@ -1,22 +0,0 @@ -server { - root /app/; - listen 80; - keepalive_timeout 70; - - location /static/ { - expires max; - alias /app/collectedstatic/; - } - - location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $http_host; - proxy_set_header X-NginX-Proxy true; - proxy_redirect off; - if (!-f $request_filename) { - proxy_pass http://127.0.0.1:8000; - break; - } - } -}