backend_and_cms/deployment.md

163 lines
5.3 KiB
Markdown
Raw Normal View History

2024-11-30 13:26:24 +08:00
# Web Deployment
* DNS add cms, adminer, traefik, oneandallmusic.net
* Check the env file
* check the env file in frontend, VITE_IMAGE_URL is corrent
Using Services
* godaddy for domain
* google map
* cloudflare for dns nameserver and image storage(r2)
* hostinger for vps
## Public Traefik
2024-09-17 12:11:39 +08:00
2024-10-28 19:13:10 +08:00
Go to local usr/local/
2024-09-17 12:11:39 +08:00
```bash
2024-10-28 19:13:10 +08:00
mkdir traefik-public
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
mkdir web_backend
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
cd web_backend
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
git init
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
git pull https://git.develop-cat.com/all_in_one/backend_and_cms.git
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
cp docker-compose.traefik.yml ../traefik-public
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
cd ../
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
docker network create traefik-public
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
cd traefik-public
2024-09-17 12:11:39 +08:00
```
```bash
2024-10-28 19:13:10 +08:00
USERNAME=admin PASSWORD=Wingwingk3 DOMAIN=oneandallmusic.net EMAIL=oneandall.music@gmail.com HASHED_PASSWORD=$(openssl passwd -apr1 $PASSWORD) docker compose -f docker-compose.traefik.yml up -d
2024-09-17 12:11:39 +08:00
```
2024-11-30 13:26:24 +08:00
## Deploy Backend
2024-09-17 12:11:39 +08:00
Now that you have Traefik in place you can deploy your FastAPI project with Docker Compose.
**Note**: You might want to jump ahead to the section about Continuous Deployment with GitHub Actions.
## Environment Variables
You need to set some environment variables first.
Set the `ENVIRONMENT`, by default `local` (for development), but when deploying to a server you would put something like `staging` or `production`:
```bash
export ENVIRONMENT=production
```
Set the `DOMAIN`, by default `localhost` (for development), but when deploying you would use your own domain, for example:
```bash
export DOMAIN=fastapi-project.example.com
```
You can set several variables, like:
* `PROJECT_NAME`: The name of the project, used in the API for the docs and emails.
* `STACK_NAME`: The name of the stack used for Docker Compose labels and project name, this should be different for `staging`, `production`, etc. You could use the same domain replacing dots with dashes, e.g. `fastapi-project-example-com` and `staging-fastapi-project-example-com`.
* `BACKEND_CORS_ORIGINS`: A list of allowed CORS origins separated by commas.
* `SECRET_KEY`: The secret key for the FastAPI project, used to sign tokens.
* `FIRST_SUPERUSER`: The email of the first superuser, this superuser will be the one that can create new users.
* `FIRST_SUPERUSER_PASSWORD`: The password of the first superuser.
* `SMTP_HOST`: The SMTP server host to send emails, this would come from your email provider (E.g. Mailgun, Sparkpost, Sendgrid, etc).
* `SMTP_USER`: The SMTP server user to send emails.
* `SMTP_PASSWORD`: The SMTP server password to send emails.
* `EMAILS_FROM_EMAIL`: The email account to send emails from.
* `POSTGRES_SERVER`: The hostname of the PostgreSQL server. You can leave the default of `db`, provided by the same Docker Compose. You normally wouldn't need to change this unless you are using a third-party provider.
* `POSTGRES_PORT`: The port of the PostgreSQL server. You can leave the default. You normally wouldn't need to change this unless you are using a third-party provider.
* `POSTGRES_PASSWORD`: The Postgres password.
* `POSTGRES_USER`: The Postgres user, you can leave the default.
* `POSTGRES_DB`: The database name to use for this application. You can leave the default of `app`.
* `SENTRY_DSN`: The DSN for Sentry, if you are using it.
## GitHub Actions Environment Variables
There are some environment variables only used by GitHub Actions that you can configure:
* `LATEST_CHANGES`: Used by the GitHub Action [latest-changes](https://github.com/tiangolo/latest-changes) to automatically add release notes based on the PRs merged. It's a personal access token, read the docs for details.
* `SMOKESHOW_AUTH_KEY`: Used to handle and publish the code coverage using [Smokeshow](https://github.com/samuelcolvin/smokeshow), follow their instructions to create a (free) Smokeshow key.
### Generate secret keys
Some environment variables in the `.env` file have a default value of `changethis`.
You have to change them with a secret key, to generate secret keys you can run the following command:
```bash
python -c "import secrets; print(secrets.token_urlsafe(32))"
```
Copy the content and use that as password / secret key. And run that again to generate another secure key.
### Deploy with Docker Compose
With the environment variables in place, you can deploy with Docker Compose:
```bash
docker compose -f docker-compose.yml up -d
```
For production you wouldn't want to have the overrides in `docker-compose.override.yml`, that's why we explicitly specify `docker-compose.yml` as the file to use.
## Continuous Deployment (CD)
You can use GitHub Actions to deploy your project automatically. 😎
You can have multiple environment deployments.
There are already two environments configured, `staging` and `production`. 🚀
## URLs
Replace `fastapi-project.example.com` with your domain.
### Main Traefik Dashboard
Traefik UI: `https://traefik.fastapi-project.example.com`
### Production
Frontend: `https://fastapi-project.example.com`
Backend API docs: `https://fastapi-project.example.com/docs`
Backend API base URL: `https://fastapi-project.example.com/api/`
Adminer: `https://adminer.fastapi-project.example.com`
### Staging
Frontend: `https://staging.fastapi-project.example.com`
Backend API docs: `https://staging.fastapi-project.example.com/docs`
Backend API base URL: `https://staging.fastapi-project.example.com/api/`
Adminer: `https://adminer.staging.fastapi-project.example.com`