diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 6b04ecae..182dbbc9 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -37,9 +37,14 @@ jobs: sed -i 's/GOTRUE_SMTP_ADMIN_EMAIL=.*/GOTRUE_SMTP_ADMIN_EMAIL=${{ secrets.GOTRUE_SMTP_ADMIN_EMAIL }}/' .env sed -i 's/GOTRUE_EXTERNAL_GOOGLE_ENABLED=.*/GOTRUE_EXTERNAL_GOOGLE_ENABLED=true/' .env + - name: Disable pull docker image + run: | + sed -i '/image: appflowyinc\/appflowy_cloud:/d' docker-compose.yml + sed -i '/image: appflowyinc\/admin_frontend:/d' docker-compose.yml + - name: Run Docker-Compose run: | - docker compose up -d + docker compose up -d - name: Run tests run: | diff --git a/.github/workflows/push_latest_docker.yml b/.github/workflows/push_latest_docker.yml new file mode 100644 index 00000000..f2da36d5 --- /dev/null +++ b/.github/workflows/push_latest_docker.yml @@ -0,0 +1,43 @@ +name: Build and Push latest docker image + +on: + push: + branches: + - 'main' + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Check out the repository + uses: actions/checkout@v2 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + + - name: Build and push appflowy-cloud + uses: docker/build-push-action@v5 + with: + platforms: linux/amd64,linux/arm64 + push: true + tags: appflowyinc/appflowy_cloud:latest + + - name: Build and push admin frontend + uses: docker/build-push-action@v5 + with: + platforms: linux/amd64,linux/arm64 + push: true + tags: appflowyinc/admin_frontend:latest + + - name: Logout from Docker Hub + if: always() + run: docker logout \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 2a724ae3..70d7596d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2906,6 +2906,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.1.6+3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.93" @@ -2914,6 +2923,7 @@ checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] diff --git a/Cargo.toml b/Cargo.toml index 5015712b..f0cd9ee6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ actix-identity = "0.6.0" actix-cors = "0.6.4" actix-router = "0.5.1" actix-session = { version = "0.8", features = ["redis-rs-tls-session"] } -openssl = { version = "0.10.45" } +openssl = { version = "0.10.45", features = ["vendored"] } # serde serde_json.workspace = true diff --git a/doc/EC2_GUIDE.md b/doc/EC2_GUIDE.md new file mode 100644 index 00000000..5f493c24 --- /dev/null +++ b/doc/EC2_GUIDE.md @@ -0,0 +1,142 @@ + +## Create an EC2 Instance + +To create a default EC2 instance on AWS, you can follow these steps: + +1. Open the Amazon EC2 console at [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/). + +2. In the navigation bar at the top of the screen, the current AWS Region is displayed. Select a Region in which to launch the instance. This is important because some Amazon EC2 resources can be shared between Regions, while others cannot. + +3. From the Amazon EC2 console dashboard, choose "Launch instance." + +4. (Optional) Under "Name and tags," for Name, enter a descriptive name for your instance. + +5. Under "Application and OS Images (Amazon Machine Image)," choose "Quick Start," and then choose the ubuntu. + +6. Under "Key pair (login)," for "Key pair name," choose an existing key pair or create a new one. + +7. In the Summary panel, choose "Launch instance" + + +## Install Docker on EC2 Ubuntu + +To install Docker on an Ubuntu server hosted on AWS, you typically follow these steps: + +Add your user to the Docker group**: This lets your user run Docker commands without `sudo`. Run the following command to add your user to the Docker group: + ```bash + sudo usermod -aG docker ${USER} + ``` + +1. Update your existing list of packages: + ```bash + sudo apt update + ``` + +2. Install prerequisite packages which let `apt` use packages over HTTPS: + ```bash + sudo apt install apt-transport-https ca-certificates curl software-properties-common + ``` + +3. Add the GPG key for the official Docker repository to your system: + ```bash + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + ``` + +4. Add the Docker repository to APT sources: + ```bash + sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + ``` + +5. Update the package database with the Docker packages from the newly added repo: + ```bash + sudo apt update + ``` + +6. Make sure you are about to install from the Docker repo instead of the default Ubuntu repo: + ```bash + apt-cache policy docker-ce + ``` + +7. Finally, install Docker: + ```bash + sudo apt install docker-ce + ``` + +8. Check that Docker is running: + ```bash + sudo systemctl status docker + ``` + +Add your user to the Docker group, which will allow you to run Docker commands without `sudo`: + ```bash + sudo usermod -aG docker ${USER} + ``` + +## Install AppFlowy-Cloud on EC2 Ubuntu +To install AppFlowy-Cloud on an EC2 Ubuntu instance, here's a streamlined guide: + +1. **Clone the AppFlowy-Cloud Repository**: + Access your EC2 instance via SSH and execute the following commands to clone the AppFlowy-Cloud repository and navigate into the directory: + ```bash + git clone https://github.com/AppFlowy-IO/AppFlowy-Cloud + cd AppFlowy-Cloud + ``` + +2. **Prepare the Configuration File**: + Create a `.env` file from the provided template: + ```bash + cp dev.env .env + ``` + +3. **Configure Gotrue Mailer**: + Edit the `.env` file to set up the mailer for auto-confirmation: + ```bash + echo "GOTRUE_MAILER_AUTOCONFIRM=true" >> .env + ``` + +4. **Customize `.env` Settings**: + Open the `.env` file to replace placeholders with your instance details: + ```bash + vim .env + ``` + (Here, replace placeholders with the actual IP or hostname of your EC2 instance.) + +5. **Authentication Setup**: + Consult the [Authentication documentation](./AUTHENTICATION.md) for instructions on setting up the authentication service. + +6. **Start AppFlowy**: + Use Docker to launch the AppFlowy services: + ```bash + docker-compose up -d + ``` + +7. **Check Service Status**: + Confirm that the services have started successfully: + ```bash + docker ps -a + ``` + +Make sure to review and follow the authentication guide closely, adjusting the `.env` file as necessary for your specific setup. + +## Helpful Docker Commands + +Be careful when running these commands. They can be destructive. + +1. **Remove all containers in Docker**: + ```bash + docker rm -f $(sudo docker ps -a) + ``` + +2. **Restart the Docker service**: Sometimes, the Docker daemon might be in a state that prevents access. Restarting it can resolve the issue: + ```bash + sudo systemctl restart docker + ``` +3. **Clean up everything except volumes**: + ```bash + docker system prune -af + ``` +4. **Remove volumes**: + ```bash + docker system prune -af --volumes + ``` + diff --git a/doc/LOCAL_BUILD.md b/doc/LOCAL_BUILD.md new file mode 100644 index 00000000..2721a229 --- /dev/null +++ b/doc/LOCAL_BUILD.md @@ -0,0 +1,26 @@ + +# To build a multi-architecture Docker image + +Docker's buildx tool, which is a part of Docker BuildKit. This tool allows you to create images for different platforms from a single build command. Here's a basic rundown of the steps: + +1. **Enable experimental features** by setting `"experimental": "enabled"` in your Docker configuration file (`~/.docker/config.json`). + +2. **Install QEMU** on your macOS to emulate different architectures: + ```sh + brew install qemu + ``` + +3. **Create a new builder** that enables buildx and specify the platforms you want to target: + ```sh + docker buildx create --name mybuilder --use + ``` + +4. **Inspect the builder** to ensure it's correctly configured and can build for the target platforms: + ```sh + docker buildx inspect mybuilder --bootstrap + ``` + +5. **Build and push the image** to Docker Hub (or another registry) for the desired platforms using the `--platform` flag: + ```sh + docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t /myimage:latest --push . + ``` \ No newline at end of file diff --git a/doc/deployment.md b/doc/deployment.md index 65f8aec0..6d4850df 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -10,18 +10,25 @@ we recommend using cloud compute services (as your host server) such as - Minimum 2GB Ram (4GB Recommended) - Ports 80/443 available + ## Software Requirements -- [docker compose](https://docs.docker.com/compose) -This is needed be installed in your host server -- We recommend using approach as proposed by offical docker website: [Install Docker Engine](https://docs.docker.com/engine/install/) + +Ensure you have Docker Compose installed on your host server. Follow the official guidelines for a reliable setup: + +- **Docker Compose:** Install it as per the [official documentation](https://docs.docker.com/compose/install/). + +- **Docker Engine:** We suggest adhering to the instructions provided by Docker for [installing Docker Engine](https://docs.docker.com/engine/install/). + + +> **Note for AWS Users:** Here is a step by step guide to self host AppFlowy Cloud on AWS EC2 instance: [EC2 Guide](./EC2_GUIDE.md) ## Steps ### 1. Getting source files - Clone this repository into your host server and `cd` into it ```bash -git clone https://github.com/AppFlowy-IO/AppFlowy-Cloud` -cd AppFlowy-Cloud` +git clone https://github.com/AppFlowy-IO/AppFlowy-Cloud +cd AppFlowy-Cloud ``` ### 2. Preparing the configuration @@ -80,9 +87,12 @@ AWS_S3_BUCKET=appflowy AWS_REGION=us-east-1 # This option only applicable for AWS S3 ``` -For authentication, please read the [Authentication](./AUTHENTICATION.md) for more details. +For authentication details, refer to the [Authentication](./AUTHENTICATION.md) documentation. You will need to update the +redirect URI to match your host server's public IP or hostname, such as `http:///callback`. +If using localhost, then just keep the default value. + ```bash -GOTRUE_EXTERNAL_GOOGLE_ENABLED=false +GOTRUE_EXTERNAL_GOOGLE_ENABLED=true GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID= GOTRUE_EXTERNAL_GOOGLE_SECRET= GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI=http://localhost:9998/callback @@ -103,7 +113,8 @@ GOTRUE_EXTERNAL_DISCORD_REDIRECT_URI=http://localhost:9998/callback ### 3. Running the services ### Start and run AppFlowy-Cloud -- The following command will build and start the AppFlowy-Cloud +- The following command will build and start the AppFlowy-Cloud. + ```bash docker compose up -d ``` @@ -112,6 +123,11 @@ docker compose up -d docker ps -a ``` +> When using the `docker compose up -d` command without specifying a tag, Docker Compose will pull the `latest` +tag for the `appflowy_cloud` and `admin_frontend` images from Docker Hub by default. If you've set the `BACKEND_VERSION` +environment variable, it will pull the specified version instead. If `BACKEND_VERSION` is not set, Docker Compose +defaults to using the `latest` tag. + ### 4. Reconfiguring and redeployment - It is very common to reconfigure and restart. To do so, simply edit the `.env` and do `docker compose up -d` again diff --git a/docker-compose.yml b/docker-compose.yml index ccd54b38..3de37d60 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -149,7 +149,7 @@ services: build: context: . dockerfile: Dockerfile - image: appflowy_cloud:${BACKEND_VERSION:-latest} + image: appflowyinc/appflowy_cloud:${BACKEND_VERSION:-latest} depends_on: - redis - postgres @@ -162,6 +162,7 @@ services: build: context: . dockerfile: ./admin_frontend/Dockerfile + image: appflowyinc/admin_frontend:${BACKEND_VERSION:-latest} depends_on: - gotrue ports: