博客迁移记录
之前在《决定转投 DigitalOcean》这篇文章中说了一下决定迁移网站的原因。 趁十一假期终于完成了博客的迁移工作,在此记录。
Dump PostgreSQL data
pg_dump -U laike9m -f dump.sql database1
生成 425KB 的 dump.sql, 下载到本地,scp 到 DO machine。安装 PostgreSQL:
sudo apt-get update sudo apt-get install postgresql postgresql-contrib
创建用户和数据库,参考 how-to-install-and-use-postgresql-on-ubuntu-14-04。 还要给用户 laike9m 数据库的管理员权限。先切到 postgres 用户,然后参考 error-must-be-owner-of-language-plpgsql 给 laike9m 管理员权限。
Load data
psql -U laike9m database1 < dump.sql
配置虚拟环境
安装 virtualenvwrapper,mkvirtualenv
, 安装依赖。在安装之前先sudo apt-get install libpq-dev sudo apt-get install python3-dev
因为要安装 psycopg2。
下载并修改代码
在家目录创建 static, media 文件夹作为STATIC_ROOT
和MEDIA_ROOT
。 clone 代码,clone media 文件夹,按照新路径修改 settings.py, 下载 media 文件。设定密码环境变量(实际上这个用不到了)。
之前的 Django 版本是 1.5,这次我想趁迁移升级成 1.8。参照官方的教程, 先把 south 从INSTALLED_APPS
中去掉,然后在 css3two_blog 文件夹中mkdir migrations cd migrations touch __init__.py
最后在根目录执行
python manage.py makemigrations
和python manage.py migrate --fake-initial
(blog)laike9m@laike9m1:~/Envs/blog/My_Blog$ python manage.py makemigrations Migrations for 'css3two_blog': 0001_initial.py: - Create model BlogPost - Create model BlogPostImage (blog)laike9m@laike9m1:~/Envs/blog/My_Blog$ python manage.py migrate --fake-initial Operations to perform: Synchronize unmigrated apps: staticfiles, admindocs, messages, mytemplatetags, contact_form Apply all migrations: css3two_blog, contenttypes, taggit, admin, auth, sites, sessions Synchronizing apps without migrations: Creating tables... Running deferred SQL... Installing custom SQL... Running migrations: Rendering model states... DONE Applying contenttypes.0001_initial... FAKED Applying auth.0001_initial... FAKED Applying admin.0001_initial... FAKED 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 taggit.0001_initial... FAKED Applying taggit.0002_auto_20150616_2121... OK Applying css3two_blog.0001_initial... FAKED Applying sessions.0001_initial... FAKED Applying sites.0001_initial... FAKED
最后拷贝静态文件
python manage.py collectstatic
用
runserver
启动测试服务器,通过 ip 访问网站并执行各种操作,均没有出现问题。
这里不得不赞一下 Django,原先以为 1.5 升级 1.8 将遇到各种问题,尤其是跨过了 1.7 这个内置 south 的重大改进版本,没想到居然顺利完成了。安装配置 Nginx, uWSGI
Nginx 我比较熟了,但是每次遇到 uWSGI 都很麻烦,这次也是。花了很长时间去解决 这个问题。后来发现在文档里已经有说明。
uWSGI 配置文件uwsgi.ini
如下[uwsgi] chdir = /home/laike9m/Envs/blog/My_Blog module = my_blog.wsgi:application home = /home/laike9m/Envs/blog/ master = true processes = 3 socket = /tmp/uwsgi.sock chmod-socket = 777 vacuum = true logto = /home/laike9m/uwsgi.log
Nginx 配置在这里。
原本想直接开个 screen 来运行 uwsgi,后来发现用 upstart 更好。 下面是 uWSGI 的配置文件/etc/init/uwsgi.conf
:env DJANGO_DB_PASSWORD= env EMAIL_HOST_PASSWORD= env LC_ALL=en_US.UTF-8 env LANG=en_US.UTF-8 start on runlevel [2345] stop on runlevel [!2345] setuid laike9m setgid www-data exec /usr/local/bin/uwsgi --ini /home/laike9m/Envs/blog/My_Blog/uwsgi.ini
这样之后用
sudo service uwsgi start/stop/restart
就能操作 uWSGI 了添加 HTTPS
证书还是用之前的,主要是修改 Nginx 配置。对 80 端口的访问要自动跳转。
这里只贴关键部分的配置。server { listen 80; server_name laike9m.com laike9m.com; return 301 https://$server_name$request_uri; } server { ... listen 443 ssl; server_name laike9m.com laike9m.com; ssl_certificate /home/laike9m/files/laike9m_com/laike9m_com.crt; ssl_certificate_key /home/laike9m/files/laike9m_com/key; ... }
基本就是这样了。