Git 基本配置
首先,设置你电脑的Git身份:
git config --global user.name "Vitor Freitas"git config --global user.email vitor@simpleisbetterthancomplex.com
译者注:
git config --global user.name “xxx”:设置git操作者名称
git config --global user.email “email”:设置git操作者邮箱 这2个配置的名字和邮箱,会记录在git操作记录中。
在项目根目录(与manage.py相同的目录)中,初始化一个git存储库:
git init
Initialized empty Git repository in /Users/vitorfs/Development/myproject/.git/
检查存储库的状态:
git status
On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) accounts/ boards/ manage.py myproject/ requirements.txt static/ templates/ nothing added to commit but untracked files present (use "git add" to track)
在继续添加源文件之前,请在项目根目录中创建名为.gitignore的新文件。这个特殊的文件将帮助我们保持Git仓库的干净,保证缓存文件或日志这样的不必要的文件不会添加到Git仓库中。
您可以从 GitHub 获取 Python项目的通用.gitignore文件。
确保将它从 Python.gitignore 重命名为 .gitignore(点很重要!)。
您可以补充 .gitignore 文件内容,告诉它(Git)忽略SQLite数据库文件,例如:
.gitignore 文件内容:
__pycache__/ *.py[cod] .env venv/ SQLite database files *.sqlite3
现在将文件添加到存储库:
git add .
请注意上面add
后面有一个点。上面的命令告诉Git 在当前目录中添加所有未跟踪的文件。(译者注,点表示所有,整句就表示添加所以文件到Git,除了.gitignore文件列出的要忽略。)
现在进行第一次提交:
git commit -m "Initial commit"
一定要写一个注释说明这个提交是什么,简要描述你改变了什么。
Git 远程仓库
现在让我们将 GitHub 设置为远程仓库。首先,在GitHub上创建一个免费帐户,然后在电子邮件中点击GitHub发来的验证链接确认您的电子邮件地址。然后您就能在GitHub上创建公开仓库(译者注:GitHub公开仓库是免费的,私有仓库收费。)。
现在,只需为仓库创建一个名称,不要勾选使用自述文件初始化它(initialize this repository with a README),也不要添加 Add .gitignore
或添加 Add a license
许可证。确保仓库开始为空:
创建仓库后,您应该看到如下内容:
现在让我们将其配置为我们的远程仓库:
git remote add origin git@github.com:sibtc/django-boards.git
现在将代码推送到远程服务器,即GitHub仓库:
git push origin master Counting objects: 84, done. Delta compression using up to 4 threads. Compressing objects: 100% (81/81), done. Writing objects: 100% (84/84), 319.70 KiB | 0 bytes/s, done. Total 84 (delta 10), reused 0 (delta 0) remote: Resolving deltas: 100% (10/10), done. To git@github.com:sibtc/django-boards.git * [new branch] master -> master
我创建此仓库只是为了演示使用现有代码库创建远程仓库的过程。该项目的源代码正式托管在此仓库中:https://github.com/sibtc/django-beginners-guide。
项目配置
无论代码是存储在公共或私有远程仓库中,都不应提交敏感信息并将其推送到远程仓库。这包括密钥,密码,API密钥等。
此时,我们必须在 settings.py 模块中处理两种特定类型的配置:
密钥和密码等敏感信息;
针对特定的环境配置。
密码和密钥可以存储在环境变量中或使用本地文件(未提交到远程仓库):
# environment variablesimport os SECRET_KEY = os.environ['SECRET_KEY']# or local fileswith open('/etc/secret_key.txt') as f: SECRET_KEY = f.read().strip()
为此, 我在我开发的每个Django项目中都使用了一个名为 Python Decouple 的优秀实用功能库。它将搜索名为 .env 的本地文件以设置这配置变量,并将内容配置到环境变量。它还提供了一个定义默认值的接口,在适当时将数据转换为int,bool和list。
这不是强制性的,但我真的觉得它是一个非常有用的工具。它像Heroku这样的服务一样有魅力。
首先,让我们安装它:
pip install python-decouple
myproject/settings.py
from decouple import config SECRET_KEY = config('SECRET_KEY')
现在,我们可以将敏感信息放在一个名为.env的特殊文件中(注意前面的点),该文件位于manage.py文件所在的目录中:
myproject/ |-- myproject/ | |-- accounts/ | |-- boards/ | |-- myproject/ | |-- static/ | |-- templates/ | |-- .env <-- here! | |-- .gitignore | |-- db.sqlite3 | +-- manage.py +-- venv/
.env 文件内容:
SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
该.ENV文件中忽略的.gitignore文件,所以每次我们要部署应用程序或在不同的机器上运行时,我们将创建一个.ENV文件,并添加必要的配置。
现在让我们安装另一个库来帮助我们用简单一行代码来编写数据库连接。这样,在不同的环境中编写不同的数据库连接字符串会更容易:
pip install dj-database-url
目前,我们需要解耦的全部配置:
myproject/settings.py
from decouple import config, Csvimport dj_database_url SECRET_KEY = config('SECRET_KEY') DEBUG = config('DEBUG', default=False, cast=bool) ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv()) DATABASES = { 'default': dj_database_url.config( default=config('DATABASE_URL') ) }
本地计算机的.env文件示例:
SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d DEBUG=True ALLOWED_HOSTS=.localhost,127.0.0.1
请注意,在DEBUG配置中我们给了一个默认值(True),因此在生产环境中我们可以忽略(注释)此配置,因此它将被自动设置为False,因为它生产环境应该是False的。
现在ALLOWED_HOSTS将被转换成一个列表['.localhost', '127.0.0.1'. ]。现在,这是在我们的本地机器上,为了生产,我们将其设置为类似于['.djangoboards.com', ]您拥有的任何域名。
这特定配置可确保您的应用程序仅提供给这个域名。
记录依赖库版本
跟踪项目的依赖关系是一个很好的做法,因此另一台机器上更容易安装它(依赖的环境)。
我们可以通过运行下面的命令来检查当前安装的Python依赖库:
pip freeze dj-database-url==0.4.2 Django==1.11.6 django-widget-tweaks==1.4.1 Markdown==2.6.9 python-decouple==3.1 pytz==2017.2
在项目根目录中创建名为requirements.txt的文件,并在其中添加依赖项(就是上面 pip freeze
得到的项目所有的依赖库):
requirements.txt 文件内容:
dj-database-url==0.4.2 Django==1.11.6 django-widget-tweaks==1.4.1 Markdown==2.6.9 python-decouple==3.1
我保留了pytz == 2017.2,因为它是由Django自动安装的。
您可以更新源代码仓库:
git add . git commit -m "Add requirements.txt file"git push origin master
域名
如果我们要正确部署Django应用程序,我们将需要一个域名(译者注:如果部署外网,给别人使用需要域名,但如果是内网使用,只有IP地址也可以访问。此处,作者意思要处理上线外网。)。拥有域名来为应用程序提供服务,配置电子邮件服务和配置https证书非常重要。
最近,我一直在使用 Namecheap 。您可以以8.88美元/年的价格获得.com域名,或者如果您只是尝试一下,您可以用 0.99美元/年 的价格注册.xyz域名。(译者注:在中国,可以注册阿里云、腾讯云等著名的注册商都有域名卖买,大家可自行搜索官网。)
无论如何,您可以自由使用任何注册商。为了演示部署过程,我注册了 www.DjangoBoards.com 域名。
部署策略
以下是我们将在本教程中使用的部署策略的概述:
云服务是使用 Digital Ocean 提供的虚拟专用服务器。您可以使用我的会员链接注册Digital Ocean以获得 免费的10美元信用额度(仅适用于新帐户)。(译者注:云服务商在中国可选择阿里云、腾讯云)
首先我们将使用 NGINX(译者注:Nginx是一个异步框架的 Web服务器,通常作为负载均衡器。),其商标是食人魔。NGINX将收到访问者对服务器的所有请求。但如果请求数据,它不会尝试做任何不聪明的事情(译者注:Nginx主要负责处理请求,并分发给文件系统或HTTP服务器等。)。它所要做的就是确定所请求的信息是否是一个可以自行提供的静态资源,或者它是否更复杂。如果是,它会将请求传递给 Gunicorn(译者注:Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。)。
NGINX 还将配置 HTTPS证书。这意味着它只接受通过HTTPS的请求。如果客户端尝试通过HTTP请求,NGINX将首先将用户重定向到HTTPS,然后它才会决定如何处理请求链接。
我们还将安装此 certbot 以自动续订 Let’s Encrypt 的证书。(译者注:想了解更多内容,可阅读HTTPS 简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程 | Linux Story。)
Gunicorn是一个应用服务器。根据服务器拥有的CPU处理器数量,它可以通过生成多个同时工作的程序以并行处理多个请求。它管理工作负载并执行Python和Django代码。
Django是一个努力工作的代表。它可以访问数据库(PostgreSQL)或文件系统。但在大多数情况下,工作是在视图内部完成,渲染模板,以及过去几周我们编写过的所有内容。在Django处理请求之后,它会向Gunicorn返回一个响应,他将结果返回给NGINX,最终将响应传递给客户端。
我们还将安装PostgreSQL,一个优秀的数据库系统。由于Django的ORM系统,很容易切换数据库。(译者注:PostgreSQL被业界誉为“最先进的开源数据库”,面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore)、支持GIS地理信息处理。)
最后一步是安装Supervisor。它是一个过程控制系统,它将密切关注Gunicorn和Django,以确保一切顺利进行。如果服务器重新启动,或者Gunicorn崩溃,它将自动重启。(译者注:Supervisor是一个Python开发的client/server系统,可以管理和监控服务器上面的进程的工具。)
部署到VPS
您可以使用您喜欢的任何其他VPS(虚拟专用服务器)。配置应该非常相似,毕竟我们将使用Ubuntu 16.04 作为我们的服务器。
首先,让我们创建一个新的服务器(在Digital Ocean上,他们称之为“Droplet”)。选择Ubuntu 16.04:
选择尺寸。最小的空间就足够了:
然后为您的Droplet选择一个主机名(在我的例子为“django-boards”):
如果您有SSH密钥,则可以将其添加到您的帐户。然后,您将能够使用它登录服务器。否则,他们会通过电子邮件向您发送root密码。(译者注:SSH密钥可以不用输入密码就链接到服务器,具体可自行搜索了解更多。)
现在选择服务器的IP地址:
在我们登录服务器之前,让我们将域名指向此IP地址。这将节省一些时间,因为DNS设置通常需要几分钟才能传播。
所以这里我们添加了两条A记录,一条指向主域名“djangoboards.com”,另一条指向“www.djangoboards.com”。我们将使用NGINX配置规范URL。
现在让我们使用终端登录服务器:
ssh root@45.55.144.54root@45.55.144.54's password:
然后你应该看到以下消息:
You are required to change your password immediately (root enforced) Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Get cloud support with Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud0 packages can be updated.0 updates are security updates. Last login: Sun Oct 15 18:39:21 2017 from 82.128.188.51Changing password for root. (current) UNIX password:
设置新密码,然后开始配置服务器。
sudo apt-get update sudo apt-get -y upgrade
如果在升级过程中收到任何提示,请选择"keep the local version currently installed"(保持当前安装的本地版本)选项。
Python 3.6
sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt-get install python3.6
PostgreSQL
sudo apt-get -y install postgresql postgresql-contrib
NGINX
sudo apt-get -y install nginx
Supervisor
sudo apt-get -y install supervisor sudo systemctl enable supervisor sudo systemctl start supervisor
Virtualenv
wget https://bootstrap.pypa.io/get-pip.pysudo python3.6 get-pip.py sudo pip3.6 install virtualenv
应用用户
使用以下命令创建新用户:
adduser boards
通常,我只选择应用程序的名称。输入密码,并可选择在提示中添加一些额外信息。
现在将用户添加到sudoers列表:
gpasswd -a boards sudo
PostgreSQL数据库配置
首先切换到postgres用户:
sudo su - postgres
创建数据库用户:
createuser u_boards
创建一个新数据库并将用户设置为所有者:
createdb django_boards --owner u_boards
为用户定义一个强密码:
psql -c "ALTER USER u_boards WITH PASSWORD 'BcAZoYWsJbvE7RMgBPzxOCexPRVAq'"
我们现在可以退出postgres用户了:
exit
Django项目配置
切换到应用程序用户:
sudo su - boards
开始前,我们先检查终端的位置:
pwd/home/boards
首先,让我们用我们的代码克隆存储库:
git clone https://github.com/sibtc/django-beginners-guide.git
启动虚拟环境(virtualenv):
virtualenv venv -p python3.6
初始化virtualenv:
source venv/bin/activate
安装依赖的库(译者注:从文件中读取依赖进行安装。):
pip install -r django-beginners-guide/requirements.txt
我们再添加两个额外的库,Gunicorn和PostgreSQL驱动程序:
pip install gunicorn pip install psycopg2
现在在/home/boards/django-beginners-guide文件夹中,让我们创建一个.env文件来存储数据库凭据,密钥和其他所有内容:
/home/boards/django-beginners-guide/.env
SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d ALLOWED_HOSTS=.djangoboards.com DATABASE_URL=postgres://u_boards:BcAZoYWsJbvE7RMgBPzxOCexPRVAq@localhost:5432/django_boards
以下是数据库URL的语法:postgres://db_user
:db_password
@db_host
:db_port
/db_name
。
现在让我们迁移数据库,收集静态文件并创建一个超级用户:
cd django-beginners-guide
python manage.py migrateOperations to perform: Apply all migrations: admin, auth, boards, contenttypes, sessionsRunning migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying boards.0001_initial... OK Applying boards.0002_auto_20170917_1618... OK Applying boards.0003_topic_views... OK Applying sessions.0001_initial... OK
现在静态文件:
python manage.py collectstatic Copying '/home/boards/django-beginners-guide/static/js/jquery-3.2.1.min.js'Copying '/home/boards/django-beginners-guide/static/js/popper.min.js'Copying '/home/boards/django-beginners-guide/static/js/bootstrap.min.js'Copying '/home/boards/django-beginners-guide/static/js/simplemde.min.js'Copying '/home/boards/django-beginners-guide/static/css/app.css'Copying '/home/boards/django-beginners-guide/static/css/bootstrap.min.css'Copying '/home/boards/django-beginners-guide/static/css/accounts.css'Copying '/home/boards/django-beginners-guide/static/css/simplemde.min.css'Copying '/home/boards/django-beginners-guide/static/img/avatar.svg'Copying '/home/boards/django-beginners-guide/static/img/shattered.png'...
此命令将所有静态资产复制到外部目录,NGINX可以在该目录中为我们提供文件。稍后会详细介绍。
现在为应用程序创建一个超级用户:
python manage.py createsuperuser
作者:苍云横渡
链接:https://www.jianshu.com/p/792888b96c3f