Reference: digital ocean doc | Credit to bradtraversy
- "$" 있는 명령 : 로컬
- "#" 있는 명령 : 원격 서버 (이 경우 Digital Ocean)
그 다음,
You can choose to create SSH keys to login if you want. If not, you will get the password sent to your email to login via SSH 원하는 경우 로그인 할 SSH 키를 만들도록 선택할 수 있습니다. 그렇지 않은 경우 SSH를 통해 로그인 할 수 있도록 이메일로 비밀번호가 전송됩니다.
To generate a key on your local machine 로컬 컴퓨터에서 키를 생성
$ ssh-keygen
Hit enter all the way through and it will create a public and private key at the end 엔터를 끝까지 누르면 공개 및 개인 키가 생성됩니다.
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
You want to copy the public key (.pub file) 공개 키 (.pub 파일)를 복사
$ cat ~/.ssh/id_rsa.pub
or
$ pbcopy < ~/.ssh/id_rsa.pub
Copy the entire output and add as an SSH key for Digital Ocean 전체 출력을 복사하고 Digital Ocean 용 SSH 키로 추가 서버에 로그인
If you setup SSH keys correctly the command below will let you right in. If you did not use SSH keys, it will ask for a password. This is the one that was mailed to you
$ ssh root@YOUR_SERVER_IP
It will ask for a password, use something secure. You can just hit enter through all the fields. I used the user "djangoadmin" but you can use anything
# adduser djangoadmin
# usermod -aG sudo djangoadmin
Now we need to setup SSH keys for the new user. You will need to get them from your local machine
You need to copy the key from your local machine so either exit or open a new terminal
# exit
You can generate a different key if you want but we will use the same one so lets output it, select it and copy it
$ cat ~/.ssh/id_rsa.pub
or
$ pbcopy < ~/.ssh/id_rsa.pub
$ ssh root@YOUR_SERVER_IP
Navigate to the new users home folder and create a file at '.ssh/authorized_keys' and paste in the key 새 사용자 홈 폴더로 이동하여 '.ssh / authorized_keys'에 파일을 만들고 키에 붙여 넣습니다.
# cd /home/djangoadmin
# mkdir .ssh
# cd .ssh
# nano authorized_keys
>>> Paste the key and hit "ctrl-x", hit "y" to save and "enter" to exit
$ ssh djangoadmin@YOUR_SERVER_IP
# sudo nano /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
# sudo systemctl reload sshd
See which apps are registered with the firewall
# sudo ufw app list
Allow OpenSSH
# sudo ufw allow OpenSSH
# sudo ufw enable
# sudo ufw status
We are now done with access and security and will move on to installing software 이제 액세스 및 보안이 완료되었으며 소프트웨어 설치로 넘어갈 것입니다.
# sudo apt update
# sudo apt upgrade
# sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl
# sudo -u postgres psql
You should now be logged into the pg shell
CREATE DATABASE btre_prod;
CREATE USER dbadmin WITH PASSWORD 'abc123!';
ALTER ROLE dbadmin SET client_encoding TO 'utf8';
ALTER ROLE dbadmin SET default_transaction_isolation TO 'read committed';
ALTER ROLE dbadmin SET timezone TO 'UTC';
//ALTER ROLE dbadmin WITH SUPERUSER; -> makes dbadmin SUPERUSER
GRANT ALL PRIVILEGES ON DATABASE btre_prod TO dbadmin;
\q
You need to install the python3-venv package
# sudo apt install python3-venv
# mkdir pyapps
# cd pyapps
# python3 -m venv venv
# source venv/bin/activate
From your local machine, create a requirements.txt with your app dependencies. Make sure you push this to your repo 로컬 머신에서 앱 종속성이있는 requirements.txt를 만듭니다. 이것을 저장소에 푸시하십시오
$ pip freeze > requirements.txt
Create a new repo and push to it (you guys know how to do that) 새 저장소를 만들고 git push
# git clone https://github.com/yourgithubname/btre_project.git
# pip install -r requirements.txt
Add code to your settings.py file and push to server settings.py 파일에 코드를 추가하고 서버에 푸시
try:
from .local_settings import *
except ImportError:
pass
// MAKE SURE you cd into your Djnago "project folder" (= where wsgi.py & settings.py exist; in this case it's "btre_project") // Djnago "프로젝트 폴더"(= wsgi.py 및 settings.py가 존재하는 곳,이 경우 "btre_project")로 cd했는지 확인합니다.
Create a file called local_settings.py on your server along side of settings.py and add the following settings.py 외에, 서버에 local_settings.py라는 파일을 만들고 다음을 추가하십시오.
- SECRET_KEY
- ALLOWED_HOSTS
- DATABASES
- DEBUG
- EMAIL_*
# python manage.py makemigrations
# python manage.py migrate
# python manage.py createsuperuser
python manage.py collectstatic
# sudo ufw allow 8000
# python manage.py runserver 0.0.0.0:8000
Add some data in the admin area
Install gunicorn
# pip install gunicorn
Add to requirements.txt
# pip freeze > requirements.txt
# gunicorn --bind 0.0.0.0:8000 btre.wsgi
Your images, etc will be gone
ctrl-c
# deactivate
# sudo nano /etc/systemd/system/gunicorn.socket
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
# sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=djangoadmin
Group=www-data
WorkingDirectory=/home/djangoadmin/pyapps/btre_project
ExecStart=/home/djangoadmin/pyapps/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
btre.wsgi:application
[Install]
WantedBy=multi-user.target
# sudo systemctl start gunicorn.socket
# sudo systemctl enable gunicorn.socket
# sudo systemctl status gunicorn.socket
# file /run/gunicorn.sock
# sudo nano /etc/nginx/sites-available/btre_project
server {
listen 80;
server_name YOUR_IP_ADDRESS;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/djangoadmin/pyapps/btre_project;
}
location /media/ {
root /home/djangoadmin/pyapps/btre_project;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
# sudo ln -s /etc/nginx/sites-available/btre_project /etc/nginx/sites-enabled
# sudo nginx -t
# sudo systemctl restart nginx
# sudo ufw delete allow 8000
# sudo ufw allow 'Nginx Full'
Open up the nginx conf file
# sudo nano /etc/nginx/nginx.conf
client_max_body_size 20M;
# sudo systemctl restart nginx
You may have some issues with images not showing up. I would suggest, deleting all data and starting fresh as well as removeing the "photos" folder in the "media folder"
# sudo rm -rf media/photos
Go to your domain registrar and create the following a record
@ A Record YOUR_IP_ADDRESS
www CNAME example.com
ALLOWED_HOSTS = ['IP_ADDRESS', 'example.com', 'www.example.com']
server {
listen: 80;
server_name xxx.xxx.xxx.xxx example.com www.example.com;
}
# sudo systemctl restart nginx
# sudo systemctl restart gunicorn