博客迁移记录

之前在《决定转投 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_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 的重大改进版本,没想到居然顺利完成了。

  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