博客迁移记录

之前在《决定转投 DigitalOcean》这篇文章中说了一下决定迁移网站的原因。 趁十一假期终于完成了博客的迁移工作,在此记录。

  1. 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 管理员权限。

  2. Load data

    psql -U laike9m database1 < dump.sql
    
  3. 配置虚拟环境
    安装 virtualenvwrapper,mkvirtualenv, 安装依赖。在安装之前先

    sudo apt-get install libpq-dev
    sudo apt-get install python3-dev
    

    因为要安装 psycopg2。

  4. 下载并修改代码
    在家目录创建 static, media 文件夹作为 STATIC_ROOTMEDIA_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 makemigrationspython 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 的重大改进版本,没想到居然顺利完成了。

  5. 安装配置 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 了

  6. 添加 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;
        ...
    }
    


    基本就是这样了。

comments powered by Disqus

top